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

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

Восстановить пароль Регистрация
Другие темы раздела
C++ Снова конструктор http://www.cyberforum.ru/cpp-beginners/thread635376.html
в книге написан пример NoD(std::istream &is) { is >> *this; } а по заданию надо его еще сделать по умолчанию std::cin при компиляции пишет error C2678: бинарный ">>": не найден оператор, принимающий левый операнд типа "std::istream" (или приемлемое преобразование отсутствует) и т.д.
C++ Запись звука Кто-нибудь писал подобные программки, для захвата звука? Если кто писал, помогите пожалуйста, а то я дико туплю. Накидал тут по статье (http://www.junglewin.narod.ru/sound.html): void __fastcall TForm1::Button1Click(TObject *Sender) { WAVEFORMATEX WaveFormat; WaveFormat.wFormatTag = WAVE_FORMAT_PCM; http://www.cyberforum.ru/cpp-beginners/thread635363.html
C++ Указатели на строки
Есть следующий код: class Strings // класс с указателями на строки (размер которого равен 8) { public: char* str1; char* str2; Strings() { memset(this,0,sizeof *this);
C++ Обращение к перегруженному оператору () через указатель на объект
Собственно, как? class MyClass { .. void operator() (int _i) { cout << "operator()" << _i << endl; } };
C++ Изменение свойств кнопки из обработчика таймера http://www.cyberforum.ru/cpp-beginners/thread635338.html
Есть функция обработчик таймера, необходимо из этой функции вызвать PerformClick кнопки, как это сделать. Функция обработчик таймера объявлена как static, что бы обратиться к свойствам кнопки её тоже нужно объявить как static, по другому никак?
C++ Наследование объекта Народ, помогите пожалуйста. Вопрос в следующем. Есть абстрактный базовый класс BaseClass, в нем объявлен объект Timer класса TTimer, который, в свою очередь имеет свои методы (Start(), Match(), и т.д.). У базового класса есть множество потомков. Будет ли при создании экземпляров потомков создаваться новый экземпляр класса TTimer (или мы будем иметь дело лишь с объявленным объектом в базовом... подробнее

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

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

Сейчас прочитал в учебнике совет, что всё таки предупреждения надо исправлять. Но я не знаю где тут ошибка. Подскажите, кто разбирается.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
 
Текущее время: 22:12. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru