- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我用 C 编写了一个 Simulink S-Function(级别 2)。生成的模块有一个输出和一个参数。此参数存储在一个变量中,该变量在设置 block 后立即在文件范围内定义:
#define NUM_PARAMS 1
#define NUM_INPORTS 0
#define NUM_OUTPORTS 1
unsigned short int MASK_INDEX;
我在 mdlInitializeSizes 中分配它,并对它的值进行一些操作:
static void mdlInitializeSizes(SimStruct *S) {
// Check Parameters
ssSetNumSFcnParams(S, NUM_PARAMS);
if (ssGetNumSFcnParams(S) != ssGetSFcnParamsCount(S)) {
return;
}
MASK_INDEX = *mxGetPr(ssGetSFcnParam(S, 0));
(...) operations
}
我的问题是,变量 MASK_INDEX 似乎是全局的,并且在所有相同类型的 block 之间共享。因此,它对所有 block 都具有相同的值。
作为一种解决方法,我每次都重新加载它,并重新进行操作,例如:
static void mdlOutputs(SimStruct *S, int_T tid) {
MASK_INDEX = *mxGetPr(ssGetSFcnParam(S, 0));
(...) operations
}
我怎样才能得到一个真正的“局部变量”,这样我就不必每次都重复这一切?
最佳答案
您没有提到您声明 MASK_INDEX
的位置,但从您的描述来看,它听起来像是在文件范围内。如果是这样,那么是的,这个变量将在所有实例之间共享。这在任何方面都与 S-Functions 无关,这是大多数(如果不是全部)平台上的共享库的行为方式。共享库的单个实例将由应用程序加载,在本例中为 MATLAB;因此只有一个全局变量副本。
最简单的选择是每次要访问参数时都使用ssGetSFcnParam
。如果您深入研究那些 S-Function 宏,它们只是访问 SimStruct
的字段,因此重复访问不太可能导致性能下降。我什至看到宏被用来包装常见的用例,例如您的用例。
如果你真的想缓存对话框参数,最简单的方法可能是使用 ssSetUserData
.声明一个包含 MASK_INDEX
成员的 struct
(您没有使用 struct
但这种方法更可扩展)。在 mdlStart
中使用 mxMalloc
动态分配实例,并将其分配给 block 的用户数据。确保设置 SS_OPTION_CALL_TERMINATE_ON_EXIT
在 ssSetOptions
中调用 mdlInitializeSizes
。然后定义 mdlTerminate
函数,您将在其中使用 ssGetUserData
和 mxFree
访问分配的 struct
。现在您可以使用 ssGetUserData
访问 mdlOutputs
中的 struct
成员。
还有其他更高级的选项,例如 work vectors , 可能是 PWork vector .
另一个选项,如果您的参数是可调的,则使用 runtime parameters ,它允许您缓存并可选择转换 block 的对话框参数。
在你的情况下,我只是坚持每次在 mdlOutputs
中使用 ssGetSFcnParam
。
关于c - Simulink:如何在 2 级 s 函数中使用局部变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24822336/
我是一名优秀的程序员,十分优秀!