PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Problem mit "Hello World" Programm in C++...



fraggo01
27.06.04, 12:43
Ich weiss, dafür gibts mrunix aber da sind nur 2 Mitglieder Online.

Ihr könnt mir bestimmt genauso gut helfen.

Hier mein Problem:

Ich bin totaler Noob und bekomme ein "Hello World" programm nicht zum laufen.

Hier das Programm:


#include <iostream>
void main()
{
// Dies ist das Hello-world-Programm
cout<<"Hello, world!"<<endl;
};

Das will ich mit

g++ test.cc -o test
kompilieren.

Beim kompilieren kommen diese Meldungen:

test.cc:2: error: `main' must return `int'
test.cc: In function `int main(...)':
test.cc:4: error: `cout' undeclared (first use this function)
test.cc:4: error: (Each undeclared identifier is reported only once for each function it appears in.)
test.cc:4: error: `endl' undeclared (first use this function)

Warum kompiliert der das nicht?

Danke im vorraus.

Reality
27.06.04, 12:45
Vielleicht weil es so heissen muss:


#include <iostream.h>

Liebe Grüße
Reality

geronet
27.06.04, 12:49
>Warum kompiliert der das nicht?
Steht doch genau da.

>test.cc:2: error: `main' must return `int'

Dann schreibstes so:

#include <iostream.h>
int main()
{
// Dies ist das Hello-world-Programm
cout<<"Hello, world!"<<endl;
return 0;
};

Nuke
27.06.04, 12:53
@Reality

Ähm, nein. Diese Schreibweise ist veraltet und ist kein Standard mehr.

Richtig wäre, z.B.:


#include <iostream>

int main()
{
// Dies ist das Hello-world-Programm
std::cout<<"Hello, world!"<<std::endl;
return 0;
};

carnil
27.06.04, 12:53
ja und ein


using namespace std;


Müsste doch auch noch stehen? Unterhalb von #include <iostream>?

MfG carnil

EDIT: zu langsam ... und wenn man es wie Nuke geschrieben hat, dann ist das mit dem using namespace std nicht mehr nötig ...

fraggo01
27.06.04, 12:55
Alles klar, aber warum muss da anstatt "void" "int" hin?
Hab das aus nem Tutorial wo es mit "void" steht...

sirmoloch
27.06.04, 12:59
AFAIK muss main nach ANSI einen Wert zurück geben, damit das OS weiß, dass das Programm erfolgreich abgelaufen ist.

fraggo01
27.06.04, 13:01
also mit


#include <iostream.h>
int main() {
// Dies ist das Hello-world-Programm
cout<<"Hello, world!"<<endl;
return 0;
};

kommt beim kompilieren:

In file included from /usr/include/c++/3.3.2/backward/iostream.h:31,
from test.cc:1:
/usr/include/c++/3.3.2/backward/backward_warning.h:32:2: warning: #warning This file includes at least one deprecated or antiquated header. Please consider using one of the 32 headers found in section 17.4.1.2 of the C++ standard. Examples include substituting the <X> header for the <X.h> header for C++ includes, or <sstream> instead of the deprecated header <strstream.h>. To disable this warning use -Wno-deprecated.



Bei

#include <iostream>
using namespace std;
int main() {
// Dies ist das Hello-world-Programm
cout<<"Hello, world!"<<endl;
return 0;
};

kommt garkeine Meldung vom compiler. :)

m.o.o.
27.06.04, 13:03
Alles klar, aber warum muss da anstatt "void" "int" hin?
Hab das aus nem Tutorial wo es mit "void" steht...
Soweit ich weiß, muss main immer einen int-Rückgabewert haben.

carnil
27.06.04, 13:05
kommt garkeine Meldung vom compiler. :)

Ist doch gut so, oder nicht? jetzt kannst du mit ./programmname das Progi ausführen ....

MfG carnil

fraggo01
27.06.04, 13:07
@sirmoloch:

Ich muss int angeben, weil ich das Hello World zurückgegeben wird?
Oder hab ich das falsch verstanden?

Bei dieser Variante kommt wieder der Fehler "test.cc:3: error: `main' must return `int'"


#include <iostream>
using namespace std;
void main() {
// Dies ist das Hello-world-Programm
cout<<"Hello, world!"<<endl;
};

fraggo01
27.06.04, 13:11
Soweit ich weiß, muss main immer einen int-Rückgabewert haben.
Mit int funzts ja auch wunderbar, bloss warum steht dann in sämtlichen Tuts void?
Ist das ne veraltete form?

Reality
27.06.04, 13:15
@Reality

Ähm, nein. Diese Schreibweise ist veraltet und ist kein Standard mehr.

Richtig wäre, z.B.:


#include <iostream>

int main()
{
// Dies ist das Hello-world-Programm
std::cout<<"Hello, world!"<<std::endl;
return 0;
};


Hmm, glaubst du mein Buch ist noch zu gebrauchen?

Liebe Grüße
Reality

geronet
27.06.04, 13:15
Ja.

Bei return 0 oder return xy kannst du dann den Status in der bash auslesen:

echo $?

Grüsse, Stefan

stefan-tiger
27.06.04, 13:19
Mit int funzts ja auch wunderbar, bloss warum steht dann in sämtlichen Tuts void?
Ist das ne veraltete form?

Ich kenn mich mit den gepflogenheiten nicht so aus, aber was passiert wenn du die Compilier-Version benutzt die das Tutorial auch benutzt?

sirmoloch
27.06.04, 13:20
Ich muss int angeben, weil ich das Hello World zurückgegeben wird? Oder hab ich das falsch verstanden?

Ne, nicht ganz...;)

Also: Du startest die Funktion main() in der dann die Ausgabe von Hello World erfolgt. Wenn alles erfolgreich abläuft wird dem OS eine 0 zurückgegeben. Die 0 bedeutet, dass keine Fehler während des Ablaufs vorgekommen sind und das OS weiß bescheid, dass kein Zombie da ist oder sonst irgenwas in der Richtung.

Das erklärt dann auch direkt, wieso der Rückgabewert int main() ist, da eine 0 vom Typ int ist. Um zwischen Funktionen zu "kommunizieren" können auch andere Datentypen für die Rückgabe benutzt werden. Lies mal hier weiter ;) (http://pronix.de/modules/C/openbook/c_programmierung_12_2.php#15) - der Link ist zwar für C, aber in C++ genauso interessant.

fraggo01
27.06.04, 13:34
Gemäß dem ANSI C-Standard muss mindestens eine Funktion in einem Programm den Namen main() besitzen. Diese Funktion ist auch die erste, die beim Programmstart ausgeführt wird. Geben Sie der main()-Funktion einen anderen Rückgabewert als int, könnte ein C99-Standard-konformer Compiler ein undefiniertes Verhalten zeigen. In einigen (vorwiegend älteren) Büchern finden Sie die main()-Funktion mitunter in folgender Schreibweise:

void main()
{
}

Nach dem älteren C89-Standard ist dies auch richtig. Läuft ein Compiler aber nach dem C99-Standard, sollte dann eine Warnung ausgegeben werden, dass die main()-Funktion einen Rückgabewert erwartet. Die main()-Funktion lautet (nach C99) richtig:

int main()
{
return 0;
}

Also muss die main() funktion immer mit int beginnen beim gcc 3.3.2...

Bei "return 0;" ist die Rückgabe dann keine oder 0?


Bei return 0 oder return xy kannst du dann den Status in der bash auslesen:

echo $?

die Variable muss ich dann aber erst deklarieren oder nicht??

Nuke
27.06.04, 14:32
Hmm, glaubst du mein Buch ist noch zu gebrauchen?

Liebe Grüße
Reality

Keine Ahnung! ;)

Also ich habe hier "Die C++ Programmiersprache 4. Auflage" von Bjarne Stroustrup. Ist ja bekanntlich der Erfinder von C++.

In dem steht entweder mein Code, oder der ohne "std::" aber denn mit "using namespace std".

Es wird aber ausdrücklich empfohlen "using namespace" nicht zu verwenden.

carnil
27.06.04, 14:44
In dem steht entweder mein Code, oder der ohne "std::" aber denn mit "using namespace std".

Es wird aber ausdrücklich empfohlen "using namespace" nicht zu verwenden.

Hi Nuke

Könntest du noch kurz erläutern wieso das so ist? Wir hatten das mit dem "using namespace std" in unserer Informatik 1 Vorlesung (nicht für Informatiker)? Damit man nicht immer std:: davorschreiben muss .... wodurch könnte es dann Konflikte geben? Erst wenn man eigene Klassen definiert und dafür dieselbe Namen verwendet? Entschuldige die Frage. Hätte mich nur noch interessiert.

MfG carnil

sirmoloch
27.06.04, 14:55
Also muss die main() funktion immer mit int beginnen beim gcc 3.3.2...

Jein, bei C89 nicht, aber bei C99 schon...;) Der gcc ist da tolerant, aber man kann AFAIK auch ein strenges "ANSI-Verhalten" einstellen.

Denk dran: Du willst C++ - wie es da genau aussieht kann ich dir leider nicht sagen. Such ein wenig...;)


Bei "return 0;" ist die Rückgabe dann keine oder 0?

Die Rückgabe ist 0.


die Variable muss ich dann aber erst deklarieren oder nicht??

