Hey,
ich habe folgenden C Code gegeben und soll sagen, was für ein Fehler
auftritt. Ich glaube ich habe den Fehler, aber weiß nicht ob ich da
richtig liege. Kann mir jemand bitte helfen?
Der Fehler liegt glaube ich darin, dass die Funktion times_two nichts
zurückgibt?
Und dadurch entsteht eine Endlosschleife.
Deine Analyse klingt gut.
Jetzt noch dein Entwicklungssystem hochfahren, den Code eingeben,
compilieren (was sagt der Compiler dazu) und nachsehen ob die Analyse so
stimmt, bzw. ob der Compiler dazu was zu sagen hat.
Jen schrieb:> Der Fehler liegt glaube ich darin, dass die Funktion times_two nichts> zurückgibt?
Wie auch wenn sie eine void-Funktion ist?
i wird by Value übergeben, by Reference würde es klappen:
Habe ich jetzt mal gemacht, es wird immer wieder eine 1 ausgegeben.
Jetzt sollen wir das Problem benennen und eventuell verbessern. Muss ich
mit Pointern arbeiten?
ein bischen zu krass. Wenn die Funktion nicht times_two geheissen hätte,
sondern irgendwie anders, hättest du diese Verbindung nicht hergestellt.
Ich würde das als Antwort durchaus so akzeptieren, aber ich fände die
Antwort "Das Programm endet in einer Endlosschleife, weil die Variable i
innerhalb der Schleife keine Möglichkeit hat verändert zu werden"
besser. Denn das ist die eigentliche Ursache - dass i innerhabld der
Schleife nicht verändert wird. Das es so gedacht war, dass times_two
diese Veränderung macht ist hingegen Spekulation deinerseits. Der
Programmierer könnte ja auch ein ++ in der Schleife in main vergessen
haben.
Diese Spekulation ist natürlich begründet, keine Frage. Aber es ist erst
mal eine Spekulation.
Jen schrieb:> Habe ich jetzt mal gemacht, es wird immer wieder eine 1 ausgegeben.> Jetzt sollen wir das Problem benennen und eventuell verbessern. Muss ich> mit Pointern arbeiten?
Du musst nicht.
Du kannst. Aber es gibt auch noch eine andere Möglichkeit.
Welche Möglichkeiten kennst du denn, wie eine Funktion einen Wert an
ihren Aufrufer mitteilen kann?
Max, machs nicht so kompliziert.
Wie teilt denn ein sin() seinem Aufrufer den errechneten Wert mit? Oder
die Funktion abs()?
(Ich will Jen die Lösung nicht präsentieren. Er soll selber
draufkommen.)
Jen schrieb:> Eine Sach wäre da noch das unkorrigierte von vorhin nennt man CbV und> das Max H. CbR?
Ja.
Aber ganz ehrlich. Wenn du mir diese Lösung präsentierst, würdest du von
mir Punkteabzug kriegen. Denn die naheliegenste Lösung sieht anders aus.
Habe noch eine Aufgabe dazu und hier habe ich es nicht hinbekommen. Habe
die Funktion dann rausgelassen, denke aber dass ich dafür keine Punkte
kriegen werde.
Jen schrieb:> denke aber dass ich dafür keine Punkte> kriegen werde.
Wieso? Musst du eine Funktion für i++ schreiben?
Jen schrieb:> void times_two(int i)> {> i = i * 2;> return i;> }
Diese müsstest du dann mit
Jen schrieb:> ich muss einfach nur wieder den Fehler im Programm> finden und wenn möglich korrigieren.
Das Problem ist wieder der gleiche und du kannst es auch wieder lösen
mit:
- Call by reference: netx(&i);
- Return Wert i = netx(i);
- Makro
- i++ in den Code schreiben.
next() muss dann halt entsprechen angepasst werden.
Jen schrieb:> Und ich glaube das void in int umändern?
Stimmt, das habe ich ganz übersehen.
Dann dürfte er i aber nicht in der main und in der anderen Funktion
nachmals deklarieren. Eine globale Variable für so etwas ist mMn nicht
wirklich sauber programmiert.
Max H. schrieb:> Dann dürfte er i aber nicht in der main und in der anderen Funktion> nachmals deklarieren. Eine globale Variable für so etwas ist mMn nicht> wirklich sauber programmiert.
Exakt.
Ausserdem denke ich nicht, dass das der Sinn der Übung ist.
So wie die beiden Aufgaben aussehen, sind sie speziell dafür gedacht,
den Lernenden an Returnwerte von Funktionen zu gewöhnen und ihm da eine
gewisse Übung zuzuschanzen. Das die beiden 'Fehlerfälle' exakt dem
gleichen Strickmuster folgen, ist denke ich kein Zufall.
Tom schrieb:> Eine gute Gelegenheit, den Unterschied zwischen call by reference und> call by value nachzulesen, und wie das in C geht.
In C gibts aber nur call by value. :-)
Die Fußnote "In C gibt es kein call by reference, man kann aber mit
Zeigern ein de-facto-call-by-reference nachbauen." wollte ich dem OP bei
seinem momentanen Kenntnisstand ganz bewusst ersparen. Über solche
Details kann man nachdenken, wenn man Zeiger etc. sicher verwenden kann,
Programmieren lernen funktioniert (bei normalen Menschen) nicht wie ein
mathematischer Beweis.