Форум программистов, компьютерный форум CyberForum.ru

warning C4309: =: усечение константного значения - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 14, средняя оценка - 4.64
Alex Z
27 / 1 / 0
Регистрация: 29.06.2011
Сообщений: 136
09.08.2012, 19:13     warning C4309: =: усечение константного значения #1
Добрый вечер.

Почему-то С++ отказывается выводить на экран русские буквы: вместо них бессмысленный набор символов. Я решил написать заголовочный файл и поместить в него функцию, с помощью которой можно нормально выводить русский текст. Вызывать захотел её вот так:
C++
1
write_rus("Привет мир!");
Создал заголовочный файл write_rus.h и описал в нём эту функцию. Привожу код:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
// 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++; // сдвигаем указатель на следующий символ
    }
}
Кусок кода между 21-ой и 25-ой строчками я удалил чтобы не загромождать здесь. Суть здесь такая: я передаю в функцию строку символов. Затем с помощью указателя просматриваю её до конца (до символа '\0') и для каждого символа вывожу на экран переменную x. Чему должна быть равна эта переменная я просто тупо подобрал. Таким образом я перебрал весь русский алфавит от А до Я и ещё раз от а до я. Если в строке английская буква или символ, то просто её вывожу (строчка с default).

Мне показалось, что вроде всё правильно. Я написал файл .cpp и подключил туда свой заголовочный файл с функцией. Решил проверить. Привожу код:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#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 предупреждений). Причём программа запускается и всё работает, так как это не ошибка, а только предупреждение.

Сейчас прочитал в учебнике совет, что всё таки предупреждения надо исправлять. Но я не знаю где тут ошибка. Подскажите, кто разбирается.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
nexen
187 / 180 / 3
Регистрация: 27.01.2012
Сообщений: 1,335
09.08.2012, 19:29     warning C4309: =: усечение константного значения #2
Если я правильно понял и вопрос, и задачу, то
Все дело в функции :
void write_rus (char *string)
Дело в том, что у тебя строка принимается по указателю, а значит никакой доп. переменной не создается (что логично), однако сама строка у тебя константа вида "....", а значит для неё создается временная переменная, которая и передается к тебе в функцию. Да, это warning, но не error. Думаю, что исправить можно лишь :
1) Создав доп. переменную в функции и скопировав в неё содержимое
или
2) Создав доп. переменную в main и уже её отсылать в функцию

p.s С 'x' всё впорядке вроде

p.p.s Чтобы выводить русские символы :
#include <clocale>
в main :
setlocale(0, RUS);
Alex Z
27 / 1 / 0
Регистрация: 29.06.2011
Сообщений: 136
11.08.2012, 05:15  [ТС]     warning C4309: =: усечение константного значения #3
Цитата Сообщение от nexen Посмотреть сообщение
Чтобы выводить русские символы :
#include <clocale>
в main :
setlocale(0, RUS);
Я написал это. При компиляции ошибка:
error C2065: RUS: необъявленный идентификатор
nexen
187 / 180 / 3
Регистрация: 27.01.2012
Сообщений: 1,335
11.08.2012, 06:56     warning C4309: =: усечение константного значения #4
Цитата Сообщение от Alex Z Посмотреть сообщение
Я написал это. При компиляции ошибка:
error C2065: RUS: необъявленный идентификатор
Да, извините, ошибся. Нужно было :
setlocale (LC_ALL,"");
Yandex
Объявления
11.08.2012, 06:56     warning C4309: =: усечение константного значения
Ответ Создать тему
Опции темы

Текущее время: 05:30. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru