为啥即使我设置了 DataTypeReplacement = 'CBuiltIn',MATLAB Coder 也不会生成 C 内置类型?

Posted

技术标签:

【中文标题】为啥即使我设置了 DataTypeReplacement = \'CBuiltIn\',MATLAB Coder 也不会生成 C 内置类型?【英文标题】:Why does MATLAB Coder not generate C built-in types even though I've set DataTypeReplacement = 'CBuiltIn'?为什么即使我设置了 DataTypeReplacement = 'CBuiltIn',MATLAB Coder 也不会生成 C 内置类型? 【发布时间】:2021-04-18 19:13:56 【问题描述】:

我有一个 MATLAB (R2020b) 函数,我正在尝试使用 MATLAB Coder 将其转换为(Linux 兼容的)C 程序。该函数接受 3 个字符串参数,如下所示:

function func1(a, b, c)

我希望生成的 C 函数接受 3 个char* 参数:

extern void func1(const char *a, const char *b, const char *c);

为了完成这项工作,我正在通过这个脚本运行 MATLAB Coder:

cfg = coder.config('dll','ecoder',false);
cfg.GenerateReport = true;
cfg.ReportPotentialDifferences = false;
cfg.GenerateComments = false;
cfg.RuntimeChecks = true;
cfg.GenCodeOnly = true;
cfg.HardwareImplementation.TargetHWDeviceType='Generic->64-bit Embedded Processor (LP64)';
cfg.DataTypeReplacement = 'CBuiltIn';

%% Define argument types for entry-point 'func1'.
ARGS = cell(1,1);
ARGS1 = cell(3,1);
ARGS11 = coder.typeof('X',[Inf Inf],[1 1]);
ARGS12 = coder.typeof('X',[Inf Inf],[1 1]);
ARGS13 = coder.typeof('X',[Inf Inf],[1 1]);

%% Invoke MATLAB Coder.
codegen  -config cfg func1 -args ARGS1 -c

运行脚本后,生成的函数签名为:

extern void func1(const emxArray_char_T *a, const emxArray_char_T *b, const emxArray_char_T *c);

似乎尽管我明确设置了 cfg.DataTypeReplacement = 'CBuiltIn',但 MATLAB Coder 生成了 MathWorks 类型定义而不是 built-in C data types。

我的问题是 - 为什么?以及如何解决此问题以生成内置数据类型?

【问题讨论】:

【参考方案1】:

不幸的是,从 MATLAB Coder R2021a 开始,不支持为可变大小的字符串生成采用 char* 的代码。目前,当使用可变大小的字符串时,MATLAB Coder 始终生成采用 emxArray_char_T*(用于 C 代码生成)或 coder::array(用于 C++ 代码生成的默认值)的代码。

【讨论】:

以上是关于为啥即使我设置了 DataTypeReplacement = 'CBuiltIn',MATLAB Coder 也不会生成 C 内置类型?的主要内容,如果未能解决你的问题,请参考以下文章

为啥即使我在项目设置中更改了语言标准,std::lcm() 也不起作用?

为啥即使我设置了 STATIC_ROOT 和 urls.py 也会出现 404 错误

为啥即使配置文件设置为分发,xcode 也会抛出此错误?

为啥即使 objectEquality 设置为 true,$watch 也不会触发?

为啥即使设置了 Effects = DragDropEffects.None 也允许放置?

为啥即使我没有明确设置表格字体大小,表格也不使用正文字体大小?