Вверх ↑
Этот топик читают: Гость
Ответов: 1330
Рейтинг: 30
#1: 2022-09-19 13:10:08 ЛС | профиль | цитата
все переменные Single, время от времени в какие либо переменные попадают не верные данные и программа вылетает

все значения перед выполнением этого куска кода проверяются на NaN и на бесконечность, эффекта это не дает, может я что то не вижу или не понимаю, но что тут может быть не так??, может как то можно защитить этот кусок кода



begin
ccX:= (PosX*m1) + (PosY*m5) + (PosZ*m9) + m13;
ccY:= (PosX*m2) + (PosY*m6) + (PosZ*m10) + m14;
ccW:= (PosX*m4) + (PosY*m8) + (PosZ*m12) + m16;

if (ccW › 0.1) then
begin

NDCx:= ccX / ccW;
NDCy:= ccY / ccW;

screenX:= ((windowWidth * 0.5) * NDCx) + (NDCx + (windowWidth * 0.5));
screenY:= -((windowHeight * 0.5) * NDCy) + (NDCy + (windowHeight * 0.5));

sqrtif:=(sqr(PosXm-PosX))+(sqr(PosYm-PosY))+(sqr(PosZm-PosZ));
if (sqrtif › 0) then vd:=sqrt(sqrtif) / 100;

if ( (screenX ‹ windowWidth) and (screenY ‹ windowHeight) and (screenX › 0) and (screenY › 0) ) then
begin
_onEvent(onScreenX, screenX);
_onEvent(onScreenY, screenY);
_onEvent(onMeter, vd);
_onEvent(onVis);
end;
end;

end;
карма: 2

0
vip
#1.1контекстная реклама от партнеров
Ответов: 8782
Рейтинг: 816
#2: 2022-09-19 14:44:55 ЛС | профиль | цитата
Rysik, наверное ваши вычисления проводятся в цикле и когда вот это условие вывода не выполняется
----------------------------
if ( (screenX ‹ windowWidth) and (screenY ‹ windowHeight) and (screenX › 0) and (screenY › 0)) then
begin
_onEvent(onScreenX, screenX);
_onEvent(onScreenY, screenY);
_onEvent(onMeter, vd);
_onEvent(onVis);
end else Exit;
------------------------------
вычисления продолжаются до переполнения вашего Single.
Попробуйте обозначить этот момент (в коде жирным шрифтом)
карма: 18

0
Ответов: 1330
Рейтинг: 30
#3: 2022-09-22 10:47:40 ЛС | профиль | цитата
Леонид писал(а):
Rysik, наверное ваши вычисления проводятся в цикле и когда вот это условие вывода не выполняется
----------------------------
if ( (screenX ‹ windowWidth) and (screenY ‹ windowHeight) and (screenX › 0) and (screenY › 0)) then
begin
_onEvent(onScreenX, screenX);
_onEvent(onScreenY, screenY);
_onEvent(onMeter, vd);
_onEvent(onVis);
end else Exit;
------------------------------
вычисления продолжаются до переполнения вашего Single.
Попробуйте обозначить этот момент (в коде жирным шрифтом)


Избежать этого можно заключением этого куска кода в функцию?
Или просто для каждого if нужен else?
карма: 2

0
Ответов: 8782
Рейтинг: 816
#4: 2022-09-22 13:10:27 ЛС | профиль | цитата
Rysik, ну откуда же я могу знать, вернутся ваши точки в пределы экрана или продолжат путешествие к Альфа Центавра
Rysik писал(а):
для каждого if нужен else?
Нет, конечно, это решает программист, размышляя к чему приведёт не выполнение условия.
карма: 18

0
4
Сообщение
...
Прикрепленные файлы
(файлы не залиты)