Range Check

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut
Antworten
Benutzeravatar
fliegermichl
Lazarusforum e. V.
Beiträge: 1650
Registriert: Do 9. Jun 2011, 09:42
OS, Lazarus, FPC: Lazarus Fixes FPC Stable
CPU-Target: 32/64Bit
Wohnort: Echzell

Range Check

Beitrag von fliegermichl »

Moin,

ich habe jetzt stundenlang nach einem Fehler gesucht.
Ich habe ein Array of Record mit verschiedenen Werten zu den installierten Druckern.
In meinem Programmoptionen Formular befülle ich daraus einige Eingabeelemente.

Code: Alles auswählen

procedure TProgrammoptionenForm.SpinChange(Sender: TObject);
begin
 with Anwender.PrinterSettings[Printername.ItemIndex] do
 begin
   OffsetLeft   := SpinEdit1.Value;
   OffsetTop    := SpinEdit2.Value;
   OffsetRight  := SpinEdit3.Value;
   OffsetBottom := SpinEdit4.Value;
 end;
end;
Dabei ist Printername eine Combobox mit Style csDropDownList.
Wie man im Code sehen kann, habe ich keine Prüfung drin, ob da überhaupt Einträge drin stehen.
Am Anfang der Prozedur sind in dem Array Anwender.PrinterSettings 5 Einträge enthalten.
Danach nur noch einer und beim beenden des Programmes kam es zusätzlich noch zu einer Exception mit Zugriffsverletzung.

Hätte ich gleich den Range Check eingeschaltet, wäre hier eine Exception ausgelöst worden und ich hätte mir die lange Fehlersuche gespart.
Nur mal so als Tip.

Benutzeravatar
Zvoni
Beiträge: 396
Registriert: Fr 5. Jul 2024, 08:26
OS, Lazarus, FPC: Windoof 10 Pro (Laz 2.2.2 FPC 3.2.2)
CPU-Target: 32Bit
Wohnort: BW

Re: Range Check

Beitrag von Zvoni »

Immer wenn ich mit "dynamischen" Arrays arbeite, verteidige ich mich von vorneherein gegen ungültige Zugriffe.
Range-Checks habe ich ganz selten an, da ich mir defensives Programmieren von Anfang an angewöhnt habe

In deinem Fall

Code: Alles auswählen

procedure TProgrammoptionenForm.SpinChange(Sender: TObject);
begin
 If (Printername.ItemIndex>-1) And (Length(Anwender.PrinterSettings)>0) 
   And (Printername.Items.Count<=(Length(Anwender.PrinterSettings))
   Then Begin
 	with Anwender.PrinterSettings[Printername.ItemIndex] do
 	begin
   	OffsetLeft   := SpinEdit1.Value;
   	OffsetTop    := SpinEdit2.Value;
   	OffsetRight  := SpinEdit3.Value;
   	OffsetBottom := SpinEdit4.Value;
 	end;
   End;
end;
"Ist überhaupt ein Eintrag in der Combobox ausgewählt?"
"Sind überhaupt Einträge im Array?"
"Ist die Anzahl Einträge in der ComboBox kleiner/gleich der Einträge im Array?"

In beiden Fällen wird vorausgesetzt dass der erste Index 0 ist
Ein System sie alle zu knechten, ein Code sie alle zu finden,
Eine IDE sie ins Dunkel zu treiben, und an das Framework ewig zu binden,
Im Lande Redmond, wo die Windows drohn.

Benutzeravatar
theo
Beiträge: 10921
Registriert: Mo 11. Sep 2006, 19:01

Re: Range Check

Beitrag von theo »

Oder mit anderen Worten: Range Check einschalten ist gut, Hirn einschalten ist aber auch nicht schlecht... :lol:

Benutzeravatar
Zvoni
Beiträge: 396
Registriert: Fr 5. Jul 2024, 08:26
OS, Lazarus, FPC: Windoof 10 Pro (Laz 2.2.2 FPC 3.2.2)
CPU-Target: 32Bit
Wohnort: BW

Re: Range Check

Beitrag von Zvoni »

theo hat geschrieben: Mi 26. Feb 2025, 11:02 Oder mit anderen Worten: Range Check einschalten ist gut, Hirn einschalten ist aber auch nicht schlecht... :lol:
Oder in anderen Worten: wenn ich ins Auto steige, und weiss, dass ich 800 Km fahren muss, dann schaue ich halt vor der Abfahrt auf die Tankanzeige, ob die "Range" ausreichend ist :mrgreen:
Ein System sie alle zu knechten, ein Code sie alle zu finden,
Eine IDE sie ins Dunkel zu treiben, und an das Framework ewig zu binden,
Im Lande Redmond, wo die Windows drohn.

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6848
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: Range Check

Beitrag von af0815 »

Ich schalte zum Programmieren generell alle Dugfunktionen ein = Debugmodus. Im Release sind die deaktivert. Geht super über die Compilemodes. Die Modes erstelle ich immer gleich, nach dem Erzeugen des Projekts, ist für mich über die Jahre komplett verinnerlicht.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

Mathias
Beiträge: 6955
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: Range Check

Beitrag von Mathias »

Ich schalte zum Programmieren generell alle Dugfunktionen ein = Debugmodus. Im Release sind die deaktivert. Geht super über die Compilemodes. Die Modes erstelle ich immer gleich, nach dem Erzeugen des Projekts, ist für mich über die Jahre komplett verinnerlicht.
Da bin ich eher ein Banause, ich schalte alles aus, um möglichst viel Power zu bekommen.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6848
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: Range Check

Beitrag von af0815 »

Mathias hat geschrieben: Mi 26. Feb 2025, 13:00
Ich schalte zum Programmieren generell alle Dugfunktionen ein = Debugmodus. Im Release sind die deaktivert. Geht super über die Compilemodes. Die Modes erstelle ich immer gleich, nach dem Erzeugen des Projekts, ist für mich über die Jahre komplett verinnerlicht.
Da bin ich eher ein Banause, ich schalte alles aus, um möglichst viel Power zu bekommen.
Das ist ja kein Problem, man kann ja mit knapp einem Klick ja umschalten. Zwischen Sicherheit und Power. Dafür sucht man sich nicht dämlich auf der falschen Stelle, wenn man mal was vergisst und heaptrace sagt einem, ob man alles sauber hinbekommen hat. Oder ob da Leichen im Code herumgammeln.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

Antworten