Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: setlocale(LC_CTYPE,"Russian") валит printf???  (Прочитано 12052 раз)
0 Пользователей и 1 Гость смотрят эту тему.
eugrita
Помогающий

ru
Offline Offline

« : 07-07-2014 17:23 » 

Работаю на билдере давно. Но до такого маразма не доходил.
Оператор setlocale(LC_CTYPE,"Russian")   валит печать printf Не понял
Проверял экспериментально
Код:
#include <iostream>
#include <stdio.h>
using namespace std;

void main() //задача о разорении стат.хар-ки
{
 char c;int K0,k; //К-начальн капитал, k-ставка
 setlocale(LC_CTYPE,"Russian");//валит
 float wp=0.25;
 std::cout<<wp<<'\n';
 printf("p= %f\n",wp);
 cin>>c;
}
если закомментировать  setlocale то все ок. Не верите- проверьте сами.
Не поленился проверить в Visual Studio -там этот же код работает (с добавлением #include <stdafx.h>
Хотя конечно setlocale(LC_CTYPE,"Russian"); - это примочка студии - для правильного вывода русс шрифта в консольном приложении. Она в Билдере не действует. А здесь еще валит.
std::cout и using namespace std; это тоже-дань Студии
Блин ,что-то многовато набирается отличий программирования под С++ на Builder и в VisualStudio
Записан
Finch
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #1 : 08-07-2014 15:27 » 

Скажем так, что using namespace std и setLocale это стандартные Сишные обозначения. А не приблуды студии, как вы выразились. Ну нету такой локали Russian. Есть CP-866, Windows-1251, KOI8-R, UTF-8 и другие. В Вашем случае скорее всего подойдет та локаль, в кодировке которой вы записываете исходники вашей программы.
Предположить могу, что библиотеки билдера сами обслуживают терминал. Не находят локаль Russian и пишут null, Поэтому затем printf пытаясь вывести на терминал и падает. Но это мои умозаключения.
Записан

Не будите спашяго дракона.
             Джаффар (Коша)
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #2 : 08-07-2014 17:13 » 

Локаль ru_RU с опциональной кодировкой.
Только LC_CTYPE никак не влияет на форматирование плавающих чисел.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
darkelf
Молодой специалист

ua
Offline Offline

« Ответ #3 : 09-07-2014 05:26 » 

Ну нету такой локали Russian. Есть CP-866, Windows-1251, KOI8-R, UTF-8 и другие. В Вашем случае скорее всего подойдет та локаль, в кодировке которой вы записываете исходники вашей программы.
У Visual Stidio локали называются так, как  написал eugrita. Судя по документации приведённой в http://docs.embarcadero.com/products/rad_studio/radstudio2007/RS2007_helpupdates/HUpdate4/FR/html/devwin32/setlocale_xml.html у Borland C++ Builder-а тоже примерно так (общий подход аналогичен).

У них в документации есть приписка:
Цитата: Borland
To take advantage of dynamically loadable locales in your application, define _ _USELOCALES_ _ for each module. If _ _USELOCALES_ _ is not defined, all locale-sensitive functions and macros will work only with the default C locale.
Может надо попробовать задать этот макрос?
« Последнее редактирование: 09-07-2014 08:33 от darkelf » Записан
eugrita
Помогающий

ru
Offline Offline

« Ответ #4 : 09-07-2014 08:30 » 

Ну что же, выслушал все советы. При изменении "Russian" на другие локали исключение исчезает, так что видно Finch прав. Однако ни одна из предложенных локалей не привела к верному отображению русского даже ru_RU
Где узнать или изменить кодировку при сохланении проекта под С++Builder 6.0 Не понял
Один на CyberForum  писал о пересохранении проекта Save As и там под треугольником выпадал список сохранить в какой кодировке. Но еше раз  под С++Builder 6.0 этого не нашел - возможно говорит о других оболочках. И единств альтернатива использ CharToOem или вводить свою функцию перекодировки
Записан
darkelf
Молодой специалист

ua
Offline Offline

« Ответ #5 : 09-07-2014 08:39 » new

eugrita, можно просто, например в far-е, перекодировать все исходники из кодировки Windows-1251, в которой они скорее всего сейчас, в кодировку IBM-866 (CP-866). Правда потом в редакторе Builder-а скорее всего буду крокозяблики вместо кириллицы. Но при этом сообщения кириллицей в консоль будут выводиться нормально.
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines