Dodawanie Extended - Invalid floating point operation

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:

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

  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ć?

0

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

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.

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.

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.

0

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

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