C Endlosschleife in While? (Anfänger)

Madjura

Cadet 1st Year
Registriert
Aug. 2011
Beiträge
8
Edit: Gestern ganz vergessen, es funktioniert, danke :D

Hallo;
ich bin absoluter Anfänger und konnte mich mit Tutorials bis hier durchkämpfen, es sollte meines Wissens auch alles funktionieren, compilen funktioniert aber es gibt keine(n) Wert(e) aus. Die Aufgabe ist eine Übung von der Uni.
Was es machen soll:
Werte für Q and P einsetzen, von den beiden den ggT finden (durch Division)
Auf Papier sieht das so aus:
q / p = Rest nehmen
Wenn der Rest = 0 also kein Rest vorhanden ist ist p das ggT
Ansonsten den Rest nehmen und p durch den Rest teilen, usw. bis der Rest = 0
Ich DENKE das Problem liegt im "while", das compilen zögert ein bisschen und es gibt mir nur einen schwarzen Bildschirm aus.
Was ich versucht habe zu machen:
q % p sollte den Rest ausgeben (% ist modulus)
Solange der Rest nicht 0 ist soll das alte P zum neuen Q in der q % p Formel werden und das R zum neuen P, das so lange bis R = 0 ist, dann das P "speichern" für die main Funktion.
Das A soll in der gcd Funktion die Werte 18 für Q, 12 für P und 0 für R einsetzen (ich gehe hier davon aus, dass r = q%p das dann "überschreibt", ich habe r = 0 nur verwendet weil ich sonst eine Fehlermeldung bekomme)
Das B soll dann einen zweiten ggT berechnen und mir auch anzeigen, im Moment wird mir aber nichts angezeigt.
Kann mir jemand einen Denkanstoß geben? Ich möchte die Aufgabe selber lösen, aber mir scheint alles Sinn zu machen, Fehler bekomme ich keine (mehr, im Moment :)) an denen ich mich orientieren kann
Mfg

Edit: Hoppla, pastebin wird blockiert, ich hänge meinen Code mal als Textdatei an:
 

Anhänge

Zuletzt bearbeitet:
Tjo,

da das wohl eine Aufgabe ist um das zu lernen, vor allem das zu erkennen was dein Fehler dabei ist wäre hier die Hilfe fehl am platz.

Ein Tipp, spiel deinen Code den du da geschrieben hast durch als wenn DU die CPU wärst.
Ich meine damit, 1. Zeile LESEN, das tun was da steht, nächste Zeile usw.... wirklich Atomar durchspielen.
Dann wirst du deinen (Denk)fehler recht schnell finden.

glhf
EoB
 
Danke, wenn ich einen Denkfehler habe reicht das schon zu wissen, ich geh auf Spurensuche!
 
Sobald du in der Schleife bist, bekommt r bei jeder Iteration den gleichen Wert. Und wenn dieser Wert nicht 0 ist, wird die Schleife nie verlassen.
 
Die Hinweise bisher bringen dich bestimmt schon weiter. Das genannte Debuggen, indem du den Code Schritt für Schritt durchgehst - ob nun händisch oder mit Hilfe von Programmen - bringt dich meist sehr schnell ans Ziel.
Meist aber reicht es dir zu wissen, an welchem Punkt der Fehler sein muss. Wenn du also kein Debugger zur Hand hast und sonst auch nicht weiter kommst, nutze Textausgaben vor und nach jeder verdächtigen Zeile. Spätestens dann weisst du, wo es zwickt.
 
Was ich nicht ganz versteh ist, warum du R übergibst, wenn du es in der ersten Zeile der Methode neu definierst O.O
 
Mr_Bishop schrieb:
Die Hinweise bisher bringen dich bestimmt schon weiter. Das genannte Debuggen, indem du den Code Schritt für Schritt durchgehst - ob nun händisch oder mit Hilfe von Programmen - bringt dich meist sehr schnell ans Ziel.
Meist aber reicht es dir zu wissen, an welchem Punkt der Fehler sein muss. Wenn du also kein Debugger zur Hand hast und sonst auch nicht weiter kommst, nutze Textausgaben vor und nach jeder verdächtigen Zeile. Spätestens dann weisst du, wo es zwickt.

Danke, ich denke von hier schaff ich es, aber wie bekomme ich Textausgaben vor und nach den Zeilen? Ich benutze im Moment nur Dev-C++, das hat einen Debugknopf (falls es das ist was du meinst?) das mir angibt in welcher Zeile ich einen Fehler habe, nur zeigt mir der in meinem jetztigen Code keinen Fehler an
 
Du musst "breakpoints" setzen. Wenn du das Programm dann mit einem Debugger ausführst, hält er an den breakpoints an und du kannst dir die aktuell gesetzten Variablenwerte ausgeben lassen. Dann kannst du Schritt für Schritt durchsteigen und siehst, warum du nicht da raus kommst.

Dass dir der Debugger einfach so keine Fehler ansagt, liegt daran, dass dein Fehler logischer Natur ist und zur Laufzeit auftritt oder z.B. von den Eingabewerten abhängt.
Vorher anzeigen kann er dir vor allem Syntaxfehler (und noch ein paar unlogische Sachen wie dead code usw., aber da weiß ich nicht, wie sich C-Compiler verhalten).
 
Zuletzt bearbeitet:
In dem Code ist so einiges komisch, aber ich vermute mal das kommt alles von der Fehlersuche.
Um halt z.B. sein mistrauen bei der übergabe von Werte an Funktionen auszuräumen macht man das am Anfang doch schon mal gerne. (Übergabewerte fix zu setzen)

*Wie gesagt von mir aus alles nur Vermutung, und der eigentliche Fehler ist auch eher, oder hoffentlich, nur ein Flüchtigkeitsfehler beim schreiben. Manchmal sieht man ja den Wald vor lauter Bäumen nicht.

:)

EoB
 
Zuletzt bearbeitet:
Die Lösung mit dem Debugger und Breakpoints ist die komfortabelste. Wenn du dich da per Tutorials einarbeitest hast du dir schon mal ein mächtiges Werkzeug angeeignet.

Die Lösung mit den Textzeilen ist aufwändiger und nur dann sinnvoll, wenn kein Debugger zur Hand ist. Ausgaben machst du ja schon mit printf(); die jetzt noch in der Gegend in und um den verdächtigen Code, z.B. die R-Zuweisungen, und du weisst bescheid.
Noch schneller geht es, wenn du die Textausgaben aussagekräftig gestaltest, also z.B. R immer wieder ausgibst.
 
Zuletzt bearbeitet:
Ein printf("value of r before next check of loop condition: %i", r); als letzte Anweisung in der Schleife könnte zum Beispiel hilfreich sein :)
 
Zuletzt bearbeitet:
Zurück
Oben