Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.02.10;
Скачать: CL | DM;

Вниз

Странная ошибка   Найти похожие ветки 

 
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;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.016 c
7-29641
ychenick
2003-11-04 17:28
2004.02.10
Помогите с LPT портом


7-29620
Иван
2003-11-27 10:51
2004.02.10
Мобильный телефон


1-29433
Maxximusss
2004-01-31 12:06
2004.02.10
Smart use SaveDialog


1-29376
Grinder
2004-01-30 23:13
2004.02.10
Рисование на border


3-29204
Жбан
2004-01-20 12:33
2004.02.10
Как подсчитать количество записей в базе?