[C] Verhindern das Programm sich schließt

Sahit

Admiral
Registriert
März 2010
Beiträge
8.117
Servus hatten die Aufgabe ein kleines Programm in C zu programmieren das die Entfernung von zwei Koordinaten auf der Erde berechnet. Das Programm läuft auch auf dem WTS (Windows Terminal Server) der Uni ohne Probleme. Ich wollte das Programm nun auf meinem Rechner daheim ausführen. Mit folgendem Ergebnis: Das Programm öffnet sich --> ich gebe alle Werte ein --> Das Programm schließt sich (wahrscheinlich läuft es durch und schließt sich sofort wieder). Wie kann ich dieses Verhalten unterbinden?

Hier der Code

Code:
#include <stdio.h>
#include <math.h>

int main()

{
const double pi=3.141592654;
double lg,lm,bg,bm,lg1,lm1,bg1,bm1,l1,b1,b2,l2,f,a,F,G,L,S,C,w,D,R,H1,H2,s,l;

//Eingabe
printf("Eingabe Standort Breitengrad Koordinaten auf der Suedhalbkugel in Minus: Grad");
scanf("%lf", &bg);

printf("Eingabe Standort Breitengrad Koordinaten auf der Westhalbkugel in Minus: Minute");
scanf("%lf", &bm);

printf("Eingabe Standort Laengengrad Koordinaten auf der Westhalbkugel in Minus : Grad");        
scanf("%lf", &lg);

printf("Eingabe Standort Laengengrad Koordinaten auf der Suedhalbkugel in Minus : Minute");
scanf("%lf", &lm);

printf("Eingabe Ziel Breitengrad Koordinaten auf der Suedhalbkugel in Minus: Grad");
scanf("%lf", &bg1);

printf("Eingabe Ziel Breitengrad Koordinaten auf der Suedhalbkugel in Minus: Minute");
scanf("%lf", &bm1);

printf("Eingabe Ziel Laengengrad Koordinaten auf der Westhalbkugel in Minus : Grad");
scanf("%lf", &lg1);

printf("Eingabe Ziel Laengengrad Koordinaten auf der Westhalbkugel in Minus : Minute");
scanf("%lf", &lm1);

// Rechnung
b1 = bg+bm/60;
l1 = lg+lm/60;
b2 = bg1+bm1/60;
l2 = lg1+lm1/60;

printf("Uebung 2 - Entfernungsberechnung\n\n");

printf("WGS-Koordinaten Koordinaten auf der Suedhalbkugel in Minus\n");
printf("b1 = %lf, l1 = %lf\n", b1, l1);
printf("b2 = %lf, l2 = %lf\n\n", b2, l2);

// Abplattung der Erde
f=1/298.257223563;
printf("f = %lf\n",f);

// Aequatorradius der Erde in km
a=6378137.0/1000.0;
printf("a = %lf\n\n",a);

// Hilfsgroessen F, G und l berechnen
F = (b1+b2)/2;
printf("F = %lf\n",F);
G = (b1-b2)/2;
printf("G = %lf\n",G);
l = (l1-l2)/2;
printf("l = %lf\n\n",l);

// F, G und l in Bogenmass umrechnen
F = ((b1+b2)/2)*(pi/180);
printf("F = %lf\n",F);

G = ((b1-b2)/2)*(pi/180);
printf("G = %lf\n",G);

l = ((l1-l2)/2)*(pi/180);
printf("l = %lf\n\n",l);

// Hilfsgroessen S, C, omega
S = sin(G)*sin(G)*cos(l)*cos(l)+cos(F)*cos(F)*sin(l)*sin(l);
printf("S = %lf\n",S);

C = cos(G)*cos(G)*cos(l)*cos(l)+sin(F)*sin(F)*sin(l)*sin(l);
printf("C = %lf\n",C);
        
w = atan(sqrt(S/C));
printf("w = %lf\n\n",w);

// Grobe Naeherung fuer Abstand
D = 2.0*w*a;
printf("D = %lf\n\n",D);

// Hilfsgroesse R
R = sqrt(S*C)/w;
printf("R = %lf\n\n",R);

// Korrekturfaktoren H1 und H2
H1 = (3.0*R-1)/(2.0*C);
printf("H1 = %lf\n",H1);

H2 = (3.0*R+1)/(2.0*S);
printf("H2 = %lf\n\n",H2);

// Abstand s in Kilometern
s = D*(1+f*H1*sin(F)*sin(F)*cos(G)*cos(G)-f*H2*cos(F)*cos(F)*sin(G)*sin(G));

// Ergebnisausgabe
printf("Entfernung in km = %lf\n\n",s);

// Programmende, Statuscode 0
return 0;
}

Ich weiß es gibt sicher noch Verbesserung Potential aber das Programm läuft :D und das ist das wichtigste für mich ;)

Sahit
 
Startest Du das Programm quasi "per Doppelklick" oder machst Du erst einmal eine Kommandozeile aus und startest es "von dort"?
 
Ich starte das Programm einfach über Doppelklick

