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

C++

Войти
Регистрация
Восстановить пароль
 
Виктор Гор
1 / 1 / 0
Регистрация: 25.03.2014
Сообщений: 23
#1

Коды, приводящие к неожиданным результатам - C++

21.01.2015, 20:40. Просмотров 353. Ответов 5
Метки нет (Все метки)

Код помещения кортежа в стрим.
Компилируется. По счастливому случаю обнаружил автоматическую ошибку до тестирования.
Кто скажет, почему следующий блок работал бы не так как ожидалось?

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
for(uint8_t idx = 0; idx < inputDataSet->Fields->Count; idx++)
    switch (inputDataSet->Fields->Fields[idx]->DataType){
    case    ftBoolean:  { writer->WriteBoolean(inputDataSet->Fields->Fields[idx]->AsBoolean); break; }
    case    ftSmallint,
            ftInteger,
            ftWord,
            ftAutoInc:  { writer->WriteInteger(inputDataSet->Fields->Fields[idx]->AsInteger); break; }
    case    ftFloat,
            ftDouble:   { writer->WriteFloat(inputDataSet->Fields->Fields[idx]->AsFloat); break; }
    case    ftCurrency: { writer->WriteCurrency(inputDataSet->Fields->Fields[idx]->AsCurrency); break; }
    case    ftDate,
            ftTime,
            ftDateTime: { writer->WriteDate(inputDataSet->Fields->Fields[idx]->AsDateTime); break; }
    case    ftMemo:     { writer->WriteWideString(inputDataSet->Fields->Fields[idx]->AsWideString); break; }
    default:            { writer->WriteString(inputDataSet->Fields->Fields[idx]->AsString); break; }
    }
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
21.01.2015, 20:40     Коды, приводящие к неожиданным результатам
Посмотрите здесь:

Вычислить суммарное количество очков, набранных каждой командой по результатам игры C++
По результатам лыжных соревнований в трех группах сформировать сборную команду из 7 человек C++
C++ не разборчивые коды
C++ Builder Неверное значение по результатам расчетов
сформировать сборную команду из 7 человек по результатам лыжных соревнований в трех группах C++
Коды Assembler в C/C++ C++
C++ Builder Рейтинг стран по результатам олимпийских соревнований (Delphi -> С++ Builder)
C++ Циклические коды
C++ Замена исходных данных по результатам расчетов
C++ Коды C++
C++ По результатам метеорологических исследований за январь месяц 1990-1999 годов, определить в каком году было бо
Задать пользователю вопросы на знание таблицы умножения, по результатам поставить оценку C++

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
DrOffset
6840 / 4051 / 924
Регистрация: 30.01.2014
Сообщений: 6,855
21.01.2015, 21:45     Коды, приводящие к неожиданным результатам #2
Цитата Сообщение от Виктор Гор Посмотреть сообщение
Кто скажет, почему следующий блок работал бы не так как ожидалось?
Оператор запятая.
Виктор Гор
1 / 1 / 0
Регистрация: 25.03.2014
Сообщений: 23
22.01.2015, 00:32  [ТС]     Коды, приводящие к неожиданным результатам #3
Да, на самом деле вычисление выражения решает, спасибо.
Но есть ещё один момент который не виден с первого взгляда и он остался.
Перепишу с учётом исправления.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
 for(uint8_t idx = 0; idx < inputDataSet->Fields->Count; idx++)
    switch (inputDataSet->Fields->Fields[idx]->DataType){
    case    ftBoolean:  { writer->WriteBoolean(inputDataSet->Fields->Fields[idx]->AsBoolean); break; }
    case    ftSmallint: { writer->WriteInteger(inputDataSet->Fields->Fields[idx]->AsInteger); break; }
    case    ftInteger:  { writer->WriteInteger(inputDataSet->Fields->Fields[idx]->AsInteger); break; }
    case    ftWord:     { writer->WriteInteger(inputDataSet->Fields->Fields[idx]->AsInteger); break; }
    case    ftAutoInc:  { writer->WriteInteger(inputDataSet->Fields->Fields[idx]->AsInteger); break; }
    case    ftFloat:    { writer->WriteFloat(inputDataSet->Fields->Fields[idx]->AsFloat); break; }
    case    ftDouble:   { writer->WriteFloat(inputDataSet->Fields->Fields[idx]->AsFloat); break; }
    case    ftCurrency: { writer->WriteCurrency(inputDataSet->Fields->Fields[idx]->AsCurrency); break; }
    case    ftDate:     { writer->WriteDate(inputDataSet->Fields->Fields[idx]->AsDateTime); break; }
    case    ftTime:     { writer->WriteDate(inputDataSet->Fields->Fields[idx]->AsDateTime); break; }
    case    ftDateTime: { writer->WriteDate(inputDataSet->Fields->Fields[idx]->AsDateTime); break; }
    case    ftMemo:     { writer->WriteWideString(inputDataSet->Fields->Fields[idx]->AsWideString); break; }
    default:            { writer->WriteString(inputDataSet->Fields->Fields[idx]->AsString); break; }
    }
