S functions. Creating a Simulink Block, failing at returning a pointer to an array (S-functions)
Mostrar comentarios más antiguos
Hi,
I´m trying to generate an S-function from a C file. It implements a moving average function. It has two inputs: the initial array and the average window. It ouputs a pointer to an array (with different size). I´ve tried with the legacy code tool and the S-function builder. Apparently, with the former it is not possible to deal with pointers? FYI, as a compiler I use Windows SDK 7.1.
First I include what I did in both versions, the M-file for the Legacy Code Tool and the S-function builder output pane (where I think is the error).
**************************** 1st version -> (Legacy Code Tool) ****************************
def = legacy_code('initialize')
def.SourceFiles = {'moving_sum_fcn_no_size_fin_v2.c'};
def.HeaderFiles = {'moving_sum_fcn_no_size_fin_v2.h'};
def.SFunctionName = 'ex_sfun_moving_sum';
def.OutputFcnSpec = 'moving_sum(double u1[1], uint8 u2, double y1[1])';
legacy_code('sfcn_cmex_generate', def)
legacy_code('compile', def)
legacy_code('sfcn_tlc_generate', def)
legacy_code('slblock_generate', def)
**************************** 2nd version -> S-function builder ****************************
// Output pane code: y[0] = moving_sum(u[0],n_avg[0]);
************************* // I receive the following error(s) when compiling it with both functions
ex_moving_sum_wrapper.c ex_moving_sum_wrapper.c(83) : error C2440: 'function' : cannot convert from 'const real_T' to 'double *'
ex_moving_sum_wrapper.c(83) : warning C4024: 'moving_sum' : different types for formal and actual parameter 1
ex_moving_sum_wrapper.c(83) : error C2440: '=' : cannot convert from 'double *' to 'real_T'
************************* Here is the C code *************************
double *calc_sum (double pr[], double b[], static unsigned int arrsize, static unsigned int n_avg)
{
static int k, m;
double s;
double *x;
x = (double*) b;
s = 0;
for (k = 0; k < n_avg; k++)
s = s + *(pr+k);
x[0] = s;
for (k = 0, m = n_avg; m < arrsize; k++, m++)
{
s = s + *(pr+m) - *(pr+k);
x[k+1] = s;
}
return x;
}
double *moving_sum(double ptr[], static unsigned int n_avg)
{
double *b;
static unsigned int size = 3999;
b = (double*) malloc((size-n_avg+1) * sizeof(double));
b = calc_sum(ptr, b, size, n_avg);
return b;
}
*************************
Is the problem related to the compiler? It seems to work with integers instead of double. Are these two options equivalent when dealing with pointers to arrays?
Thanks a lot. Sincerely Jesús.
Respuesta aceptada
Más respuestas (0)
Categorías
Más información sobre Simulink Coder en Centro de ayuda y File Exchange.
Productos
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!