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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 14, средняя оценка - 4.64
Alex Z
27 / 1 / 0
Регистрация: 29.06.2011
Сообщений: 136
#1

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

09.08.2012, 19:13. Просмотров 2023. Ответов 3
Метки нет (Все метки)

Добрый вечер.

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

Сейчас прочитал в учебнике совет, что всё таки предупреждения надо исправлять. Но я не знаю где тут ошибка. Подскажите, кто разбирается.
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
09.08.2012, 19:13
Здравствуйте! Я подобрал для вас темы с ответами на вопрос warning C4309: =: усечение константного значения (C++):

Усечение константного значения при присвоении значений объектам структуры - C++
Здравствуйте! Есть вот такой код: #include &lt;iostream&gt; using namespace std; struct date { int day; char month; int...

Изменения константного значения - C++
Всем привет, вопрос такой. Пытаюсь разобраться с приведением типов, в частности с изменением const значений через указатель. Вот код: ...

Инициализация константного члена класса с проверкой значения - C++
Допустим есть класс константным членом class a{ const int i; public: a(int ii):i(ii){}; } Можно ли как-нибудь...

Добрый вечер! Передача в функцию константного значения и обьявление им массива - C++
Вот у меня есть функция с объявленым массивом внутри: f(const int &amp;C) { int mass; } Где тут ошибка ? Ведь размер массива...

Усечение разрядности - C++
Пусть есть переменная большой разрядности. Например, uint64_t x;. Зависит ли результат y=(uint32_t)x; от порядка байт? То есть...

Усечение числа с плавающей точкой - C++
Доброго времени суток! Собсно сабж. floor(v*1000)/1000 не помогает, обнуляется только несколько знаков после запятой, а остальные...

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

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

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

Изменение константного поля класса - C++
Является ли изменение константы-поля класса UB? - компилятор может закэшировать значение и не ждать, что оно другое. - с другой стороны...

вывод константного стринга..срочно - C++
детский глупый вопрос,почему то все равно туплю: cin&gt;&gt;&quot;W=false&quot;; binary '&gt;&gt;' : no operator found which takes a right-hand operand of...

Увеличить предел константного целочисленного литерала - C++
Добрый день. Появилась потребность увеличить предел целочисленного строкового литерала. Т.е. фактически изменить его тип. Например...

Изменение константного объекта с применением const_cast - C++
1. Это код из учебника С. Прата &quot;Лекции и упражнения&quot;. #include &lt;iostream&gt; using namespace std; void change(const int* pt,...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
11.08.2012, 06:56
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru