Forum: PC-Programmierung Probleme bei C++ Ausgabe


von L. J. (luke1)


Lesenswert?

Hallo Leute.
Ich habe eine Frage bezüglich der Ausgabe von meinem Sourcecode. Und 
zwar programmiere ich mit dem DEV-C++ Compiler und ich wollte mein 
Programm kompilieren. Ich bekomme aber einige Fehlermeldungen z.B. cout 
undeclared. Was das heißt weiß ich ja auch, nur habe ich im Internet 
eine Anleitung gefunden die das so geschrieben hat. Hier der Link:
http://www.mathematik.uni-marburg.de/~cpp/1tesprog/index.html
Da steht auch, dass das Programm nicht funktioniert, wenn die Ausgabe 
auf Betriebssystemebene umgeleitet wird. Bedeutet das, dass das Programm 
nicht in DOS geöffnet werden darf? Und wenn ja wie änder ich das, dass 
das nicht mehr so ist?
Schonmal ein Danke für jeden Tipp und jede Bemühung.
MFG Luke

von Klaus W. (mfgkw)


Lesenswert?

Nicht jedes Beispiel im Internet ist ein gutes Beispiel.

Probier' doch mal das hier:
1
#include <iostream>
2
3
int main( int nargs, char **args )
4
{
5
  std::cout << "Hallo Welt!" << std::endl;
6
}

von L. J. (luke1)


Lesenswert?

Wow danke funktioniert einwandfrei. Ich musste lediglich was hinzufügen. 
Mein Code sieht nun so aus:
1
#include <iostream>
2
3
int main( int nargs, char **args )
4
{
5
  std::cout << "Hallo Welt!" << std::endl;
6
  while(1){}
7
}

Ansonsten wird das Fenster sofort wieder geschlossen. Aber wieso hat es 
das vorher nicht getan? Kennst du eine gute Seite wo ich C++ lernen 
kann?

von Ch D. (chrisu) Benutzerseite


Lesenswert?


von L. J. (luke1)


Lesenswert?

Ja stimmt schon. Ich weiß das unter google viel steht. Aber genau das 
ist es. Ich mein ich war ja vorher auch schon auf einer Seite, aber der 
Code war ja anscheinend irgendwie nicht korrekt. Deswegen hab ich zur 
Sicherheit nachgefragt ob jemand dazu näheres weiß.

von yalu (Gast)


Lesenswert?

> Aber wieso hat es das vorher nicht getan?

Das Progrämmchen in

  http://www.mathematik.uni-marburg.de/~cpp/1tesprog/index.html

war früher korrekt, aber heute nicht mehr ;-)

Grund: Im aktuellen C++-Standard wurden alle Deklarationen in den Hea-
derfiles der Standardbibliothek vom globalen Namespace in den Namespace
std verschoben, um die Gefahr von Namenskonflikten zu verringern.
Damit es keinen Durcheinander zwischen alten und neuen Headerfiles gibt,
wurden auch die Dateinamen geändert, und zwar von *.h nach * (also bspw.
von iostream.h nach iostream).

Beim aktuellen GCC werden die *.h-Headerfiles für C++ nicht mehr mitge-
liefert, weswegen du iostream.h durch iostream ersetzen musst. Da aber
iostream sämtliche Deklarationen in den Namespace std packt, musst bei
der Verwendung der deklarierten Klassen, Objekte usw. ein std:: voran-
setzen (also z.B. std::cout statt cout schreiben) oder alternativ ein

  using namespace std;

an den Anfang des Programms setzen.

von Klaus W. (mfgkw)


Lesenswert?

yalu schrieb:
> ...
> liefert, weswegen du iostream.h durch iostream ersetzen musst. Da aber
> iostream sämtliche Deklarationen in den Namespace std packt, musst bei
> der Verwendung der deklarierten Klassen, Objekte usw. ein std:: voran-
> setzen (also z.B. std::cout statt cout schreiben) oder alternativ ein
>
>   using namespace std;
>
> an den Anfang des Programms setzen.

Wovon ich bei jeder Gelegenheit abrate.
Allerdings seit Jahren erfolglos :-(

Ich habe hiermit meine Pflicht aber trotzdem mal wieder erfüllt.

Sonst hast du natürlich vollkommen recht.

von Klaus W. (mfgkw)


Lesenswert?

L. J. schrieb:
> Wow danke funktioniert einwandfrei. Ich musste lediglich was hinzufügen.
> Mein Code sieht nun so aus:
>
>
1
#include <iostream>
2
> 
3
> int main( int nargs, char **args )
4
> {
5
>   std::cout << "Hallo Welt!" << std::endl;
6
>   while(1){}
7
> }
8
>
>
> Ansonsten wird das Fenster sofort wieder geschlossen. Aber wieso hat es
> das vorher nicht getan? Kennst du eine gute Seite wo ich C++ lernen
> kann?

Vorher konntest du dein Programm doch gar nicht übersetzen,
dachte ich?

Zu C++: Es gibt vermutlich keine Bücher/Internetseiten, mit denen
man mal eben schnell sinnvoll C++ lernt.

Mein Rat: erst Grundlagen von C lernen (weiß nicht, wie weit du
da bist), auch wenn man oft hört, man solle gleich mit C++
anfangen.
Dann den Stroustrup nehmen und sich durchbeißen (und ignorieren,
daß da genau drin steht, man solle gleich mit C++ anfangen)

Sicher gibt es auch andere brauchbare Bücher dazu, aber
den finde ich auf jeden Fall sinnvoll, auch nach Jahren noch.
Ist etwas hartes Brot, aber viel leichter wird es nicht
vernünftig gehen, dazu ist C++ doch zu komplex (oder zu
verworren, je nachdem).
Alles, was auf "C++ kurz und bündig" oder "C++ in 3.5 Stunden"
raus läuft, ist bei diesem Thema einfach zu oberflächlich.

(Falls das zu steinig ist: es gibt einfachere Sprachen, die
auch für vieles zweckmäßig sind.)

von ... .. (docean) Benutzerseite


Lesenswert?

wie wärs mit http://de.wikibooks.org/wiki/C%2B%2B-Programmierung leider 
noch unvollständig

von Klaus W. (mfgkw)


Lesenswert?

ein leider noch unvollständiges habe ich auch anzubieten:
http://www.wachtler.de/cpp/index.html
bzw, als Postscript http://www.wachtler.de/ck.ps.gz
:-)

