Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (WinAPI, Konsole) » 3D-Array C++ dll an VBA

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 < [ 2 ]
000
06.08.2013, 10:11 Uhr
~ootobbyoo
Gast


Hallo Leute,

könnt 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:


C++:
#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:


Visual Basic:
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... :mad:

Bin für jeden Ratschlag dankbar!!! :confused:
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
06.08.2013, 12:52 Uhr
Tommix



Hallo,
in C gehen die Indizes bei Null los.

Gruß,
Tommix
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
07.08.2013, 09:10 Uhr
~ootobbyoo
Gast



Zitat von Tommix:
Hallo,
in C gehen die Indizes bei Null los.

Gruß,
Tommix


das ist mir bekannt, sollte doch aber kein Einfluss haben... Ich hatte mir gedacht die null-ten Stellen einfach nicht zu beschreiben!
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
07.08.2013, 15:57 Uhr
Tommix



Ich fürchte Du irrst. Es ist nicht so, dass der Index Null in C einfach hinzukommt. Nur die Zählweise ist anders. D.h.

C++:
int a[10];


erzeugt bzw. meint genau wie

Visual Basic:
dim a(10) as integer


ein Array mit 10 Elementen. In C gehen die Indizes von 0 bis 9 und in Basic von 1 bis 10. Das n-te Element in Deinem Code oben gibt es in C gar nicht. Du rutscht da in den Speicher dahinter und der gehört dann schon zur nächsten Dimension oder am Ende gar nicht mehr zum Array.
Es müsste so aussehen:

C++:
    for(i = 0; i < n; i++){
        for(j = 0; j < n; j++){
            zw[i][j][1] = 1;
            zw[i][j][2] = 2;
        }
    }


Vorausgesetzt, VB legt Arrays nicht völlig anders im Speicher ab als C - das weiß ich jetzt nicht.

- Tommix

Dieser Post wurde am 07.08.2013 um 15:58 Uhr von Tommix editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
09.08.2013, 16:40 Uhr
~ootobbyoo
Gast


nein, leider passt das auch nicht:

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



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

 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
09.08.2013, 16:44 Uhr
Tommix



Sorry, es gilt natürlich für alle Indizes:

C++:
    for(i = 0; i < n; i++){
        for(j = 0; j < n; j++){
            zw[i][j][0] = 1;
            zw[i][j][1] = 2;
        }
    }



- Tommix[/quote]
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
09.08.2013, 17:00 Uhr
~ootobbyoo
Gast


auch nicht...

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



2 2 0 0 0
0 0 0 0 0
1 0 0 0 0
2 0 0 0 0
0 0 0 0 0
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
12.08.2013, 08:59 Uhr
Tommix



Hallo,
ich bin wirklich kein Basic-Experte und lag mit meiner geratenen Vermutung wohl daneben: In VB gehen Array-Indizes standardmäßich auch bei Null los. Demzufolge haben sie eine Zeile / Spalte usw. mehr als in C. Es müsste also

C++:
square(double zw[][6][3], ...


heißen. Ich hoffe, das passt jetzt, ich kriege irgendwie den Import bei mir nicht hin.

- Tommix
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
12.08.2013, 14:35 Uhr
~ootobbyoo
Gast


Hallo Tommix,

vielen Dank für dein Durchhaltevermögen.

Ich habe etwas Interessantes heraus gefunden: Wenn ich den Array manuell beschreibe


C++:
        zw[0][0][0] = 666;
    zw[1][0][0] = 666;
    zw[0][1][0] = 666;
    zw[0][0][1] = 666;
     zw[0][1][1] = 666;
    zw[1][0][1] = 666;
     zw[1][1][0] = 666;
    zw[1][1][1] = 666;

    zw[0][0][0] = 555;
    zw[2][0][0] = 555;
    zw[0][2][0] = 555;
    zw[0][0][2] = 555;
    zw[0][2][2] = 555;
    zw[2][0][2] = 555;
    zw[2][2][0] = 555;
    zw[2][2][2] = 555;

    zw[1][1][1] = 444;
    zw[2][1][1] = 444;
    zw[1][2][1] = 444;
    zw[1][1][2] = 444;
    zw[1][2][2] = 444;
    zw[2][1][2] = 444;
    zw[2][2][1] = 444;
    zw[2][2][2] = 444;



kommt er immer komplett leer zurück.

Sowohl bei


C++:
quare(double zw[][5][2], ...


als auch bei


C++:
quare(double zw[][6][3], ...


Es scheint also grundsätzlich etwas an der Übergabe nicht zu stimmen. Erstaunlich aber, dass bei den Schleifen einige "1" und "2" zu sehen waren.

Dass dein Import nicht funktioniert, könnte an der Verlinkung liegen: www.forexfactory.com/showthread.php?p=5250053#post5250053

Vielen Dank für deine Unterstützung
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
009
12.08.2013, 15:55 Uhr
Hans
Library Walker
(Operator)


Hi,

diese Zuweisungsorgie enthält implizite Typenkonvertierungen, die nicht immer erfolgreich sind. Probier mal was heraus kommt, wenn du die Zuweisungen so schreibst:

C++:
...
zw[0][0][2] = 555.;
zw[0][2][2] = 555.;
...


Also mit einem Dezimalpunkt hinter der Ziffer. Das weisst den Compiler an, die Konstanten als double-Typ zu behalndeln. Ohne den Punkt kann er sie auch als int-Werte betrachten.

Hans
--
Man muss nicht alles wissen, aber man sollte wissen, wo es steht. Zum Beispiel hier: Nachdenkseiten oder Infoportal Globalisierung.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 < [ 2 ]     [ C / C++ (WinAPI, Konsole) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: