How to convert a function using mex code with the Matlab Coder
이전 댓글 표시
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
답변 (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
카테고리
도움말 센터 및 File Exchange에서 MATLAB Coder에 대해 자세히 알아보기
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!