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 -Wall

    Ivo



  • 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


Anmelden zum Antworten