Arbeiten mit Arrays



  • Hallo Zusammen!

    Ich bin ein Anfänger in Sachen C++. Nun möchte ich aber einige Funktionen aus meiner Excel-VBA Anwendung in eine DLL auslagern, die ich mit Visual C++ erstellen möchte.
    Leider komme ich schon bei der ersten Funktion ins Schleudern. Ich möchte zwei Matrizen an die DLL übergeben und diese dann miteinander multiplizieren und das Ergebnis zurückgeben.
    Bisher sieht es so aus:

    #include <windows.h>
    BOOL WINAPI DllEntryPoint ( HINSTANCE hDLL, DWORD dwREASON, LPVOID Reserved )
    {
        switch (dwREASON)
        { 
            case DLL_PROCESS_ATTACH: {
                                        break; 
                                     }
    
            case DLL_PROCESS_DETACH: {
                                        break; 
                                     }       
        }
        return TRUE;
    }
    
    //------------------------------------------------------------------------
    
    double _stdcall MatrixMulti (double MatrixA[], long lngZeilenA, long lngSpaltenA, 
                                 double MatrixB[], long lngZeilenB, long lngSpaltenB)
    {
        double ErgMatrix[1][1] = {2, 5, 7, 1};
        return (ErgMatrix);
    }
    

    Ich habe erstmal nur die Matrix ErgMatrix so definiert, aber schon diese Rückgabe klappt nicht. Er gibt mir einen Kompilierungsfehler aus.

    Vielen Dank schon jetzt für eure Mühen.

    Grüße,
    Dirk



  • Original erstellt von Dirk99:
    **```
    double ErgMatrix[1][1] = {2, 5, 7, 1};
    return (ErgMatrix);

    Eine Matrix mit 1x1 Feldern, aber 4 Einträgen, da passt was nicht.



  • double _stdcall MatrixMulti (double MatrixA[], long lngZeilenA, long lngSpaltenA,
    double MatrixB[], long lngZeilenB, long lngSpaltenB)
    {
    double ErgMatrix[1][1] = {2, 5, 7, 1};
    return (ErgMatrix);
    }

    Da stimmt ja einfach nix.
    1. MatrixA und MatrixB sind 1-Dimensionale-double-Arrays. Die Zeilen-/Spalten-Parameter weisen aber darauf hin, dass du eigentlich 2-Dimensionale-Arrays haben willst.

    2. ErgMatrix ist ein 2-Dimensionales-double-Array mit *einer* Zeile und *einer* Spalte. Das ergbit zusammen *ein* Element. Du hast initialsierst es aber mit vier. Das ist etwas viel.

    3. MatrixMulti liefert ein double. Du versuchst aber ein 2-Dimensionales-Array zurückzugeben. Zwischen double und Array existiert aber keine Konvertierung -> Fehler.



  • Tut mir leid, dass man mir den Anfänger so derbe anmerkt.
    Bei der Dimensionierung der ErgMatrix dachte ich mir, dass er mit der Stelle [0][0] anfängt zu arbeiten. Dann wäre ErgMatrix eine 2x2 gewesen. Nachdem ich das geändert habe waren es beim kompilieren auch schon 2 Fehler weniger.
    Was muss ich denn ändern, dass MatrixA und MatrixB zwei dynamisch belegbare 2-dim Matrizen werden? Reicht da die Änderung in double MatrixA[][]?
    Und die letzte Frage: Wie gebe ich denn ein 2-dim Array zurück? Also was muss ich statt dem 'double' einstellen, damit die Rückgabe klappt?

    Grüße,
    Dirk



  • Dynamisch würde auch

    double Matrix[][]
    

    nicht reichen, den es wäre eine statisches Array

    Dynamisch wäre

    double **Matrix;
    Matrix=(double **)calloc(Spalten,sizeof(double))
    for(unsigned int ctr=0;ctr<Spalten;ctr++)
           Matrix[ctr]=(double *)calloc(Zeilen, sizeof(double));
    

    Dieses Array wäre auch direkt mit Nullen gefüllt

    Die Rückgabe Funktion kann "nur einen" Wert zurückgeben, also würde sich hier der Startpointer auf das Array anbieten.

    Gruß Winn

    P.S.: Die Arrays werden zwar von Null bewandert, aber "ohne" die Null deklariert 😉

    [ Dieser Beitrag wurde am 06.06.2003 um 21:53 Uhr von Winn editiert. ]



  • Hallo,

    Die Rückgabe Funktion kann "nur einen" Wert zurückgeben, also würde sich hier der Startpointer auf das Array anbieten.

    das heißt also, ich kann überhaupt kein Array zurückgeben? Es ist demnach gar nicht möglich eine DLL zu schreiben, die ein Matrixprodukt ausrechnet? Oder habe ich da was falsch verstanden?

    Gruß,
    Dirk



  • nee, man kann schon mehrere sachen zurückgeben, man muss sie aber in EINER struktur zusammenfassen.

    man könnte also etwas in der art zurückgeben :

    struct 
    {
    double matrix[2][];
    int dim;
    } ergebnistyp;
    
    ergebnistyp _stdcall MatrixMulti (double MatrixA[], long lngZeilenA, long lngSpaltenA, 
                                 double MatrixB[], long lngZeilenB, long lngSpaltenB)
    

    eine andere möglichkeit wäre halt eine referenz als parameter zu übergeben. diesem paramter weist man dann das ergebnis zu.

    bsp.:

    void func1(int & zahl)
    {
         zahl++;
    }
    

    wenn du diese funktion nun aufrufst :

    ...
    int i=2;
    func1(i);
    ...
    

    dann hat nach dem aufruf i den wert 3.

    ich hoffe ich konnte helfen.



  • Hallo!

    Das mit dem Paramter als Referenz und nicht als Wert zu übergeben ist eine gute Idee. Kann man das dann auch weitertreiben? Bei mir sähe das dann so aus, dass ich eine Matrix und einen Vektor, sowie einige mit Nullen gefüllte Matrizen als Referenz von Excel-VBA an die C++ DLL übergebe. Mittels der Matrix und des Vektors werden Berechnungen durchgeführt, und in den Null-Matrizen gespeichert. Da diese ja eine Referenz sind, ändern sich die Werte in VBA auch automatisch, oder? Wann erfolgt denn die Änderung der Werte in VBA? Doch erst, wenn die DLL fertig ist, die Werte ändern sich doch nicht schon während die DLL läuft, oder?

    Sollte das so funktionieren, wie ich es mir eben überlegt habe, bin ich wirklich froh, dann kann ich mich guten Gewissens an die C++ Programmierung setzen.

    Vielen Dank für Eure Antworten,
    Dirk



  • wenn da steht a = 10; und a ist eine referenz auf einen integer aus VBA dann ändert sich der dort in dem moment, in dem das programm bei der ausführung zur zeile a = 10; kommt. also sofort.



  • Wirkt sich das nicht negativ auf die Geschwindigkeit aus? Könnte ich mir gut vorstellen, da doch dann praktisch permanent Werte nach VBA rübergeschoben werden. Ich berechne ja in C++ dauernd Werte neu und in speichere diese in den Matrizen die als Referenz übergeben wurden.

    Grüße,
    Dirk


Anmelden zum Antworten