gpt4 book ai didi

c - 如何使用二维数组的输入端口在 Simulink 中创建 s 函数?

转载 作者:行者123 更新时间:2023-12-01 09:57:23 25 4
gpt4 key购买 nike

我正在尝试使用将接受二维数组作为输入的 s-function builder 在 Simulink 中创建一个 s-function。在输入端口中,我指定了维度:2d,行:4,列:4。当我尝试使用 f[x][y] 访问输入端口时,它给出了一个错误:“错误 C2109:下标需要数组或指针type”,用于输入端口所在的线路。

如何使用二维数组的输入端口在 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 构建器正在生成如下所示的代码 mdlOutputs :

real_T *y0 = (real_T *)ssGetOutputPortSignal(S, 0);
// OR
real_T *y0 = ssGetOutputPortRealSignal(S, 0);

与任一行 y0是一个指向一维数组的指针,因此当您尝试使用 2 个下标访问它时,就好像它是一个二维数组一样,编译器会提示。

您可以通过在编辑中发布时将二维索引更改为线性索引来修复它。这工作得很好,事实上,当您使用 2 个下标索引到 2-D 数组时,无论如何编译器都必须在幕后执行此操作。

另一种选择是转换 ssGetInputPortSignal 的返回值(或 ssGetInputPortRealSignal )指向指向指针类型的指针。
real_T **y0 = (real_T **)ssGetOutputPortSignal(S, 0);

y0[1][1] = 0;

关于c - 如何使用二维数组的输入端口在 Simulink 中创建 s 函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11525701/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com