@KTelwood Ja so geht das auf jeden fall aber gibts nich noch ne "elegantere" Lösung?
 
Die Lösung entspricht vollendet "KISS" und darf als elegant betrachtet werden.

Aufblähen lässt sich das natürlich noch damit, dass die Eingabe eines speziellen Zeichens bzw. Zeichenkette erfolgen muss, bevor das Programm terminiert, wobei bei nicht passender Eingabe ein Rücksprung erfolgen sollte. Ist aber echt nur BalLast.
 
Danke für die schnelle Hilfe ich habe es jetzt mit der Lösung von Thaxll'ssillyia gemacht.
 
Sahit schrieb:
Ich starte das Programm einfach über Doppelklick
Da haben wir schon das Problem. Logisch das dann nach Ende des Programms das Fenster wieder geschlossen wird wie bei jedem anderen Programm auch.

Besser ist es bei Konsolenprogrammen auch wirklich erst eine Konsole auf zu machen. Die bleibt dann auch auf, wenn daraus ein anderer Prozess gestartet wird und sich wieder beendet.

So muss man im Programm auch nichts anpassen. Außerdem bekommt man etwaige Runtime-Fehler mit.

Gruß
Andy
 
Ganz gut ist dann eine VM mit Linux. Da gibts dann eine "richtige" Konsole.
 
Und die Windows Konsole ist keine "richtige" oder was? :D
 
Nö.
Das ist bloß eine altmodische Bedienweise und dient beim ausführen von primitiven Programmen wie "Ping" oder eben den selbst geschriebenen (C) Programmen als ausgabefenster.

https://en.wikipedia.org/wiki/Linux_console

Die Kommandozeile ist bei Windows eher so eine Umgebung für rudimentäre Programme. Bei Linux läuft ansich alles in shells/Terminals.
 
Zuletzt bearbeitet:
KTelwood schrieb:
Die Kommandozeile ist bei Windows eher so eine Umgebung für rudimentäre Programme. Bei Linux läuft ansich alles in shells/Terminals.
Also jetzt mal ganz konkret (ohne nur vage Andeutungen):
Worin unterscheidet sich technisch(!) eine Linux-Console zu ihrem Windows-Pendant?

Gruß
Andy
 
Statt groben Quark daher zu reden, kann man auch einfach zugeben, dass man sich geirrt hat. Deine Beschreibung der NT-Konsole zeugt nur davon, dass du von ihr keine Ahnung hast. Dass sie unter Windows weniger häufig benutzt wird, liegt eher an den vielfältigen Alternativen, als an ihrer mangelnden Mächtigkeit.

Die NT-Konsole unterstützt Kontrollstrukturen, Schleifen, Ein- und Ausgabeumleitung, Pipelines und alles, was deine liebste Unix-Shell auch kann.
 
Zuletzt bearbeitet:
Kurz, die "Kommandozeile" bei Linux ist universeller. Das kommt daher das in Linux viel mehr Programme über das Terminal aufrufbar sind als die paar Windows-Wartungsteile.


Zum Testen.
Besorg dir VMware und ein Ubuntu und installiere eine VM.
Dann versuch mal das Beispiel mit Linux zu kompilieren und einmal mit windows.
Bei Linux ein "Terminal" öffnen, und gcc programm.c eingeben und du erhälst sofort ein ergebnis.

Bei Windows brauchst du eine Entwicklungsumgebung, du kannst es nicht "in cmd" kompilieren.
Auch musst du zwischen Kommandozeile und Entwicklungs GUI hin und her. Und in der Kommandozeile kannst du nur lauffähige programme
ausführen, aber fehler bekommst du nur Kryptisch.
 
Die Powershell kann sogar noch mehr ;)

Allerings scheint mir das GUI Interface (als Gui bezeichne ich jetzt mal alles was auf den Bildschirm zeichnet - selbst wenns nur text ist) für diese Konsole im Vergleich zu den üblichen Linux Terminals wesentlich eingeschränkter zu sein (Wobei sich das mit Win10 schon merklich gebessert hat).
Ergänzung ()

@KTelwood: Wenn man keine Ahnung hat...
GCC gibts genauso für windows und selbst den microsoft compiler kann man ohne gui verwenden. Dass es insgesamt wohl mer kommandozeilentools für Linux als für Windows gibt simmt vermutlich - da kenne ich mich unter Windows zu wenig aus.
 
Zuletzt bearbeitet:
KTelwood schrieb:
Zum Testen.
Besorg dir VMware und ein Ubuntu und installiere eine VM.
Dann versuch mal das Beispiel mit Linux zu kompilieren und einmal mit windows.
Bei Linux ein "Terminal" öffnen, und gcc programm.c eingeben und du erhälst sofort ein ergebnis.
Das ist gelogen und das müsstest du auch wissen. Das geht erst, wenn man die libc-header, Header aller verwendeten Bibliotheken, binutils, make und das komplette GNU Build System installiert.

