g++ kompiliert ohne Fehler und Warnungen und es kommt nur eine '4'
-
Moin Leute,
Als ich das letzte Mal nur eine Variable in meinen Programm geaendert habe und es kompilieren wollte, kam eine komische Sache.
Wenn ich das Programm ausfuehre kommt nur eine 4 (nein das Programm macht nicht cout << "4" << endl;)Auch wenn ich die letzte Version kompiliere, macht er das...
Wie bekomme ich das wieder hin?
Ich kompiliere mit g++ -o foo bar.cpp -WallIvo
-
OS ist Debian 4 Etch und g++ 4.1.2
-
Und wie sieht die source aus?
-
Da auch die Backups (2 Stunden alt) den selben Fehler machen, sollte es am Compiler liegen oder? Egal welche ich nutze, ich teste mal kurz ein Hallo Welt...
-
Hallo Welt geht komischerweise....
-
Da auch die Backups (2 Stunden alt) den selben Fehler machen, sollte es am Compiler liegen oder? Egal welche ich nutze, ich teste mal kurz ein Hallo Welt...
Ja, es ist sicher der Compiler.
Oder der Linker.
Oder ev. sogar das OS.Simon
-
Auch der unveraenderte Sourcecode mit neu installierten Compiler haut die Meldung raus...
-
dann liegt es wohl am sourcode den du uns vorenthalten willst
-
OK hier mal der Sourcecode....
Bitte keine Sprueche wegen dem goto... es ist hier echt praktisch.// main.cpp #include <iostream> #include <string> #include <fstream> #include <time.h> // Eigene Files zum einbinden #include "readConf.cpp" #include "interface.cpp" #include "createScript.cpp" #include "timer.cpp" using namespace std; // Deklarieren der globalen Variablen string confFile = ("/etc/remote/remote.conf"); time_t timeStart; time_t timeStop; int main() { start: // Auslesen der Konfiguration readConf(); if(ErrorCounter != 0) {return 0;} // Starten des Interfaces interfaceStart(); // Auswahl der Computers cout << "Select the computer [1]-[" << AnzahlRechner << "]: "; int AuswahlRechner; cin >> AuswahlRechner; if(AuswahlRechner >= AnzahlRechner+1) {goto start;} if(AuswahlRechner == 0) {goto start;} // Abgleichen der IP Addresse checkIP(AuswahlRechner); // Was soll mit dem Rechner gemacht werden? interfaceOption(); cout << "Selected computer " << AuswahlRechner << " <" << IP << ">" << endl; cout << "Select the option [0]-[3]: "; int AuswahlOption; cin >> AuswahlOption; if(AuswahlOption >= 4) {goto start;} if(AuswahlOption <= 0) {goto start;} // Sperren eines Rechners if(AuswahlOption == 1) { // Erstellen und ausfuehren des Scriptes, anschliessend loeschen des scriptes createScriptLock(IP); string lock; lock = "sh " + tmpFile; system(lock.c_str()); string delScript = "rm " + tmpFile; system(delScript.c_str()); // Errechnen der verbrauchten Zeit timerStop(IP); // Sicherstellen das der Kunde zahlt char AbfragePaid; paid: cout << "customer have paid? y/n: "; cin >> AbfragePaid; if(AbfragePaid == 'y') {goto start;} if(AbfragePaid == 'n') {goto paid;} else {goto paid;} } // Entsperren eines Rechners if(AuswahlOption == 2) { createScriptUnlock(IP); string unlock; unlock = "sh " + tmpFile; system(unlock.c_str()); string delScript = "rm " + tmpFile; system(delScript.c_str()); // Starten des Zeitgebers timerStart(IP); goto start; } //Shutdown eines Rechners if(AuswahlOption == 3) { createScriptShutdown(IP); string shutdown; shutdown = "sh " + tmpFile; system(shutdown.c_str()); goto start; string delScript = "rm " + tmpFile; system(delScript.c_str()); } }
// interface using namespace std; void interfaceStart() { // Die Variablen string PROGRAMM = ("REMOTE KIOSK SYSTEM"); string AUTOR = ("XXX"); string EMAIL = ("XXX"); string VERSION = ("0.1"); string LINE = ("--------------------------------------------------------------------------------\n"); system("clear"); cout << LINE << PROGRAMM << " v " << VERSION << endl; cout << AUTOR << " <" << EMAIL << ">" << endl; cout << LINE; } void interfaceOption() { interfaceStart(); cout << "[1]lock\t\t[2]unlock\t[3]shutdown\t\t\t[0] chancel" << endl; cout << "--------------------------------------------------------------------------------\n"; }
// createScript using namespace std; string IP; // Pruefen ob der Rechner in der Pooldatei vorhanden ist void checkIP(int rechner) { ifstream dat_ein; dat_ein.open(Pool.c_str(), ios_base::in); int counter = 1; while(counter <= rechner) { int zahl; char zeichen; string tmpIP; dat_ein >> zahl; dat_ein >> zeichen; dat_ein >> tmpIP; if(zahl == rechner) { IP = tmpIP; } counter++; } dat_ein.close(); } // Erstellen des Scriptes zum sperren void createScriptLock(string IP) { ofstream dat_aus; tmpFile = ".script"; dat_aus.open(tmpFile.c_str(), ios_base::out); if(!dat_aus) {cout << "cannot create script" << endl;} dat_aus << "#!/bin/bash" << endl; dat_aus << "ssh root@" << IP << " 'init 3'" << endl; dat_aus << "exit" << endl; dat_aus.close(); } // Erstellen des Scriptes zum entsperren void createScriptUnlock(string IP) { ofstream dat_aus; tmpFile = ".script"; dat_aus.open(tmpFile.c_str(), ios_base::out); if(!dat_aus) {cout << "cannot create script" << endl;} dat_aus << "#!/bin/bash" << endl; dat_aus << "ssh root@" << IP << " 'init 5'" << endl; dat_aus << "exit" << endl; dat_aus.close(); } // Erstellen des Scriptes zum shutdown void createScriptShutdown(string IP) { ofstream dat_aus; tmpFile = ".script"; dat_aus.open(tmpFile.c_str(), ios_base::out); if(!dat_aus) {cout << "cannot create script" << endl;} dat_aus << "#!/bin/bash" << endl; dat_aus << "ssh root@" << IP << " 'shutdown -h now'" << endl; dat_aus << "exit" << endl; dat_aus.close(); }
// readConf.cpp using namespace std; string LogFile; string TmpDir; string tmpFile = TmpDir + "tmp"; string Pool; int ErrorCounter = 0; int AnzahlRechner = 0; void readConf() { ifstream dat_ein; ofstream dat_aus; dat_ein.open("/etc/remote/remote.conf", ios_base::in); if(!dat_ein) {cout << "cannot read /etc/remote/remote.conf" << endl;} // Auslesen des Pfades zur Logdatei while(dat_ein) { string puffer; dat_ein >> puffer; if(puffer == "LogFile") { string tmp; dat_ein >> tmp; dat_ein >> LogFile; } // Auslesen des Pfades zur TmpDir if(puffer == "TmpDir") { string tmp; dat_ein >> tmp; dat_ein >> tmpFile; } // Auslesen des Pfades zum Rechnerpool if(puffer == "Pool") { string tmp; dat_ein >> tmp; dat_ein >> Pool; } } // Schliesse die Datei /etc/remote/remote.conf dat_ein.close(); // Sind die files vorhanden oder koennen erstellt werden? dat_aus.open(LogFile.c_str(), ios_base::app); // LogFile zum anhaengen von Daten if(!dat_aus) {ErrorCounter = 1;} dat_aus.close(); dat_aus.open(tmpFile.c_str(), ios_base::out); // TmpFile neu erstellen if(!dat_aus) {ErrorCounter = 1;} dat_aus.close(); dat_ein.open(Pool.c_str(), ios_base::in); // Pooldatei muss nur lesbar sein if(!dat_ein) {ErrorCounter = 1;} dat_ein.close(); // Ermitteln der Anzahl der Rechner im Pool und speichern in AnzahlRechner dat_ein.open(Pool.c_str(), ios_base::in); if(!dat_ein) {ErrorCounter = 1;} int counter = -1; while(dat_ein) {string tmp, tmp2, tmp3; dat_ein >> tmp; dat_ein >> tmp2; dat_ein >> tmp3; counter++;} dat_ein.close(); AnzahlRechner = counter; cout << AnzahlRechner << endl; } [code] // timer.cpp using namespace std; void timerStart(string IP) { ofstream dat_aus; string path; path = ".startTime" + IP; dat_aus.open(path.c_str(), ios_base::out); if(!dat_aus) {cout << "cannot create tmp file" << endl;} time_t t; t = time(NULL); dat_aus << t; dat_aus.close(); } void timerStop(string IP) { // Auslesend der Startzeit ifstream dat_ein; string path; path = ".startTime" + IP; dat_ein.open(path.c_str(), ios_base::in); if(!dat_ein) {cout << "cannot read tmp file" << endl;} int startTime; dat_ein >> startTime; dat_ein.close(); // Aktuelle Zeit ermitteln time_t stopTime; stopTime = time(NULL); // Errechnen der verbrauchten Zeit int zeitSekunden; int zeitMinuten; zeitSekunden = stopTime - startTime; zeitMinuten = zeitSekunden / 60; // Anzeige der verbrauchten Zeit cout << "Customer have to paid: " << zeitMinuten << " Bath" << endl; // Entfernen des tmpFiles string del; del = "rm " + path; system(del.c_str()); }
Der Code hat frueher einwandfrei funktioniert, also kann es kaum daran liegen...
_icke_
-
icke schrieb:
OK hier mal der Sourcecode....
Bitte keine Sprueche wegen dem goto... es ist hier echt praktisch.http://xkcd.com/292/ *SCNR
Hast du schonmal von OOP gehört?
Wieso wird vier ausgegeben, du hast doch das Pogramm geschrieben. Es wird die Anzahl an Rechnern ausgegeben und dann wegen eines Fehlers das Programm beendet.
-
Wenn ich das ganze mit strace laufen laufen lasse, funktioniert es wunderbar...
_icke_
-
Schonmal was von debuggen gehört?
-
Ja gehoert schon mal, aber daraus werd ich nicht schlau -> nur warum ging der selbe Code frueher????
-
Weil du etwas eingebaut hast, was früher eben nicht da war.
-
Und warum gehen die alten Files auch nicht?
-
Weil undefiniertes Verhalten sich nicht immer gleich äussert.
-
Es kann sein dass du zum Beispiel einen Sprung hast (if) der von einem unintialisierten Wert abhängt. Dann kann eigentlich so gut wie alles passieren und auf einen Systemen kriegst du komische Fehler, auf anderen Segmentation Faults etc.
Lass doch sonst mal durch valgrind laufen. Dann weisst du ob es daran liegt.
valgrind --tool=memcheck program
LG
Neph