Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi ständiger Fehler bei einem Array (https://www.delphipraxis.net/98082-staendiger-fehler-bei-einem-array.html)

mitchel 21. Aug 2007 07:31


ständiger Fehler bei einem Array
 
Hi,
habe folgenden Code:
Delphi-Quellcode:
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;
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....

Hat jemand einen Tipp, wo mein Denkfehler ist???

mkinzler 21. Aug 2007 07:51

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?

mitchel 21. Aug 2007 08:46

Re: ständiger Fehler bei einem Array
 
@mkinzler
Danke für den Tipp, aber liegt leider nicht an double....

sirius 21. Aug 2007 08:48

Re: ständiger Fehler bei einem Array
 
Was ist es denn für ein Fehler? Vielleicht EDivideZero?

Luckie 21. Aug 2007 08:49

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.

messie 21. Aug 2007 09:37

Re: ständiger Fehler bei einem Array
 
Mir fällt noch auf, daß
Delphi-Quellcode:
Grenz := trunc(Zoombereich / UmrFaktorFFT)
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.

Grüße, Messie

shmia 21. Aug 2007 09:59

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:
var
  Hilfsarray : array of double;
  ...
  Grenz := trunc(Zoombereich / UmrFaktorFFT);
  SetLength(Hilfsarray, Grenz); // Grösse dynamisch festlegen
Somit ist auch sichergestellt, dass es zu keinem "Index-out-of-Range" Fehler kommen kann.
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