Arraylänge in Funktion berechnen



  • Hallo,
    ich versuche gerade in einer Funktion die Größe (Anzahl der Elemente) eines Arrays bestimmen zu lassen. Wenn ich das Array nun aber der Funktion als Parameter übergebe wird ja eigentlich nur ein Pointer zu diesem Array übergeben, wenn ich das richtig verstanden habe. Wenn ich nun die Größe des Arrays in der Funktion berechne bekomme ich demnach nur die Größe des Pointers.
    Ob meine Interpretation korrekt ist und wie ich das Problem lösen kann wäre nun also meine Frage...

    Hier mein Code:

    #include <iostream>
    using namespace std;
    
    int array_func(float in[])
    {
    	int n=sizeof(in)/sizeof(in[0]);
    	return n;
    }
    
    int main(int argc, char **argv)
    {
    	int a;
    	float b[5]; b[0]=3; b[1]=2; b[2]=7; b[3]=8; b[4]=1;
    	a=array_func(b);
    	cout << a << endl;
    	return 0;
    }
    

    Egal wie groß das Array b ist, a ist immer 2...
    Wie bekomme ich es nun hin, dass meine Funktion tatsächlich die Anzahl der Elemente in b zurückgibt?
    Vielen Dank!



  • a ist immer 2, weil float 4 Byte und dein Zeiger 8 Byte (64 Bit Adresse) groß ist.

    Wie du schon richtig erkannt hast, übergibst du mit dem Zeiger nur die Adresse zum Array, dessen Größe erfährst du davon nicht. Im Falle von C-Strings lässt sich deren Länge abzählen, da das Ende durch den Wert 0 markiert ist, für übliche Arrays bieten sich allerdings andere Verfahrensweisen an:
    - die Größe wird als zusätzlicher Wert mitgegeben
    - anstelle eines Arrays wird in C++ ein Container verwendet, wie std::vector



  • Die üblichen Workarounds sind das Array in ein struct zu tun, std::array zu benutzen oder eine Referenz auf ein Array zu übergeben. Die ersten sind ganz einfach, letzteres ist etwas interessant:

    #include <iostream>
    using namespace std;
    
    template<class T, size_t size>
    size_t array_func(T (&in)[size]){
        size_t n = size;
        //alternativ:
        n = sizeof in / sizeof *in;
        return n;
    }
    
    int main(){
        float b[] = {3.f, 2.f, 7.f, 8.f, 1.f};
        size_t a = array_func(b);
        cout << a << endl;
    }
    

    std::vector kann das zwar auch, tut aber eigentlich was anderes (Größe ändern, das kann ein Array nicht, aber das ist nicht kostenlos).
    (Ich habe mir auch erlaubt diversen Kram meinem Geschmack anzupassen.)



  • Super, vielen Dank für die ausführlichen Antworten! 👍


Anmelden zum Antworten