C Code Fehler

Gast #4017969
Lesenswert?

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.

1
#include <stdio.h>
2
void times_two(int i)
3
  {
4
   i = i * 2;
5
  }
6
int main(void){
7
   int i = 1;
8
   do {
9
      printf("%d\n", i);
10
      times_two(i);
11
   } while (i <= 256);
12
   return 0;
13
}
#4017984
Lesenswert?

Im übrigen ist diese Aussage
1
Und dadurch entsteht eine Endlosschleife.

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.
#4017989
Lesenswert?

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?
Gast #4018045
Lesenswert?

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.
1
#include <stdio.h>
2
/*void next(int i)
3
{
4
    i++;
5
}*/
6
int main(void)
7
{
8
int i, fib[10];
9
fib[0] = 1;
10
fib[1] = 1;
11
i = 2;
12
printf("fib[0] = %d\n",fib[0]);
13
printf("fib[1] = %d\n",fib[1]);
14
do {
15
fib[i] = fib[i-1]+fib[i-2];
16
printf("fib(%d) =%d\n", i ,fib[i]);
17
i ++;
18
} while (i <= 10);
19
return 0;
20
}
#4018069
Lesenswert?

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.
#4018111
Lesenswert?

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.
Gast #4019093
Lesenswert?

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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren