2D-Array bei return übergeben



  • Ich möchte über eine Klasse ein Array übergeben, dass ich dann in einer anderen Klasse wieder nutzen möchte. Ich muss also eigentlich nur die Adressen übergeben. Die Größen sind identisch.

    Also quasi an A=B (was ja nicht geht), nur mit
    A = classX.getArray

    dazu habe ich in der Klasse aus der das Array kommen soll eine Funktion der folgenden Art eingeführt: (double (*m_A0)[SIZEDOEY];)

    double* AdaptiveAlgorithm::getAmplitudeDOE(){ return &m_A0;}

    dann stimmen aber die Typen aber nicht überein:
    'double (**__w64 )[256]' kann nicht in 'double *' konvertiert werden

    wie müsste ich es stattdessen machen?

    Unm ja ich werde mich in STD:vector einlesen (vermutlich nächstes WE). Wenn es damit einfacher geht, wie würde es damit aussehen ?

    Matthias



  • EDIT: Äh.
    Hat ich blödsinn geschreibt.

    Nu richtig:

    Der richtige Returntyp wäre "double ()[SIZEDOEY]".
    Oder aber du gehst halt her und arbeitest bloss mit einem double
    , und multiplizierst den einen Index mit Hand:

    // Allozieren:
    size_t width = ...;
    size_t height = ...;
    double* p = new double[width * height];
    
    // Zugriff:
    size_t x = ...;
    size_t y = ...;
    p[y * width + x] = 1.23;
    
    // Kopieren:
    double* copy = new double[width * height];
    memcpy(copy, p, sizeof(double) * width * height);
    

    Ist so oft einfacher, obwohl man beim Indizieren mehr tippen muss.
    Lässt sich allerdings sehr einfach in eine kleine inline Funktion packen die einfach x und y übergeben bekommt und eine Referenz zurückgibt. Der Compiler wird das wegoptimieren, von daher kein Problem bei der Ausführungszeit.



  • hustbaer schrieb:

    Der richtige Returntyp wäre "double (*)[SIZEDOEY]".

    Der Code

    double (*)[SIZEDOEY] AdaptiveAlgorithm::getAmplitudeDOE(){ return &m_A0;}
    

    führt nur zu dem Fehler

    1>c:\daten\dev\cpp\lightmodulator2dmat\lightmodulator2d\AdaptiveAlgorithm.h(47) : error C2059: Syntaxfehler: ')'
    1>c:\daten\dev\cpp\lightmodulator2dmat\lightmodulator2d\AdaptiveAlgorithm.h(47) : error C2238: Unerwartete(s) Token vor ';'
    1>.\AdaptiveAlgorithm.cpp(129) : error C2059: Syntaxfehler: ')'
    1>.\AdaptiveAlgorithm.cpp(129) : error C2143: Syntaxfehler: Es fehlt ';' vor '{'
    1>.\AdaptiveAlgorithm.cpp(129) : error C2447: '{': Funktionskopf fehlt - Parameterliste im alten Stil?
    

    Das ist es dann wohl doch nicht ?

    hustbaer schrieb:

    Oder aber du gehst halt her und arbeitest bloss mit einem double*, und multiplizierst den einen Index mit Hand:

    // Allozieren:
    size_t width = ...;
    size_t height = ...;
    double* p = new double[width * height];
    
    // Zugriff:
    size_t x = ...;
    size_t y = ...;
    p[y * width + x] = 1.23;
    
    // Kopieren:
    double* copy = new double[width * height];
    memcpy(copy, p, sizeof(double) * width * height);
    

    Ich verstehe zwar grob was das macht, aber sehe nicht wie das zu einer Lösung führt die ich suche. Abgesehen davon dass mir eine Funktion die im Speicher rumkopiert sehr suspekt ist.

    Matthias



  • zu std::vector<double>

    std::vector<double>& AdaptiveAlgorithm::getAmplitudeDOE(){return m_A0;}
    
    std::vector<double> m_A0;
    m_A0.push_back(0.0); // wäre dann m_A0[0]
    m_A0.push_back(1.0); // wäre dann m_A0[1]
    ...
    //lesen mit 
    d = m_A0[0]; // also wie sonst auch.
    

    Anstelle von m_A0[0]; kannste auch m_A0.at(0); nehmen; letzteres wirft std::range_error wenn du versuchst außerhalb des Vectors zu lesen. Der []-Operator steigt dann mit sig-fault aus.

    BTW: m_A0.size() gibt dir die Anzhal der Elemente an. wobei m_A0[m_A0.size()-1] das letze ist.


Log in to reply