Witam wszystkich
Pisząc program „utknąłem” na określonym problemie: Jeżeli wprowadzę poprawne dane do algorytmu obliczeń wówczas wszystko jest ok., jednak jeżeli wprowadzę błędne dane wówczas zdarza się, że program zwiesza komputer i pozostaje wyłącznie reset.
Niestety nie potrafię stwierdzić w czym jest błąd. Podejrzewam, że Delphi nie radzi sobie z obsługą bardzo małych liczb (a na takich algorytm operuje).
Poniżej zamieszczam skróconą procedurę (a raczej szkielet jak to mniej więcej wygląda bo kod jest długi), która jest odpowiedzialna za „wykrzaczanie” się programu:
procedure TPrzeklTechn.FillParamDRot;
begin
// wypełnienie macierzy parametrów dla DRoT
try
// obliczenia według 1 lub 2 wariantu
FreeDRotArray; // wyczyszczenie tablicy (procedura)
for IDR := 1 to 3 do // pętla dla wpisu do poszczególnych tablic
begin
repeat
try
// dane obliczane są wg następującego schematu:
// wariant 1
AlfaTp2:=GetAlfaTP2(DeltaRo);
// wariant 2
AlfaTp2:=ArcSin(Sin(BetaB0)/Cos(AlfaWn))};
// na końcu obliczeń następuje wpis do tablicy dynamicznej
except // w przypadku wystąpienia błędu nic nie rób - nie wpisuj danych do tablicy
end;
until (fMinAlfaWn+(I)*fPrecision) > fMaxAlfaWn;
end;
except
raise EAbortError.Create('');
end;
end;
// jeżeli dane są obliczane na podstawie warinatu 2 (czyli wg funkcji) wówczas jest ona deklarowana następująco:
function GetAlfaTp2(DeltaRo: real):real;
begin
try
Result:=ArcTan(Cos(ArcSin(BZ/Cos(Alf[J])))*Tan(A[J]));
if IsNan(Result) then raise EAbortError.Create('');
except
raise EAbortError.Create('');
end;
end;
Gdzie może tkwić błąd? Wydaje mi się, że w momencie wystąpienia błędu jest on przechwytywany więc dlaczego zwiesza się komputer? Czy rzeczywiście nie radzi sobie z funkcjami typu ArcSin(ArcTan(Tan(x)))?
Za zwieszanie na pewno nie jest odpowiedzialne wpisywanie do tablicy dynamicznej, bo gdy nie wpisuję to również się zwiesza. Na pewno też pętla repeat .. until się kończy jak i inne pętle.
Z drugiej strony na pewno ta funkcja jest odpowiedzialna za zwieszanie bo gdy ją wyłączę wówczas wszystko działa ok. Być może coś robię nie tak. Jeżeli to coś zmienia to funkcja jest wewnątrz obiektu (tzn. tworzę obiekt, który później w programie będę używać).
Pozdrawiam i z góry dzięki za wszelkie sugestie.
Rav