Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   FreePascal Kommischer ERange Error (https://www.delphipraxis.net/171593-kommischer-erange-error.html)

PhilmacFLy 14. Nov 2012 10:49

Delphi-Version: 5

Kommischer ERange Error
 
Min DP'ler

Bin grad am programmieren mit Lazarus und bin dabei auf folgendes Problem gestoßen:
Ich bekomme einen ERange Error bei folgender anweisung:
Delphi-Quellcode:
  foo := code[i];
    l := high(changefuncs);
    for k := 0 to l do
    begin
      if (pos(changefuncs[k].Name, foo) > 0) and not newfunc and not //hier kommt der Fehler
        kommentar then
      begin
        while (pos('(', code[j]) = 0) or (pos(');', code[j]) > 0) or
          (pos('if', code[j]) > 0) do
          j := j - 1;
        loadfunc(newfunc, j, tmp, code);
      end;
    end;
und ich hab keine idee woran das liegt, weil ich geh doch nur bis high(changefuncs)
btw: Changefuncs ist vom type state und state ist:
Delphi-Quellcode:
type
  state = record
    startline: integer;
    endline: integer;
    Name: string [30];
  end;
Kann mir da jemand helfen, weil ich keine Idee hab.

uligerhardt 14. Nov 2012 11:10

AW: Kommischer EERange Rror Zugriffsverletzung
 
Zitat:

Zitat von PhilmacFLy (Beitrag 1191092)
btw: Changefuncs ist vom type state

Eher
Delphi-Quellcode:
array ??? of state
, oder?

Schreib doch die Schleife einfach so:
Delphi-Quellcode:
    for k := Low(changefuncs) to High(changefuncs) do

PhilmacFLy 14. Nov 2012 11:54

AW: Kommischer EERange Rror Zugriffsverletzung
 
Ja array of state.

Habs ausgetauscht, aber selber Fehler.

uligerhardt 14. Nov 2012 12:06

AW: Kommischer EERange Rror Zugriffsverletzung
 
Zitat:

Zitat von PhilmacFLy (Beitrag 1191102)
Ja array of state.

Delphi-Quellcode:
array of state
? Oder
Delphi-Quellcode:
array[...] of state
? Kopier doch einfach mal die relevanten Deklarationen in deinen Ursprungspost.

Uwe Raabe 14. Nov 2012 12:08

AW: Kommischer EERange Rror Zugriffsverletzung
 
Wo wird j initialisiert?

PhilmacFLy 14. Nov 2012 12:18

AW: Kommischer EERange Rror Zugriffsverletzung
 
Wesentlich weiter oben, ich post mal den ganzen funktions code:
Delphi-Quellcode:
function TForm1.extractfuncs(var statevar: string; const endswitch: integer;
  code: TStrings): boolean;
var
  kommentar: boolean;
  newfunc: boolean;
  k: integer;
  j, i, l: integer;
  tmp: integer;
  Count, count2: integer;
  foo: string;
begin
  Count := 0;
  count2 := 0;
  tmp := 0;
  Result := False;
  //showmessage(inttostr(endswitch));
  for i := endswitch to code.Count do
    (*Für alle Zeilne vom letzten Status bis ende des Files*)
  begin
    if i = 2091 then
      sleep(1);
    newfunc := False;
    if (pos('/*', code[i]) > 0) then
      kommentar := True;
    if (pos('{', code[i]) > 0) then
      (*Klammer auf registrieren, könnte die gescuhte funktion sein*)
    begin
      if kommentar then
      begin
        if ((pos('{', code[i]) < pos('/*', code[i])) and not
          (pos('{', code[i]) = 0)) or
          ((pos('{', code[i]) > pos('*/', code[i])) and not
          (pos('*/', code[i]) = 0)) then
        begin
          Inc(Count);
          if Count = count2 + 1 then
            j := i;
          (*Falls eine Klammer auf mehr als Klammer zu, merk dir die Zeile*)
        end;
      end
      else
      begin
        Inc(Count);
        if Count = count2 + 1 then
          j := i;
        (*Falls eine Klammer auf mehr als Klammer zu, merk dir die Zeile*)
      end;
    end;
    if pos('}', code[i]) > 0 then
      if kommentar then
      begin
        if ((pos('}', code[i]) < pos('/*', code[i])) and not
          (pos('}', code[i]) = 0)) or
          ((pos('}', code[i]) > pos('*/', code[i])) and not
          (pos('*/', code[i]) = 0)) then
        begin
          Inc(Count2);
        end;
      end
      else
      begin
        Inc(Count2);
      end;
    if (pos(statevar, code[i]) > 0) and not (pos('==', code[i]) > 0) and
      (pos('=', code[i]) > 0) and not kommentar then
      (*Wenn switch variable gefunden, dann*)
    begin
      while pos('(', code[j]) = 0 do

        (*Beweg dich solang Rückwärts bis eine Rundeklammer zu kommt (da dies die funktion bestimt)*)
        j := j - 1;
      loadfunc(newfunc, j, tmp, code);
    end;
    foo := code[i];
    l := high(changefuncs);
    //if ((i = 1543) or (i = 1545)) then
    //  ShowMessage(changefuncs[l - 1].Name);
    if sametext(statevar, 'GSMData.State') then
       sleep(1);
    for k := Low(changefuncs) to high(changefuncs) do
    begin
      if (pos(changefuncs[k].Name, foo) > 0) and not newfunc and not
        kommentar then
      begin
        while (pos('(', code[j]) = 0) or (pos(');', code[j]) > 0) or
          (pos('if', code[j]) > 0) do

          (*Beweg dich solang Rückwärts bis eine Rundeklammer zu kommt (da dies die funktion bestimt)*)
          j := j - 1;
        loadfunc(newfunc, j, tmp, code);
      end;
    end;
    if (pos('*/', code[i]) > 0) then
      kommentar := False;
    if newfunc then
      Result := True;
  end;
end;

himitsu 14. Nov 2012 12:26

AW: Kommischer EERange Rror Zugriffsverletzung
 
Zitat:

Zitat von Uwe Raabe (Beitrag 1191105)
Wo wird j initialisiert?

Garnicht, bzw. nicht immer.

Aber wer hört schon auf seinen Compiler ... die Meldungen da unten sind ja eh nicht wichtig :roll:


Zitat:

Delphi-Quellcode:
      while pos('(', code[j]) = 0 do

        (*Beweg dich solang Rückwärts bis eine Rundeklammer zu kommt (da dies die funktion bestimt)*)
        j := j - 1;

"Rundeklammer zu" ... ZU oder AUF? :stupid:

Zitat:

Delphi-Quellcode:
        while (pos('(', code[j]) = 0) or (pos(');', code[j]) > 0) or
          (pos('if', code[j]) > 0) do

          (*Beweg dich solang Rückwärts bis eine Rundeklammer zu kommt (da dies die funktion bestimt)*)
          j := j - 1;

Copy&Paste ist was Tolles, aber den Kommentar hätte man schon noch anpassen sollen, denn so sind Kommentare voll nutzlos irreführend.

uligerhardt 14. Nov 2012 12:34

AW: Kommischer EERange Rror Zugriffsverletzung
 
Zitat:

Zitat von PhilmacFLy (Beitrag 1191106)
Wesentlich wieter oben, ich post mal den ganzenf unfktions code:

Jetzt hast du zwar viel Code gepostet, aber die Deklaration von ChangeFuncs war immer noch nicht dabei. :mrgreen:

PhilmacFLy 14. Nov 2012 12:39

AW: Kommischer EERange Rror Zugriffsverletzung
 
Zitat:

Zitat von himitsu (Beitrag 1191108)
Zitat:

Zitat von Uwe Raabe (Beitrag 1191105)
Wo wird j initialisiert?

Garnicht, bzw. nicht immer.

Aber wer hört schon auf seinen Compiler ... die Meldungen da unten sind ja eh nicht wichtig :roll:


Zitat:

Delphi-Quellcode:
      while pos('(', code[j]) = 0 do

        (*Beweg dich solang Rückwärts bis eine Rundeklammer zu kommt (da dies die funktion bestimt)*)
        j := j - 1;

"Rundeklammer zu" ... ZU oder AUF? :stupid:

Zitat:

Delphi-Quellcode:
        while (pos('(', code[j]) = 0) or (pos(');', code[j]) > 0) or
          (pos('if', code[j]) > 0) do

          (*Beweg dich solang Rückwärts bis eine Rundeklammer zu kommt (da dies die funktion bestimt)*)
          j := j - 1;

Copy&Paste ist was Tolles, aber den Kommentar hätte man schon noch anpassen sollen, denn so sind Kommentare voll nutzlos irreführend.

Ja du weist doch wie das ist, da bastelt man und bastelt man und passt die Kommentare am Schluss erst an. (Desweitern waren das mal am Anfang gneua die gleichen Statements)

Changefuncs wie schon erwähnt Sorry hatte deinen Beitrag nicht gesehen (den oberen)
Delphi-Quellcode:
private
changefuncs: array of state;
Tante Edit meinte noch:
Die Funktion läuft in einer Schleife solang Result falsch ist, denn das ganze dient dazu eine Statemachine zu analysieren (C Code)
Natürlich können auch andere Funktionen in States aufgerufen werden die dann wiederum die state Variable ändern oder wieder eine Funktion aufrufen die ...
Deswegen durchlaufe ich die Funktionen solange bis sicherlich keine Neue Funktion mehr ins Array kommt.
Das erzähl ich deswegen weil die ersten 4x läuft die Funktion ohne Probleme da drüber.

PhilmacFLy 14. Nov 2012 13:25

AW: Kommischer EERange Rror Zugriffsverletzung
 
Problem gelöst:
loadfunc hatte mir während dem schleifen durchlauf changefuncs wieder verkleinert


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:11 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz