Andreas Pflug: Wie komisch ist das denn?

Beitrag lesen

Hallo,

Hi,
ich bin gerade dabei, ein wenig c++ zu lernen, habe aber ein sehr komisches Problem bei der Funktionsübergabe eines long double. Am besten gebe ich einfach mal die source her, ich habe mit g++ kompiliert.


#include <iostream>
using namespace std;

long double summe(long double s, long double *f, int n)
{
        if(n>1)

Hier muss - wie schon gesagt wurde - if(n>0) stehen.

{
                summe(s+*f++, f, n-1);

Zunächst: Wenn das Programm hierhin kommt, wird die Funktion beendet,
ohne einen return-Wert zurückzugeben.
Weiterhin scheint das mit dem Zeiger-Inkrement nicht zu
funktionieren, da ja an die tiefere Rekursionsebene
immer wieder f übergeben wird. In meinem Testlauf wurde
10 mal das erste Listenelement addiert.

Funktionieren tut dagegen

return summe(s+f[n-1], f, n-1);

[...]

Also im Ganzen nochmal meine geänderte Summenfunktion:

  
long double summe(long double s, long double *f, int n)  
{  
        if(n>0)  
        {  
                return summe(s+f[n-1], f, n-1);  
        }  
        else  
        {  
                cout << "Berechneter Wert ist " << s << "\n" << s << ", jetzt erfolgt die funktionsuebergabe: \n";  
                return s;  
        }  
}  

Das ganze ist übrigens in Form einer rekursiven Funktion
reichlich kompliziert und tendeziell ressourcenfressend.
Einfacher wäre es z. B. so:

  
long double summe2(long double *f, int n) {  
  long double s(0);  
  do { s+= f[n---1]; } while(n);  
  return s;  
}  

Wer will, kann s+= f[(n--)-1]; auch mit Klammerung schreiben ;-)

MfG

Andreas