Форум Академгородка, Новосибирск > Помогите исправить предупреждение на С++ (warning C4309: =: усечение константного значения)
Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Помогите исправить предупреждение на С++ (warning C4309: =: усечение константного значения)
Форум Академгородка, Новосибирск > Компьютеры и сети > Программирование
Zlo_
Добрый день. Задавал этот вопрос уже 2 знакомым и ещё на одном форуме. Народ предлагает свои варианты, но мою ошибку исправить не могут. Пишу проблему:

Почему-то С++ отказывается выводить на экран русские буквы: вместо них бессмысленный набор символов. Я решил написать заголовочный файл и поместить в него функцию, с помощью которой можно нормально выводить русский текст. Вызывать захотел её вот так:

write_rus("Привет мир!");

Создал заголовочный файл write_rus.h и описал в нём эту функцию. Привожу код:

// write_rus - функция для вывода на
// экран русскими буквами
void write_rus (char *string)
{
char x;
while (*string != '\0')
{
switch (*string)
{
case 'А':
{
x=128;
std::cout<<x;
}
break;
case 'Б':
{
x=129;
std::cout<<x;
}
break;

/***************************************/

case 'ю':
{
x=238;
std::cout<<x;
}
break;
case 'я':
{
x=239;
std::cout<<x;
}
break;

default: std::cout << *string; break; // для символов и для английских букв
}

string++; // сдвигаем указатель на следующий символ
}
}

Кусок кода, помеченный символом /***************************************/ я удалил чтобы не загромождать здесь. Суть здесь такая: я передаю в функцию строку символов. Затем с помощью указателя просматриваю её до конца (до символа '\0') и для каждого символа вывожу на экран переменную x. Чему должна быть равна эта переменная я просто тупо подобрал. Таким образом я перебрал весь русский алфавит от А до Я и ещё раз от а до я. Если в строке английская буква или символ, то просто её вывожу (строчка с default).

Мне показалось, что вроде всё правильно. Я написал файл .cpp и подключил туда свой заголовочный файл с функцией. Решил проверить. Привожу код:

#include <iostream>
#include "write_rus.h" // чтобы ипользовать функцию write_rus()
int main()
{
using std::cout;
using std::endl;

write_rus("AБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ"); // русские буквы
cout<<endl;

write_rus("абвгдеёжзийклмнопрстуфхцчшщъыьэюя"); // русские буквы
cout<<endl;

write_rus("ABCDEFGHILKLMNOPQRSTUVWXYZ"); // английские буквы тоже выводит
cout<<endl;

write_rus("abcdefghijklmnopqrstuvwxyz"); // английские буквы тоже выводит
cout<<endl;

cout<<"ABCDEFGHILKLMNOPQRSTUVWXYZ"<<endl; // этот способ только для английских букв
cout<<"abcdefghijklmnopqrstuvwxyz"<<endl<<endl; // этот способ только для английских букв

char response; // эти 2 строчки для
std::cin >> response; // задержки экрана

return 0;
}

Нажал на компиляцию. Выдало одно предупреждение много раз:
warning C4309: =: усечение константного значения
Весь текст из окошка Вывод:

1>Построение начато 09.08.2012 22:00:46.
1>ClCompile:
1> write_rus.cpp
1>d:\my documents\write_rus\write_rus\write_rus.h(12): warning C4309: =: усечение константного значения
1>d:\my documents\write_rus\write_rus\write_rus.h(18): warning C4309: =: усечение константного значения

.
. (аналогично, пропустил)
.

1>d:\my documents\write_rus\write_rus\write_rus.h(396): warning C4309: =: усечение константного значения
1>d:\my documents\write_rus\write_rus\write_rus.h(402): warning C4309: =: усечение константного значения
1>
1>Построение успешно завершено.
1>
1>Затраченное время: 00:00:00.85
========== Построение: успешно: 1, с ошибками: 0, без изменений: 0, пропущено: 0 ==========

То есть он в качестве предупреждения помечает те строчки, в которых я присваиваю переменной х значения ( и того 33*2= 66 предупреждений). Причём программа запускается и всё работает, так как это не ошибка, а только предупреждение.

Сейчас прочитал в учебнике совет, что всё таки предупреждения надо исправлять. Но я не знаю где тут ошибка. Подскажите, кто разбирается.
SSerge
Перед тем как запускать свою программу в DOS-окне (другое название "командная строка") исполните сначала команду chcp 1251 и любуйтесь на русские буковки без всякой перекодировки.
Дело в том, что по умолчанию применяется кодировка 866 (досовская), а текст Вашей программы в кодировке win1251.
Basilevs
Цитата(cshnik @ 17.08.2012, 14:41) *
На самом деле ваша задача с выводом русских букв по-нормальному должна решаться настройкой локали для потока вывода(и еще имеет значение в какой локали сохраняется исходный текст вашей программы), но конкретный код подсказать не могу...


Код
ostringstream encodingString;
encodingString<< "." << GetConsoleOutputCP();
locale consoleLocale(encodingString.str());
wcout.imbue(consoleLocale);
wcout << L"Привет мир!" << endl;
Flinn
я так всегда делал:
Код
setlocale(LC_ALL,"Russian");

в самом начале мэйна. может настоящие мужики smile.gif скажут что это не по-пацански, но у меня за 5 лет всегда работало:)
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Русская версия IP.Board © 2001-2024 IPS, Inc.