C++ mit exit funktioniert nicht

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
Benutzeravatar
Duff
Beiträge: 6321
Registriert: 22.03.2005 14:36:03
Wohnort: /home/duff

C++ mit exit funktioniert nicht

Beitrag von Duff » 22.12.2008 10:13:18

Hallo,

ich versuche mich nochmal in C++ einzuarbeiten. Jedoch bekomme ich immer folgende Fehlermeldung, wenn ich mit exit arbeite.

Wieso?

Code: Alles auswählen

daniel@daniel-laptop:~/scripts/C++/Kapitel01$ g++ -Wall -o if if.cpp 
if.cpp: In function ‘int main()’:
if.cpp:11: error: ‘exit’ was not declared in this scope
if.cpp:16: error: ‘exit’ was not declared in this scope
if.cpp:20: error: ‘exit’ was not declared in this scope
daniel@daniel-laptop:~/scripts/C++/Kapitel01$ cat if.cpp 
// if1.cpp
#include <iostream>
using namespace std;

int main(void) {
	int var1, var2;

	cout << "Bitte eine Zahl: ";
	if ( (cin >> var1) == false ) {
		cerr << "Fehler bei der Eingabe!\n";
		exit(1);
	}
	cout << "Bitte den Teiler eingeben: ";
	if ( (cin >> var2) == false ) {
		cerr << "Fehler bei der Eingabe!\n";
		exit(1);
	}
	if( var2 == 0 ) {
		cerr << "Teiler darf nicht 0 sein!\n";
		exit(1);
	}
	cout << "Ergebnis der Division " << var1 << " / " << var2 << " = " << (var1/var2) << '\n';
	return 0;
}
Oh, yeah!

Benutzeravatar
GoKi
Beiträge: 2068
Registriert: 04.07.2003 23:08:56
Lizenz eigener Beiträge: MIT Lizenz

Re: C++ mit exit funktioniert nicht

Beitrag von GoKi » 22.12.2008 10:22:59

Da fehlt lediglich der include

Code: Alles auswählen

#include <cstdlib>
Nützlich bei sowas ist es auch die manpages-dev zu installieren und sich dann

Code: Alles auswählen

man 3 exit
anzusehen.
MfG GoKi
:wq

Benutzeravatar
Duff
Beiträge: 6321
Registriert: 22.03.2005 14:36:03
Wohnort: /home/duff

Re: C++ mit exit funktioniert nicht

Beitrag von Duff » 22.12.2008 10:42:39

Danke, da bin ich einfach nicht drauf gekommen.

Und noch eine weitere Frage.
Wieso läuft folgendes Programm in einer Endlos-Schleife, wenn ich einen Wert eingebe?

Code: Alles auswählen

daniel@daniel-laptop:~/scripts/C++/Kapitel02$ cat list.cpp 
// list.cpp
#include <iostream>
using namespace std;

struct Knoten {
	int daten;
	Knoten* next;
};

// Anfang der Liste
Knoten* Anfang = 0;

// Funktionsprototypen
Knoten* insertKnoten( int& val );
void showKnoten( const Knoten* n );
Knoten* deleteKnoten( int dat );

int main( void ) {
	Knoten* node;
	int auswahl, ival;
	do {
		cout << "Eine einfache verkettete Liste\n";
		cout << "------------------------------\n";
		cout << "-1- Neue Element hinzufügen\n";
		cout << "-2- Alle Elemente ausgeben\n";
		cout << "-3- Einzelnes Element löschen\n";
		cout << "-4- Programm beenden\n";
		cout << "Ihre Auswahl: ";
		cin >> auswahl;
		
		switch( auswahl ) {
			case 1:
				cout << "Daten eingeben: ";
				cin >> ival;
				node=insertKnoten( ival );
				break;
			case 2:
				showKnoten( node );
				break;
			case 3:
				cout << "Wert zum Löschen eingeben: ";
				cin >> ival;
				node=deleteKnoten( ival );
				break;
			case 4:
				break;
			default:
				cout << "Falsche Menüauswahl!\n";
		}

	} while( auswahl != 4 );

	return 0;
}


// Funktion zum Einfügen neuer Elemente
Knoten* insertKnoten( int& val ) {
	// Ist noch kein Element in der Liste, dann f+rgen wir das erste am Anfang ein
	cout << "Anfang" << Anfang << "\n";
	if( Anfang == 0 ) {
		Knoten* node = new Knoten;
		node->daten=val;
		node->next = 0;
		Anfang=node;
		cout << "Vor return if\n\n\n\n";
		return Anfang;
	}
	// Es sind bereits Elemente in der Liste, dann soll das neue hinten angehängt werden
	else {
		Knoten* node = Anfang;
		Knoten* newNode;
		while( node->next != 0 ) 
			node=node->next;
		newNode=new Knoten;
		newNode->daten=val;
		newNode->next=0;
		node->next = newNode;
		cout << "\n\n\n\n\nVor return else\n\n\n\n\n";
		return Anfang;
	}
}

// Alle Elemente der Liste anzeigen
void showKnoten( const Knoten* n ) {
	if( Anfang == 0 ) {
		cout << "Die Liste ist leer.\n";
	} else {
		cout << "1. Element: " << n->daten << '\n';
		for( int i=2; n->next != 0; i++) {
			cout << i << ". Element: " << n->daten << '\n';
		}
	}
}

