![]() |
ständiger Fehler bei einem Array
Hi,
habe folgenden Code:
Delphi-Quellcode:
Es soll ein Vergleich zwischen 2 Kurven sattfinden (DATAFFTai1 und DATAFFTai0). Bei einem kleinen Zoombereich funktioniert das auch ganz gut, jedoch kommt bei größeren Werten immer die Fehlermeldung "ungültiger Gleitkommaüberlauf". Ist für mich unverständlich, da das Hilfsarray nur so um die 50 Werte beinhaltet....
procedure TForm1.Button20Click(Sender: TObject);
var Grenz, i: Integer; fl: double; fn: double; NormValue: double; s: string; Summe: double; Hilfsarray : array[0..32768] of double; s2: string; begin UmrFaktorFFT := tA/Zoombereich; //ta = 10000 Str(UmrFaktorFFT:2:2,s2); form1.label26.caption := s2; if Zoombereich < 2100 then begin form1.panel5.caption := ('nicht def'); showmessage('Zoombreich kleiner 2100 ms gewählt!' +#13+ 'Keine Berechnung bis 20Hz möglich!'); end else begin fl := UmrFaktorFFT; Grenz := trunc(Zoombereich / UmrFaktorFFT); fn := StrToInt(form1.Edit1.Text) - (2*fl); if form1.ComboBox2.ItemIndex = 0 then //Kanal 1 -> Kanal 2 begin Summe := 0; for i := 2 to Grenz-1 do begin Hilfsarray[i] := abs(1-(DATAFFTai0[i] / DATAFFTai1[i]))*fl; //Hier kommt Fehler Summe := Summe + Hilfsarray[i]; end; NormValue := 0; for i:= 2 to Grenz do NormValue := Summe * (1-(1/fn))*100; Str(NormValue:2:2,s); form1.panel5.caption := s + ' %'; end; end; end; Hat jemand einen Tipp, wo mein Denkfehler ist??? |
Re: ständiger Fehler bei einem Array
das Problem liegt auch eher an dem Werten, welche wohl den Wertebereich verletzen. Schon mit extended statt double versucht?
|
Re: ständiger Fehler bei einem Array
@mkinzler
Danke für den Tipp, aber liegt leider nicht an double.... |
Re: ständiger Fehler bei einem Array
Was ist es denn für ein Fehler? Vielleicht EDivideZero?
|
Re: ständiger Fehler bei einem Array
Die Fehlermeldung sagt es doch schon: Die Zahklen werden zu groß für den Datentyp. Das hat nichts mit der Größe des Arrays zu tun bzw. der Anzahl der Elemente in dem Array.
|
Re: ständiger Fehler bei einem Array
Mir fällt noch auf, daß
Delphi-Quellcode:
nicht geprüft wird, Du greifst aber damit auf ein array zu, was nicht größer als 32768 sein kann. Wenn dieser Fall eintreten würde, könntest Du die verschiedensten Fehler erzeugen, je nachdem was da im Speicher steht und wem der Speicher gehört.
Grenz := trunc(Zoombereich / UmrFaktorFFT)
Grüße, Messie |
Re: ständiger Fehler bei einem Array
Es so grosses Array (32768 * 8 = 256 kb) sollte man nicht auf dem Stack sondern dynamisch auf dem Heap anlegen.
Delphi-Quellcode:
Somit ist auch sichergestellt, dass es zu keinem "Index-out-of-Range" Fehler kommen kann.
var
Hilfsarray : array of double; ... Grenz := trunc(Zoombereich / UmrFaktorFFT); SetLength(Hilfsarray, Grenz); // Grösse dynamisch festlegen Folgende Zeilen machen IMHO keinen Sinn:
Delphi-Quellcode:
NormValue := 0; // wozu auf 0 setzen, wenn die Variable später geändert wird ?
// warum wird die Variable NormValue x-Mal mit dem gleichen Wert befüllt ? // Summe * (1-(1/fn))*100 ist eine Konstante, da nicht abhängig von Laufvariable i for i:= 2 to Grenz do NormValue := Summe * (1-(1/fn))*100; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:34 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz