Autor Beitrag
MSC
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 63

Win XP Home, Win Vista Buisiness
Delphi 7 Enterprise
BeitragVerfasst: So 02.09.07 23:38 
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:
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 591
Erhaltene Danke: 14



BeitragVerfasst: Mo 03.09.07 02:27 
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:
ausblenden 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 63

Win XP Home, Win Vista Buisiness
Delphi 7 Enterprise
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 721
Erhaltene Danke: 3



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 378

Win XP/Vista, Debian, (K)Ubuntu
Delphi 5 Prof, Delphi 7 Prof, C# (#Develop, VS 2005), Java (Eclipse), C++, QT, PHP, Python
BeitragVerfasst: Mo 03.09.07 09:21 
Für das Debuggen einfach folgendes machen:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
{$O-} // Optimierung ausschalten
pocedure Blub();
[...]
end;
{$O+} // Optimierung anschalten

Dann sollte auf i zugreifbar sein.
MSC Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 63

Win XP Home, Win Vista Buisiness
Delphi 7 Enterprise
BeitragVerfasst: 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.