AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Kommischer ERange Error

Ein Thema von PhilmacFLy · begonnen am 14. Nov 2012 · letzter Beitrag vom 14. Nov 2012
Antwort Antwort
Benutzerbild von PhilmacFLy
PhilmacFLy

Registriert seit: 20. Jan 2008
Ort: Nürnberg
340 Beiträge
 
FreePascal / Lazarus
 
#1

Kommischer ERange Error

  Alt 14. Nov 2012, 11:49
Delphi-Version: 5
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.
Philipp N.
"Programmiern ist wie küssen:
Mann kan darüber reden, mann kann es beschreiben,
aber man weiss erst, was es bedeutet,
wenn man es getan hat"

Geändert von TBx (14. Nov 2012 um 19:34 Uhr) Grund: Titel korrigiert
  Mit Zitat antworten Zitat
Benutzerbild von uligerhardt
uligerhardt

Registriert seit: 19. Aug 2004
Ort: Hof/Saale
1.746 Beiträge
 
Delphi 2007 Professional
 
#2

AW: Kommischer EERange Rror Zugriffsverletzung

  Alt 14. Nov 2012, 12:10
btw: Changefuncs ist vom type state
Eher array ??? of state , oder?

Schreib doch die Schleife einfach so:
    for k := Low(changefuncs) to High(changefuncs) do
Uli Gerhardt
  Mit Zitat antworten Zitat
Benutzerbild von PhilmacFLy
PhilmacFLy

Registriert seit: 20. Jan 2008
Ort: Nürnberg
340 Beiträge
 
FreePascal / Lazarus
 
#3

AW: Kommischer EERange Rror Zugriffsverletzung

  Alt 14. Nov 2012, 12:54
Ja array of state.

Habs ausgetauscht, aber selber Fehler.
Philipp N.
"Programmiern ist wie küssen:
Mann kan darüber reden, mann kann es beschreiben,
aber man weiss erst, was es bedeutet,
wenn man es getan hat"
  Mit Zitat antworten Zitat
Benutzerbild von uligerhardt
uligerhardt

Registriert seit: 19. Aug 2004
Ort: Hof/Saale
1.746 Beiträge
 
Delphi 2007 Professional
 
#4

AW: Kommischer EERange Rror Zugriffsverletzung

  Alt 14. Nov 2012, 13:06
Ja array of state.
array of state ? Oder array[...] of state ? Kopier doch einfach mal die relevanten Deklarationen in deinen Ursprungspost.
Uli Gerhardt
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.475 Beiträge
 
Delphi 12 Athens
 
#5

AW: Kommischer EERange Rror Zugriffsverletzung

  Alt 14. Nov 2012, 13:08
Wo wird j initialisiert?
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Benutzerbild von PhilmacFLy
PhilmacFLy

Registriert seit: 20. Jan 2008
Ort: Nürnberg
340 Beiträge
 
FreePascal / Lazarus
 
#6

AW: Kommischer EERange Rror Zugriffsverletzung

  Alt 14. Nov 2012, 13:18
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;
Philipp N.
"Programmiern ist wie küssen:
Mann kan darüber reden, mann kann es beschreiben,
aber man weiss erst, was es bedeutet,
wenn man es getan hat"

Geändert von PhilmacFLy (14. Nov 2012 um 13:42 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#7

AW: Kommischer EERange Rror Zugriffsverletzung

  Alt 14. Nov 2012, 13:26
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


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?

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.
$2B or not $2B

Geändert von himitsu (14. Nov 2012 um 13:37 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von uligerhardt
uligerhardt

Registriert seit: 19. Aug 2004
Ort: Hof/Saale
1.746 Beiträge
 
Delphi 2007 Professional
 
#8

AW: Kommischer EERange Rror Zugriffsverletzung

  Alt 14. Nov 2012, 13:34
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.
Uli Gerhardt
  Mit Zitat antworten Zitat
Benutzerbild von PhilmacFLy
PhilmacFLy

Registriert seit: 20. Jan 2008
Ort: Nürnberg
340 Beiträge
 
FreePascal / Lazarus
 
#9

AW: Kommischer EERange Rror Zugriffsverletzung

  Alt 14. Nov 2012, 13:39
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


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?

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.
Philipp N.
"Programmiern ist wie küssen:
Mann kan darüber reden, mann kann es beschreiben,
aber man weiss erst, was es bedeutet,
wenn man es getan hat"

Geändert von PhilmacFLy (14. Nov 2012 um 13:48 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von PhilmacFLy
PhilmacFLy

Registriert seit: 20. Jan 2008
Ort: Nürnberg
340 Beiträge
 
FreePascal / Lazarus
 
#10

AW: Kommischer EERange Rror Zugriffsverletzung

  Alt 14. Nov 2012, 14:25
Problem gelöst:
loadfunc hatte mir während dem schleifen durchlauf changefuncs wieder verkleinert
Philipp N.
"Programmiern ist wie küssen:
Mann kan darüber reden, mann kann es beschreiben,
aber man weiss erst, was es bedeutet,
wenn man es getan hat"
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:43 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