Entwickler-Ecke

Sonstiges (Delphi) - Auf Variable 'i' kann wegen Optimierung nicht zugegriffen...


MSC - So 02.09.07 23:38
Titel: Auf Variable 'i' kann wegen Optimierung nicht zugegriffen...
Hallo ich habe mal wieder ein Problem.

Diesmal kommt eine merkwürdige Fehlermeldung:
Auf Variable 'i' kann wegen Optimierung nicht zugegriffen werdenin einer For Schleife

hier der Quelltext, ist ein teil der FormCreate Prozedur:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
...

Reset(o);
for i:=0 to filesize(o)-1 do begin
S:='';
 Read(o,d[i]);
  S:=b[StrToint(d[i].code)].name;
 if d[i].w11 <> '-1' then
  S:=S+' '+a[StrToInt(d[i].w11)].shor;
 if d[i].w12 <> '-1' then
  S:=S+'+'+a[StrToInt(d[i].w12)].shor;
 if d[i].w21 <> '-1' then
  S:=S+' '+a[StrToInt(d[i].w21)].shor;
 if d[i].w22 <> '-1' then
  S:=S+'+'+a[StrToInt(d[i].w22)].shor;
 if d[i].w31 <> '-1' then
  S:=S+' '+a[StrToInt(d[i].w31)].shor;
 if d[i].w32 <> '-1' then
  S:=S+'+'+a[StrToInt(d[i].w32)].shor;
 if d[i].w41 <> '-1' then
  S:=S+' '+a[StrToInt(d[i].w41)].shor;
 if d[i].w42 <> '-1' then
  S:=S+'+'+a[StrToInt(d[i].w42)].shor;
 ListBox1.Items.Add(S);
end;
Closefile(o);

...

Die Hilfe konnte mir nicht helfen und die Beiträge die die Suchfunktion gefunden hat leider auch nicht...
Nur das man die Optimierung abschalten sollte, aber wie geht das?
Oder gibt es eine andere Möglichkeit?


Reinhard Kern - Mo 03.09.07 02:27
Titel: Re: Auf Variable 'i' kann wegen Optimierung nicht zugegriffen...
user profile iconMSC hat folgendes geschrieben:
Hallo ich habe mal wieder ein Problem.

Diesmal kommt eine merkwürdige Fehlermeldung:
Auf Variable 'i' kann wegen Optimierung nicht zugegriffen werdenin einer For Schleife

hier der Quelltext, ist ein teil der FormCreate Prozedur:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
...

Reset(o);
for i:=0 to filesize(o)-1 do begin
S:='';
 Read(o,d[i]);
  S:=b[StrToint(d[i].code)].name;
 if d[i].w11 <> '-1' then
  S:=S+' '+a[StrToInt(d[i].w11)].shor;
 if d[i].w12 <> '-1' then
  S:=S+'+'+a[StrToInt(d[i].w12)].shor;
 if d[i].w21 <> '-1' then
  S:=S+' '+a[StrToInt(d[i].w21)].shor;
 if d[i].w22 <> '-1' then
  S:=S+'+'+a[StrToInt(d[i].w22)].shor;
 if d[i].w31 <> '-1' then
  S:=S+' '+a[StrToInt(d[i].w31)].shor;
 if d[i].w32 <> '-1' then
  S:=S+'+'+a[StrToInt(d[i].w32)].shor;
 if d[i].w41 <> '-1' then
  S:=S+' '+a[StrToInt(d[i].w41)].shor;
 if d[i].w42 <> '-1' then
  S:=S+'+'+a[StrToInt(d[i].w42)].shor;
 ListBox1.Items.Add(S);
end;
Closefile(o);

...

Die Hilfe konnte mir nicht helfen und die Beiträge die die Suchfunktion gefunden hat leider auch nicht...
Nur das man die Optimierung abschalten sollte, aber wie geht das?
Oder gibt es eine andere Möglichkeit?


Zur Erklärung: i wird ja nur einmal gebraucht, um d[i] zulesen, das speichert der Compiler und vergisst i für den Rest der Schleife. Damit optimiert er die ganzen überflüssigen Indizierungen d[i] weg. Abgesehen von fragwürdigen Tricks (Zuweisung von i an irgendwas nicht lokales) hilft nur die Abschaltung der Optimierung oder die Abfrage zum geeigneten Zeitpunkt:

Du müsstest i abfragen können, wenn das Programm auf der Zeile Read(o,d[i]); steht, diese also noch nicht ausgeführt hat.

Gruss Reinhard


MSC - Mo 03.09.07 02:45
Titel: Re: Auf Variable 'i' kann wegen Optimierung nicht zugegriffe
user profile iconReinhard Kern hat folgendes geschrieben:

Zur Erklärung: i wird ja nur einmal gebraucht, um d[i] zulesen, das speichert der Compiler und vergisst i für den Rest der Schleife. Damit optimiert er die ganzen überflüssigen Indizierungen d[i] weg. Abgesehen von fragwürdigen Tricks (Zuweisung von i an irgendwas nicht lokales) hilft nur die Abschaltung der Optimierung oder die Abfrage zum geeigneten Zeitpunkt:

Du müsstest i abfragen können, wenn das Programm auf der Zeile Read(o,d[i]); steht, diese also noch nicht ausgeführt hat.

Gruss Reinhard


Wie geht die Abschaltung? Und hat das einen Einfluss auf das fertige Programm?
Denn im fertigem Programm funktioniert die Prozedur auch nicht: die Listboxeinträge sind nicht richtig.

Wenn ich mit F7 einzeln durchgehe funktioniert i in der Zeile
for i:=0 to filesize(o)-1 do begin
bereits nicht.
Zu erwähnen wäre, dass die Prozedur 5 For Schleifen hat und fehlerhafte die 3. ist.


Bernhard Geyer - Mo 03.09.07 08:17
Titel: Re: Auf Variable 'i' kann wegen Optimierung nicht zugegriffe
user profile iconMSC hat folgendes geschrieben:
Zu erwähnen wäre, dass die Prozedur 5 For Schleifen hat und fehlerhafte die 3. ist.

Verwendest du dann i in einer äußeren/Inneren Schleife nochmal?


arj - Mo 03.09.07 09:21

Für das Debuggen einfach folgendes machen:

Delphi-Quelltext
1:
2:
3:
4:
5:
{$O-} // Optimierung ausschalten
pocedure Blub();
[...]
end;
{$O+} // Optimierung anschalten

Dann sollte auf i zugreifbar sein.


MSC - Mo 03.09.07 09:44

Die For Schleifen sind nacheinander.
Beim nachsehen ist mir mein Fehler aufgefallen:
die For Schleifen, die das Programm die Daten für Array a und b einlesen lässt, kommt erst danach. Dann ist es kein Wunder, dass das ganze nicht geht.

Das Optimierung abschalten hat funktioniert, allerdings lag der Fehler woanders.

Allerdings finde ich es doch einwenig Rätselhaft das dort soeine Fehlermeldung entsteht.