Ausdruck ergibt keine Funktion
-
Hallo zusammen,
wenn ich eine definierte Funktion
double sum1(int n,double y2[]){}
mit
sum1(n,y2);
aufrufe, erhalte ich die Fehlermeldung:
Ausdruck ergibt keine Funktion
Wie liegt mein syntaktischer Fehler?
Danke und Grüße!
-
Hallo,
vllt so:
#include <stdio.h> //Summiert n Elemente von y2 double sum1(int n, double y2[]) { double res = 0; int i=0; for ( ; i < n; ++i) res += y2[i]; return res; //Wichtig, deine Funktion hat einen Rückgabewert, also gib was zurück. } int main() { double arr[] = {1.5, 2.5 , 3.5 }; double x = sum1(3,arr); printf("%f", x); return 0; }
Mfg
GPC
-
GPC schrieb:
int i=0; for ( ; i < n; ++i)
hat das einen bestimmten grund das du das so geschrieben hast und nicht so:
for (int = 0; i < n; ++i)
mein code erscheint mir irgendwie "besser"
-
icepacker schrieb:
GPC schrieb:
int i=0; for ( ; i < n; ++i)
hat das einen bestimmten grund das du das so geschrieben hast und nicht so:
for (int = 0; i < n; ++i)
mein code erscheint mir irgendwie "besser"
Ja, den hat es. In C89 konnte man Variablen nur am Anfang der Funktion deklarieren, deshalb war das von dir beschriebene Konstrukt nicht möglich. In C99 gibt es diese Einschränkung zwar nicht mehr, aber nicht jeder verwendet auch C99, also hab ich mir angewöhnt, den C89 Stil beizubehalten (nur um sicher zu gehen, das es auch überall läuft), in C versteht sich, bei C++ sieht die Sache anders aus.
Mfg
GPC
-
Hallo zusammen,
danke schon mal, die Frage bezieht sich auf ein Programm. das aus einer unteren und oberen Grenze und der Laufweite das Integral einer Funktion berechnet.
-
Hallo,
Diesen Algo möchte ich nun noch rekursiv machen,
Wieso? Es ist kein Fehler, ein Problem wie dieses iterativ zu lösen.
die sum-Funktionen sollen dann jeweils n,y2[] übergeben und als return-Wert dann die Summen zurückgeben.
Soweit ich das sehe, würde mein Code aus dem ersten Post diese Anforderung erfüllen.
Mfg
GPC
-
Stimmt, aber dies ist leider Bestandteil einer Aufgabe. Erst den Algo. iterativ entwickeln, dann rekursiv. Ich probier es mal auf deinem Weg, ich mach mir nur noch ein wenig Gedanken, wie ich die Schrittweite 2*n rekursiv zurückzähle.
-
faellt mir grad dazu ein:
"tail recursion"
"intervallteilung"
-
Ja, schon klar. Das hab ich bis jetzt aber nur für einfache Funktionen gemacht, Fakultät einer Zahl z. B. Je mehr ich mir die Sache hier angucke, desto mehr krieg ich einen Knoten ins Hirn.
Wir krieg ich diese Funktion hier z. B. rekursiv:
double sum2(int s2_n, double s2_y2[]){
double ret_sum2 = 0;
int i;
for(i=1;i<2*s2_n;i+=2){
ret_sum2+=s2_y2[i];
}
return ret_sum2;
}Bin verwirrt ...
-
double sum_recursive(int count, double *values) { if (!count) return 0; else return values[count-1] + sum_recursive(count-1, values); // ^ letztes element ^ restliche liste }
funktion ist nicht endrekursiv.
versuche sie endrekursiv (= iterativ) zu schreiben. dazu musst du einen weiteren parameter einfuehren, auf den jeweils dazuaddiert wird.bitte verstehen.
-
Sorry aber das hab ich jetzt nicht geschnallt, wieso ist meine funktion nicht iterativ? Ich hab einfach diese Schleife:
for(i=1;i<2*n;i+=2){
sum2+=y2[i];
}als Funktion dargestellt (Die Schleife findest du oben im ganzen Programm). Nun wollte ich die Funktion einfach rekursiv umbauen und (falls das klappt) das dann mit allen Schleifen so machen. Ich wüsste nicht wie ich sonst das Programm rekursiv darstellen soll. Im Moment ko... mich die ganze Sache voll an, ich hab diese Rekursion zwar vom Prinzip her verstanden, krieg das aber einfach nicht umgesetzt. Könntest du mir das nochmal genauer, bezogen auf meine Funktion zeigen?
-
deine funktion ist iterativ, aber es gibt verschiedene arten von iterativ. ich meinte eine art von iterativ, die eigentlich auf rekursion basiert. kannst du aber eigentlich ignorieren.
deine funktion (aufsummieren eines double-arrays) habe ich dir bereits als rekursive funktion dargestellt.
-
Ich hab es jetzt dank deinem Schema rekursiv hinbekommen. Hat mir auch geholfen die Rekursion besser zu verstehen. Vielen Dank für die Hilfe!