Форум программистов, компьютерный форум, киберфорум
C++
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/4: Рейтинг темы: голосов - 4, средняя оценка - 5.00
1 / 1 / 0
Регистрация: 25.03.2014
Сообщений: 29
1

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

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

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

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
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
21.01.2015, 20:40
Ответы с готовыми решениями:

Геометрические и физические задачи, приводящие к диф. ур-ниям
1. Найти кривую,проходящую через начало координат,для которой площадь,ограниченная кривой, осью Ох...

Сервисные коды S5230 все коды работают сам проверял
все коды работают сам проверял *#197328640# - Debug Screen Version Information RF Test Base...

Дан массив S(50).Вывести те символы (и их коды), коды которых кратны 5 и определить их количество.
Дан массив S(50).Вывести те символы (и их коды), коды которых кратны 5 и определить их количество.

Ввести коды ASCII N символов. Выбрать из них и вывести только коды цифр
Нужна помощь с заданием: Ввести коды ASCII N символов. Выбрать из них и вывести только коды цифр. ...

5
18840 / 9839 / 2408
Регистрация: 30.01.2014
Сообщений: 17,280
21.01.2015, 21:45 2
Цитата Сообщение от Виктор Гор Посмотреть сообщение
Кто скажет, почему следующий блок работал бы не так как ожидалось?
Оператор запятая.
1
1 / 1 / 0
Регистрация: 25.03.2014
Сообщений: 29
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
18840 / 9839 / 2408
Регистрация: 30.01.2014
Сообщений: 17,280
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
Сообщений: 29
22.01.2015, 19:11  [ТС] 5
255 полей это много, даже не буду предполагать для какой сущности такое может понадобится.

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

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

Добавлено через 4 минуты
Цитата Сообщение от Виктор Гор Посмотреть сообщение
255 полей это много, даже не буду предполагать для какой сущности такое может понадобится
Опять же, из приведенного кода не видно всего этого. Что это за поля и т.п.
Код, который ты приводишь, должен отражать проблему. Вот проблема с оператором запятой видна была сразу и ты получил ссылку. А тут - нет. Тут только телепатия.
Хотя бы можно было написать в шапке темы, что это Builder
0
23.01.2015, 00:06
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
23.01.2015, 00:06
Помогаю со студенческими работами здесь

Предыдущее завершение работы системы в 1:42:51 на ‎10.‎09.‎2010 было неожиданным.
64-разрядная ОС Windows 7 Домашняя расширенная. В журнале проблем и стабильности работы...

Даны два двоичных числа 10010000 и 00001001. Числа 16-е ASCII–коды и перевести их в 2-е коды
Добрый день, помогите с задачкой: Даны два двоичных числа 10010000 и 00001001. Числа 16-е...

Клики по результатам
Имею вопрос: Учитывают ли поисковики, по каким ссылкам из результатов поиска, кликают посетители?

Вопрос по результатам CCNA
Сегодня прошел сертификацию CCNA (Sw &amp; R), по баллам сдал, обрадовался. Но сначала беглым взглядом...


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

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru