Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
-
Duff
- Beiträge: 6321
- Registriert: 22.03.2005 14:36:03
- Wohnort: /home/duff
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!
-
GoKi
- Beiträge: 2068
- Registriert: 04.07.2003 23:08:56
- Lizenz eigener Beiträge: MIT Lizenz
Beitrag
von GoKi » 22.12.2008 10:22:59
Da fehlt lediglich der include
Nützlich bei sowas ist es auch die manpages-dev zu installieren und sich dann
anzusehen.
MfG GoKi
:wq
-
Duff
- Beiträge: 6321
- Registriert: 22.03.2005 14:36:03
- Wohnort: /home/duff
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!
-
GoKi
- Beiträge: 2068
- Registriert: 04.07.2003 23:08:56
- Lizenz eigener Beiträge: MIT Lizenz
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
fehlt.
Habe es mal auf nopaste gestellt.
http://nopaste.debianforum.de/17622
MfG GoKi
:wq
-
Duff
- Beiträge: 6321
- Registriert: 22.03.2005 14:36:03
- Wohnort: /home/duff
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
Beitrag
von Danielx » 22.12.2008 11:40:41
GoKi hat geschrieben:Da fehlt lediglich der include
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
-
GoKi
- Beiträge: 2068
- Registriert: 04.07.2003 23:08:56
- Lizenz eigener Beiträge: MIT Lizenz
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
-
Duff
- Beiträge: 6321
- Registriert: 22.03.2005 14:36:03
- Wohnort: /home/duff
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!
-
Duff
- Beiträge: 6321
- Registriert: 22.03.2005 14:36:03
- Wohnort: /home/duff
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!
-
GoKi
- Beiträge: 2068
- Registriert: 04.07.2003 23:08:56
- Lizenz eigener Beiträge: MIT Lizenz
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