强制 Matlab Coder 创建结构
Forcing Matlab Coder to create structures
我的代码中有一个结构是使用函数 create_a_structure.m
和 a_struct = create_a_structure()
创建的。其他几个函数要么调用该函数,要么修改该结构字段中的值。
使用 coder.cstructname(a_struct, 'a_struct')
和一些调整,我设法让 Matlab 编码器在生成的代码中实际创建了一个名为 a_struct
的结构。尽管实际变量被命名为 b_a_struct
,并在 My_project_types.h
中声明。这使得使用生成的代码变得更加容易。
现在,我想添加第二个应该具有类似行为的结构,比如说 b_struct
。在创建了类似的函数来处理这个新结构后,我期望在 Matlab coder 生成的代码中也会生成一个名为 b_struct
的结构,但事实并非如此。
从那以后,我一直在努力复制我通过 a_struct
获得的行为。
但简而言之:
How to force Matlab Coder to create C structures corresponding to Matlab structs used in the Matlab code?
编辑:手写 header 不是解决方案,因为我希望这个结构的内容会经常改变,而且我'我计划以类似的方式添加更多结构。
coder.cstructname(myStructVariable, 'myStruct')
指示 MATLAB Coder 使用指定的结构名称 myStruct
作为类型,基本上使用 typedef struct {...} myStruct
.
当生成的代码需要引用具有该 typedef 的变量时,MATLAB Coder 仍将需要生成一些不会干扰类型的变量名,因此您可能确实将 b_a_struct
视为变量姓名。如果您保持类型的结构名称和变量名称足够不同,您可能会看到来自生成器的预期代码,例如使用 codegen -config:lib myfun -report
生成的代码来自:
function [v, w, x] = myfun()
%#codegen
v = struct('a',1,'b',2);
coder.cstructname(v, 'myStruct');
w = struct('a', 1, 'b', 3);
coder.cstructname(w, 'b_struct');
x = struct('a', 1, 'b', 4);
coder.cstructname(x, 'a_struct');
end
结果如下:
void myfun(myStruct *v, b_struct *w, a_struct *x)
{
v->a = 1.0;
v->b = 2.0;
w->a = 1.0;
w->b = 3.0;
x->a = 1.0;
x->b = 4.0;
}
所以我们确实看到输入参数中的 typedef 作为指针并且变量名称是匹配的(v
、w
和 x
)。
MATLAB Coder 在优化生成的代码方面非常出色(有时非常激进),其目标始终是确保在代码生成时给定指定输入的入口函数输出相同。如果你从其他 C/C++ 代码中调用生成的代码,生成代码中的实际变量名不应该太重要,但结构类型定义在自动生成和其他代码之间的接口中确实很重要代码!!
我的代码中有一个结构是使用函数 create_a_structure.m
和 a_struct = create_a_structure()
创建的。其他几个函数要么调用该函数,要么修改该结构字段中的值。
使用 coder.cstructname(a_struct, 'a_struct')
和一些调整,我设法让 Matlab 编码器在生成的代码中实际创建了一个名为 a_struct
的结构。尽管实际变量被命名为 b_a_struct
,并在 My_project_types.h
中声明。这使得使用生成的代码变得更加容易。
现在,我想添加第二个应该具有类似行为的结构,比如说 b_struct
。在创建了类似的函数来处理这个新结构后,我期望在 Matlab coder 生成的代码中也会生成一个名为 b_struct
的结构,但事实并非如此。
从那以后,我一直在努力复制我通过 a_struct
获得的行为。
但简而言之:
How to force Matlab Coder to create C structures corresponding to Matlab structs used in the Matlab code?
编辑:手写 header 不是解决方案,因为我希望这个结构的内容会经常改变,而且我'我计划以类似的方式添加更多结构。
coder.cstructname(myStructVariable, 'myStruct')
指示 MATLAB Coder 使用指定的结构名称 myStruct
作为类型,基本上使用 typedef struct {...} myStruct
.
当生成的代码需要引用具有该 typedef 的变量时,MATLAB Coder 仍将需要生成一些不会干扰类型的变量名,因此您可能确实将 b_a_struct
视为变量姓名。如果您保持类型的结构名称和变量名称足够不同,您可能会看到来自生成器的预期代码,例如使用 codegen -config:lib myfun -report
生成的代码来自:
function [v, w, x] = myfun()
%#codegen
v = struct('a',1,'b',2);
coder.cstructname(v, 'myStruct');
w = struct('a', 1, 'b', 3);
coder.cstructname(w, 'b_struct');
x = struct('a', 1, 'b', 4);
coder.cstructname(x, 'a_struct');
end
结果如下:
void myfun(myStruct *v, b_struct *w, a_struct *x)
{
v->a = 1.0;
v->b = 2.0;
w->a = 1.0;
w->b = 3.0;
x->a = 1.0;
x->b = 4.0;
}
所以我们确实看到输入参数中的 typedef 作为指针并且变量名称是匹配的(v
、w
和 x
)。
MATLAB Coder 在优化生成的代码方面非常出色(有时非常激进),其目标始终是确保在代码生成时给定指定输入的入口函数输出相同。如果你从其他 C/C++ 代码中调用生成的代码,生成代码中的实际变量名不应该太重要,但结构类型定义在自动生成和其他代码之间的接口中确实很重要代码!!