I guess i did not copy my code correctly.
Here is what my C# struct looks like
public struct validationResult
{
public int rWaveValid; //validity of the r Wave
public int[] signalStatusArray; //validity of each of the
//channel data
};
Are you suggesting that the the error is caused by my array definition
in C# is dynamic (because of the []), while my C++ array is of size 4?
> > Hi,
> > I have a C++ Dll that has a function that is being exported as
[quoted text clipped - 43 lines]
> > Thanks in Advance.
> > abhi M
Willy Denoyette [MVP] - 18 Apr 2007 22:08 GMT
>I guess i did not copy my code correctly.
> Here is what my C# struct looks like
[quoted text clipped - 8 lines]
> Are you suggesting that the the error is caused by my array definition
> in C# is dynamic (because of the []), while my C++ array is of size 4?
Hard to tell, as you did not post the function declaration (C#), also I'm not clear on why
you allocate a managed array in C# while your C function returns a pointer (to an array in
unmanaged memory).
res.signalStatusArray = new int[4]; // WHY????
res = _validateData(dataToMat, 2); //res is returned from C, it's a pointer right???
I would suggest you to post a complete sample that illustrates the issue.
Willy.
AM - 19 Apr 2007 14:29 GMT
Here is my C++ code
#include "CppMatlabWrapper.h"
#include <exception>
#include <string>
using namespace std;
//Method to validate the data
extern "C" __declspec(dllexport) validationResult __stdcall
_validateData(double dataToMat[], int time)
{
validationResult res;
res.signalStatusArray[0]=1;
res.signalStatusArray[1]=2;
res.signalStatusArray[2]=3;
res.signalStatusArray[3]=4;
res.micDataValid = (int)(dataToMat[0]*100);
res.rWaveValid = (int)(dataToMat[1]*100);
return res;
}
------------
Here is the header file CppMatlabWrapper.h
//Structure to store the result of the validation operation
struct validationResult
{
int micDataValid; //validity of the microphone data
int rWaveValid; //validity of the r Wave
int signalStatusArray[4]; //validity of each of the channel data
};
extern "C" __declspec(dllexport) validationResult __stdcall
_validateData(double dataToMat[], int time);
This C++ code compiled gives me the library "CppMatlabWrapper.dll"
--------------------------------------------------------------------
Here is the C# code to access this library
using System;
using System.Runtime.InteropServices;
namespace MatlabWrapper
{
class Program
{
//Structure to receive the result of the validation operation
public struct validationResult
{
public int micDataValid; //validity of the microphone data
public int rWaveValid; //validity of the r Wave
public fixed int signalStatusArray[4];
};
[DllImport("CppMatlabWrapper.dll")]
static extern validationResult _validateData(double[] data,
int time);
static void Main(string[] args)
{
//code for creating a double array called dataToMat of
some size
//
validationResult res;
res = _validateData(dataToMat, 2);
}
}
}
THANKS
________
On Apr 18, 5:08 pm, "Willy Denoyette [MVP]"
<willy.denoye...@telenet.be> wrote:
> >I guess i did not copy my code correctly.
> > Here is what my C# struct looks like
[quoted text clipped - 19 lines]
>
> Willy.
Ben Voigt - 19 Apr 2007 15:31 GMT
>I guess i did not copy my code correctly.
> Here is what my C# struct looks like
[quoted text clipped - 8 lines]
> Are you suggesting that the the error is caused by my array definition
> in C# is dynamic (because of the []), while my C++ array is of size 4?
I am suggesting looking at the documentation for C# fixed-size buffers which
is here: http://msdn2.microsoft.com/en-us/library/zycewsya(VS.80).aspx
A dynamic (.NET) array carries additional stuff with it like length.
Additionally, since .NET arrays are ref class, only a pointer is stored in
the structure. This is totally different from the layout used by the C++
structure definition you gave.
>> > Hi,
>> > I have a C++ Dll that has a function that is being exported as
[quoted text clipped - 44 lines]
>> > Thanks in Advance.
>> > abhi M
AM - 19 Apr 2007 16:41 GMT
In that case what should my C# definition look like for the
corresponding C++ definition mentioned below?
C++ struct
struct validationResult
{
int micDataValid; //validity of the microphone data
int rWaveValid; //validity of the r Wave
int signalStatusArray[4]; //validity of each of the channel
data
};
Thanks
> >I guess i did not copy my code correctly.
> > Here is what my C# struct looks like
[quoted text clipped - 69 lines]
> >> > Thanks in Advance.
> >> > abhi M
Ben Voigt - 19 Apr 2007 16:52 GMT
> In that case what should my C# definition look like for the
> corresponding C++ definition mentioned below?
[quoted text clipped - 7 lines]
> data
> };
C# (not compile tested)
unsafe struct validationResult
{
int micDataValid; //validity of the microphone data
int rWaveValid; //validity of the r Wave
fixed int signalStatusArray[4]; //validity of each of the channel
data
};
or
struct validationResult
{
int micDataValid; //validity of the microphone data
int rWaveValid; //validity of the r Wave
int signalStatusArray_0; //validity of each of the channel data
int signalStatusArray_1;
int signalStatusArray_2;
int signalStatusArray_3;
};
> Thanks
>
[quoted text clipped - 76 lines]
>> >> > Thanks in Advance.
>> >> > abhi M
AM - 19 Apr 2007 18:41 GMT
When I use the struct u suggested
unsafe struct validationResult
{
int micDataValid; //validity of the microphone data
int rWaveValid; //validity of the r Wave
fixed int signalStatusArray[4]; //validity of each of the
channel
data
};
I get the following error.
Unable to find an entry point named '_validateData' in DLL
'CppMatlabWrapper.dll'.
This error goes away When i remove the array fro both the C++ and the
C# structs. So I think It has something to do with the way my array is
declared in the struct.
Thanks.
> > In that case what should my C# definition look like for the
> > corresponding C++ definition mentioned below?
[quoted text clipped - 116 lines]
> >> >> > Thanks in Advance.
> >> >> > abhi M
AM - 23 Apr 2007 18:16 GMT
Just so you guys know, I found a solution to the problem at the MSDN
forums. Here is a listing of the code
Code - header file
Header file
//Structure to store the result of the validation operation
struct validationResult
{
int micDataValid; //validity of the microphone data
int rWaveValid; //validity of the r Wave
int signalStatusArray[4]; //validity of each of the channel data -
causing the problems
};
extern "C" __declspec(dllexport) void __stdcall _validateData(double
dataToMat[], int time, validationResult *retval);
Code - CPP file
Cpp file
extern "C" __declspec(dllexport) void __stdcall _validateData(double
dataToMat[], int time, validationResult *retval)
{
retval->micDataValid = 10;
retval->rWaveValid =20;
retval->signalStatusArray[0] =1;
retval->signalStatusArray[1] =2;
retval->signalStatusArray[2] =3;
retval->signalStatusArray[3] =4;
return;
}
Code - C# code
Here is a listing of the C# code
class Program
{
unsafe struct validationResult
{
int micDataValid;
int rWaveValid;
fixed int signalStatusArray[4];
}
static void Main(string[] args)
{
validationResult res;
_validateData(dataToMat, 2,out res);
//assume dataToMat is an array with //
data already in it
}
}
----------------------------------
Thanks again.
> When I use the struct u suggested
> unsafe struct validationResult
[quoted text clipped - 141 lines]
> > >> >> > Thanks in Advance.
> > >> >> > abhi M