3D-Array von VBA über C++ DLL und zurück



  • Hallo Leute,

    nach ihr mir hier http://www.c-plusplus.net/forum/p2341453#2341453 so gut weiter geholfen habt, müsst mir mal wieder aus der Klemme helfen. Ich habe ein Programm in VBA und lasse eine Routine über eine C++-DLL berechnen. Ich habe da bisher immer einen 2D-Array übergeben, was auch super geklappt hat. Jetzt möchte ich dies aber mit einem 3D-Array machen und das klappt gar nicht.

    Ich habe mal ein Minimal-Beispiel generiert:

    #include <windows.h>
    #include <iostream>
    #include <stdio.h>
    
    using namespace std;
    
    //zw = 3D-Array
    //n Größe des Arrays
    
    extern "C" __declspec(dllexport) int __stdcall square(double zw[][5][2], double n)
    {
    	int i,j;
    
    	for(i = 1; i <= n; i++){
    		for(j = 1; j <= n; j++){
    			zw[i][j][1] = 1;
    			zw[i][j][2] = 2;
    		}
    	}
    	return 0;
    }
    

    in VBA sieht es dann so aus:

    Option Explicit
    
    Declare Function square Lib "E:\C++\dll_datei_array\Release\dll_datei_array.dll" (ByVal zw As Long, ByVal n As Double) As Long
    
    Sub test()
        Dim zw() As Double
        Dim i As Integer, n As Integer, j As Integer
    
        n = 5
        ReDim zw(n, n, 2) As Double
    
        Call square(VarPtr(zw(0, 0, 0)), n)
    
        Cells.Clear
        For i = 1 To n: For j = 1 To n: Cells(i, j) = zw(i, j, 1): Next j: Next i
        For i = 1 To n: For j = 1 To n: Cells(i + 8, j) = zw(i, j, 2): Next j: Next i
    
    End Sub
    

    Leider kommt da völliger Müll raus:

    1 1 1 1 0
    2 2 2 2 0
    1 1 1 0 0
    2 2 2 0 0
    1 1 1 0 0

    und die zweite Ebene ist komplett leer:

    0 0 0 0 0
    0 0 0 0 0
    0 0 0 0 0
    0 0 0 0 0
    0 0 0 0 0

    Mach ich mit den Zuweisungen etwas falsch? Hab schon viel rumprobiert, erkenne aber kein System dahinter... 😡

    Bin für jeden Ratschlag dankbar!!! 😕



  • Niemand eine Idee???

    Falsche Rubrik?



  • Hallo,

    keine Ahnung wie VBA mehrdimensionale Array anordnet.

    Eventuell helfen die Szenarios 2. oder 3. hier weiter
    http://support.microsoft.com/kb/207931/en-us



  • Hi nn,

    auf die Seite bin ich auch schon gestoßen. Die dort gezeigen Beispiele beziehen sich aber auch nur auf 2D-Arrays, was bei mir gut funktioniert. Die Frage ist, warum 2D läuft, 3D aber nicht?

    Danke für deine Hilfe!



  • Die Versionen mit Safearray sollten auch mit mehr Dimensionen arbeiten.

    Mehr dazu erfährst du eventuell, wenn du oben im VC- oder WinAPI-Forum fragst, da gibt es eventuell Leute, die sich damit auskennen. Ob Du dann aber noch mit dem gcc arbeiten kannst, kann ich nicht sagen.



  • Eigentlich sollte es auch wie oben beschrieben gehen. Mit 2D klappt es ja problemlos...

    Ohne gcc ist leider keine Option. Es muss auch nach meiner Art irgendwie gehen...

    Trotzdem Danke.



  • ootobbyoo schrieb:

    Mit 2D klappt es ja problemlos...

    Nur wer sagt, dass das für höhere Dimensionen auch gilt ? Eventuell werden diese Arrays VBA intern dann als COM-Objekte dargestellt, dann sind es Safearrays.


Anmelden zum Antworten