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

C++

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

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

21.01.2015, 20:40. Просмотров 378. Ответов 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; }
    }
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
21.01.2015, 20:40
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Коды, приводящие к неожиданным результатам (C++):

Неверное значение по результатам расчетов - C++ Builder
Доброго дня. У меня возникла проблема следующего характера: программа считает среднее набора правильно, а когда дело доходит до нахождения...

Рейтинг стран по результатам олимпийских соревнований (Delphi -> С++ Builder) - C++ Builder
Задача Создать программу, с помощью которой пользователь смог бы по введенным данным о количестве золотых, серебряных и бронзовых медалей...

Замена исходных данных по результатам расчетов - C++
здраствуйте имеется програма для расчета #include&lt;conio.h&gt; #include&lt;iostream&gt; #include &lt;cstdio&gt; #include &quot;windows.h&quot; using...

Сравнить две переменные и изменить их значения по результатам сравнения - C++
Даны две переменные целого типа: A и B. Если их значения не равны, то присвоить каждой переменной сумму этих значений, а если равны, то...

сформировать сборную команду из 7 человек по результатам лыжных соревнований в трех группах - C++
За результатами лижних змагань у трьох групах сформувати збірну команду з 7 чоловік. Пункт 1.4 Правил: Официальный язык форума - русский.

Вычислить суммарное количество очков, набранных каждой командой по результатам игры - C++
результаты игры квн, в которой принимали участие 3 команды и проводилось 5 конкурсов, сохранены в двумерном массиве. Написать...

5
DrOffset
7351 / 4451 / 1009
Регистрация: 30.01.2014
Сообщений: 7,292
21.01.2015, 21:45 #2
Цитата Сообщение от Виктор Гор Посмотреть сообщение
Кто скажет, почему следующий блок работал бы не так как ожидалось?
Оператор запятая.
1
Виктор Гор
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; }
    }
0
DrOffset
7351 / 4451 / 1009
Регистрация: 30.01.2014
Сообщений: 7,292
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]" каждый раз неужели не напрягает? Не лучше ли получить указатель на текущий элемент в начале цикла, и потом везде работать с ним. Будет и короче и понятней.
0
Виктор Гор
1 / 1 / 0
Регистрация: 25.03.2014
Сообщений: 23
22.01.2015, 19:11  [ТС] #5
255 полей это много, даже не буду предполагать для какой сущности такое может понадобится.

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

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

Добавлено через 4 минуты
Цитата Сообщение от Виктор Гор Посмотреть сообщение
255 полей это много, даже не буду предполагать для какой сущности такое может понадобится
Опять же, из приведенного кода не видно всего этого. Что это за поля и т.п.
Код, который ты приводишь, должен отражать проблему. Вот проблема с оператором запятой видна была сразу и ты получил ссылку. А тут - нет. Тут только телепатия.
Хотя бы можно было написать в шапке темы, что это Builder
0
23.01.2015, 00:06
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
23.01.2015, 00:06
Привет! Вот еще темы с ответами:

По результатам лыжных соревнований в трех группах сформировать сборную команду из 7 человек - C++
По результатам лыжных соревнований в трех группах сформировать сборную команду из 7 человек

Задать пользователю вопросы на знание таблицы умножения, по результатам поставить оценку - C++
Поставить пользователю 10 вопросов на знание таблицы умножения , по результатам поставить оценку отлично (10 правильных ответов). хорошо...

В некотором вузе абитуриенты проходят предварительное тестирование, по результатам которого могут быть допущен - C++
В некотором вузе абитуриенты проходят предварительное тестирование, по результатам которого могут быть допущены к сдаче вступительных...

По результатам метеорологических исследований за январь месяц 1990-1999 годов, определить в каком году было бо - C++
Структуры и объединения По результатам метеорологических исследований за январь месяц 1990-1999 годов, определить в каком году было...


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

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Опции темы

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