Форум: "Основная";
Текущий архив: 2004.08.29;
Скачать: [xml.tar.bz2];
ВнизВылет проги по "Invalid floating point operation" Найти похожие ветки
← →
ЮрийК © (2004-08-10 12:46) [0]Следующий вопрос:
Программа, написанная на дельфи, иногда вылетает по исключению "Invalid floating point operation" у пользователя. Программа использует много ДЛЛ-ей (свои, написанные на VC, и чужие также, без кода), и исключение например может случаться и там. Что и где можно добавить в код, чтобы найти причину? Например какие-то данные скинуть в файл (какие?), которые помогут понять ситуацию?
← →
inic © (2004-08-10 13:12) [1]Быть может окружить все вызовы подозрительных функций try except, например:
procedure SomeProc ();
try
CallFunc();
except
on EInvalidOp do MessageBox(0, "From Unit1.SomeProc", "", 0);
end;
end;
← →
Ega23 © (2004-08-10 13:30) [2]Скорее всего где-то FloatToStr не так переводишь.
← →
TUser © (2004-08-10 13:38) [3]Чаще (у меня, по крайней мере) - деление на ноль.
← →
Ega23 © (2004-08-10 13:42) [4]Чаще (у меня, по крайней мере) - деление на ноль.
Это не EDivByZero ли случайно?
← →
TUser © (2004-08-10 13:54) [5]Нет. InvalidFlPOp.
← →
Ega23 © (2004-08-10 14:14) [6]Нет. Только что проверил.
Floating point division by zero
← →
Anatoly Podgoretsky © (2004-08-10 14:27) [7]Это когда NAN или INF
← →
ЮрийК © (2004-08-10 15:46) [8]"Это когда NAN или INF"
Это на ассемблере?
← →
Anatoly Podgoretsky © (2004-08-10 15:47) [9]Нет это два предопределенных значения для чисел с плавающей запятой.
← →
ЮрийК © (2004-08-10 16:26) [10]Весь код с плавающими числами (в ДЛЛ) :
в одном месте:
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<nLen1;i++)
str[pStr1[i]]=(BYTE)i;
for (i=0;i<nLen2;i++){
if (pStr1[i]==pStr2[i]) procent+=100;
else
if (str[pStr2[i]]<0xff) procent+=50;
}
return (int)(procent/=maxlen);
Вроде бы ничего такого особенного, чтобы из-за этого вылетало.
← →
Плохиш © (2004-08-10 16:29) [11]
> ЮрийК © (10.08.04 16:26) [10]
А что, сайт уже в "CMAster" переименовали? или с других сайтов с такими вопросами сразу посылают?
← →
ЮрийК © (2004-08-10 17:18) [12]"А что, сайт уже в "CMAster" переименовали? или с других сайтов с такими вопросами сразу посылают?"
Основная прога на дельфи, смотри первое сообщение.
← →
Ega23 © (2004-08-10 17:28) [13]
(nNext - nCur);
чему равно?
Я в сях, конечно, не силён, но что-то вот это мне не нравится:str[pStr1[i]]=(BYTE)i
и вот это:str[pStr2[i]]<0xff
← →
ЮрийК © (2004-08-10 18:04) [14]"(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, результат изменяться не должен (всего лишь).
В сгоседней ветке пишут про перполнение стека, что это может давать ошибку. Может быть в этом и есть проблема?
← →
ЮрийК © (2004-08-10 21:28) [15]Кстати, как можно узнать, что стека не хватило и произошло его переполнение.
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2004.08.29;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.031 c