C++, neuer Kompiler compiliert anders

Crash Kid

Erfahrenes Mitglied
Hallo,

ich habe vor einer Woche meine IDE von Dev-C++ auf die neue Code::Blocks 10.5 umgestellt.
Beim compilieren von meinen "alten" Programmen, die ich in Dev-C++ geschrieben habe, bekomme ich keine Fehlermeldung, allerdings funktioniert trotzdem nicht alles so, wie es soll.

Konkret: Ich habe eine char-Varriable vordefiniert.

C++:
char cLaufwerkmaske[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";

und im laufe des Programms greife ich darauf wie folgt zu:

C++:
string stBuchstabe;
int iZahl = 5;

stBuchstabe = cLaufwerkmaske[iZahl];

Wenn ich es mit dem alten Compiler von Dev-C++ compiliert habe, hat es super geklappt. Ich hatte in der Varriable stBuchstabe den jeweiligen Buchstaben.
Wenn ich es jetzt mit dem neuen Compiler von Code::Blocks compiliere, dann steht nichts mehr in der Varriable Buchstabe drin.

Es gehen jetzt auch neue sachen wie z.B.
C++:
Buchstabe = cLaufwerkmaske;
Der alte Compiler hat bei so etwas immer reklamiert. Anscheinend haben die im Compiler was geändert.

Meine Frage nun, wie bekomme ich die Buchstaben von cLaufwerkmaske wieder einzeln in meine Varriable stBuchstabe?


Vielen Dank schon mal

grüße
 
Konkret: Ich habe eine char-Varriable vordefiniert.

C++:
char cLaufwerkmaske[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";

und im laufe des Programms greife ich darauf wie folgt zu:

C++:
string stBuchstabe;
int iZahl = 5;

stBuchstabe = cLaufwerkmaske[iZahl];

Wenn ich es mit dem alten Compiler von Dev-C++ compiliert habe, hat es super geklappt. Ich hatte in der Varriable stBuchstabe den jeweiligen Buchstaben.
Wenn ich es jetzt mit dem neuen Compiler von Code::Blocks compiliere, dann steht nichts mehr in der Varriable Buchstabe drin.
Dann geht irgendwo anders was schief. Kannst du trotzdem mal testen, ob das folgende Minimalbeispiel bei dir wie erwartet "F" ausgibt?
C++:
#include <iostream>
#include <string>

int main() {
  char cLaufwerkmaske[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
  std::string stBuchstabe;
  int iZahl = 5;
 
  stBuchstabe = cLaufwerkmaske[iZahl];

  std::cout << stBuchstabe << std::endl;

  return 0;
}

Es gehen jetzt auch neue sachen wie z.B.
C++:
Buchstabe = cLaufwerkmaske;
Der alte Compiler hat bei so etwas immer reklamiert. Anscheinend haben die im Compiler was geändert.
Das funktioniert zurecht, denn das ist absolut gültiges C++ (unter der Annahme, dass Buchstabe ein std::string ist).

Grüße,
Matthias
 
Zuletzt bearbeitet von einem Moderator:
OK. Also das kleine Beispiel funktioniert. Ich such jetzt mal nochmal genau meinen Code durch, aber das sind inzwischen 12.000 Zeilen. Eigentlich hab ich daran nichts geändert, melde mich dann, wenn ich was gefunden habe.

Ja Beispiel ist ein std::string. Aber mein alter Compiler hat damal trotzdem reklamiert.

Danke schon mal

grüße
 
Also, ich hab jetzt nochmal meinen Code durchgeschaut und keinen Fehler gefunden. Den Code hab ich jetzt auch nochmal vom Dev-C++ compilieren lassen und da geht es wieder. Da gibt er mir den richtigen Buchstaben aus. Nehm ich den genau gleichen Code, ohne irgendein Zeichen zu verändern, und lasse ihn im Code::Blocks compilieren, geht es nicht. Ich weiß nicht was ich noch machen kann. Im Code::Blocks verwende ich momentan den MinGW32-gcc-4.5.2 und im Dev-C++ den MinGW-gcc-3.4.2.

grüße
 
Hi.
Wenn ich es mit dem alten Compiler von Dev-C++ compiliert habe, hat es super geklappt. Ich hatte in der Varriable stBuchstabe den jeweiligen Buchstaben.
Wenn ich es jetzt mit dem neuen Compiler von Code::Blocks compiliere, dann steht nichts mehr in der Varriable Buchstabe drin.
Wie prüfst du das denn? Debugger benutzt?
Also, ich hab jetzt nochmal meinen Code durchgeschaut und keinen Fehler gefunden. Den Code hab ich jetzt auch nochmal vom Dev-C++ compilieren lassen und da geht es wieder. Da gibt er mir den richtigen Buchstaben aus. Nehm ich den genau gleichen Code, ohne irgendein Zeichen zu verändern, und lasse ihn im Code::Blocks compilieren, geht es nicht.
Vermutlich hast du irgendwelchen Speicher zerstört, was undefiniertes Verhalten auslöst. Benutze einen Memory Debugger wie z.B. Valgrind unter Linux.

Ansonsten läßt sich das auch mit etwas ASCII Arithmetik einfacher lösen:
C++:
std::string s(1, 'A' + zahl);
Gruß
 
Also, ich habe es nicht mit einem Debugger probiert, sonder auf meinem Laptop die Dev-C++ IDE installiert und auf dem des Compilieren lassen unter Windows. Und auf meinem Rechner hier habe ich Code::Blocks. Und das Programm funktioniert wenn ich es unter Dev-C++ compilieren lasse.

Bin aber durch viel rumprobieren auf neue Erkenntnise gekommen:
1. Ich verwende den Zugriff auf die char-Varriablen öfters im Programm und von 10 stellen, macht es an nur 5 Problemen. Habe es soweit eingegrenzt, dass wenn ich die 5 Problem-Stellen (nur den Zugriff auf die Varriable) auskommentiere, funktioniert des Programm unter Code::Blocks.

Hab jetzt auch rausgefunden was an den 5 Stellen anders ist, wie an den anderen Stellen wo es klappt.
An den 5 Problem-Stellen mache ich eine gwisse Anzahl an if-else-Abfragen mehr, als an den anderen stellen im Programm. Wenn ich ein paar else-Anfragen (die if-Abfrage kann stehen bleiben) auskommentiere, klappt das Programm auch mit dem Varriablen-Zugriff.
Ich versteh da aber die Welt nicht mehr, warum der Compiler, bei zuvielen (sind 9 if-else-Abfragen und eine switch-case noch davor) Abfragen Probleme mit dem Varriablen-Zugriff hat. Sobald ich 2 else-Abfragen aukommentiere, funktioniert das Programm.
Das beste ist ja auch, dass der Varriablen-Zugriff an den Problem-Stellen keinerlei einfluss auf die Funktion hat, wo dann der Varriablen-Zugriff nicht klappt.

Ist verdammt verwirrent die ganze Sache, aber ich glaube dafür gibt es fast keine Lösung. Vllt hat ja doch schon mal jemand mit dem Problem zu tun gehabt.

P.S.: Ich versuche jetzt mal noch den neuesten Borland-Compiler, ob es mit dem geht.

grüße
 
Hallo,

Ist die IDE für den Borland-Compiler nicht kostenpflichtig? Versuchs doch mal mit Visual Studio, da kannst mit der Express kostenlos arbeiten.
 
Ist verdammt verwirrent die ganze Sache, aber ich glaube dafür gibt es fast keine Lösung. Vllt hat ja doch schon mal jemand mit dem Problem zu tun gehabt.
Nochmal: Es liegt nicht am Compiler, sondern an deinem Code (wie du eigentlich selbst gerade festgestellt hast). Du machst da irgendeinen "Mist" und es ist reiner Zufall ob es funktioniert oder nicht.

Zielführend wäre es einen Memory Debugger zu verwenden. Oder ein Minimalbeispiel zu erstellen wo der Fehler reproduzierbar ist.

Gruß
 
Zurück