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.

Answers (0)

Categories

Find more on Simulink Coder in Help Center and File Exchange

Asked:

on 30 May 2017

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!