我想在使用S函数构建器的Simulink中创建一个s函数,它将接受一个2d数组作为输入。在输入端口中,我指定了维度:2d,rows:4,columns:4.当我尝试使用f [x] [y]访问输入端口时,它给出错误:“error C2109:subscript requires array or pointer键入“,用于输入端口所在的行。如何在输入端口为2d数组的Simulink中创建s函数?
如何在输入端口为2d数组的情况下在Simulink中创建s函数?
相关的代码:
static void mdlInitializeSizes(SimStruct *S)
{
DECL_AND_INIT_DIMSINFO(inputDimsInfo);
DECL_AND_INIT_DIMSINFO(outputDimsInfo);
ssSetNumSFcnParams(S, NPARAMS);
if (ssGetNumSFcnParams(S) != ssGetSFcnParamsCount(S)) {
return; /* Parameter mismatch will be reported by Simulink */
}
ssSetNumContStates(S, NUM_CONT_STATES);
ssSetNumDiscStates(S, NUM_DISC_STATES);
if (!ssSetNumInputPorts(S, NUM_INPUTS)) return;
/*Input Port 0 */
inputDimsInfo.width = INPUT_0_WIDTH;
ssSetInputPortDimensionInfo(S, 0, &inputDimsInfo);
ssSetInputPortMatrixDimensions(S ,0, INPUT_0_WIDTH, INPUT_DIMS_0_COL);
ssSetInputPortFrameData(S, 0, IN_0_FRAME_BASED);
ssSetInputPortDataType(S, 0, SS_DOUBLE);
ssSetInputPortComplexSignal(S, 0, INPUT_0_COMPLEX);
ssSetInputPortDirectFeedThrough(S, 0, INPUT_0_FEEDTHROUGH);
ssSetInputPortRequiredContiguous(S, 0, 1); /*direct input signal access*/
if (!ssSetNumOutputPorts(S, NUM_OUTPUTS)) return;
ssSetNumSampleTimes(S, 1);
ssSetNumRWork(S, 0);
ssSetNumIWork(S, 0);
ssSetNumPWork(S, 0);
ssSetNumModes(S, 0);
ssSetNumNonsampledZCs(S, 0);
/* Take care when specifying exception free code – see sfuntmpl_doc.c */
ssSetOptions(S, (SS_OPTION_EXCEPTION_FREE_CODE |
SS_OPTION_USE_TLC_WITH_ACCELERATOR |
SS_OPTION_WORKS_WITH_CODE_REUSE));
}
在mdlOuputs
我尝试治疗f
(端口),为正常阵列。 例如:
x=f[0][0];
这会引发错误。
编辑: 那么,有点想通了。
根据输入参数设置端口尺寸,然后您可以使用f [x * xw + y]来解决这些值,其中x和y是x和y位置(从0开始),xw是列数。
还没有找到更好的方法,但这个工程。
您可以复制粘贴由S-Function Builder中的'mdlInitializeSizes','mdlSetInputPortDimensionInfo'&'mdlOutputs'(你所访问的部分生成的代码港口)? – Praetorian 2012-07-17 15:37:23
Stackoverflow不会让我发布在这里,所以这里是mdlInitializeSizes:http://textsave.de/?p=128363。没有mdlSetInputPortDimensionInfo。在mdlOuputs中,我尝试将f(端口)视为普通数组。例如:x = f [0] [0]。这给出了一个错误。 – 2012-07-17 16:09:42