DLL function that takes pointer to struct and that contains pointer to struct
显示 更早的评论
I am trying to use the GSL libraries (compiled in a 64bit DLL) inside a Simulink model with the idea of generating C code. The M-function simulink block takes a Matlab vector and a costant as input and gives the result of the C function gsl_blas_dscal as output (y). To do this I need MATLAB/Simulink to understand the custom data types of the DLL that are defined in the following header file:
struct gsl_block_double_struct
{
size_t size;
double *data;
};
typedef struct gsl_block_double_struct gsl_block_double;
typedef struct gsl_vector
{
size_t size;
size_t stride;
double *data;
gsl_block_double *block;
int owner;
} gsl_vector_double;
void gsl_blas_dscal (double, gsl_vector_double *);
The code of the M-function is
function y = gsl_blas_dscal(v1,a)
%#codegen
y = 1;
l1 = length(v1);
f1 = double(a);
coder.cinclude('libgsl.h');
g1_bf = struct('size',l1,'data',v1);
coder.cstructname(g1_bf, 'gsl_block_double','extern');
g1 = struct('block',g1_bf,'data',v1, 'stride',1, 'size',l1);
coder.cstructname(g1, 'gsl_vector_double','extern');
y = coder.ceval('gsl_blas_dscal',f1,coder.ref(g1));
end
The problem I have is with the gsl_block_double *block that is contained by the gsl_vector_double struct. The function gsl_blas_dscal takes as input a pointer to a gsl_vector_double that (as you can see from my Matlab code) I pass to the coder.eval instruction using coder.ref, but when I try to run the simulation I get this error
Building with 'MinGW64 Compiler (C)'.
C:\Users\f08844c\Documents\NGRS\gsl_simulink\slprj\_sfprj\gsl_block\_self\sfun\src\c2_gsl_block.c: In function 'sf_gateway_c2_gsl_block':
C:\Users\f08844c\Documents\NGRS\gsl_simulink\slprj\_sfprj\gsl_block\_self\sfun\src\c2_gsl_block.c:239:15: error: incompatible types when assigning to type 'struct gsl_block_double *' from type 'gsl_block_double'
C:\Users\f08844c\Documents\NGRS\gsl_simulink\slprj\_sfprj\gsl_block\_self\sfun\src\c2_gsl_block.c:249:10: error: void value not ignored as it ought to be
C:\Users\f08844c\Documents\NGRS\gsl_simulink\slprj\_sfprj\gsl_block\_self\sfun\src\c2_gsl_block.c: In function 'c2_c_sf_marshallOut':
C:\Users\f08844c\Documents\NGRS\gsl_simulink\slprj\_sfprj\gsl_block\_self\sfun\src\c2_gsl_block.c:388:10: error: incompatible types when assigning to type 'gsl_block_double' from type 'struct gsl_block_double *'
C:\Users\f08844c\Documents\NGRS\gsl_simulink\slprj\_sfprj\gsl_block\_self\sfun\src\c2_gsl_block.c: In function 'c2_c_emlrt_marshallIn':
C:\Users\f08844c\Documents\NGRS\gsl_simulink\slprj\_sfprj\gsl_block\_self\sfun\src\c2_gsl_block.c:433:17: error: incompatible types when assigning to type 'struct gsl_block_double *' from type 'gsl_block_double'
gmake: *** [c2_gsl_block.obj] Error -1
How can I define the member gsl_block_double of gsl_vector_double as a pointer to structure? I tried either using coder.ref (but it tells me that I can only use it within a coder.ceval context), or defining the structure as
coder.cstructname(g1_bf, 'gsl_block_double*','extern');
but in this case I get this error
Building with 'MinGW64 Compiler (C)'.
C:\Users\f08844c\Documents\NGRS\gsl_simulink\slprj\_sfprj\gsl_block\_self\sfun\src\c2_gsl_block.c: In function 'sf_gateway_c2_gsl_block':
C:\Users\f08844c\Documents\NGRS\gsl_simulink\slprj\_sfprj\gsl_block\_self\sfun\src\c2_gsl_block.c:231:8: error: request for member 'size' in something not a structure or union
C:\Users\f08844c\Documents\NGRS\gsl_simulink\slprj\_sfprj\gsl_block\_self\sfun\src\c2_gsl_block.c:233:10: error: request for member 'data' in something not a structure or union
C:\Users\f08844c\Documents\NGRS\gsl_simulink\slprj\_sfprj\gsl_block\_self\sfun\src\c2_gsl_block.c:249:10: error: void value not ignored as it ought to be
C:\Users\f08844c\Documents\NGRS\gsl_simulink\slprj\_sfprj\gsl_block\_self\sfun\src\c2_gsl_block.c: In function 'c2_c_sf_marshallOut':
C:\Users\f08844c\Documents\NGRS\gsl_simulink\slprj\_sfprj\gsl_block\_self\sfun\src\c2_gsl_block.c:391:18: error: request for member 'size' in something not a structure or union
C:\Users\f08844c\Documents\NGRS\gsl_simulink\slprj\_sfprj\gsl_block\_self\sfun\src\c2_gsl_block.c:396:27: error: request for member 'data' in something not a structure or union
C:\Users\f08844c\Documents\NGRS\gsl_simulink\slprj\_sfprj\gsl_block\_self\sfun\src\c2_gsl_block.c: In function 'c2_d_emlrt_marshallIn':
C:\Users\f08844c\Documents\NGRS\gsl_simulink\slprj\_sfprj\gsl_block\_self\sfun\src\c2_gsl_block.c:458:9: error: request for member 'size' in something not a structure or union
C:\Users\f08844c\Documents\NGRS\gsl_simulink\slprj\_sfprj\gsl_block\_self\sfun\src\c2_gsl_block.c:462:36: error: request for member 'data' in something not a structure or union
C:\Users\f08844c\Documents\NGRS\gsl_simulink\slprj\_sfprj\gsl_block\_self\sfun\src\c2_gsl_block.c: In function 'c2_d_sf_marshallOut':
C:\Users\f08844c\Documents\NGRS\gsl_simulink\slprj\_sfprj\gsl_block\_self\sfun\src\c2_gsl_block.c:519:16: error: request for member 'size' in something not a structure or union
C:\Users\f08844c\Documents\NGRS\gsl_simulink\slprj\_sfprj\gsl_block\_self\sfun\src\c2_gsl_block.c:524:25: error: request for member 'data' in something not a structure or union
gmake: *** [c2_gsl_block.obj] Error -1
How can I solve this and be able to run the simulation and then generate code?
Sorry for the long question, but describing this kind of issues is complicated.
回答(0 个)
类别
在 帮助中心 和 File Exchange 中查找有关 Simulink Coder 的更多信息
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!