Debugger und Range Check Error

Für Fragen rund um die Ide und zum Debugger
Antworten
Epcop
Beiträge: 159
Registriert: Di 29. Mai 2012, 09:36

Debugger und Range Check Error

Beitrag von Epcop »

Hallo,

ich bin dabei ein Programm zu schreiben.

Dabei habe ich zwei verschachtelte Schleifen verwendet. Die äußeren Schleife durchläuft ein Array, die innere Schleife durchläuft auch ein Array und vergleicht mit dem anderen Array (dient zum zählen bestimmter Zeichen).

Wenn ich bei Lazarus (1.2.4) nun unter Projekteinstellungen / Debuggen die Sechs Häkchen bei Überprüfungen weg mache, läuft alles so wie es soll. Wenn ich sie rein tue, dann erhalte ich einen Error "Range Check Error".

Ich verstehe nur nicht warum, das ist doch unlogisch?

Läge wirklich ein Range Check Error vor, dann würde der Error doch auch ohne die Überprüfung des Debuger erscheinen, oder?!?

LG
Epcop

Michl
Beiträge: 2511
Registriert: Di 19. Jun 2012, 12:54

Re: Debugger und Range Check Error

Beitrag von Michl »

Kannst du etwas Code dazu zeigen?

Code: Alles auswählen

type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection;  

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6782
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: Debugger und Range Check Error

Beitrag von af0815 »

Nein, ohne Rangecheck kann es sein das du unbemerkt auf Speicherbereich ausserhalb der Grenzen zugreifst. Deshalb unbedingt herausfinden warum der Rangecheck anspricht.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

Epcop
Beiträge: 159
Registriert: Di 29. Mai 2012, 09:36

Re: Debugger und Range Check Error

Beitrag von Epcop »

Hier ist die funktion, das unnötige hab ich entfernt wegen der Übersicht und sind nur ein paar replace wegen optimierungen gewesen.

Code: Alles auswählen

 
 
function tokenizer(no_ges:string): TStringList;
var
  token, temp: string;
  i, a, txt_laenge, schleife_exit: integer;
  token_list: TStringList;
  trennzeichen: array[1..9] of string = (' ', '{', '}', '(', ')', '?', '!', '$', '#');
begin
 
    // hier sind noch einige optimierungen vor dem zerlegen, f. spätere verarbeitung [...]
 
 
    // === erstellen start
    txt_laenge := length(no_ges);
    token_list := TStringList.Create;
    schleife_exit := 0;
    token := '';
    if txt_laenge > 1 then
    begin
      for i := 0 to txt_laenge do
      begin //no_ges durchgehen / Eingangstext durchgehen
        schleife_exit := 0;
 
        for a := 1 to 9 do // Anzahl Trennzeichen
        begin //Trennzeichen durchgehen
          if no_ges[i] = trennzeichen[a] then  // HIER IST DER FEHLER???!!!  Derzeit als RunError 201   (bzw. der "Range Check Error") ABER warum???
          begin
            temp := no_ges[i];
 
            if trim(token) <> '' then
            begin
              token_list.add(trim(token));
            end;
            if trim(temp) <> '' then
            begin
              token_list.add(no_ges[i]);
            end;
            token := '';
            schleife_exit := 1;
            break;
          end;
        end;
        if schleife_exit = 1 then
        begin
          continue;
        end;
        token := token + no_ges[i];
 
      end;  // for
    end; // if
    result := token_list;
    token_list.Free;
end;    
 
 

shokwave
Beiträge: 475
Registriert: Do 15. Nov 2007, 16:58
OS, Lazarus, FPC: Win11/Ubuntu Budgie (L 3.0 FPC 3.2.2)
CPU-Target: i386, x64
Wohnort: Gera

Re: Debugger und Range Check Error

Beitrag von shokwave »

Hi,

ich glaube der Fehler liegt weiter oben:

Code: Alles auswählen

txt_laenge := length(no_ges);
...
  for i := 0 to txt_laenge do
  ...
   if no_ges[i] = trennzeichen[a]
mfg Ingo

wp_xyz
Beiträge: 5153
Registriert: Fr 8. Apr 2011, 09:01

Re: Debugger und Range Check Error

Beitrag von wp_xyz »

Woher soll ich jetzt wissen, was "no_ges" ist? Falls es ein String ist, hat das erste Zeichen den Index 1, nicht 0 (abweichend von der üblichen Konvention bei dynamischen Arrays).

Epcop
Beiträge: 159
Registriert: Di 29. Mai 2012, 09:36

Re: Debugger und Range Check Error

Beitrag von Epcop »

vielen Dank das war der Fehler. 1 Statt 0. Ui dieser fehler ist mir im restlichen Code nochmal unterlaufen. Kein Wunder dass es nicht völlig Reibungslos geklappt hat...

no_ges ist der Text (string) der an die Funktion gegeben wird. Welcher Text genau das ist weiß ich nicht da er vom Benutzer kommt.

danke nochmal

LG
Epcop

Bitschubser
Beiträge: 61
Registriert: Mo 27. Aug 2012, 15:43

Re: Debugger und Range Check Error

Beitrag von Bitschubser »

noch ein Tipp -
sowas:

Code: Alles auswählen

var
[...]
  trennzeichen: array[1..9] of string = (' ', '{', '}', '(', ')', '?', '!', '$', '#');
[...]
        for a := 1 to 9 do // Anzahl Trennzeichen
[...]
 
würde ich immer entweder so:

Code: Alles auswählen

const
  MaxTrennZeichen = 8;
 
var
[...]
  trennzeichen: array[0..MaxTrennZeichen ] of string = (' ', '{', '}', '(', ')', '?', '!', '$', '#');
[...]
        for a := 0 to MaxTrennZeichen  do // Anzahl Trennzeichen
[...]
 
oder so machen:

Code: Alles auswählen

var
[...]
  trennzeichen: array[1..9] of string = (' ', '{', '}', '(', ')', '?', '!', '$', '#');
[...]
        for a := Low(trennzeichen) to High(trennzeichen)  do // Anzahl Trennzeichen
[...]
 
Spätestens wenn zwischen Deklaration und Schleife mal 10000 Programmzeilen oder 3 geschachtelte Includes liegen wird klar warum man lieber ein paar Buchstaben mehr tippt und dem Kompiler das Nachzählen überläßt...

Antworten