An error occurred when using matlab to call dll file which was generated by matlab coder
3 次查看(过去 30 天)
显示 更早的评论
- Hi, everyone! I am using matlab coder to convert m file to dll file using a simple test function. Now I've done the previous job, that is, dll file was generated.
- However, when using matlab functions(libstruct and calllib)to call the dll file ,an error message occurred: Cannot convert data value for field a due to error: A structure is required.
- The input argument of the function is a structure "in" with filed "a" and "b". And "a" is a variable-size argument(double inf*inf).
- When I change the argument "a" and "b" into a double 1*1 size, the error message disappeared. So I wonder if matlab doesn't support the variable-size argument in a dll file, and how can I solve the problem? (The structure is necessary in my algorithm!)
- Thank you in advance!
0 个评论
采纳的回答
Ryan Livingston
2016-4-7
When generating code for an Inf X Inf array, Coder will produce a C or C++ function which takes a struct argument to account for the fact that the array is variable size:
If you're intending to use the generated code in MATLAB then change the build target to a MEX file:
3 个评论
Ryan Livingston
2016-4-8
编辑:Ryan Livingston
2016-4-8
That clarifies the situation for me. The typical steps for verifying generated code are shown at:
So that you'll first generate and test a MEX and then move on to other code verification. If you have an Embedded Coder license, then Software-in-the-Loop (SIL) testing may be beneficial:
SIL wraps up the generated code into a MEX interface which can then be called in MATLAB. However, it has a limitation that it does not support function arguments which are dynamically allocated, like your Inf-by-Inf input. If you can use a fixed or upper bounded argument, then SIL could be of value.
Otherwise, some hand code will likely need to be written to interface with the generated code. An example main function is generated in the folder codegen/dll/<name>/examples which shows how to interact with the generated code:
You could use that example to write one of:
- A test script in C or C++ to do the verification
- A wrapper that can be easily called by loadlibrary in MATLAB. You could make that wrapper take an array and a size argument which will be easy to pass with calllib and then construct the emxArray argument(s) to call the generated code.
- A MEX wrapper which has a mexFunction that takes the inputs from MATLAB, converts them to emxArray arguments, calls the generated code, and passes the output back to MATLAB in plhs.
更多回答(0 个)
另请参阅
产品
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!