Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Потрепаться";
Текущий архив: 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
3-29227
qwe
2004-01-19 20:06
2004.02.10
execute statement


1-29451
Evgeny78
2004-01-30 13:05
2004.02.10
Правая кнопка мыши


4-29660
sizmrebi
2003-12-05 09:04
2004.02.10
Registry Update


1-29404
axx
2004-01-31 13:28
2004.02.10
Вопрос по VCLZip


1-29429
iosafat
2004-01-31 12:27
2004.02.10
Как обнаружить прокрутку RichEdit?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский