array als functions-rückgabe



  • Hallo ich versuche eine function zu schreiben, die ein array füllt und zurückgibt, aber es scheitert schon an der functionsdeklaration.
    Ich dachte mir das so:
    double[16] quatToMatrix(quaternion Quat)
    {
    double mat[16];
    float xx, xy, xz, xw, yy, yz, yw, zz, zw;

    xx = Quat.x * Quat.x;
    xy = Quat.x * Quat.y;
    ....
    return mat;
    }

    Aber das klappt nicht.

    Ich denk die absicht meiner ffunction ist klar. wie löst man das am besten?
    ich fange übrigens grad an c++ zu programmieren.



  • Wenn der Aufrufer weiß, dass ein Array mit 16 Werten kommt, kannst du das ganze mit nem richtigen Zeiger machen:

    double *quatToMatrix(quaternion Quat)
    // Der Rest bleibt gleich
    

    Ansonsten wär wohl std::vector das beste.



  • Also ich löse das Problem immer indem ich entweder die Größe des Arrays in array[0] schreibe (sinnvoll bei int-arrays) oder so

    float* array;
    int num_of_elements = function_that_returns_some_array(float param1, float* array);
    

    in function_that_returns_some_array mach ich dann:

    array = new float(anzahl)
    return anzahl
    

    Wenn du aber weisst, wieviele Elemente zurück kommen, machs wie's Michael E. vorgeschlagen hat.



  • ...Oder du baust dir eine Struktur drum herum:

    struct Matrix
    {
        double data[16];
    };
    
    Matrix quatToMatrix(quaternion Quat)
    {
        Matrix mat;
        //...
        return mat;
    }
    

    Aber das beste wäre imho wahrscheinlich, du würdest eine eigene Matrix Klasse schreiben und für sie den 'operator = (quaternion& Quat)' überladen.



  • Michael E. schrieb:

    Wenn der Aufrufer weiß, dass ein Array mit 16 Werten kommt, kannst du das ganze mit nem richtigen Zeiger machen:

    double *quatToMatrix(quaternion Quat)
    

    Falsch, dann würdest du einen Pointer auf ein lokales Objekt zurückgeben, was zu dem Zeitpunkt, wo es vom Aufrufer verwertet werden soll, schon nicht mehr existiert.



  • Bashar schrieb:

    Michael E. schrieb:

    Wenn der Aufrufer weiß, dass ein Array mit 16 Werten kommt, kannst du das ganze mit nem richtigen Zeiger machen:

    double *quatToMatrix(quaternion Quat)
    

    Falsch, dann würdest du einen Pointer auf ein lokales Objekt zurückgeben, was zu dem Zeitpunkt, wo es vom Aufrufer verwertet werden soll, schon nicht mehr existiert.

    Och mist, das ich da aber auch jedes Mal drauf rein falle 🙄


Anmelden zum Antworten