Debugging

master.of.war

Freizeitschrauber(in)
Hallo,

ich habe gerade eben angefangen C++ zu lernen. Ich verwende Microsoft Visual C++ 2010 dafür. Schon nach kurzer Zeit habe ich nun ein Problem, unzwar schließt sich das Fenster wenn ich auf Starten OHNE Debugging drücke sofort wieder. Nach angaben müsste das Fenster allerdings geöffnet bleiben.

Was mache ich falsch?


Hier der Quelltext:

// Erster Test
#include <iostream>
int main()
{
std::cout << "Mein erstes Programm!" <<std::endl;
}




Fehler usw wurden nicht gefunden also müsste der Quelltext richtig sein.

Mfg

master.of.war
 
Zuletzt bearbeitet:
Ist alles korrekt. Das Eingabefenster von Windows öffnet sich, um das Programm ausführen zu können und schließt sich folglich, sobald es nicht mehr gebraucht wird. (Also sobald „Mein erstes Programm!“ ausgegeben wurde.) Wenn du es anders möchtest, musst du irgendwo in deinem IDE einstellen, dass das Eingabefenster offen bleiben soll – oder aber du öffnest es manuell und führst darin dein Programm aus. Dann bleibt das Fenster nämlich auch nach Programmende offen.

PS: Für den Anfang würde ich empfehlen, kein IDE zu benutzen, sondern den Compiler selbst aufzurufen und das Programm auch selber zu starten. Dann weißt du, was passiert, lernst mehr und bist vor „Fehlern“ (ist ja keiner) wie diesem sicher.
 
Falls du freiwillig Linux nutzt würde ich dir empfehlen dort mit Programmieren lernen anzufangen. Einfach per Text-Editor coden und per GNU Compiler Collection, die in den meisten fällen schon installiert ist. Während in Windows man entweder von den einfach zu installierenden IDEs erschlagen wird oder man umständlich freie Compiler installieren muss wenn man was lernen will, kann man in Linux direkt loslegen.

Ich hab selber hab aber auch mit Visual Studio angefangen, also Schäden hab ich keine davon getragen. Trotzdem hab ich's seit dem nie wieder angerührt.

Für dein spezielles "Problem" noch eine 2. Lösung:
system("PAUSE"); am Ende von main() plus ein include <stdlib.h>
Aber gibt besser Lösungen, u.A. die von Bauer87. Denn, um ein nettes Zitat zu bringen:
"It's like using a bulldozer to open your front door. It works, but the key is cleaner, easier, cheaper."
 
Zumal das Aufrufen von Systemprogrammen a) nicht plattformunabhängig ist und b) auch ein gewisses Gefahrenpotential bietet. Man sollte es sich daher erst garnicht angewöhnen ;)

Mit Linux anzufangen kann durchaus ratsam sein, da man hier meist das Spiel zwischen den verschiedenen Build-Schritten nachverfolgen kann (oder besser gesagt, muss ^^).

Mir persönlich gefällt das Arbeiten mit Visual Studio ganz gut, zumal ich mich nicht mit irgendwelchen makefiles rumschlagen muss. Aber alles Ansichtssache :ugly:
 
cin.get() ist unsauber.

system("Pause");

ist die richtige Vorgehensweise, und entgegen Bingo88 ist dies in diesem Fall auch kein Problem. Linux akzeptiert DIESEN Aufruf ohne Probleme, gibt einfach aus das er ihn nicht kennt, bearbeitet das Programm aber ansonsten ohne zu murren. Ist aber nen Einzelfall.
 
cin.get() ist unsauber.

system("Pause"); ist die richtige Vorgehensweise, und entgegen Bingo88 ist dies in diesem Fall auch kein Problem.
Warum ist «system("Pause");» bitte sauber? Das wird zwar häufiger gemacht, ist aber doch auch nur ein Hack, damit das für das Programm geöffnete Terminalfenster nach dem eigentlichen Programmende nicht wieder geschlossen wird (so wie es sein sollte).

Der einzig saubere Weg ist imho, das Terminalfenster unabhängig vom Programm (schon vorher) zu öffnen und darin das Programm auszuführen. Das eigentliche Problem ist, dass man dem VS nicht sagen kann, das Terminalfenster offen zu behalten. Das geht sonst mit jeder anständigen Entwicklungsumgebung.

Grundsätzlich ist wohl – da schließe ich mich meinen Vorrednern an – am besten, mit Linux anzufangen zu programmieren. Da lernt man noch Programmieren und nicht die Bedienung einer spezifischen Entwicklungsumgebung und die dazugehörigen Hacks. Dank Virtualisierung dürfte sich damit heute auch keiner mehr ein Bein abbrechen. Einfach ne Virtualbox mit Ubuntu installieren, im Ubuntu „sudo apt-get install build-essential“ in ein Terminal eingeben und schon kann es losgehen.
 
cin.get() ist unsauber.

system("Pause");

ist die richtige Vorgehensweise, und entgegen Bingo88 ist dies in diesem Fall auch kein Problem.
Aha, genau wie int main() ohne alles und ohne Rückgabewert :ugly:

Es gibt gute Gründe, warum system(xyz) besser vermieden werden sollte: Es ist zum einen nicht portabel (das OS muss den Befehl auf OS-Ebene unterstützen). Zum anderen ist system ein ziemlich teuerer Aufruf:

  • laufendes Programm anhalten
  • Eintritt OS-Ebene
  • Shell öffnen
  • Speicher anlegen, um den Befehl auszuführen
  • Befehl ausführen und in diesem Fall auf Tastendruck warten (was passiert wohl bei anderen Programmen, die Fehler erzeugen können und dann auf Eingaben warten? :ugly: )
  • Speicher wieder freigeben
  • OS-Ebene verlassen
  • Programmausführung fortsetzen
Außerdem sieht es mit der Sicherheit dieser Funktion auch nicht so prächtig aus: Falls in deiner PATH-Variable irgendwo ein Programm namens "pause" auftaucht, wird dieses aufgerufen (du gibst den Pfad ja nicht explizit an). So eine ähnliche Sche*sse war letztens für ne Sicherheitslücke in Windows verantwortlich und da sagst du mir jetzt, so ne Funktion wär okay? Is nich böse gemeint oder so, aber nur weil man es so machen kann, heißt das noch lange nicht, dass es auch das richtige Vorgehen ist...
 
Zurück