Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - Fehler bei Bereichsprüfung


Krischa - Mo 08.06.09 09:44
Titel: Fehler bei Bereichsprüfung
Hi,
mein Program zeigt mir beim Testen die Fehlermeldung 'Fehler bei Bereichsprüfung' an. Ich kann aber kein Fehler feststellen. Wenn ich das Programm Zeile für Zeile durchlaufe kommt an der Stelle der Fehler.

Delphi-Quelltext
1:
2:
3:
4:
5:
case stsa of                                                        //
  0:stsa:=query3.fieldbyname('MW0').Value;                          //
  1:stsa:=query3.fieldbyname('MW1').Value;                          //
  2:stsa:=query3.fieldbyname('MW2').Value;                          //
end;


stsa hat den Wert 2 und die Felder die ich auslese sind auch nicht leer. Was soll ich aus der Fehlermeldung schließen?


jaenicke - Mo 08.06.09 09:47

Die Fehlermeldung besagt normalerweise, dass die Grenzen beim Zugriff auf ein Array überschritten wurden.

Bei einem Datenbankzugriff kenne ich den Fehler nicht, ich weiß nicht wodurch der an der Stelle verursacht werden kann. Aber ich vermute einmal, dass die Felder vielleicht nicht gefunden werden. :gruebel:


oki - Mo 08.06.09 09:58

Du machst ein case auf stsa und weist in der Case-Anweisung stsa einen Wert zu? Könnte das der Fehler sein? Hab ich so nocht nicht ausprobiert.

Gruß oki


Krischa - Mo 08.06.09 10:06

Daran liegt es nicht. Habe das Programm noch 2 mal durchlaufen lassen und auf einmal ist er an der Stelle nicht mehr hängen geblieben sonder ein paar Zeilen weiter.


Delphi-Quelltext
1:
2:
3:
4:
5:
if prod[j].steuabw=true then
begin
  h1:=StringReplace(floattostr(prod[i].steu),',','.',[rfReplaceAll, rfIgnoreCase]);
  nachricht := nachricht + slinebreak + 'TAX+7+VAT+++:::' +h1 + #39; nz := nz + 1;
end;


Wenn prod[j].steuabw false ist macht er keine Probleme aber sobal einmal ein true auftaucht bringt er mir die gleiche Fehlermeldung wie oben 'Fehler bei Bereichprüfung' ERangeError. Die Fehlermeldung kommt schon bei der Überprüfung.
Ich verstehe die Welt nicht mehr :(


jaenicke - Mo 08.06.09 10:27

An der Stelle wäre das prod[j] der wahrscheinlichste Kandidat, bist du sicher, dass j nicht über den Bereich hinauslaufen kann?

Eine andere Möglichkeit wäre ein Speicherfehler, d.h., dass du irgendwo Speicher überschrieben hast, und daher irgendwo anders pseudozufällig Fehler auftreten.

user profile iconKrischa hat folgendes geschrieben Zum zitierten Posting springen:

Delphi-Quelltext
1:
if prod[j].steuabw=true then                    
Dazu dann noch der Standardhinweis:
Der Vergleich mit Booleanwerten (z.B. if x = true then) ist nicht nur unschön und unlogisch, sondern falsch.
Hier habe ich mal ein kleines Beispiel gebastelt, wann es schief geht:
http://www.delphi-forum.de/viewtopic.php?p=548760#548760
Mehr dazu steht hier unter Anfängerfehler:
http://www.delphi-treff.de/tutorials/objectpascal/programmierung-mit-boolean-werten/page/4/
Und warum das auch vollkommen unlogisch ist:
http://www.delphi-forum.de/viewtopic.php?p=560637#560637


oki - Mo 08.06.09 10:29

prod[i]?
gibt es das Arrayfeld mit dem Index i in prod?

[edit] Hmmm :?: da war kein roter Kasten [/edit]


der organist - Mo 08.06.09 10:30

user profile iconKrischa hat folgendes geschrieben Zum zitierten Posting springen:
Daran liegt es nicht. Habe das Programm noch 2 mal durchlaufen lassen und auf einmal ist er an der Stelle nicht mehr hängen geblieben sonder ein paar Zeilen weiter.


Delphi-Quelltext
1:
2:
3:
4:
5:
if prod[j].steuabw=true then
begin
  h1:=StringReplace(floattostr(prod[i].steu),',','.',[rfReplaceAll, rfIgnoreCase]);
  nachricht := nachricht + slinebreak + 'TAX+7+VAT+++:::' +h1 + #39; nz := nz + 1;
end;


Wenn prod[j].steuabw false ist macht er keine Probleme aber sobal einmal ein true auftaucht bringt er mir die gleiche Fehlermeldung wie oben 'Fehler bei Bereichprüfung' ERangeError. Die Fehlermeldung kommt schon bei der Überprüfung.
Ich verstehe die Welt nicht mehr :(


sicher dass das i nich über die Grenzen geht, wenn eigentlich ein j gemeint ist?


Krischa - Mo 08.06.09 10:37

Ahhhh,
ich sollte nicht so früh mit Porgrammieren anfangen. Es lag am j was eigentlich ein i sein müsste. *schlafen geh* :shock: