Re: NET/Link return array from C++
- To: mathgroup at smc.vnet.net
- Subject: [mg61156] Re: [mg60978] NET/Link return array from C++
- From: Todd Gayley <tgayley at wolfram.com>
- Date: Tue, 11 Oct 2005 03:22:37 -0400 (EDT)
- Sender: owner-wri-mathgroup at wolfram.com
At 03:08 AM 10/6/2005, Lars Schouw wrote: >I am having some problems returning an array back from C++. > >I would expect {100.,100.,100} coming back in my example. >Can anyone explain what I do wrong? > >C++ >void Test123(double x[], int size, double* result) >{ > for (long i = 0 ; i < size; i ++) > *(result+i) = 100.; >} > >NoteBook > >In[1]:= Needs["NETLink`"]; >TEST123 = DefineDLLFunction["ErrorFunctionA","mydll.dll", >"Void",{"double[]", "long", "out double"}]; > >input1=MakeNETObject[{1., 2., 3.}]; >res=MakeNETObject[{0.0,0.0, 0.0}]; > >TEST123[input1, 3, res] > >NETObjectToExpression[res] > >100 Lars, Dealing with array arguments that are written into by DLL functions is a bit tricky. I find that I have to remind myself of the rules for handling them every time I face a question about the subject. You have the right idea in that you need to explicitly create a .NET array object (your 'res' variable) to hold the output. Simply passing in a Mathematica list will not work because you will have no way to retrieve the modified array values. Your problem is with the "out double" type in DefineDLLFunction. When .NET marshals an "out double" argument into and back out of a DLL call, it treats it as the address of a double, not the beginning of a block of memory that might hold an array (after all, how could it know the length of the array?) The solution is to use the type "double[]" instead of "out double": TEST123 = DefineDLLFunction["ErrorFunctionA","mydll.dll", "Void", {"double[]", "long", "double[]"}]; Incidentally, those are exactly the array types you would use if you were declaring this external function in a C# program. It is generally the case that you can use the exact same types in DefineDLLFunction as you would in a C# or VB .NET declaration. Todd Gayley Wolfram Research