Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

1

16.05.2011, 11:24

[C++] Einsteigerproblem: keine konsolenausgabe trotz cout/get.ch/system(pause)

Hallo Leute,

>> Achtung: Ich bin der ultimative Programmieranfänger <<

Habe mir das Buch von Heiko Kalista gekauft, Visual Express 2008 installiert und schon beim 1. Kapitel ein Problem:

> Wie beschrieben habe ich den schlichten code nach dem Schema Hallo Welt ("Hier kommt die Konkurrenz!") eingegeben und debugged.
Doch die Konsolenausgabe bleibt aus. Das Fenster wird sehr sehr kurz angezeigt und ist gleich wieder weg.

Googeln ergab Möglichkeiten wie
get.ch(), system("PAUSE") u.a.

> Wie bzw. wo muss ich diese Funktionen in den Quelltext hinschreiben, damit das Fenster offen bleibt?!

Ich kapier es einfach nicht.

siehe z.B. den Quelltext von Kapitel 2.1 mit der Einführung von Variablen:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
// C++ für Spieleprogrammierer
// Listing 2.1
// Deklarieren und definieren von Variablen
//
#include <iostream>
using namespace std;

// Hauptprogramm
//
int main ()
{
    //Variablen
    //
    int Lebensenergie;          // Variable deklarieren

    Lebensenergie = 100;        // Variable definieren
    cout << "Lebensenergie des Spielers: " << Lebensenergie << endl;
    return 0;
}

2

16.05.2011, 11:36

Vor dem Ende der main().
Also nach cout und vor return 0.

Klar soweit?
Willkommen im Forum! ;)
fka tm

3

16.05.2011, 11:40

Auch von mir: Willkommen im Forum! :)

Gruß
SaRu_

4

16.05.2011, 12:11

2 Dinge dazu:
1.) Visual C++ 2008 ist veraltet, es gibt inzwischen eine 2010 Version. Gut, die Neuerungen dürften einem Anfänger nicht viel bringen und schlimmstenfalls könnten sie dich unnötog verwirren, aber behalt im Hinterkopf umzusteigen wenn es sich ergibt.

2.) Weder system("Pause") noch getch() (nicht get.ch()) sind sonderlich elegante Lösungen - für den Anfang reichts vielleicht, aber die Konsole schließt sich nach dem Ausführen nicht ohne Grund (bzw. um Anfänger zu ärgern) - daher würd ich dir empfehlen einfach von einer bestehenden Konsole zu starten (umschalt+rechtsklick in den "Debug" Ordner deines Projekts, dann auf "Eingabeaufforderung hier öffnen"). Dann einfach den Namen der exe von deinem Projekt schreiben (Normalerweise der Name deines Projektes, aber das siehst du dann ja - Achtung, der Name muss in Anführungszeichen stehen wenn er aus mehr als einem Wort besteht!), und Enter drücken. Dann kannst du die Ausgabe auch so sehen, ohne dass du was an deinem Code verändern musst. Später kannst du auch einfach den Debugger benutzen.

NachoMan

Community-Fossil

Beiträge: 3 885

Wohnort: Berlin

Beruf: (Nachhilfe)Lehrer (Mathematik, C++, Java, C#)

  • Private Nachricht senden

5

16.05.2011, 12:35

Willkommen im Forum :D

Du hättest es auch einfach ausprobieren können. getch() oder besser cin.get() pausiert das Programm dort wo du es hereinkopierst.
Um das zu verstehen kannst ja mal das ausführen:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
int main()
{
    cout << "blub" << endl;
    cin.get();
    cout << "blub2" << endl;
    cin.get();
    return 0;
}


@Cubic:
1.) Es gibt einen guten Grund Visual Studio 2008 zu benutzen: die Performance. Wenn der Rechner mit 2010 nicht klar kommt bringt es einem nichts, dass es die aktuelle Version ist.

