Re: Passing a 2d array from vb.net to unmanaged C++ dll
I'm trying to pass a bi-dimensional array of integers from vb.net to a c++
dll (in fact - a matrix that has to be processed in the dll) and then I
need the results back in the vb.net application.
I tried using the same approach as when passing a simple array (see
example below) but didn't succeed.
C++ function to process the array:
int Cmfcw001App::TestArr(int *ar, int size) {
//read the first element for test
int k;
k = ar[5];
return k;
}
.....
The function TestArr has been defined in the .def file.
The declaration in vb.net module
Public Declare Function TestArr Lib "<path>\mfcw001.dll" (ByRef ar As
Integer, ByVal size As Integer) As Integer
//****** Usage in vb.net code:
Dim ar(9) As Integer
For i = 0 To 9
ar(i) = -1 * i
Next
s = TestArr(ar(0), 10)
MsgBox(s)
On this pattern I tried replacing
int* ar with int** ar ,
ar(9) with ar(3, 3)
the call is now TestArr(ar(0, 0), 10)
in the dll the function tries to read k = ar[0][0]
The error message I get in vb.net is "Object reference not set to an
instance of an object" when reaching the call to TestArr.
changing int* ar with int** ar does not mean changing from a 1D array to a
2D array. it means that you now expect to pass a pointer to a pointer to a
chunk of data.
Furthermore, the only way to pass multi dimensional arrays is by fixing all
but one dimension because otherwise the compiler won't know how to calculate
index offsets.
also your array has only 9 values, but you pass the size as 10.
If cannot fix your array sizes, the only way to work with it from the C++
side is to pass the 2D array as a 1D array, supply the different array sizes
and then calculate the appropriate index in the 1D array for a given row and
column index.
--
Kind regards,
Bruno van Dooren MVP - VC++
http://msmvps.com/blogs/vanDooren
bruno_nos_pam_van_dooren@hotmail.com