Dodawanie Extended - Invalid floating point operation

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:

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:prawie 19 lat
  • Ostatnio:14 dni
  • Postów:819
0

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

KA
  • Rejestracja:prawie 20 lat
  • Ostatnio:około 8 godzin
  • 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.


Nie odpowiadam na PW w sprawie pomocy programistycznej.
Pytania zadawaj na forum, bo:
od tego ono jest ;) | celowo nie zawracasz gitary | przeczyta to więcej osób a więc większe szanse że ktoś pomoże.
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
Moderator Delphi/Pascal
  • Rejestracja:ponad 13 lat
  • Ostatnio:około 10 godzin
  • Lokalizacja:Tuchów
  • Postów:12171
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.


Pracuję nad własną, arcade'ową, docelowo komercyjną grą z gatunku action/adventure w stylu retro (pixel art), programując silnik i powłokę gry od zupełnych podstaw, przy użyciu Free Pascala i SDL3. Więcej informacji znajdziesz na moim mikroblogu.
edytowany 1x, ostatnio: flowCRANE
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.