was genau passiert hier?
-
Hallo,
ich habe hier folgenden Code aus einer Aufgabe:
int f(int a[], int l, int r, int x, int y) { if (l>r) return 0; else { int m = (l+r)/2; int f1 = f(a,l,m-1,x,y) + f(a,m+1,r,x,y); if (x<=a[m] && a[m] <=y) { return f1 + 1; } else { return f1; } } }
als a[10]={0,1,8,5,4,6,8,9,5,7}
und als f(a,0,9,4,6)was macht die Funktion jetzt ganz genau?
Mir ist klar, dass Sie das Array nimmt und immer wieder in zwei Hälften teilt aber was sie mit den Hälften jeweils macht ist mir nicht ganz klar und auch nicht was in f1 immer abgespeichert wird.Kann mir das jemand erklären?
-
und folgende Aufgabe habe ich noch gehabt:
char *f (char* a1, a2) { while (*a1 = *a2); return; }
ist es korrekt wenn man sagt, dass das eine Endlosschleife ist und jedes Mal *a2 *a1 zugewiesen wird?
-
streamilein schrieb:
ist es korrekt wenn man sagt, dass das eine Endlosschleife ist und jedes Mal *a2 *a1 zugewiesen wird?
In dieser Funktion ist so ziemlich gar nichts korrekt.
Also nochmal richtig abtippen, damit wir dir weiterhelfen können ohne zu raten.
-
Wenn er sagt, es ist eine Aufgabe... Vielleicht will ihn sein Lehrer/Prof ja auch in eine Falle laufen lassen.
char* a1, a2;
Da werden die Meisten denke, es handelt sich um zwei Zeiger.
-
Achso, na dann:
char *f (char* a1, a2) // jeder Parameter braucht nochmal eigene Typangabe { while (*a1 = *a2); // Das Semikolon beachten! Außerdem ist char nicht derefenzierbar return; // Funktion muss was zurückliefern, da sie nicht als void deklariert ist }
Hast du denn keinen Compiler und Debugger für sowas?
-
ups.
also die Aufgabe lautet so:
Was leistet die Funktion f?
char * f (char* a1, char* a2) { while (*a1 = *a2); return; }
-
doch ich habe einen compiler und der sagt mir das es nicht geht weil die Funktion was zurück geben muss. Aber sobald ich dann z.B. sage return a1
dann ist es eine Endlosschleife. Aber so wie es da steht in der Aufgabe leistet die Funktion überhaupt nichts weil sie nicht funktioniert oder?
-
Die Sache ist die, dass die Schleife entweder endlos durchlaufen wird, oder nicht.
Je nachdem ob a2 <> 0 ist oder nicht.
a2 wird ja nicht verändert. Und a1 nur einmal.Das return darunter muss aber trozdem was zurückgeben. Es wird nur nicht erreicht, wenn a2 <> 0 ist.
-
streamilein schrieb:
Was leistet die Funktion f?
char * f (char* a1, char* a2) { while (*a1 = *a2); return; }
Sie kopiert einen C-String (a2) in einen Zielpuffer (a1). Es ist also 'ne memcpy Implementation. Und wenn ich mich richtig erinnere, dann gibt die das Ziel zurück. Also sollte die Funktion irgendwas wie
return a1;
zurückgeben.
Aber wie Sepp schon sagte, wenn in a2 kein Nullzeichen vorkommt, dann degeneriert die Funktion zu einer Endlosschleife, die das Programm früher oder später wohl zum Absturz bringen wird.
-
groovemaster schrieb:
Sie kopiert einen C-String (a2) in einen Zielpuffer (a1). Es ist also 'ne memcpy Implementation.
Du meinst vermutlich strcpy. Passt aber auch nicht, denn dazu müsste die Funktion die Zeiger auch irgendwo mal hochzählen.
-
Sry, hast natürlich recht. Es muss strcpy heissen. Und dabei hab ich noch gedacht, nicht memcpy zu schreiben.
Und du hast schon wieder recht, dass für strcpy die Inkrement-Operatoren noch fehlen. Ist mir irgendwie entgangen.
Naja, man sollte halt doch nicht mehr so spät posten.