Das macht die Shell für dich.

Beispiel hier:



fab@moloch-02 test $ ls && echo $?
0
fab@moloch-02 test $ lfdfsds; echo $?
bash: lfdfsds: command not found
127


(Das Verzeichnis hat keinen Inhalt.)

RapidMax
27.06.04, 15:16
Könntest du noch kurz erläutern wieso das so ist? Wir hatten das mit dem "using namespace std" in unserer Informatik 1 Vorlesung (nicht für Informatiker)?

Mit "using namespace xy" werden die Namen aus dem Namespace xy in den globalen Namespace importiert. Damit wird der Sinn von Namensräumen aufgehoben, denn diese sind ja dazu da die Namen zu unterscheiden.
Das heisst nicht, dass man grundsätzlich auf dieses Statement verzichten soll: Gerade in einem "Hello World" darf man es getrost einsetzen. In grösseren Projekten hingegen macht es Sinn, die Namen über den vollen Namen zu qualifizieren um Namenskonflikte zu verhindern. Diese kommen daher, dass viele Namen aus std in anderen Namensräumen ebenfalls verwendet werden.

Gruss, Andy

carnil
27.06.04, 15:22
@RapidMax: Ein grosses Dankeschön ... wieder einmal etwas neues dazugelernt! Danke.

MfG carnil

Franknborder
27.06.04, 20:48
Zu Deiner Frage nach dem Funktionskopf int main()



Du kannst die Sache ungefähr so sehen,...ein C/C++ Code wird immer in einer bestimmten Reihenfolge abgearbeitet, diese ist durch die ANSI C Standards festgelgt. Als erstes erfolgt der Präprozessor Aufruf mittels #, "Prä" aus dem Grund weil etwas "Vor" her aufgerufen werden muss, z.B. include<stdio.h>, Du rufst also vorgefertigte Bibliotheken\Headerdateien auf, in denen "Funktionen" vordefiniert sind, die dein Programm temporär (nämlich wenn an entsprechender Stelle angekommen) zum kompilieren braucht z.B "printf" auf dem Bidschrim etwas ausgeben, in deinem Fall die <iostream>, früher mit Anhang .h für Header. Dann folgt die main Funktion, ist dein main "abgearbeitet" ist dein Programm abgearbeitet, alles was geschieht spielt sich innerhalb eines "Anweisungsblocks" ab (das ist alles in den geschweiften Klammern) in deinem main (=Haupt(Funktion)). Die Aufteilung deines "Funktionskopfes" egal ob da jetzt void, int oder () nichts drinn steht, sagt immer folgendes in dieser Reihenfolge aus:

(Typ des Rückgabewertes)

main

(der Wert der übergeben wird)

also

int (=integer=Zahl) main (muss immer vorhanden sein) () nichts bzw. void

{

Dein Anweisungsblock;
return 0;

}


Das ist einfach die festgelegte Form wie ein C Prog aussehen muss. Ich würde Dir empfehlen Dich erst mal in C einzuarbeiten, da C als Teilmenge in C++ enthalten ist....return 0 meldet dem Betriebssystem ganz einfach nur ein erfolgreiches Ende der Programm Code Abarbeitung. Das heisst "ja hallo ich bin hier angekommen, Prog wurde ohne Fehler abgearbeitet"....Ich hoffe das hilft Dir ein bisschen, ich bin selbst Beginner.

Gruß

Franknborder

fraggo01
28.06.04, 08:28
Ja, das hab ich soweit schon verstanden, denke ich.

Ich werde mich aber von anfang an nur auf C++ eingehen, ich denke das lässt sich genauso gut (schlecht) lernen wie C.
Hab ja vorher noch nie ne Hochsprache Programmiert.

Wenn ich irgendwann weiss wie ich Variablen mit den richtigen Datentypen
Deklariere, dan bin ich schon nen stück weiter.

Das mit den Funtionen ist ja nicht unbedingt schwer zu verstehen, die gibts ja in der Bash auch...

Na ja, ich hoffe mal das ich in nem halben bis 1 Jahr schon ein bischen was kann und auch das grundlegene alles verstanden habe.
Vor allem die Klassen...

Ich werde hier oder in mrunix bestimmt noch öfter mal stressen.
Nur so als vorwarnung. :D

Franknborder
28.06.04, 11:01
Hallo,....

Du kannst natürlich gleich C++ lernen, bedenke C++ ist wesentlich komplexer als C. Schau Dir mal dieses Forum hier an,... www.C-plusplus.de .
Dort gibt es auch viele Tutorials zum download, in denen Dir u.a. die verschiedensten Datentypen und deren Definitonen\Deklarationen und Anwendungen bis zum abwinken demonstriert werden.....

Gruß

Franknborder