如何使用C语言在Scilab/Xcos中开发自己的模块
我一直在使用CBLOCK4在Scilab/Xcos中开发自己的块。 块中的C语言代码如下所示:如何使用C语言在Scilab/Xcos中开发自己的模块,c,memory-management,scilab,xcos,C,Memory Management,Scilab,Xcos,我一直在使用CBLOCK4在Scilab/Xcos中开发自己的块。 块中的C语言代码如下所示: #include <stdio.h> #include "scicos_block4.h" #define U ((SCSREAL_COP *)GetRealInPortPtrs(block, 1)) #define Y ((SCSREAL_COP *)GetRealOutPortPtrs(block, 1)) #define X ((SCSREAL_COP *
#include <stdio.h>
#include "scicos_block4.h"
#define U ((SCSREAL_COP *)GetRealInPortPtrs(block, 1))
#define Y ((SCSREAL_COP *)GetRealOutPortPtrs(block, 1))
#define X ((SCSREAL_COP *)GetState(block))
#define dX ((SCSREAL_COP *)GetDerState(block))
#define Xk ((SCSREAL_COP *)GetDstate(block))
#define W ((SCSREAL_COP *)GetWorkPtrs(block))
// parameters
#define N (GetIparPtrs(block)[0])
typedef struct
{
double *buffer;
double *sum;
int *index;
}MovingAverage_t;
FILE *f;
void MovingAverage(scicos_block *block,int flag)
{
MovingAverage_t *ptr;
int bufferPos;
if(flag == 4)
{
/* init */
f = fopen("Debug.txt", "w");
if((*(block->work) = (MovingAverage_t *)scicos_malloc(sizeof(MovingAverage_t))) == NULL)
{
set_block_error(-16);
return;
}
ptr = (MovingAverage_t*)*block->work;
fprintf(f, "ptr: %ld \n", ptr);
if((ptr->buffer = (double*)scicos_malloc(sizeof(double)*N)) == NULL)
{
scicos_free(*(block->work));
fclose(f);
set_block_error(-16);
return;
}
if((ptr->sum = (double*)scicos_malloc(sizeof(double))) == NULL)
{
scicos_free(*(ptr->buffer));
scicos_free(*(block->work));
fclose(f);
set_block_error(-16);
return;
}
if((ptr->index = (int*)scicos_malloc(sizeof(int))) == NULL)
{
scicos_free(*(ptr->buffer));
scicos_free(*(ptr->sum));
scicos_free(*(block->work));
fclose(f);
set_block_error(-16);
return;
}
fprintf(f, "ptr->buffer: %ld \n", ptr->buffer);
fprintf(f, "ptr->sum: %ld \n", ptr->sum);
fprintf(f, "ptr->index: %ld \n", ptr->index);
int i;
for(i = 0; i < N; i++)
{
ptr->buffer[i] = 0;
}
*(ptr->sum) = 0;
*(ptr->index) = 0;
for(i = 0; i < N; i++)
{
fprintf(f, "buffer[%d]: %f\n", i, ptr->buffer[i]);
}
fprintf(f, "*(ptr->sum): %f\n", *(ptr->sum));
fprintf(f, "*(ptr->index): %d\n", *(ptr->index));
}
else if(flag == 1)
{
fprintf(f, "In: %f \n", U[0]);
ptr->buffer[0] = U[0];
int i;
for(i = 0; i < N; i++)
{
fprintf(f, "buffer[%d]: %f\n", i, ptr->buffer[i]);
}
}
else if (flag == 5)
{
/* ending */
scicos_free(*(block->work));
fclose(f);
}
}
我能够成功编译代码,但如果我运行包含
我的CBLOCK4块始终收到以下错误消息:
警告!!!
Scilab发现一个严重错误(异常\访问\违反)
具有“scicosim”功能。
保存数据并重新启动Scilab
模拟也不会启动。我发现,如果我删除CBLOCK4块中的以下代码行,模拟将开始工作:
ptr->buffer[0] = U[0];
int i;
for(i = 0; i < N; i++)
{
fprintf(f, "buffer[%d]: %f\n", i, ptr->buffer[i]);
}
ptr->buffer[0]=U[0];
int i;
对于(i=0;ibuffer[i]);
}
我怀疑我的C代码中有一些bug(可能是关于内存)
分配)但我找不到。有人有使用Scilab/Xcos的经验吗
CBLOCK4的使用情况?我经历过,要获得CBLOCK4的好信息/示例可能非常困难,但在谷歌搜索了很多之后,我现在将以下内容用于缓冲区实现(取一个实数,输出N个最后样本的向量):
#包括“scicos_block4.h”
#在(n,i)中定义r_((GetRealInPortPtrs(block,n+1))[(i)])
#定义r_OUT(n,i)((GetRealOutPortPtrs(block,n+1))[(i)])
#在(r_in(0,0))中定义//输入,单实
#定义out(n)(r_out(0,n))//输出,向量(1,n)实
#定义nsample(GetOutPortSize(块,1,2))
#定义设置0(GetiParpts(块)[0])
#定义X(GetState(块)[0])//状态
#定义Xdot(GetDerState(block)[0])//状态的派生
#定义surface0(GetGPtrs(块)[0])
#定义mode0(GetModePtrs(块)[0])
#定义wrk(i)(((双*)GetWorkPtrs(块))[i])
无效缓冲区(scicos_块*块,int标志)
{
int i;
开关(标志){
案例0://计算导数
打破
案例1://计算输出
对于(i=1;我是一个大结构!它看起来是重复的(x
block、z
block、par
block等等),为什么不提取公共部分呢?@KamilCuk感谢您的反应。这个结构是API的一部分,我无法影响它。您第一眼看到我的代码中有什么问题吗?
ptr->buffer[0] = U[0];
int i;
for(i = 0; i < N; i++)
{
fprintf(f, "buffer[%d]: %f\n", i, ptr->buffer[i]);
}
#include "scicos_block4.h"
#define r_IN(n, i) ((GetRealInPortPtrs(block, n+1))[(i)])
#define r_OUT(n, i) ((GetRealOutPortPtrs(block, n+1))[(i)])
#define in (r_IN(0, 0)) // input, single real
#define out(n) (r_OUT(0, n)) // output, vector(1,N) real
#define nSamples (GetOutPortSize(block, 1, 2))
#define setting0 (GetIparPtrs(block)[0])
#define X (GetState(block)[0]) // state
#define Xdot (GetDerState(block)[0]) // derivative of the state
#define surface0 (GetGPtrs(block)[0])
#define mode0 (GetModePtrs(block)[0])
#define wrk(i) (((double*)GetWorkPtrs(block))[i])
void buffer(scicos_block *block, int flag)
{
int i;
switch(flag){
case 0: // calculate derivative
break;
case 1: // calculate output
for(i=1; i<nSamples; i++) out(i-1)=out(i);
out(nSamples-1)=in;
break;
case 2: // update states
break;
case 3: // event
break;
case 4: // init
break;
case 5: // done, deinit
break;
case 6: // re-initialization
break;
case 9: // calculate surfaces and modes
break;
}
}