Problem mit einfacher do while Schleife

Post Reply
Message
Author
bennynestler

Problem mit einfacher do while Schleife

#1 Post by bennynestler »

Hallo,

wir fangen gerade an in der FH C zu programmieren. Es ging dabei um eine kleine do while schleife. Der Programmcode sah wie folgt aus:

do
{
printf("Bitte geben sie als erstes das zu verzinsende Kapital ein: ");
status_Kapital = scanf("%f", &Kapital);
fflush(stdin);
}
while (status_Kapital != 1);

Wir programmieren in Windows mit dem Dev - Bloodsheed - Compiler. In Windows funktioniert dieser Schleifenteil auch wunderbar.

Nun habe ich zu Hause Ubuntu 6.2. Ich Arbeite mit Kate als Editor und compiliere ich mein Code mit gcc (Gibt es eigentlich noch eine andere Methode bzw. einen Compiler innerhalb des GNome - Desktops???).

Auf jedenfall gibt es bei mir immer das Problem, dass wenn ich ein unzulässiges Zeichen eingebe, sprich ich gebe für die floatingpoint zahl einen buchstaben ein, so schreibt er mir in einer art endlosschleifeimmer nur "bitte geben sie als erstes das zu verzinsende Kapital ein:". WIe gesagt, es läuft so lange bis ich das Programm mit Strg + C unterbreche.

Woran liegt das. Kann mir wer helfen? Ich habe immer gedacht C wäre eine Plattformunabhängige Programmiersprache.

Ich hoffe auf Hilfe,

MFG BennyNestler

sesame

#2 Post by sesame »

C ist plattformunabhängig. Es gibt allerdings betriebssystemspezifische Befehle, die du verwenden kannst, z.B. bei Grafik. fflush brauchste z.b. auch nur bei mickisoft, soweit ich es beobachte.

versuche mal, den gleichen compiler mit den gleichen argumenten einzugeben. evtl. nimm auch eine gleiche entwicklungsumgebung für den anfang. das hilft.
ich benutze z.b. anjuta, netbeans und eclipse, alle mit dem gnu c-compiler.
denn: anderer compiler mit vielleicht sogar noch anderen argumenten -> wahrscheinlich anderes ergebnis.

unter win hilft dir dafür cygwin.

dann sollte es funktionieren bzw. du bekommst genau den fehlerpunkt gemeldet, wo es für ein system nicht mehr geht.

bennynestler

#3 Post by bennynestler »

ich verstehe nicht ganz was du meinst!

der compiler ist doch in allen drei Entwicklungsebenen, die du aufgezählt hast der gnu c - compiler (gcc) oder nicht? da ist es doch egal in welchem Programm ich den c - code schreibe oder??

Ich hab mir nun anjuta heruntergeladen und dort das selbe c - programm geschrieben. Compilieren geht mit anjuta doch auch nicht oder? ich hab zumindest nicht herausbekommen wie. Ich habe also das in anjuta geschriebenen c - programm wieder mit gcc comiliert und dann ausgeführt und das ergebnis ist wieder mein vollgeschriebener bildschirm.

gerade habe ich noch nach minGW gesucht. allerdings finde ich dieses Programm nur für Windows.

Ich verstehe auch nicht recht warum die schleifenstruktur in windows klappt und in linux mir den ganzen bildschirm voll schreibt. Irgendwie kann ich mir das nicht anders erklären, als dass er in linux irgendwie nicht bei dem scanf befehl anhält und auf eine neue eingabe wartet. sondern immer den status schon als ungleich 1 liest und deshalb eine endlosschleife draus wird.

liegt das problem vielleicht wo anders?

MFG benny nestler

User avatar
Janka
Posts: 3585
Joined: 11. Feb 2006 19:10

#4 Post by Janka »

C selbst ist Plattformunabhängig. Das wären dann do, { }, while und die Art, wie man Dinge notiert.

Die libc (scanf(), fflush() etc.) ist hingegen hochgradig plattformabhängig. Vom eingesetzten Compiler hängt die libc mittelbar ab, denn für die meisten Compiler gibt es eine bevorzugte libc.

Du gehst in deinem Beispiel davon aus, dass fflush(stdin) das fehlerhafte Zeichen aus dem Eingabedatenstrom entfernt. Das Verhalten von fflush() auf Input-Streams ist aber laut C99-Spezifikaktion nicht definiert. Du hast dich also von einer bestimmten Implementierung (Dev-Bloodsheed) abhängig gemacht.

Um das falsche Zeichen aufzufressen musst du getchar() statt fflush(stdin) benutzen. Falls du bisher aufgelaufenen Zeichen auffressen willst, machst du fseek(stdin, 0L, SEEK_END); getchar();
Das ist dann auch plattformunabhängig.

Wenn du weniger Plattformabhängigkeit haben willst, nimm eine Skriptsprache oder Java.

Janka
Ich vertonne Spam immer in /dev/dsp statt /dev/null.
Ich mag die Schreie.

PDA

#5 Post by PDA »

GCC heißt übrigens
GNU Compiler Collection
Enthalten unter anderem Compiler für C, C++ und noch andere.

Post Reply