Dodawanie Extended - Invalid floating point operation

Dodawanie Extended - Invalid floating point operation
  • Rejestracja: dni
  • Ostatnio: dni
0

Witam.
Wywala mi Exception class EInvalidOp with message 'Invalid floating point operation'
i teraz nie wiem czemu nie mogę wykonać akcji X:=X+Scores.Score[I];
funkcja wygląda tak:

Kopiuj
type TScore = record
 Score: array of Extended;
end;
...
function CalcScore(Scores:TScore):String;
var
 I:Byte;
 X:Extended;
begin
 for I:=1 to High(Scores.Score) do begin
  X:=X+Scores.Score[I];
 end;
end;

próbowałem dodać zmienną pomocniczą Y

Kopiuj
  Y:=X+Scores.Score[I];
  X:=Y;

Ale to nie pomaga bo wywala się na X:=Y; z takim samym komunikatem :(
Czy może mnie ktoś to wytłumaczyć?

pelsta
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 819
0

Wyzeruj x przed pętlą.
Elementy tablicy dynamicznej indeksujemy od 0 nie od 1

KA
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Gorlice
0

Na dzień dobry to popraw funkcje CalcScore bo po pierwsze X jest nie ma przypisanej początkowej wartości a po drugie tablice dynamiczne zawsze indeksowane są od 0 a nie 1no i skoro to funkcja czemu nic nie zwraca?
A jak dalej będzie błąd to od czego masz debbuger, watches i inne zabawki podglądaj wartości zmiennych to zobaczysz co się dzieje bo jak poprawisz to o czym pisałem kod będzie teoretycznie poprawny (no jeszcze czy High(Scores.Score) nie jest większe niż 255 inaczej I nie moze być typu Byte) przy przekroczeniu zakresu Extended chyba by był inny błąd.

  • Rejestracja: dni
  • Ostatnio: dni
0

Dzięki, jak powiedziałeś o wyzerowaniu X pomyślałem by sprawdzić jakie dane wpadają z tablicy okazało się że procedura, która liczyła mi czas operacji była za słaba, było w niej Sleep(1) to zwracała wartości większe od 0 ale jak usunąłem to już Now() z TimeBegin i TimeEnd było takie same :( milisekundy to za duża jednostka :D
Co do funkcji 0wy element jest pusty więc nie biorę go pod uwagę i pomijam, i dałem byte bo ilość nie przekracza 10 elementów nie zwraca nic bo nie skończyłem pisać :D
Jeszcze raz dzięki za pomoc.

flowCRANE
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Tuchów
  • Postów: 12269
0
kAzek napisał(a)

przy przekroczeniu zakresu Extended chyba by był inny błąd.

Byłby błąd: EOverflow - Floating point overflow;

hzmzp napisał(a)

Dzięki, jak powiedziałeś o wyzerowaniu X pomyślałem by sprawdzić jakie dane wpadają z tablicy okazało się że procedura, która liczyła mi czas operacji była za słaba, było w niej Sleep(1) to zwracała wartości większe od 0 ale jak usunąłem to już Now() z TimeBegin i TimeEnd było takie same :( milisekundy to za duża jednostka :D

Do precyzyjnego mierzenia można wykorzystać QueryPreformanceCounter i QueryPerformanceFrequency - w Google jest pełno przykładów, choćby ten z Delphi.About.com - How to Accurately Measure Elapsed Time Using High-Resolution Performance Counter.

  • Rejestracja: dni
  • Ostatnio: dni
0

Fajnie wszystko, użyłem QueryPerformanceFrequency i QueryPerformanceCounter Dzięki wielkie za pomoc

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.