c - 根据 2 级 C-mex S-Function 中的导入数据类型设置输出端口的 Simulink block 数

标签 c matlab mex simulink

我正在尝试创建一个用 C 编写的 2 级 S-Function,它具有不同数量的输出端口,具体取决于连接到进口。

实际背景是我有一些其他 S-Function,它们通过调用 ssRegisterDataType 来定义自定义数据类型。这些数据类型描述了指向某些数据的指针。

我现在想要另一个 S-Function,它可以使用这些自定义数据类型(指针),并根据输入的指针类型输出某些数据。

我尝试通过 ssSetNumOutputPorts 设置输出端口的数量

static void mdlSetInputPortDataType(SimStruct *S, int portIndex,DTypeId dType)
{
    if( portIndex == 0 )
    {
        if(      dType == ssGetDataTypeId(S, "ptrtype1" ) )
        {
            if (!ssSetNumOutputPorts(S, nOutportsPtr1)) return;
        }
        else if( dType == ssGetDataTypeId(S, "ptrtype2" ) )
        {
            if (!ssSetNumOutputPorts(S, nOutportsPtr2)) return;
        }
        else if( dType == ssGetDataTypeId(S, "ptrtype3" ) )
        {
            if (!ssSetNumOutputPorts(S, nOutportsPtr3)) return;
        }
        else if( dType == ssGetDataTypeId(S, "ptrtype4" ) ) 
        {
            if (!ssSetNumOutputPorts(S, nOutportsPtr4)) return;
        }
        else
        {
            ssSetErrorStatus(S, "Input data type is not supported."); return;
        }


        if (!ssSetInputPortDataType(S, portIndex, dType)) return;
    }
} /* mdlSetInputPortDataType */

mdlInitializeSizes 中,我将输入端口的数据类型设置为 DYNAMICALLY_TYPED

但 Simulink 一直告诉我应该在调用 ssSetNumOutputPorts 时在 mdlSetInputPortDataType 中设置输入端口数据类型。我假设在这个函数中只有输入端口的数据类型可以改变。

有人知道解决这个问题的方法吗?我能想到的唯一解决方法是屏蔽 S-Function 并让用户手动选择他希望处理的指针类型。但是,对于数据类型传播,这看起来很困惑且没有必要。

最佳答案

您需要在 mdlInitializeSizes 中设置端口数。你不能在那个函数之后改变它。唯一的解决方法是您提到的那个。

关于c - 根据 2 级 C-mex S-Function 中的导入数据类型设置输出端口的 Simulink block 数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13744112/

相关文章:

algorithm - Matlab算法问题

c - C程序设计语言第二版练习1-9

谁能告诉我为什么输出如此奇怪?

c - Makefile 忽略 @ 以静默输出

c++ - 高级 C 或 C++ 书籍

c++ - 如何判断c++ vector中的值类型(int或double)?

matlab - 如何检查函数调用中是否提供了参数?

Matlab 2012b 桌面 - 重新激活旧的 "retro style"桌面?

c++ - 使用 mex 编译库时出错 - __int 64 未命名类型

matlab - MATLAB MEX 文件的大小限制