Форум: "Потрепаться";
Текущий архив: 2004.02.10;
Скачать: [xml.tar.bz2];
ВнизСтранная ошибка Найти похожие ветки
← →
cyborg (2004-01-19 14:45) [0]FreePascal 1.10
Выходит ошибка (редко) Invalid floating point operation в таком участке:
var
i,j, tg: LongInt;
x1,y1: LongInt;
a: Real;
X,Y : Real;
TempBombPower : LongInt;
begin
TempBombPower:=16;
//Координаты = от 1 до 64:
X:=(BombSprite^.X+32) shr 6+1;
Y:=(BombSprite^.Y+40) shr 6+1;
tg:=360 shr 3;
for j:=1 to 40 do
begin
for i:=0 to TempBombPower do
begin
a:= j*tg*(pi/180) ;
x1:=Round(x+i*cos(a));// <-Ошибка тут!
y1:=Round(y+i*sin(a));
...
end;
end;
Менял типы переменных, всё бестолку, уже месяц не могу понять чего там нетак :(
← →
PVOzerski (2004-01-19 14:48) [1]Хорошо бы разобраться, глюк ли это FPC или неудачный выбор алгоритма. А если перекомпилировать на Delphi, эта проблема снимается?
← →
cyborg (2004-01-19 15:01) [2]На Дельфи вроде работало раньше нормально, давно всё перенёс на фрипаскаль, поэтому точно сказать не могу, впринципе это объёмный взрыв в моей игре исходник на Дельфи которого можно взять тут:
http://www.cyborghome.ru/index.php?&id=sources
3 килобайта.
Дебагер во фрипаскале неудобный, не посмотреть никак, или я не знаю как нужно правильно им пользоваться.
← →
Ega23 (2004-01-19 15:05) [3]попробуй
x1:=Trunc(Round(x+i*cos(a)));//<-Ошибка тут!
Хотя какая разница???
← →
PVOzerski (2004-01-19 15:17) [4]Описание дебаггера, используемого в FPC, есть на сайте fpc.by.ru. А пока я запустил пример с www.cyborghome.ru из D6 и попытки этак с 5-й получил сообщение об ошибке.
← →
cyborg (2004-01-19 15:39) [5]Там (в том примере) просто нет проверки на выход за границы массива, поэтому следует делать взрыв в середине матрицы, или выходит ошибка Invalid floating point operation?
← →
PVOzerski (2004-01-19 16:10) [6]2 [5]: похоже, что там ошибка связана с выходом за границы массива. Вот что: а просто повыводить на экран или в файл значения переменных перед потенциальной ошибкой с плавающей точкой, вставив writeln в текст программы, нельзя?
← →
cyborg (2004-01-19 18:00) [7]Это будет затруднительно, это игра, вызов данной процедуры происходит несколько сотен раз, если не больше, на уровень. Если при этом писать в файл значения переменных при каждом цикле расчёта !!! ошибка выходит редко, поэтому непонятно в чём дело. Откомпилировал с отладочной информацией, при ошибке указывает на эту строку.
У меня несколько вариантов причин:
1) не очищаютсфя регистры сопроцессора или подобное (глюк работы с сопроцессором);
2) оптимизация машинного кода криво работает;
3) где-то затираются данные переменных, ошибка типа выхода за границы структуры и затирание других данных (вполне возможно, глупая ошибка);
4) переполнение числа (в этом что-то я сомневаюсь, там ошибка другая должна быть)
Run time cheks - при компиляции все пункты включены, ошибка появляется и со включёнными и выключенными данными параметрами компиляции.
Может просто банальная ошибка в функции Round, где нибудь её код можно посмотреть?
← →
PVOzerski (2004-01-19 18:09) [8]>Может просто банальная ошибка в функции Round, где нибудь её код можно посмотреть?
Исходники RTL FreePascal доступны на ftp.freepascal.org.
Хотя дело почти наверняка не в Round. Интересно, а если запихнуть проблемный кусок в блок try .. except и логить только ситуации исключения? Естественно, нужно включть {$mode delphi} или {$mode objfpc}.
← →
cyborg (2004-01-19 18:40) [9]Сейчас попробую, если удастся получить такую ошибку :).
А по поводу исходников, они все в компиляторе есть, я имел ввиду какой файл смотреть?
Сейчас посмотрел source\rtl\i386\msth.inc там их целых две с условной компиляцией, пытался вставить ассамблерную функцию себе в код, да там компилятор на ассамблер ругается, не знает инструкции movw :о/
← →
PVOzerski (2004-01-20 10:25) [10]>Сейчас попробую, если удастся получить такую ошибку :).
Только uses classes добавить не забудь.
> да там компилятор на ассамблер ругается, не знает инструкции movw :о/
а у тебя режим ассемблера часом не Intel выставлен? Тогда поставь перед asm-вставкой {$asmmode ATT}.
← →
cyborg (2004-01-20 22:09) [11]Мда, сделал так с логом (try except), ошибка больше не появляется, хотя возможно всё ещё впереди, пора приобретать бубен ;)
Страницы: 1 вся ветка
Форум: "Потрепаться";
Текущий архив: 2004.02.10;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.009 c