eagle87
Anmeldungsdatum: 29. Dezember 2010
Beiträge: 85
|
Hallo zusammen, ich habe heute den GNU C++-Compiler g++ installiert und ihn ausprobiert. Dabei sind ein paar Fragen aufgetreten. Zum Compilieren habe ich "g++ /Dateipfad/Datei.cpp" im Terminal eingegeben. Gibt es einen schnelleren Weg die Datei auszuwählen? Also dass man nicht bei jedem Compilerlauf den gesamten Dateipfad mit angeben muss. In Visual Studios zum Beispiel reicht es ja einfach zwei Tasten zu drücken (glaub es waren F5 und F7). Ich hab gelesen, dass man die neue Datei mit "./a.out" bzw. mit "./Datei" ausführen kann. Gibt es auch eine Möglichkeit eine Datei zu erstellen und die dann ohne Terminal auszuführen (vgl .exe)? Mit VisualStudios unter Windows war es immer nötig "system("PAUSE");" in den Quellcode zu schreiben um zu verhindern dass sich die Konsole sofort wieder schließt. Mit g++ unter Ubuntu scheint man diesen Befehl nicht zu benötigen (es kam sogar die Meldung "sh: PAUSE: not found"). Müsste es unter den verschidenen Systemen nicht gleich sein, da es sich um ein und die selbe Programmiersprache handelt? Programmbeispiel:
| #include <iostream>
#include <cstdlib>
using namespace std;
int main()
{
cout << "Hello World" << endl;
system("PAUSE");
}
|
Gruß
Michael Moderiert von primus pilus: Thema in das richtige Forum verschoben.
|
Riddle
Anmeldungsdatum: 27. Juli 2007
Beiträge: 201
Wohnort: 127.0.0.1
|
system-Befehle gehören nicht zu C++ sondern man sendet einen Befehl nach Außen ab. Dieser Unfug mit system("PAUSE") funktioniert also nur fehlerfrei, wenn man das unter Windows ausführt. Obendrein ist es etwas unfair gegenüber dem gcc, wenn man einen Compiler mit einer IDE vergleicht. Edit: Bitte schreib in dein Programm wenigstens noch ein return 0; am Ende hin.
|
Lysander
Anmeldungsdatum: 30. Juli 2008
Beiträge: 2669
Wohnort: Hamburg
|
Unter Linux schließt sich eine Konsole ja nicht unbedingt nach Beendigung eines Programms 😉 Und wenn Du eine Konsolen-App per Klick aufrufbar machen willst, kannst Du das über Desktop-Dateien machen und denen angeben, dass ein Programm in einer Shell aufgerufen werden soll. Üblicherweise kann man da angeben, dass die Konsole geöffnet bleiben soll. Solche unsinnigen Spielereien mit einer Endlosschleife am Schluss sollte man niemals selber machen! Du kannst ja eine Konsole offen lassen und in der Verzeichnis des Quellcodes gehen und dort den Compiler aufrufen - dann ist der Pfad ja trivial kurz 😉 Zudem sollte man sich dann irgend wann einmal make und Konsorten angucken. Unter Linux kannst Du auch IDEs nutzen, etwa KDevelop oder eben auch Eclipse. Diese erleichtern Dir das Aufrufen des Compilers - Haken ist zunächst die Einarbeitungszeit.
|
user_unknown
Anmeldungsdatum: 10. August 2005
Beiträge: 17618
Wohnort: Berlin
|
Riddle schrieb: Obendrein ist es etwas unfair gegenüber dem gcc, wenn man einen Compiler mit einer IDE vergleicht.
Nun - die meisten Editoren (gedit, scite, vi, emacs, mcedit, ...) unter Linux erlauben es, dass man einen Compiler (oder sonst ein Programm, welches einen Parameter, wie einen Dateinamen, verarbeitet) aufruft, plus Linker, und das Programm startet - unterschiedlich flexibel, aber g++ sollte man überall einstellen können - einmal freilich, muss man es einstellen.
Eine fette IDE braucht es dafür nicht.
Edit: Bitte schreib in dein Programm wenigstens noch ein return 0; am Ende hin.
Das ist aber jetzt auch schon ein paar Jahre obsolet, nein?
|
Hefeweiz3n
Moderator, Webteam
Anmeldungsdatum: 15. Juli 2006
Beiträge: 5814
Wohnort: Ankh-Morpork
|
eagle87 schrieb: Ich hab gelesen, dass man die neue Datei mit "./a.out" bzw. mit "./Datei" ausführen kann. Gibt es auch eine Möglichkeit eine Datei zu erstellen und die dann ohne Terminal auszuführen (vgl .exe)?
Ja. Die a.out ist eine Ausführbare Datei, mit einem Doppelklick in einem Dateibrowser solltest du die öffnen können (Falls nicht: chmod ist dein Freund). Wie oben genannt schließt sich die Konsole dann aber sofort, die richtige Methode das zu unterbinden wurde ebenfalls dort genannt. Mit dem -o -Switch kannst du auch einen Namen vergeben, siehe GCC (Abschnitt „Einige-wichtige-Parameter“).
Müsste es unter den verschidenen Systemen nicht gleich sein, da es sich um ein und die selbe Programmiersprache handelt?
Jain. Die System -Bibliothek ist meines Wissens nach Windows-spezifisch. Die C++-Standardbibliothek ist generisch und wird von allen Implementierungen unterstützt.
|
lilith2k3
Anmeldungsdatum: 14. Dezember 2006
Beiträge: 2999
Wohnort: OS
|
Hallo,
Zum Compilieren habe ich "g++ /Dateipfad/Datei.cpp" im Terminal eingegeben. Gibt es einen schnelleren Weg die Datei auszuwählen? Also dass man nicht bei jedem Compilerlauf den gesamten Dateipfad mit angeben muss. In Visual Studios zum Beispiel reicht es ja einfach zwei Tasten zu drücken (glaub es waren F5 und F7).
Das hiesse hier Äpfel mit Birnen zu vergleichen. Benutze statt des Visual Studios die Powershell und vergleiche dann den Aufwand, den es benötigt, in der Powershell das Programm zu kompilieren und entsprechend in der BASH - bzw.benutze unter beiden Systemen den QT-Creator. Du wirst sehen, der Aufwand ist der gleiche. Entsprechend gälte es zu raten, dass Du aus Komfort-Gründen eben eine IDE benutzt.
Ich hab gelesen, dass man die neue Datei mit "./a.out" bzw. mit "./Datei" ausführen kann. Gibt es auch eine Möglichkeit eine Datei zu erstellen und die dann ohne Terminal auszuführen (vgl .exe)?
Technisch gesehen, ist Deine a.out (warum benutzt Du nicht die Option -o?) eine "Linux-.exe". Erstellst Du irgendwann in ferner Zukunft einmal ein Programm mit graphischer Benutzeroberfläche, wirst Du es auch ohne Terminal ausführen können. Gleiches gilt im Übrigen auch für Windows.
Mit VisualStudios unter Windows war es immer nötig "system("PAUSE");" in den Quellcode zu schreiben um zu verhindern dass sich die Konsole sofort wieder schließt.
Wer behauptet das? Es ist überhaupt nicht nötig, derartige Calls zu machen. Es ist einfach eine schlechte Angewohnheit. Ein einfaches cin.get() reicht.
Müsste es unter den verschidenen Systemen nicht gleich sein, da es sich um ein und die selbe Programmiersprache handelt?
Wenn Du den Aufruf richtig liest, wirst Du verstehen, warum es bei verschiedenen Systemen nicht gleich ist.
Den System-Call gibt's hüben wie drüben, der ist also gleich. Lediglich das externe Kommando "PAUSE" gibt es unter Linux nicht. @Lysander Unter Linux kannst Du auch IDEs nutzen, etwa KDevelop oder eben auch Eclipse. Diese erleichtern Dir das Aufrufen des Compilers - Haken ist zunächst die Einarbeitungszeit.
Ist insofern vernachlässigbar, da sich der TO auch in VS einarbeiten muss(te). @user_unknown Das ist aber jetzt auch schon ein paar Jahre obsolet, nein?
Zur Not hängt's der Compiler an 😉
|
Riddle
Anmeldungsdatum: 27. Juli 2007
Beiträge: 201
Wohnort: 127.0.0.1
|
Sorry, ich bin einfach nur der Meinung, dass eine Funktion, die einen Rückgabewert hat auch etwas zurückliefern sollte und wenn man die return-Anweisung weglässt erzeugt das Compilerwarnungen (zumindest für so altmodische Leute wie mich, die mit mindestens -ansi -Wall -pedantic übersetzen). Mit Empfehlungen für eine IDE wollte ich mich zurückhalten (weil das zu sehr vom eigenen Geschmack abhängt) und in meinem ersten Post das Wiki verlinken. Irgendwie habe ich das dann aber vergessen. Edit: Ich sehe gerade, dass irgendwie nicht mehr gewarnt wird, wenn man die return-Anweisung bei main weglässt. Finde ich ehrlich gesagt unschön.
|
eagle87
(Themenstarter)
Anmeldungsdatum: 29. Dezember 2010
Beiträge: 85
|
Riddle schrieb: Bitte schreib in dein Programm wenigstens noch ein return 0; am Ende hin.
Was genau bewirkt return 0; ? Lysander schrieb: Und wenn Du eine Konsolen-App per Klick aufrufbar machen willst, kannst Du das über Desktop-Dateien machen und denen angeben, dass ein Programm in einer Shell aufgerufen werden soll.
Was meinst du mit Desktop Dateien? Das hat mich aber noch auf eine Idee gebracht. Wenn ich einen Konsolenstarter mit Pfad zu a.out anlege und draufklicke öffnet sich eine Konsole. Allerdings wird sie auch so schnell wieder geschlossen dass man nix erkennen kann. Üblicherweise kann man da angeben, dass die Konsole geöffnet bleiben soll.
Eine solche Auswahl hab ich nirgends gefunden. Du kannst ja eine Konsole offen lassen und in der Verzeichnis des Quellcodes gehen und dort den Compiler aufrufen - dann ist der Pfad ja trivial kurz 😉
Funktioniert ☺ Hefeweiz3n schrieb: Ja. Die a.out ist eine Ausführbare Datei, mit einem Doppelklick in einem Dateibrowser solltest du die öffnen können (Falls nicht: chmod ist dein Freund).
Mit Doppelklick passiert nichts. chmod werd ich bei Gelegenheit ausprobieren lilith2k3 schrieb: Wer behauptet das? Es ist überhaupt nicht nötig, derartige Calls zu machen. Es ist einfach eine schlechte Angewohnheit. Ein einfaches cin.get() reicht.
So wurde uns das an der Hochschule beigebracht 😉 Gruß
Michael
|
Lysander
Anmeldungsdatum: 30. Juli 2008
Beiträge: 2669
Wohnort: Hamburg
|
eagle87 schrieb: Was meinst du mit Desktop Dateien? Das hat mich aber noch auf eine Idee gebracht. Wenn ich einen Konsolenstarter mit Pfad zu a.out anlege und draufklicke öffnet sich eine Konsole. Allerdings wird sie auch so schnell wieder geschlossen dass man nix erkennen kann.
guckst Du hier: Menue
|
Riddle
Anmeldungsdatum: 27. Juli 2007
Beiträge: 201
Wohnort: 127.0.0.1
|
eagle87 schrieb: So wurde uns das an der Hochschule beigebracht 😉
Na dann sei froh, dass ich nicht die Übungsaufgaben korrigiert habe, weil ich bei sowas immer Punkte abgezogen hab 😉. Ein Programm kann immer einen Wert zurückliefern, den man dann in einem anderen Programm nutzen kann um festzustellen ob das Programm ordnungsgemäß (Konvention: Rückgabewert 0) beendet wurde oder irgendwo ein Fehler aufgetreten ist (indem man dann im Programm einen Wert ungleich 0 zurückgibt und dokumentiert, was die Werte bedeuten sollen, also z.B. 1 bei "Teilen durch 0", 2 bei "Speicherzugriffsfehler" usw.).
|
Hefeweiz3n
Moderator, Webteam
Anmeldungsdatum: 15. Juli 2006
Beiträge: 5814
Wohnort: Ankh-Morpork
|
eagle87 schrieb: Riddle schrieb: Bitte schreib in dein Programm wenigstens noch ein return 0; am Ende hin.
Was genau bewirkt return 0; ?
Nun, guck dir die Methode doch mal an: int main() , d.h. die Methode erwartet eigentlich die Rückgabe einer Integer-Zahl. 0 bedeutet in dem Fall das das Programm keinen Fehler produziert hat und erfolgreich ausgefüht wurde.
Lysander schrieb: Und wenn Du eine Konsolen-App per Klick aufrufbar machen willst, kannst Du das über Desktop-Dateien machen und denen angeben, dass ein Programm in einer Shell aufgerufen werden soll.
Was meinst du mit Desktop Dateien? Das hat mich aber noch auf eine Idee gebracht. Wenn ich einen Konsolenstarter mit Pfad zu a.out anlege und draufklicke öffnet sich eine Konsole. Allerdings wird sie auch so schnell wieder geschlossen dass man nix erkennen kann. Üblicherweise kann man da angeben, dass die Konsole geöffnet bleiben soll.
Eine solche Auswahl hab ich nirgends gefunden.
Hm, ich finde sie bei Ubuntu jetzt auch nicht, KDE hat sie aber 😀. Einen Workaround gibt es in den Ubuntu Foren 🇬🇧
Hefeweiz3n schrieb: Ja. Die a.out ist eine Ausführbare Datei, mit einem Doppelklick in einem Dateibrowser solltest du die öffnen können (Falls nicht: chmod ist dein Freund).
Mit Doppelklick passiert nichts. chmod werd ich bei Gelegenheit ausprobieren
Wurde ja auch schon beschrieben: Es wird keine Konsole geöffnet, das Programm nur ausgeführt. Also siehst du auch nix.
lilith2k3 schrieb: Wer behauptet das? Es ist überhaupt nicht nötig, derartige Calls zu machen. Es ist einfach eine schlechte Angewohnheit. Ein einfaches cin.get() reicht.
So wurde uns das an der Hochschule beigebracht 😉
Ich würde mal sagen: Der Prof. sollte mal über seinen Windows-Horizont blicken und Standardkonformen Code unterrichten 😀.
|
user_unknown
Anmeldungsdatum: 10. August 2005
Beiträge: 17618
Wohnort: Berlin
|
Riddle schrieb: Edit: Ich sehe gerade, dass irgendwie nicht mehr gewarnt wird, wenn man die return-Anweisung bei main weglässt. Finde ich ehrlich gesagt unschön.
So ging es mir vor ca. 3 Jahren auch, und da dachte ich, ich sei der letzte, der es gemerkt hat. Aber da man verstehen lernen muss, dass es kein Fehler ist, das wegzulassen beim Lesen u.v.a. beim Kritisieren von Code kommt man nicht umhin, für diese eine Stelle eine Ausnahme zu erlernen - keine dolle Quote, wenn für eine Datei pro mittelgroßem Projekt eine Ausnahme erlernt werden muss, die als Verletzung ansonsten gültiger Standards ins Auge fällt.
|
user_unknown
Anmeldungsdatum: 10. August 2005
Beiträge: 17618
Wohnort: Berlin
|
Hefeweiz3n schrieb: eagle87 schrieb: Riddle schrieb: Bitte schreib in dein Programm wenigstens noch ein return 0; am Ende hin.
Was genau bewirkt return 0; ?
Nun, guck dir die Methode doch mal an: int main() , d.h. die Methode erwartet eigentlich die Rückgabe einer Integer-Zahl. 0 bedeutet in dem Fall das das Programm keinen Fehler produziert hat und erfolgreich ausgefüht wurde.
Eine Methode kann nicht irgendwas erwarten, was in ihren eigenen Verantwortungsbereich fällt. Die Methode sichert zu, dass sie einen Integer zurückgeben wird. Sie verpflichtet sich dazu. Eine Erwartung ist das etwaige Gegenteil davon - Parameter kann sie erwarten.
|
Lysander
Anmeldungsdatum: 30. Juli 2008
Beiträge: 2669
Wohnort: Hamburg
|
user unknown schrieb: Eine Methode kann nicht irgendwas erwarten, was in ihren eigenen Verantwortungsbereich fällt.
Und nun nennen wir es noch universeller Funktion 😉
|
lilith2k3
Anmeldungsdatum: 14. Dezember 2006
Beiträge: 2999
Wohnort: OS
|
Das Return-Statement ist nicht überflüssig in dem Sinne geworden, dass es nicht gebraucht wird: der Compiler ergänzt es ja.
|