Panke
Anmeldungsdatum: 14. Oktober 2010
Beiträge: 133
|
Ein einfaches cin.get() reicht.
Reicht nur, wenn nichts im Puffer und main gibt implizit 0 zurück, wurde ja schon erwähnt.
Na dann sei froh, dass ich nicht die Übungsaufgaben korrigiert habe, weil ich bei sowas immer Punkte abgezogen hab
Das finde ich in diesem konkreten Fall völlig unangebracht. Standardkonform ist Standardkonform auch wenn der
Standard nach deiner Zeit verabschiedet wurde. Wenn müsstest du allen einen Punkt abziehen, die 0 zurückgeben
ohne vorher den Stream zu prüfen.
|
Riddle
Anmeldungsdatum: 27. Juli 2007
Beiträge: 201
Wohnort: 127.0.0.1
|
Was soll bitte an system("PAUSE") standardkonform sein (Es geht mir hier nicht um Verwendung von system, weil diese Funktion manchmal ja noch Sinn hat, sondern um PAUSE was eben nur unter Windows funktioniert)? Und ja, ich hatte z.B. auch Punkte abgezogen, wenn
conio.h verwendet wurde, Leute einfach immer alle ihnen bekannten Header eingebunden haben, nicht überprüft wurde ob bei Filestreams das Öffnen der Datei geklappt hat, ein Filestream/Stringstream nicht ordnungsgemäß geschlossen wurde, nicht gecheckt wurde, ob das Anlegen von dynamischen Speicher geklappt hat, dynamischer Speicher nicht wieder freigegeben wurde, unbemerkt über die Grenzen eines dynamischen Arrays hinausgeschrieben wurde, in einer Klasse mit dynamisch angelegten Datenelementen kein Kopierkonstruktor/Destruktor/Zuweisungsoperator vorhanden war, zu einer Klasse kein sinnvolles Testprogramm abgegeben wurde, ...
Warum hatte ich das gemacht? Weil das ein Programmierkurs war und die Leute sich nicht eine "es compiliert, damit sind wir fertig"-Einstellung angewöhnen sollten. Und ich bin selbst schon damit auf die Nase gefallen mich drauf zu verlassen, dass ein Compiler implizit etwas macht (z.B. die Funktion exit, die indirekt über lange Zeit über iostream mit verfügbar war und dann plötzlich mit einer gcc-Version nicht mehr) und dann ein Paar Jahre später musste ich dann erst große Debugrunden einlegen um meine alten Programme wiederverwenden zu können. Seit diesem Moment rate ich einfach davon ab, dass man sich zu sehr auf den Compiler verlässt.
|
eagle87
(Themenstarter)
Anmeldungsdatum: 29. Dezember 2010
Beiträge: 85
|
Hab jetzt bei meinem Terminal doch ne Einstellung gefunden mit der ich es offen lassen kann. Dann kommt die Meldung "Der Kindprozess wurde unerwartet mit Status 0 beendet". Wie muss das Programm aussehen, dass es nichtmehr "unerwartet" beendet wird? Lysander schrieb: 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
Ok, damit funktionierts auch das Terminal zu starten. Passieren tut anschließend das gleiche wie wenn ich das Programm mit einem Starter starte. Das mit dem Dozenten in der Programmiervorlesung war eh so eine Sache. Der, den wir in den ersten zwei Semestern planmäßig hätten kriegen sollen war "unerwatet" beide Semester im Ausland. Der Ersatzdozent hat im ersten Semester eine mehr schlechte als rechte Vorlesung gehalten und ist im zweiten Semester auf einmal auch nicht erschienen, weshalb die Vorlesung dann einfach komplett ausgefallen ist. Fürs dritte Semester übernimmt dann zum Glück jemand anderes.
|
Riddle
Anmeldungsdatum: 27. Juli 2007
Beiträge: 201
Wohnort: 127.0.0.1
|
Endet das Programm auch unerwartet?
| #include <iostream>
using namespace std;
int main() {
cout << "Hello World!" << endl;
return 0;
}
|
|
user_unknown
Anmeldungsdatum: 10. August 2005
Beiträge: 17622
Wohnort: Berlin
|
Riddle schrieb: Und ich bin selbst schon damit auf die Nase gefallen mich drauf zu verlassen, dass ein Compiler implizit etwas macht (z.B. die Funktion exit, die indirekt über lange Zeit über iostream mit verfügbar war und dann plötzlich mit einer gcc-Version nicht mehr) und dann ein Paar Jahre später musste ich dann erst große Debugrunden einlegen um meine alten Programme wiederverwenden zu können. Seit diesem Moment rate ich einfach davon ab, dass man sich zu sehr auf den Compiler verlässt.
Dass alte Programme in 5 Jahren unverändert compilieren kann man nur erkaufen, in dem man alle Fortschritte unterbindet. Ob davon implizite Argumente betroffen sind oder nicht ist dabei mehr zufällig. Das nächste Mal trifft es eine andere Eigenschaft des Programms - gegen alle derartige Entwicklungen kann man sich nicht einigeln. Plötzlich hieß es nicht mehr iostream.h sondern iostream. Tja - will man dann neu kompilieren, muß man über den Quellcode nochmal rüber, oder den Schalter --antik finden und setzen.
|
Riddle
Anmeldungsdatum: 27. Juli 2007
Beiträge: 201
Wohnort: 127.0.0.1
|
Mir ist durchaus bewusst, dass man alten Code nicht ohne ein paar Anpassung einfach so weiterverwenden kann, trotzdem muss man sich die Sache nicht schwerer machen als sie eh schon ist und sollte einigermaßen am Standard bleiben (der dann beim compilieren gewählt wird und teilweise wirklich zu einem --antik-Flag werden kann). Und nennt mich stur: Ich sehe es nicht als Fortschritt an, wenn man aus Faulheit return 0; weglässt und damit die Sprache inkonsequent erscheinen lässt. So, jetzt halte ich mich aber etwas zurück, weil das Ganze zu sehr vom Thema des Threads wegführt.
|
eagle87
(Themenstarter)
Anmeldungsdatum: 29. Dezember 2010
Beiträge: 85
|
Riddle schrieb: Endet das Programm auch unerwartet?
Ja, das endet auch unerwartet. Mir ist eben noch aufgefallen dass diese Meldung nur erscheint wenn ich das Programm über einen Starter oder als Desktop-Datei starte. Wenn ich es von der Konsole aus starte kommt keine Meldung. Vermutlich liegt das daran, dass wenn ich es von der Konsole aus Starte die Konsole anschließend eine neue Eingabe von mir erwartet (Es steht dann sowas wie "Benutzername@Benutzername:~$ " da). Beim Start als Desktop-Datei oder über einen Starter ist keine Benutzereingabe möglich.
|
Riddle
Anmeldungsdatum: 27. Juli 2007
Beiträge: 201
Wohnort: 127.0.0.1
|
OK, dann liegt es nicht am Programm, sondern definitiv am Starter. Könntest du die Desktop-Datei vielleicht mal hochladen, damit man das auch einmal testen kann? Welches Terminal verwendest du?
|
eagle87
(Themenstarter)
Anmeldungsdatum: 29. Dezember 2010
Beiträge: 85
|
Ich verwende das GNOME-Terminal 2.32.0
- test.out.desktop (8.9 KiB)
- Download test.out.desktop
|
Panke
Anmeldungsdatum: 14. Oktober 2010
Beiträge: 133
|
Riddle schrieb:
conio.h verwendet wurde, Leute einfach immer alle ihnen bekannten Header eingebunden haben, nicht überprüft wurde ob bei Filestreams das Öffnen der Datei geklappt hat, ein Filestream/Stringstream nicht ordnungsgemäß geschlossen wurde, nicht gecheckt wurde, ob das Anlegen von dynamischen Speicher geklappt hat, dynamischer Speicher nicht wieder freigegeben wurde, unbemerkt über die Grenzen eines dynamischen Arrays hinausgeschrieben wurde, in einer Klasse mit dynamisch angelegten Datenelementen kein Kopierkonstruktor/Destruktor/Zuweisungsoperator vorhanden war, zu einer Klasse kein sinnvolles Testprogramm abgegeben wurde, ...
Klingt alles ganz vernünftig. Ich bezog mich aber auf fehlendes "return 0;". Riddle schrieb: Endet das Programm auch unerwartet?
| #include <iostream>
using namespace std;
int main() {
cout << "Hello World!" << endl;
return 0;
}
|
Schlimmer: Es signalisiert Erfolg (return 0;) auch dann, wenn das schreiben
auf cout fehlschlägt. Dafür könnte man nen Punkt abziehen ☺ Ist ungefähr die Kategorie: Leute einfach immer alle ihnen bekannten Header eingebunden haben, einfach ein Filestream/Stringstream nicht ordnungsgemäß geschlossen wurde,
Mir geht es vor allem darum, dass man nicht Punkte für etwas abziehen kann,
dass nur subjektiv schlechter Stil ist. Und ein fehlendes "return 0;" ist imo
nur subjektiv schlecht.
|
Riddle
Anmeldungsdatum: 27. Juli 2007
Beiträge: 201
Wohnort: 127.0.0.1
|
Erst einmal zum eigentlichen Thread: Hast du deinem Programm einfach nur die Endung .desktop angehängt und das auf die Arbeitsfläche gelegt? Eigentlich sind Starter einfach nur Textdateien und keine ELF-Dateien. Panke schrieb:
Ich bezog mich aber auf fehlendes "return 0;".
Aber ich bezog mich die ganze Zeit auf system("PAUSE") weil ich bis gestern nicht wusste, dass ein Programm ohne Warnung compiliert, wenn man das return-Statement weglässt und mir das auch vorher noch nie untergekommen ist (ich bin jetzt auch ehrlich gesagt zu faul um mehrere Compiler zu testen, ob das auch wirklich von allen automatisch ergänzt wird). Und bei einer Konsolenapplikation zu testen ob Ein- und Ausgabestrom funktionstüchtig sind ist so ungefähr in der Größenordnung wie wenn man beim Tanken eine chemische Analyse macht ob man nun wirklich Benzin bekommen hat (Entwickelt man eine Bibliothek ist das wieder eine ganz andere Geschichte). Und die anderen Sachen sind auch nicht nur subjektiv:
Zu viele Header können sich ungünstig auf die Compilierdauer auswirken. Nicht abgeschlossene Filestreams können zu Problemen führen, wenn man in einer Funktion eine Datei geschrieben hat und in einer anderen Funktion die Datei wieder auslesen möchte.
Wie gesagt, es war ein Programmierkurs und da müssen die Teilnehmer meiner Meinung nach auch auf Stellen aufmerksam gemacht werden, die zu Problemen führen könnten. So, aber nun endgültig von meiner Seite her genug: Während meiner ganzen Korrekturzeit kam keine einzige Beschwerde (eher das Gegenteil, da ich immer recht ausführliche Anmerkungen zur Korrektur gemacht habe und begründet warum ich die Stellen schlecht finde). Weitere Diskussion über das Thema also vielleicht noch als PN, es gehört definitiv nicht in diesen Thread.
|
Lysander
Anmeldungsdatum: 30. Juli 2008
Beiträge: 2669
Wohnort: Hamburg
|
eagle87 schrieb: Ok, damit funktionierts auch das Terminal zu starten. Passieren tut anschließend das gleiche wie wenn ich das Programm mit einem Starter starte.
Ooops, da war ich wohl zu voreilig. Ich hatte fest im Kopf, dass man dort auch angeben kann, dass sie Konsole nach Beendigung des Programms geöffnet bleiben soll. Das geht aber wohl nicht standardisiert, sondern man muss die Option der jeweiligen Shell explizit angeben. Hier mal ein Beispiel, welches ich unter KDE 4.7 angelegt habe:
[Desktop Entry]
Comment=
Exec=/home/nelson/src/Python/snippets/dsaini.py
Name=DSA ini
NoDisplay=false
Path[$e]=
StartupNotify=true
Terminal=1
TerminalOptions=--hold
Type=Application
X-KDE-SubstituteUID=false
X-KDE-Username=
Wie man sieht starte ich ein Python-Script und gebe explizit an, dass es im Terminal gestartet werden soll. Die Option --hold ist eine spezifische Option der KDE SHell konsole . Unter GNOME dürfte das vermutlich anders sein? Ich denke mal Du müsstest das einfach anpassen.
|
eagle87
(Themenstarter)
Anmeldungsdatum: 29. Dezember 2010
Beiträge: 85
|
Riddle schrieb: Hast du deinem Programm einfach nur die Endung .desktop angehängt und das auf die Arbeitsfläche gelegt? Eigentlich sind Starter einfach nur Textdateien und keine ELF-Dateien.
Ehrlich gesagt hab ich nur die Endung .desktop angehängt, die Datei aber in "Persönlicher Ordner" belassen. Was genau sind ELF-Dateien? Was ich bisher darüber gefunden hab ist, dass es ein Format ist welches das a.out Format abgelöst haben soll. Mit dem Starter hab ich auch nur versucht die Programmdatei zu öffnen. Ich hab also 2 Objekte, einen Starter und die .out-Datei (beim Öffnen mit Starter ohne die Endung .desktop). Lysander schrieb: Wie man sieht starte ich ein Python-Script und gebe explizit an, dass es im Terminal gestartet werden soll. Die Option --hold ist eine spezifische Option der KDE SHell konsole . Unter GNOME dürfte das vermutlich anders sein? Ich denke mal Du müsstest das einfach anpassen.
Jetzt müsst ich nurnoch wissen wie das ganze mit c++ unter GNOME funktioniert 😛 mit Google hab ich nix gefunden. Aber immerhin bin ich jetzt soweit dass ich meine Programme einigermaßen schnell Testen kann.
|
Riddle
Anmeldungsdatum: 27. Juli 2007
Beiträge: 201
Wohnort: 127.0.0.1
|
Ich hab mal ein bisschen rumprobiert und bin, damit gnome-terminal funktioniert, ehrlich gesagt nur auf diese Lösung gekommen (hold-Flag wie bei xterm und konsole habe ich leider nicht gefunden):
#!/usr/bin/env xdg-open
[Desktop Entry]
Version=1.0
Type=Application
Terminal=false
Icon[de_DE]=gnome-panel-launcher
Name[de_DE]=Test
Exec=/bin/bash -c '/Pfad/zum/Programm; exec /bin/bash -i'
Name=Test
Icon=gnome-panel-launcher
Einfach z.B. als Test.desktop im Ordner Arbeitsfläche anlegen und natürlich den Pfad zum Programm vorher noch durch den zu deinem Programm ersetzen.
Ist im Grunde jetzt nur durch Rechtsklick → "Starter anlegen" erzeugt und vieles auf Defaulteinstellungen belassen. Vielleicht hat aber jemand noch eine bessere Idee. ELF-Dateien sind die Programme, die dein Compiler erzeugt.
|
Lysander
Anmeldungsdatum: 30. Juli 2008
Beiträge: 2669
Wohnort: Hamburg
|
eagle87 schrieb: Riddle schrieb: Hast du deinem Programm einfach nur die Endung .desktop angehängt und das auf die Arbeitsfläche gelegt? Eigentlich sind Starter einfach nur Textdateien und keine ELF-Dateien.
Ehrlich gesagt hab ich nur die Endung .desktop angehängt, die Datei aber in "Persönlicher Ordner" belassen.
Ich hatte Dir doch explizit den wiki-Eintrag verlinkt! Hast Du Dir den überhaupt angeguckt? Lysander schrieb: Wie man sieht starte ich ein Python-Script und gebe explizit an, dass es im Terminal gestartet werden soll. Die Option --hold ist eine spezifische Option der KDE SHell konsole . Unter GNOME dürfte das vermutlich anders sein? Ich denke mal Du müsstest das einfach anpassen.
Jetzt müsst ich nurnoch wissen wie das ganze mit c++ unter GNOME funktioniert 😛 mit Google hab ich nix gefunden. Aber immerhin bin ich jetzt soweit dass ich meine Programme einigermaßen schnell Testen kann.
Das hat doch nix mit C++ zu tun! Sofern die Shell bei einer Datei das Ausführungsrecht hat, wird sie dieses auch versuchen auszuführen. Du gibst ja die fertig kompilierte und gelinkte Datei an und nicht irgend einen Quellcode. Irgend wie kommt es mir so vor, als dass Dir so ziemlich alle Grundbegriffe der Shell und der Basiskonzepte von Linux fehlen. Du musst doch eigentlich nur meine Beispieldatei entsprechend anpassen und bei Dir im definierten Ordner ablegen. Alternativ nutzt Du eben den Menü-Editor von GNOME. Das stand doch iirc auch im wiki! Einzig den Parameter für das "Offen-Lassen" der Shell musst Du noch rausfinden. Da ich kein GNOME einsetze, kann ich Dir das nicht sagen. Normalerweise hilft da ein shell-name --help , wobei Du für shell-name eben das Konsolenprogramm von GNOME eingeben musst. (evtl. reicht terminal ?)
|