How to convert a function using mex code with the Matlab Coder
조회 수: 1 (최근 30일)
이전 댓글 표시
Hello,
I am trying to convert my project into C code using the Matlab Coder but it is running into an error when it comes to the 'written for mex' C code part.
The error is:
>> coder -build test_mex.prj??? C function calls always return scalar values but a non-scalar value is expected here.
Error in ==> test_Coder_with_mex Line: 13 Column: 5
Code generation failed: Open error report.
My test code is:
function Pts_out = test_Coder_with_mex
Pts_in = [1,1,1; 1,1,2; 1,2,1; 2,1,1; 1,2,2; 2,1,2; 2,2,1; 2,2,2];
Pts_out = zeros(8,3);
Pts_ctrl_in = [Pts_in(1,:); Pts_in(4,:); Pts_in(8,:)];
Pts_ctrl_out = [0,0,0; 2,1,1; 2,3,2];
D_hnd_mesh = [0 1 1.73205080756888;1 1.41421356237310 1.41421356237310;1 1.41421356237310 1.41421356237310;1 0 1.41421356237310;1.41421356237310 1.73205080756888 1;1.41421356237310 1 1;1.41421356237310 1 1;1.73205080756888 1.41421356237310 0];
if coder.target('Sfun')
% running in MATLAB
Pts_out = MLSsubroutine_C(Pts_in, Pts_ctrl_in, Pts_ctrl_out, 2, D_hnd_mesh);
else
% running by coding
Pts_out = coder.ceval('MLSsubroutine_C',Pts_in, Pts_ctrl_in, Pts_ctrl_out, 2, D_hnd_mesh);
end
The C function is not running with a return value but with the mex specific:
void mexFunction(int nlhs, mxArray *plhs[], /* Output variable */
int nrhs, const mxArray *prhs[]) /* Input variables */
{
// do stuff here
return;
}
Thanks
댓글 수: 0
답변 (1개)
Fred Smith
2015년 4월 20일
Instead of
coder.target('sfun')
you probably meant
coder.target('matlab')
in the latest release. In older releases you would have used
isempty(coder.target)
That said, even after you make this change, your invocation still will not work:
Pts_out = coder.ceval('MLSsubroutine_C',Pts_in, Pts_ctrl_in, Pts_ctrl_out, 2, D_hnd_mesh);
coder.ceval is expecting a C call that works with the raw data and not with mxArrays.
You can resolve this in two ways. Refactor your C code into a kernel that does not use mxArrays and a wrapper that converts from mxArrays to raw data, and then call the kernel using coder.ceval. Alternatively, you can write a raw function wrapper that creates mxArrays from the raw data and then calls mexFunction. If both seem equally easy to you, the former is clearly to be preferred.
Good luck,
Fred
참고 항목
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!