![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Вылет проги по "Invalid floating point operation" [D5]
ЮрийК © (2004-08-10 12:46:00)Следующий вопрос:
Программа, написанная на дельфи, иногда вылетает по исключению "Invalid floating point operation" у пользователя. Программа использует много ДЛЛ-ей (свои, написанные на VC, и чужие также, без кода), и исключение например может случаться и там. Что и где можно добавить в код, чтобы найти причину? Например какие-то данные скинуть в файл (какие?), которые помогут понять ситуацию?
ЮрийК (2004-08-10 21:28:00) [1]Кстати, как можно узнать, что стека не хватило и произошло его переполнение.
ЮрийК (2004-08-10 18:04:00) [2]"(nNext - nCur); чему равно?"
от 1 до 100000, если и больше, то вряд ли существенно.
"Я в сях, конечно, не силён, но что-то вот это мне не нравится:
str[pStr1[i]]=(BYTE)i"
i не больше длины строки pStr1, которая всё же меньше 256 (так изначально), pStr1[i] точно меньше 256.
"и вот это:
str[pStr2[i]]<0xff"
Где pStr2[i] такое (значение меньше 256), что str[pStr2[i]] равно 0xff, результат изменяться не должен (всего лишь).
В сгоседней ветке пишут про перполнение стека, что это может давать ошибку. Может быть в этом и есть проблема?
Ega23 (2004-08-10 17:28:00) [3]
(nNext - nCur);чему равно?
Я в сях, конечно, не силён, но что-то вот это мне не нравится:
str[pStr1[i]]=(BYTE)i
и вот это:
str[pStr2[i]]<0xff
ЮрийК (2004-08-10 17:18:00) [4]"А что, сайт уже в "CMAster" переименовали? или с других сайтов с такими вопросами сразу посылают?"
Основная прога на дельфи, смотри первое сообщение.
Плохиш (2004-08-10 16:29:00) [5]
> ЮрийК © (10.08.04 16:26) [10]
А что, сайт уже в "CMAster" переименовали? или с других сайтов с такими вопросами сразу посылают?
ЮрийК (2004-08-10 16:26:00) [6]Весь код с плавающими числами (в ДЛЛ) :
в одном месте:
if (nNext > nCur) {
float flNum = (float)nNum;
pSour->d = flNum + flNum / (float)(nNext - nCur);
}
в другом месте:
int cmpR( const void *sr1, const void *sr2 )
{
float& a = ((SInfo*)sr1)->d;
float& b = ((SInfo*)sr2)->d;
if ( a > b ) return -1;
if ( a < b ) return 1;
и в третьем:
static BYTE str[256];
if (nLen1 == 0 && nLen2 == 0)
return 0;
memset(str,0xff,256);
double maxlen=__max(nLen1,nLen2);
double procent=0.0;
for (WORD i=0;i
Anatoly Podgoretsky (2004-08-10 15:47:00) [7]Нет это два предопределенных значения для чисел с плавающей запятой.
ЮрийК (2004-08-10 15:46:00) [8]"Это когда NAN или INF"
Это на ассемблере?
Anatoly Podgoretsky (2004-08-10 14:27:00) [9]Это когда NAN или INF
Ega23 (2004-08-10 14:14:00) [10]Нет. Только что проверил.
Floating point division by zero
TUser (2004-08-10 13:54:00) [11]Нет. InvalidFlPOp.
Ega23 (2004-08-10 13:42:00) [12]Чаще (у меня, по крайней мере) - деление на ноль.
Это не EDivByZero ли случайно?
TUser (2004-08-10 13:38:00) [13]Чаще (у меня, по крайней мере) - деление на ноль.
Ega23 (2004-08-10 13:30:00) [14]Скорее всего где-то FloatToStr не так переводишь.
inic (2004-08-10 13:12:00) [15]Быть может окружить все вызовы подозрительных функций try except, например:
procedure SomeProc ();
try
CallFunc();
except
on EInvalidOp do MessageBox(0, 'From Unit1.SomeProc', '', 0);
end;
end;