Nichtsdestotrotz rate ich für ernsthaftes Arbeiten dazu,
in einen Stroustrup zu investieren für C++ (und in den K&R
für ANSI-C).

von L. J. (luke1)


Lesenswert?

Naja in meinem letzten Programm habe ich auch:
1
using namespace std;
benutzt.

@ Klaus:
>>Vorher konntest du dein Programm doch gar nicht übersetzen,
>>dachte ich?

Doch ich habe schon normal in C programmiert. Auch mit dem Compiler. Da 
sieht so ein Programm bei mir so aus:
1
#include <stdio.h>
2
3
int main(void)
4
{
5
     printf("hello world\n");
6
     while(1){}
7
}
Grundlagen von C beherrsche ich schon ganz gut, aber ich wiederhole sie 
trotzdem nochmal, da ich nicht mehr alles weiß.

Und Danke für die vielen Vorschläge :)

von Karl H. (kbuchegg)


Lesenswert?

Klaus Wachtler schrieb:

>> setzen (also z.B. std::cout statt cout schreiben) oder alternativ ein
>>
>>   using namespace std;
>>
>> an den Anfang des Programms setzen.
>
> Wovon ich bei jeder Gelegenheit abrate.

Recht hast du.

> Allerdings seit Jahren erfolglos :-(

Leider.
Ich halte es mitlerweile so:
In einem *.cpp File kann ich es noch akzeptieren. In einem Header File 
ist ein using namespace aber völlig inakzeptabel.

von Klaus W. (mfgkw)


Lesenswert?

Auch in cpp mache ich das schon lange nicht mehr.
Bei größeren Quelltexten mit vielen #include sowieso nicht,
und daraufhin auch bei kleineren nicht wg. Einheitlichkeit.
Letztlich schreibe ich das std:: kaum von Hand, sondern
der Editor schreibt mir halt statt s ein:
  std::string
, statt cout ein:
   std::cout << << std::endl;
usw..

Letztlich habe ich damit genau das erreicht, was man mit
namespace erreichen will: eindeutige Klarheit, was Sache ist.

von Sebastian H. (sebihepp)


Lesenswert?

Wenn du auch ein Buch möchtest, statt alles im INet nachzulesen, kann
ich dir 2 Stück von "Markt und Technik" empfehlen. Die Webseite des
Verlags ist http://www.mut.de/

Eingestiegen bin ich mit "M+T easy C++" von Dirk Louis.
ISBN: 3-8272-6026-4

Danach habe ich mir das "C/C++ Kompendium" zugelegt, auch von Dirk 
Louis.
ISBN: 3-8272-6812-5

Die beiden Bücher sind zwar mit 15 Euro und 30 Euro nicht gerade
günstig, aber ich habe es nicht bereut und lese sogar Heute noch
in dem Kompendium bestimmte Dinge gerne nach.

Viele Grüße
Sebihepp

von Mark B. (markbrandis)


Lesenswert?

Klaus Wachtler schrieb:
>   std::string
> , statt cout ein:
>    std::cout << << std::endl;
> usw..
>
> Letztlich habe ich damit genau das erreicht, was man mit
> namespace erreichen will: eindeutige Klarheit, was Sache ist.

Was sonst könnte man denn mit cin, cout und endl meinen?
Wer die Eindeutigkeit verletzt sieht, muss auch sagen wo ;-)

von Klaus W. (mfgkw)


Lesenswert?

cin und cout sind nicht das Problem, die kann ich mir sogar
merken :-)

Es geht die Eindeutigkeit verloren bei den vielen Namen,
die in den Headerdateien außer cin und cout noch so stehen,
die man zu >90% nicht kennt und auch nicht alle unbedingt
auf allen Systemen gleich sind. Die schiebt man mit
using ebenfalls in den globalen Namensraum.
Wenn in std:: z.B. ein i steht, wird mit using namespace std
auf einmal eine lokale Variable i, die ich vergessen habe
zu deklarieren, zu dem i aus std::.
Ohne using namespace ist in jedem Fall klar, was von mir
kommt und was aus den Headerdateien, solange ich meine
Namen nicht mutwillig in namespace std definiere.

Ein using namespace... führt die namespaces ad absurdum
und hat m.E. bestenfalls dann eine Berechtigung, wenn ich
längere C-Passagen ohne Aufwand übernehmen muß (bei std,
bei anderen mag es anders sein).

Man könnte auch einzelne Namen gezielt übernehmen, aber
using namespace std ist die große Keule.

von Mark B. (markbrandis)


Lesenswert?

Klaus Wachtler schrieb:
> Man könnte auch einzelne Namen gezielt übernehmen, aber
> using namespace std ist die große Keule.

Aha...

1
using std::cin;
2
using std::cout;
3
using std::endl;

Klingt nicht ganz unvernünftig :)

von Klaus W. (mfgkw)


Lesenswert?

Gut; das ist jetzt nicht mein Geschmack, aber ich habe
auch nichts dagegen einzuwenden.

Ich räsoniere nur gelegentlich gegen die große Keule
"using namespace std;"

:-)

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.