// Das erste Element mit dem Wert dat aus der Liste löschen
Knoten* deleteKnoten( int dat ) {
	if( Anfang == 0 ) {
		cout << "Die Liste ist leer.\n";
	}
	// Ist das erste Element das von uns gesuchte?
	if( Anfang->daten == dat ) {
		Knoten* del=Anfang;
		if( Anfang->next != 0 ) 
			Anfang=Anfang->next;
		delete del;
	}
	// Die komplette Liste nach dem gesuchten Element durchlaufen
	else {
		Knoten* node=Anfang;
		while( node->next != 0 && node->next->daten != dat )
			node=node->next;
		if( node->next == 0 ) {
			cout << "Element zum Löschen kommt nicht in der Liste vor!\n";
		} else {
			// das zu löschende Element an del zuweisen
			Knoten* del=node->next;
			// Einen Hilfszeiger hinter das zu löschende Element
			Knoten* help=del->next;
			// das zu löschende Element aushängen
			node->next=help;
			delete del;
		}
	}
	return Anfang;
}
Oh, yeah!

Benutzeravatar
GoKi
Beiträge: 2068
Registriert: 04.07.2003 23:08:56
Lizenz eigener Beiträge: MIT Lizenz

Re: C++ mit exit funktioniert nicht

Beitrag von GoKi » 22.12.2008 11:23:23

Ich weiß jetzt nicht genau, ob es noch mehr Endlosschleifen gibt, aber showKnoten produziert auf jeden Fall eine, da innerhalb der for-Schleife im else Zweig

Code: Alles auswählen

n = n->next;
fehlt.
Habe es mal auf nopaste gestellt. http://nopaste.debianforum.de/17622
MfG GoKi
:wq

Benutzeravatar
Duff
Beiträge: 6321
Registriert: 22.03.2005 14:36:03
Wohnort: /home/duff

Re: C++ mit exit funktioniert nicht

Beitrag von Duff » 22.12.2008 11:36:49

Ups, sorry.

Das Problem tritt immer beim Aufruf von insertKnoten auf.
Oh, yeah!

Danielx
Beiträge: 6419
Registriert: 14.08.2003 17:52:23

Re: C++ mit exit funktioniert nicht

Beitrag von Danielx » 22.12.2008 11:40:41

GoKi hat geschrieben:Da fehlt lediglich der include

Code: Alles auswählen

#include <cstdlib>
Ja, denn seit GCC Version 4.3 müssen alle benötigten Header direkt eingebunden werden, da dies nicht mehr indirekt über andere Header geschieht.

edit:
Siehe dazu auch:
http://gcc.gnu.org/gcc-4.3/porting_to.html

Gruß,
Daniel

Benutzeravatar
GoKi
Beiträge: 2068
Registriert: 04.07.2003 23:08:56
Lizenz eigener Beiträge: MIT Lizenz

Re: C++ mit exit funktioniert nicht

Beitrag von GoKi » 22.12.2008 12:14:27

Duff hat geschrieben:Das Problem tritt immer beim Aufruf von insertKnoten auf.
Kann ich so nicht nachvollziehen. Habe es gerade mal kompiliert und es funktioniert - denke ich - so wie gedacht. Ich würde dir jedoch auch im Rahmen der Übung empfehlen zu versuchen, die globale Variable Anfang zu vermeiden. Vielleicht willst Du mal zwei Listen haben?
MfG GoKi
:wq

Benutzeravatar
Duff
Beiträge: 6321
Registriert: 22.03.2005 14:36:03
Wohnort: /home/duff

Re: C++ mit exit funktioniert nicht

Beitrag von Duff » 24.12.2008 12:14:23

Und schon bin ich beim nächsten Problem.

Bekomme beim Kompilieren folgende Fehlermeldung, die mir leider gar nichts sagt:

Code: Alles auswählen

daniel@daniel-laptop:~/scripts/C++/Kapitel04/by_reference$ g++ -Wall -o main main.cpp mensch.cpp 
/tmp/ccm35syn.o: In function `vergleiche_alter(Mensch const*, Mensch const*)':
mensch.cpp:(.text+0x13): multiple definition of `vergleiche_alter(Mensch const*, Mensch const*)'
/tmp/ccIIRl13.o:main.cpp:(.text+0x5c): first defined here
collect2: ld returned 1 exit status
daniel@daniel-laptop:~/scripts/C++/Kapitel04/by_reference$ grep -l vergleiche_alter *
main.cpp
mensch.h
Oh, yeah!

Benutzeravatar
Duff
Beiträge: 6321
Registriert: 22.03.2005 14:36:03
Wohnort: /home/duff

Re: C++ mit exit funktioniert nicht

Beitrag von Duff » 24.12.2008 12:21:30

Ups, hatte die Methode nicht in die Klasse geschrieben.

Code: Alles auswählen

	// Globale Funktion
	int vergleiche_alter( const Mensch* p1, const Mensch* p2 );
Bekomme nun folgende Fehlermeldung:

Code: Alles auswählen

daniel@daniel-laptop:~/scripts/C++/Kapitel04/by_reference$ g++ -Wall -o main main.cpp mensch.cpp 
main.cpp: In function ‘int main()’:
main.cpp:9: error: ‘vergleiche_alter’ was not declared in this scope
Mein vergleiche_alter:

Code: Alles auswählen

main.cpp:   ret = vergleiche_alter( &person1, &person2 );
mensch.cpp:int vergleiche_alter( const Mensch* p1, const Mensch* p2 ) {
	return p1->get_alter() - p2->get_alter();
}
mensch.h:	int vergleiche_alter( const Mensch* p1, const Mensch* p2 );
Oh, yeah!

Benutzeravatar
GoKi
Beiträge: 2068
Registriert: 04.07.2003 23:08:56
Lizenz eigener Beiträge: MIT Lizenz

Re: C++ mit exit funktioniert nicht

Beitrag von GoKi » 24.12.2008 12:46:48

Includest Du mensch.h in main.cpp. Es sind aber noch mehrere weitere Fehlerquellen möglich. Ist anhand deiner Code-Auszüge schwer einzuschätzen.
MfG GoKi
:wq

Antworten