matlab编码器要求比普通matlab更严格

matlab coder requirements stricter than normal matlab

考虑以下 matlab 程序:

function results = prog()
    opts.x = 1;
    if ~isfield(opts, 'y'); opts.y = 1; end
    'asdf'
return

我能够在 matlab 中成功 运行 这个程序,但是当我尝试使用编码器将它转换为 C 时,我得到以下错误:

This structure does not have a field 'y'; new fields cannot be added when structure has been read or used.

我想知道是否有一种方法可以使用不使用更严格的编译器的编码器(或可能的其他工具)转换为 C,就像我正在使用的编码器一样。我正在使用 matlab 版本 R2019B.

请注意,这只是编码器如何使用比普通 matlab 更严格的编译器的众多示例之一。我有一个相当大的程序,我想将其转换为 C,但我不想经历每个错误(超过 100 个)。

正如 Daniel 所提到的,C 中不存在结构的可选字段,这就是 MATLAB Coder 在该代码上出现错误的原因。

为了使此代码与 MATLAB Coder 一起工作,opts 可以始终具有 属性 y,但使其大小可变并初始化为空:

function results = prog()
    opts.x = 1;
    opts.y = [];
    coder.varsize('opts.y');
    if isempty(opts.y); opts.y = 1; end
    'asdf'
end

或者您可以创建另一个选项变量 optsWithY,它将具有字段 y,即使 opts 没有:

function results = prog()
    opts.x = 1;
    optsWithY = opts;
    if ~isfield(opts, 'y'); optsWithY.y = 1; end
    'asdf'
end

这甚至可以移入辅助函数并分配回 opts

function results = prog()
    opts.x = 1;
    opts = addOpt(opts, 'y', 1);
    'asdf'
end

function newOpts = addOpt(opts, field, defaultValue)
    newOpts = opts;
    if ~isfield(opts, field)
        newOpts.(field) = defaultValue;
    end
end

此代码与原始代码之间的区别是部分赋值 opts.y = ... 与完整赋值 opts = ...

或者像 Cris 提到的那样,MATLAB 编译器将更接近 MATLAB(尽管您不会获得 C 代码)