Arraylängen-Berechnung funktioniert nicht in der Funktion



  • Hallo,

    ich habe gerade ein kleines C-Programm geschrieben welches mir mit dem Horner-Schema einen Funktionswert eines Polynoms n-ten Grades berechnet.

    Leider habe ich ein kleines Problem,
    ich kann in der Funktion die Länge des übergebenen Arrays nicht berechnen...
    Mir ist allerdings nicht ganz klar warum...

    In der main Funktion liefert mir die berechnung die richtige Länge,
    in der Funktion allerdings nicht...
    Das liegt daran das in der main sizeof(arr) mir den Wert 24 liefert,
    doch in der Funktion liefert mir sizeof(a) den wert 4...

    Hier das Programm:

    #include <stdio.h>
    
    float horrner(float x, int a[]);
    
    int main (void){
    	int arr[] = {6, 5, 4, 3, 2, 1};
    
    	printf("sizeof(arr)=%d\n", sizeof(arr));
    
    	printf("y = %.2f\n", horrner(3.0f, arr));
    
    	printf("\n\n");
    
    	return 0;
    }
    
    float horrner(float x, int a[]) {
    	int i;
    	int s = (sizeof(a) / sizeof(int));
    	float y = a[0];
    
    	printf("sizeof(a)=%d\n", sizeof(a));
    
    	for (i = 1 ; i < s ; i++) {
    		y = y * x + a[i];
    	}
    
    	return y;
    }
    

    Wieso liefert mir das sizeof in der Funktion den "falschen" Wert?
    Liegt es vielleicht daran das in der Funktion mein a direkt schon auf den ersten Wert zeigt (also gleich zu setzen ist mit a[0])?

    Falls ja, wie soll ich den dann die Länge in der Funktion ermitteln?



  • In diesem Fall ist das int a[] gleichzusetzen mit int *a (einem Zeiger).
    Also bekommst du mit sizeof(a) die Größe eines Zeigers.

    Nein, du kannst in der Funktion die Größe des übergebenen Arrays nicht ermitteln.
    Du musst die Länge des Array als extra Parameter mit übergeben.

    Das ist halt C.

    Wenn dir das nicht gefällt, musst du eine andere Programmiersprache nehmen 😃



  • Arrays können nicht als Parameter übergeben werden, deswegen erhältst du dort (trotz der Schreibung als Array) nur einen Zeiger auf das Array. Und ein Zeiger hat numla eine feste Größe (die du per sizeof erfahren kannst), unabhängig davon wie viel Platz dahinter liegt.

    Die Lösung besteht idR darin, daß Aufrufer die Array-Größe ermittelt und als Parameter übergibt.



  • Du kannst auch einen Zeiger auf dein Array an die Funktion übergeben, dann funktioniert es auch:

    float horrner(float x, int (*a)[6]) {
        int i;
        int s = (sizeof(*a) / sizeof(**a));
        float y = **a;
    
        printf("s=%d\n", s);
    
        for (i = 1 ; i < s ; i++) {
            y = y * x + (*a)[i];
        }
    
        return y;
    }
    
    int main (void){
        int arr[] = {6, 5, 4, 3, 2, 1};
    
        printf("y = %.2f\n", horrner(3.0f, &arr));
    
        printf("\n\n");
    
        return 0;
    }
    

    Horner schreibt man übrigens Horner und nicht Horrner.



  • Vielen Dank!


Log in to reply