2.) Das ist viel zu aufwendig. Wieso eine elegante Lösung wählen, wenn sie nicht das tut was man eigentlich will? Selbst wenn er das Programm verschicken will um zu zeigen was er tolles geschrieben hat, müssen das alle anderen auch so machen. Hier spricht nichts gegen std::cin.get().(wir wollen ja bei C++ bleiben)
"Der erste Trunk aus dem Becher der Erkenntnis macht einem zum Atheist, doch auf dem Grund des Bechers wartet Gott." - Werner Heisenberg
Biete Privatunterricht in Berlin und Online.
Kommt jemand mit Nach oMan?

Wirago

Alter Hase

Beiträge: 1 193

Wohnort: Stockerau

Beruf: CRM Application Manager

  • Private Nachricht senden

6

16.05.2011, 13:26

wenn du deinen code geschrieben hast und strg+F5 drückst, dann pausiert er automatisch bevor er das konsolenfenster schließt. nur so ganz nebenbei ;)

7

16.05.2011, 15:15

wenn du deinen code geschrieben hast und strg+F5 drückst, dann pausiert er automatisch bevor er das konsolenfenster schließt. nur so ganz nebenbei ;)

Hab ich vergessen, gut dass du das sagst.

Zitat

Das ist viel zu aufwendig. Wieso eine elegante Lösung wählen, wenn sie nicht das tut was man eigentlich will? Selbst wenn er das Programm verschicken will um zu zeigen was er tolles geschrieben hat, müssen das alle anderen auch so machen. Hier spricht nichts gegen std::cin.get().(wir wollen ja bei C++ bleiben)


Wie gesagt, für einen Anfänger bei seinen "Hello World"-Programmen reichts. Ich rate den Leuten nur immer davon ab weil sie ansonsten auf die Idee kommen das ein Konsolenprogramm am Ende pausieren sollte. Abgesehen davon ist es nicht wirklich kompliziert nebenbei eine Konsole offenzuhalten und ab und zu mal Pfeil-Hoch und Enter zu drücken.

Schorsch

Supermoderator

Beiträge: 5 145

Wohnort: Wickede

Beruf: Softwareentwickler

  • Private Nachricht senden

8

16.05.2011, 15:34

Warum Pfeil Hoch und Enter? Ich benutze die Lösung selbst immer um Testprogramme aufzuhalten. Weiß auch nicht was dagegen sprechen soll. Vor allem sind das ja keine Tools, die mit irgendwelchen Parametern über die Konsole gestartet werden. Und selbst da wird oft am ende ein System("pause") benutzt.
„Es ist doch so. Zwei und zwei macht irgendwas, und vier und vier macht irgendwas. Leider nicht dasselbe, dann wär's leicht.
Das ist aber auch schon höhere Mathematik.“

9

16.05.2011, 16:44

Weil sich der Name der exe ja nicht ändert, also immer den letzten Befehl wiederholen lassen. Die meisten Konsolenprogramme die heutzutage noch benutzt werden sind eh Hilfsprogramme bei denen eine Pausierung hinderlich wäre (zB. würde die meisten Menschen wenig begeistert sein wenn sie 10000 zip dateien entpacken müssten und dazu gezwungen wären nach jeder Datei enter zu drücken).

NachoMan

Community-Fossil

Beiträge: 3 885

Wohnort: Berlin

Beruf: (Nachhilfe)Lehrer (Mathematik, C++, Java, C#)

  • Private Nachricht senden

10

16.05.2011, 18:32

Er sollte das Programm aber im Debuger starten, so lernt er langsam damit umzugehen. Mit strg+F5 starten hat den gleichen Effekt.
Es spricht mehr gegen deine Varainte als gegen seine. Wenn er so weit ist, nützliche Programme schreiben zu können (wie z.b. einen Packer) dann wird er schon wissen was er tut, wenn er am ende das Programms ein cin.get() packt.
"Der erste Trunk aus dem Becher der Erkenntnis macht einem zum Atheist, doch auf dem Grund des Bechers wartet Gott." - Werner Heisenberg
Biete Privatunterricht in Berlin und Online.
Kommt jemand mit Nach oMan?

Werbeanzeige