KTelwood schrieb:
Bei Windows brauchst du eine Entwicklungsumgebung, du kannst es nicht "in cmd" kompilieren.
Auch musst du zwischen Kommandozeile und Entwicklungs GUI hin und her.
https://msdn.microsoft.com/de-de/library/wea2sca5(v=vs.90).aspx

Und in der Kommandozeile kannst du nur lauffähige programme
ausführen, aber fehler bekommst du nur Kryptisch.

Ich dachte, ich hätte das schon gesagt, aber:
Die NT-Konsole unterstützt Kontrollstrukturen, Schleifen, Ein- und Ausgabeumleitung, Pipelines und alles, was deine liebste Unix-Shell auch kann.

Und jetzt hör auf, dich immer weiter rein zu reiten.
 
Zuletzt bearbeitet: (Kommentar zu dem Ubuntublödsinn.)
Das alles hat aber überhaupt nichts mehr mit der Frage des TE zu tun.
Wenn man verhindern möchte, dass sich das Fenster ach dem Durchlauf des Programms schließt, dann reicht das Ausführen aus einer Windows CMD heraus (oder die Variante mit system(pause)). Es ist völliger Overkill, dafür eine Linux VM zu installieren und auch der Funktionsumfang der Kommandozeile unter Linux oder Windows ist dafür nicht ausschlaggebend.
 
Mein Ubuntu kam "Out of the Box" mit GCC und allem was ich bisher eingebunden habe:

http://www.ubuntufree.com/ubuntu-15-10-will-use-the-gcc-5-compiler-by-default/

enthalten:
https://gcc.gnu.org/

Fand jetzt nicht das war gelogen, dass man mit installiertem GCC per Teminal einen befehl braucht um ein File zu übersetzen, während ich für windows dazu dann Visiual Studio oder MSBUILD oder wie auch immer das alle heißt herunterladen, kaufen und installieren muss ?

Und die meisten Compiler kommen doch immernoch mit einer Entwicklungsumgebung oder ist das falsch?


Vielleicht reden wir auch einfach an einander vorbei.

Ich meine die Windows Kommandozeile ist ein Kümmerlicher rest in einer ansonsten von GUI beherrschten welt. Viele der Programme mit GUIs kommen mit eigenen versionen von "Kommandozeilen" in extra fenstern daher. (aber keine einheitliche)

Ein Terminal bietet zugriff auf eine Vielzahl von Programmen die dafür gedacht sind in der Kommandozeile aufgerufen und bedient zu werden. pdflatex, gnuplot, emacs, alpine, zip/unzip, grep, find, locate, less, tail....
Für windows bekommen die sofort ein GUI übergestülpt. Und kommandozeilen bedienung ist dann die Hintertür.
 
Zuletzt bearbeitet:
KTelwood schrieb:
Mein Ubuntu kam "Out of the Box" mit GCC und allem was ich bisher eingebunden habe:
Exakt. ubuntu installiert den Compiler einfach mit was Du woanders (Windows, aber auch andere Linux-Distributionen manuell machen musst)
Ist aber letztlich auch irrelevant, da es ja nix mit der Konsole als solches zu tun hat.

KTelwood schrieb:
Und die meisten Compiler kommen doch immernoch mit einer Entwicklungsumgebung oder ist das falsch?
Vermutlich eher falsch, aber ist für die Bewertung ob Windows eine Konsole hat völlig irrelevant.

KTelwood schrieb:
Ich meine die Windows Kommandozeile ist ein Kümmerlicher rest in einer ansonsten von GUI beherrschten welt.
Im Gegenteil. Microsoft hat in den letzten 15 Jahren das Angebot an Kommandozeilenprogrammen wieder erheblich ausgebaut.
War auch immer eine FOrderugn von Administratoren für ihre Batch-Dateien (das Pendant zu UNIX Shellskripten).

Klar gab es den Windows-Skripting-Host und später dann auch die Powershell, aber das wurde nie so gut angenommen wie die gute alte Batch-Datei.


KTelwood schrieb:
Ein Terminal bietet zugriff auf eine Vielzahl von Programmen die dafür gedacht sind in der Kommandozeile aufgerufen und bedient zu werden. pdflatex, gnuplot, emacs, alpine, zip/unzip, grep, find, locate, less, tail....
Für windows bekommen die sofort ein GUI übergestülpt. Und kommandozeilen bedienung ist dann die Hintertür.
https://technet.microsoft.com/de-de/library/bb490890.aspx

Und die Liste ist nicht mal vollständig.

Gruß
Andy
 
Zuletzt bearbeitet:
Habe also Ubuntu 15.10 installiert und in der Tat ist GCC vorinstalliert. Benutze Ubuntu nicht regelmäßig und früher war das nicht so. Ziehe die Unterstellung zu lügen also zurück.
Ein Stück Software nachinstallieren zu müssen, kann man aber so gut wie nie vermeiden, wenn man ein brauchbares System haben möchte.
Deshalb ist dein Gemecker gegen MSBUILD bedeutungslos. Das ist nicht nur umsünst sondern sogar freie Software.
Ansonsten schließe ich mich meinen Vorrednern an.
 
Zurück
Oben