DrOffset
6840 / 4051 / 924
Регистрация: 30.01.2014
Сообщений: 6,855
22.01.2015, 18:08     Коды, приводящие к неожиданным результатам #4
Цитата Сообщение от Виктор Гор Посмотреть сообщение
Но есть ещё один момент который не виден с первого взгляда и он остался.
Предлагаешь угадывать?
Рискну предположить, что если элементов больше чем 255, то будет переполнение в счетчике.
Цитата Сообщение от Виктор Гор Посмотреть сообщение
Перепишу с учётом исправления.
Избыточность. Лучше так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
 for(size_t idx = 0; idx < inputDataSet->Fields->Count; idx++)
    switch (inputDataSet->Fields->Fields[idx]->DataType){
    case    ftBoolean:  { writer->WriteBoolean(inputDataSet->Fields->Fields[idx]->AsBoolean); break; }
    case    ftSmallint: 
    case    ftInteger:  
    case    ftWord:     
    case    ftAutoInc:  { writer->WriteInteger(inputDataSet->Fields->Fields[idx]->AsInteger); break; }
    case    ftFloat:    
    case    ftDouble:   { writer->WriteFloat(inputDataSet->Fields->Fields[idx]->AsFloat); break; }
    case    ftCurrency: { writer->WriteCurrency(inputDataSet->Fields->Fields[idx]->AsCurrency); break; }
    case    ftDate:     
    case    ftTime:     
    case    ftDateTime: { writer->WriteDate(inputDataSet->Fields->Fields[idx]->AsDateTime); break; }
    case    ftMemo:     { writer->WriteWideString(inputDataSet->Fields->Fields[idx]->AsWideString); break; }
    default:            { writer->WriteString(inputDataSet->Fields->Fields[idx]->AsString); break; }
    }
Ну и вот это вот писать "inputDataSet->Fields->Fields[idx]" каждый раз неужели не напрягает? Не лучше ли получить указатель на текущий элемент в начале цикла, и потом везде работать с ним. Будет и короче и понятней.
Виктор Гор
1 / 1 / 0
Регистрация: 25.03.2014
Сообщений: 23
22.01.2015, 19:11  [ТС]     Коды, приводящие к неожиданным результатам #5
255 полей это много, даже не буду предполагать для какой сущности такое может понадобится.

TField * field = inputDataSet->Fields->Fields[idx]; переписал ещё утром)

Угадывать не надо. ftDouble - это константа не с TFieldType. Её значение равно ftString - но так как стринг ловится в default то дублирования нет и компилятор пропускает. С первого же теста б вылетело.
DrOffset
6840 / 4051 / 924
Регистрация: 30.01.2014
Сообщений: 6,855
23.01.2015, 00:06     Коды, приводящие к неожиданным результатам #6
Цитата Сообщение от Виктор Гор Посмотреть сообщение
Угадывать не надо. ftDouble - это константа не с TFieldType. Её значение равно ftString - но так как стринг ловится в default то дублирования нет и компилятор пропускает.
Вот именно что надо было. Ибо из приведенного кода это никак не очевидно, а телепаты все в отпусках как назло

Добавлено через 4 минуты
Цитата Сообщение от Виктор Гор Посмотреть сообщение
255 полей это много, даже не буду предполагать для какой сущности такое может понадобится
Опять же, из приведенного кода не видно всего этого. Что это за поля и т.п.
Код, который ты приводишь, должен отражать проблему. Вот проблема с оператором запятой видна была сразу и ты получил ссылку. А тут - нет. Тут только телепатия.
Хотя бы можно было написать в шапке темы, что это Builder
Yandex
Объявления
23.01.2015, 00:06     Коды, приводящие к неожиданным результатам
Ответ Создать тему
Опции темы

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