Obsługa błędów i małe liczby

0

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

0

Zernij do pomocy do opisu funkcji trygonometrycznych. Parametrami sa Extended a nie Real. Tam wlasnie tracisz dokladnosc.

0

Nie za bardzo rozumiem. Mam rozumieć, że komputer zwiesza się przez to, że funkcje trygonometryczne są liczone mniej dokładnie?

0

W której lini dokładnie wywala błąd? I coś dziwna ta funkca "GetAlfaTp2(DeltaRo: real):real;" bo DeltaRo w ogóle nie jest użyte (chyba że to tylko fragment). Debugujesz to bo z twojego wywodu...<BR>

0

OK masz rację DeltaRo nie występuje w tej funkcji - po prostu jak skracałem kod to wziąłem nie ten nagłówek. Obliczenia są dłuugie więc nie przytaczam całego kodu.
Ale nie o to mi chodzi - chodzi mi czy ta konstrukcja rzeczywiście nie posiada błędów (według mnie przejmuję wszystkie komunikaty o błędach i je obsługuję).
Co do debugowania - błąd nie pojawia się w żadnej linii - dlatego że pojawia się niebieski ekran i już nic nie zrobisz zero reakcji na cokolwiek. To co mnie zastanawia to to, że zawsze pojawia się wówczas ten niebieski ekran z błędem 015F: BFF2B115. Co ciekawe nie robi tego zawsze tzn. czasem program działa bez żadnych przeszkód a czasem ... tylko reset.

0

obsługa błedów przechodzi przez windę, jak win sobie nie poradzi, coś pójdzie nie tak to twoje except nie zadziała (tak mi sie wydaje -WIN32 help- Exception Handling). Musisz wiedzieć jakie wartości generują bład i gdzie. Z tego co piszesz to program może działac cały dzień i wszystko będzie ok, więc może przed feralnym kodem zapisywać znaczące dane do pliku żeby wiedzieć na czym to się wykłada, i przetestowć ostatnie dane. (Możesz też rozpisać tego tasiemca SinCosTan.. na pojedyńcze linie i stepover wtedy będziesz wiedział która f. tryg. psuje jeśli problemem jest funkcja tryg.) Przyczyn może być wiele- może coś z debugerem -spróbuj uruchomić program poza Delphi. To tylko sugestie i pewnie niewiele pomogłem ... trzeba spróbować różnych rzeczy.

1 użytkowników online, w tym zalogowanych: 0, gości: 1