为啥即使我设置了 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 错误
为啥即使 objectEquality 设置为 true,$watch 也不会触发?