Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.74/35: Рейтинг темы: голосов - 35, средняя оценка - 4.74
27 / 1 / 0
Регистрация: 29.06.2011
Сообщений: 136

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

09.08.2012, 19:13. Показов 7567. Ответов 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
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
09.08.2012, 19:13
Ответы с готовыми решениями:

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

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

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

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

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

p.p.s Чтобы выводить русские символы :
#include <clocale>
в main :
setlocale(0, RUS);
1
27 / 1 / 0
Регистрация: 29.06.2011
Сообщений: 136
11.08.2012, 05:15  [ТС]
Цитата Сообщение от nexen Посмотреть сообщение
Чтобы выводить русские символы :
#include <clocale>
в main :
setlocale(0, RUS);
Я написал это. При компиляции ошибка:
error C2065: RUS: необъявленный идентификатор
0
187 / 180 / 25
Регистрация: 27.01.2012
Сообщений: 1,335
11.08.2012, 06:56
Цитата Сообщение от Alex Z Посмотреть сообщение
Я написал это. При компиляции ошибка:
error C2065: RUS: необъявленный идентификатор
Да, извините, ошибся. Нужно было :
setlocale (LC_ALL,"");
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
11.08.2012, 06:56
Помогаю со студенческими работами здесь

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

Смена константного значения на динамическое
Есть вот такой код на Си очень нужно чтобы &quot;n&quot; было не константное значение а вводилось с клавиатуры. #include &lt;stdio.h&gt; ...

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

Усечение строки до 40 символов
помогите,пожалуйста, я в расстроенных чувствах из-за этого задания.... Разработать программу, содержащую процедуру, которая превращает...

Усечение текста внутри фигур
Внутри овала усекается большая часть текста. Как это изменить? Пытался поместить текст перед фигурой - не вышло.


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

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru