Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Кривые значения с плавающей точкой, извлеченные из памяти 
:(
    Опции темы
EKoshelev
Дата 18.12.2014, 19:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 509
Регистрация: 1.9.2004

Репутация: нет
Всего: нет



История такая. Получаю пакеты с железки одной и разбираю их, т. е. осуществляю парсинг, если по-научному. Как правило, все извлекаемые значения целые, однако, тут стали попадаться задачи, в которых надо доставать дробные. А для дробных, если я правильно понимаю, не любая комбинация байтов является правильной, что ли, не знаю как сказать. Короче, на вот такой строке

MoveMemory(@SingleVal, @Buffer[Address], sizeof(Single));

Возникает ошибка: "Project ProjectName.exe raised exception class EInvalidOp with message 'Invalid floating point operation'. Process stopped. Use Step or Run to continue."

Можно ли перед тем как срисовать байты из буфера в переменную проверить их на корректность? Или хотя бы просто сделать так, чтобы он не орал? Для последнего случая вроде как есть стандартные подходы, но я их к своему стыду не знаю (хотя, первое предпочтительнее).

Или может просто линк дадите на гдепочитать.

Заранее спасибо.


--------------------
Вежливым и адекватным предлагаю общаться на "ты".
PM MAIL   Вверх
bems
Дата 19.12.2014, 10:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 3400
Регистрация: 5.1.2006

Репутация: 31
Всего: 88



мне крайне сомнительно чтобы именно эта строчка кидала этот эксцепшн. проверь предыдущую


--------------------
Обижено школьников: 8
PM MAIL   Вверх
EKoshelev
Дата 19.12.2014, 10:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 509
Регистрация: 1.9.2004

Репутация: нет
Всего: нет



Предыдущая - условие, которое не срабатывает (в данном случае)

if FDataTypes[ItmIdx] <> dt8Bytes then
...
else
  MoveMemory(@SingleVal...

Полагаю, что именно на ней. Раньше уже сталкивался с такими ошибками.



Кстати, я приврал, что не знаю как эксепшены обрабатывать. Но этот подход не нравится, т. к. эксепшн обрабатывается, а COM-соединение глохнет почему-то. Приходится переподключать. А вот если бы была возможность не совершать действий, которые вызывают этот эксепшн, то было бы совсем хорошо.

Это сообщение отредактировал(а) EKoshelev - 19.12.2014, 10:48


--------------------
Вежливым и адекватным предлагаю общаться на "ты".
PM MAIL   Вверх
EKoshelev
Дата 19.12.2014, 11:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 509
Регистрация: 1.9.2004

Репутация: нет
Всего: нет



А чё-то я уже и не знаю. То есть ошибка-то стопудово на той строке. Просто вещи не очень понятные.

В обработку эксепшена добавил вывод того куска памяти, при преобразовании которого в Single вылетает ошибка:
0, 0, 0, 11

Написал прожку:

Код

procedure TForm1.Button1Click(Sender: TObject);
var
  arr: array [0..3] of byte;
  SingleVal: Single;

begin
  arr[0] := 0;
  arr[1] := 0;
  arr[2] := 0;
  arr[3] := 11;

  MoveMemory(@SingleVal, @arr[0], sizeof(Single));

  ShowMessage(FloatToStr(SingleVal));
end;


она такой ошибки не вызывает.


--------------------
Вежливым и адекватным предлагаю общаться на "ты".
PM MAIL   Вверх
bems
Дата 19.12.2014, 12:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 3400
Регистрация: 5.1.2006

Репутация: 31
Всего: 88



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


--------------------
Обижено школьников: 8
PM MAIL   Вверх
EKoshelev
Дата 19.12.2014, 12:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 509
Регистрация: 1.9.2004

Репутация: нет
Всего: нет



bems, ну я в общем написал уже (выше).


--------------------
Вежливым и адекватным предлагаю общаться на "ты".
PM MAIL   Вверх
EKoshelev
Дата 19.12.2014, 13:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 509
Регистрация: 1.9.2004

Репутация: нет
Всего: нет



Короче, зря я эту тему создал.

Закомментил весь код этой процедуры. В конце оставил result := 0;
И всё равно выкидывает тот же самый эксепшн.


--------------------
Вежливым и адекватным предлагаю общаться на "ты".
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0738 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.