Andreas Pflug: Wie komisch ist das denn?

Beitrag lesen

Das Zeigerinkrement funktioniert bei mir aber wunderbar, Andreas. Du hast wohl übersehen, das nicht das gleich f übergeben wird. Ich sollte wohl statt

if(n>0)
{
     summe(s+*f++, f, n-1);
}

lieber

if(n>0)
{
     summe(s+*f, ++f, n-1);
}

schreiben, das sieht einfach mehr nach dem aus, was getan werden soll ;-).

Hier fehlt jeweils immer noch das return.

Bei mir funktioniert das mit der Pointerübergabe nicht wie
beabsichtigt. Da dies ein lehrreicher Punkt ist, habe
ich Dein Programm mal wie folgt umgeschrieben:

  
#include <iostream>  
using namespace std;  
  
long double summe1(long double s, long double *f, int n)  
{  
        if(n>0)  
        {  
                return summe1(s+*f++, f, n-1);  
        }  
        else  
        {  
                return s;  
        }  
}  
long double summe2(long double *f, long double s, int n)  
{  
        if(n>0)  
        {  
                return summe2(f, s+*f++, n-1);  
        }  
        else  
        {  
                return s;  
        }  
}  
  
int main(void)  
{  
        long double x[10];  
        for(int i=0;i<10;i++)  
        {  
                cout << "Bitte Wert " << i+1 << " eingeben \n";  
                cin >> x[i];  
        }  
        cout << "Summenfuntion 1\n"  << "Summe aller Zahlen ist " << summe1(0, x, 10)  << "\n\n";  
        cout << "Summenfunktion 2\n" << "Summe aller Zahlen ist " << summe2(x, 0, 10) << "\n\n";  
}  

Mit diesem Programm erhalte ich folgende
Ausgabe auf der Konsole:

  
~$ g++ main.cxx  
~$ ./a.out  
Bitte Wert 1 eingeben  
1  
Bitte Wert 2 eingeben  
2  
Bitte Wert 3 eingeben  
3  
Bitte Wert 4 eingeben  
4  
Bitte Wert 5 eingeben  
5  
Bitte Wert 6 eingeben  
6  
Bitte Wert 7 eingeben  
7  
Bitte Wert 8 eingeben  
8  
Bitte Wert 9 eingeben  
9  
Bitte Wert 10 eingeben  
10  
Summenfuntion 1  
Summe aller Zahlen ist 10  
  
Summenfunktion 2  
Summe aller Zahlen ist 55  

Der Unterschied kommt daher zustande, dass
bei meiner g++ - Installation Funktionsparameter
in der Reihenfolge von rechts nach links
ausgewertet werden. Daher wird in summe1 immer
erst der Zeiger f übergeben, bevor der
Ausdruck *f++ ausgewertet wird.

In summe2 habe ich die Reihenfolge
der Parameter vertauscht. Ich meine, mich
erinnern zu können, dass die Reihenfolge
der Funktionsparameter-Auswertung in C nicht
strikt definiert ist. Es könnte also sein, dass
der Output bei Deinem Compiler genau
umgekehrt ausfällt.

MfG

Andreas