Liebe Leute,
ist die Verwendung von "gpc version 20041218, based on gcc-2.95.2" im Grundsatz in Ordnung oder sollte ein neuerer gcc verwendet werden? Welche Kombination gilt zZ als die beste?
Ich hatte in der Kombination eines älteren gpc mit einem neueren gcc einen etwas seltsamen Fehler (das Erweitern eines RECORD um eine (integer-)Variable (ohne daß sie benutzt wurde) führte grundsätzlich zu einem Speicherzugriffsfehler), weshalb ich die gpc-Version geändert habe ... das hat geholfen, das Programm lief dann einwandfrei ...
Nun habe ich in dieser Version jedoch auch einen sonderbaren Fehler in einem ganz einfachen Konstrukt:
WHILE Zeiger <> NIL DO BEGIN .... Zeiger := Zeiger^.Folgender; END; dies führt zu einem Speicherzugriffsfehler an der Stelle "Zeiger := Zeiger^.Folgender" (innerhalb der Schleife wird der Zeiger nicht manipuliert). Es läßt sich zeigen, daß "Zeiger^.Folgender = NIL" ist.
absurder Weise geht: WHILE Zeiger^.Folgender <> NIL ... mit der unerwünschten Folge, daß das jeweils letzte Element (erwartungsgemäß) nicht bearbeit wird.
Dieses Verhalten ist kontextabhängig. Das Konstrukt funktioniert im gleichen Programm an verschieden Stellen wie gewünscht. Daraus ergeben sich folgende Fragen:
1. Gibt es eine Möglichkeit solche Kontextabhängigkeiten gezielt zu untersuchen, wenn ja wie, welche?
2. Gibt es eine Möglichkeit den Compiler zu überreden möglichst nah am Code zu übersetzen (-O0 half nichts)?
Dank im Voraus!
Grüße Egbert
egbert@seibertz.de schrieb:
ist die Verwendung von "gpc version 20041218, based on gcc-2.95.2" im Grundsatz in Ordnung oder sollte ein neuerer gcc verwendet werden? Welche Kombination gilt zZ als die beste?
I.a. vermutlich gcc-3.2.x, aber 2.95.x sollte auch noch ohne Probleme gehen.
Ich hatte in der Kombination eines älteren gpc mit einem neueren gcc einen etwas seltsamen Fehler (das Erweitern eines RECORD um eine (integer-)Variable (ohne daß sie benutzt wurde) führte grundsätzlich zu einem Speicherzugriffsfehler), weshalb ich die gpc-Version geändert habe ... das hat geholfen, das Programm lief dann einwandfrei ...
Nun habe ich in dieser Version jedoch auch einen sonderbaren Fehler in einem ganz einfachen Konstrukt:
WHILE Zeiger <> NIL DO BEGIN .... Zeiger := Zeiger^.Folgender; END; dies führt zu einem Speicherzugriffsfehler an der Stelle "Zeiger := Zeiger^.Folgender" (innerhalb der Schleife wird der Zeiger nicht manipuliert). Es läßt sich zeigen, daß "Zeiger^.Folgender = NIL" ist.
absurder Weise geht: WHILE Zeiger^.Folgender <> NIL ... mit der unerwünschten Folge, daß das jeweils letzte Element (erwartungsgemäß) nicht bearbeit wird.
Dieses Verhalten ist kontextabhängig. Das Konstrukt funktioniert im gleichen Programm an verschieden Stellen wie gewünscht. Daraus ergeben sich folgende Fragen:
- Gibt es eine Möglichkeit solche Kontextabhängigkeiten gezielt zu untersuchen, wenn ja wie, welche?
Ohne den Quelltext kann man da wenig sagen. Es kann natürlich ein Compiler-Fehler sein, wahrscheinlich ist aber vermutlich ein Fehler im Programm selbst. Uninitialisierte Variablen und ungültige Zugriffe sind die häufigsten Ursachen.
- Gibt es eine Möglichkeit den Compiler zu überreden möglichst nah am Code zu übersetzen (-O0 half nichts)?
-O0 ist der Default (wenn du kein -O, -O2 o.ä. verwendest).
Frank