调用自定义的C / c++代码生成的代码
从MATLAB中®代码,你可以直接调用外部C / c++代码,也称为自定义代码或遗留代码。调用C / c++函数,使用coder.ceval
。代码生成器将C / c++代码集成到从MATLAB生成的C / c++代码。当有外部库集成代码,优化代码,或C / c++开发的对象文件,您想要使用生成的代码。当外部代码使用变量类型未定义或被MATLAB,使用coder.opaque
函数与coder.ceval
。储备一定的标识符名称用于定制C / c++代码,你想与生成的代码集成,使用coder.reservedName
函数。
以下是一些外部代码集成的主要工作流程。更多的例子,请参阅coder.ceval
参考页面。
请注意
通过使用coder.ceval
,您将获得无限制的访问外部代码。滥用这些功能或代码中的错误可以破坏MATLAB和使它停止工作。代码调试和分析从编译错误信息,查看建立日志标签的代码生成报告。
使用coder.ceval
只有在MATLAB代码用于代码生成。coder.ceval
没有编译的MATLAB代码中生成一个错误。来确定一个MATLAB函数执行在MATLAB中,使用coder.target
。如果函数执行在MATLAB中,调用MATLAB版本的C / c++函数。
调用的C代码
这个例子展示了如何将一个简单的C函数,通过使用MATLAB®代码coder.ceval
。考虑到MATLAB函数,mathOps
:
函数[补充说,乘]= mathOps (in1, in2) = in1 + in2;乘= in1 * in2;结束
对于这个示例,假设您想要执行的操作通过使用外部C代码。考虑到C函数,加法器
,在文件中实现adder.c
:
# include < stdio。h > # include < stdlib。h > # include "加法器。h“双加法器(双in1,双in2){返回in1 + in2;}
集成加法器
通过MATLAB代码,您需要一个头文件,包含了函数原型。看到这个文件adder.h
:
两个加法器(双in1,双in2);
使用coder.ceval
命令来调用C函数mathOpsIntegrated.m
。通过使用包含头文件coder.cinclude
。
函数(补充说,乘)= mathOpsIntegrated (in1, in2)% # codegen%为代码生成,preinitialize输出变量%数据类型、大小和复杂性添加= 0;% C代码生成一个包含coder.cinclude (“adder.h”);%评估C函数添加= coder.ceval (“毒蛇”三机一体,in2);乘= in1 * in2;结束
使用生成代码codegen
命令。指定源文件adder.c
作为输入。为了测试C代码,执行墨西哥人功能,检查输出结果。
codegenmathOpsIntegratedarg游戏{1,2}adder.c(test1, test2) = mathOpsIntegrated_mex (10、20)
代码生成成功。test1 = 30 test2 = 200
从一个C函数返回多个值
C语言限制函数返回多个输出。相反,他们只返回一个标量值。MATLAB函数coder.ref
,coder.rref
和coder.wref
让你返回多个输出从外部C / c++函数。
例如,假设您编写一个MATLAB函数喷火
这需要两个输入x
和y
并返回三个输出一个
,b
,c
。在MATLAB中,你调用这个函数如下:
[a, b, c] = foo (x, y)
如果你改写喷火
作为一个C函数,你不能返回三个独立的值一个
,b
,c
通过一个返回
声明。相反,创建一个C函数有多个指针类型参数,通过输出参数的参考。例如:
空白foo(双x,双y,双重*,双* b,双c *)
然后你可以从一个MATLAB函数调用C函数使用coder.ceval
函数。
coder.ceval (“foo”,x, y, coder.ref (a), coder.ref (b), coder.ref (c));
如果你的外部C函数只写入或读取内存以引用的方式传递,您可以使用coder.wref
或coder.rref
功能,而不是coder.ref
。在某些情况下,这些功能可以使生成的代码的进一步优化。当你使用coder.wref (arg)
通过参数
通过参考,外部C / c++函数必须完全初始化内存引用参数
。
通过引用传递数据
这个例子展示了如何通过引用传递数据和从外部C函数。
通过引用是一个重要的C / c++代码的技术集成。当你以引用的方式传递数据,程序不需要复制数据从一个到另一个函数。按值传递,C代码可以只返回单个标量变量。通过引用传递,C代码可以返回多个变量,包括数组。
考虑到MATLAB函数adderRef
。这个函数使用外部C代码添加两个数组。的coder.rref
和coder.wref
命令指示代码生成器通过指向数组的指针,而不是复制它们。
函数= adderRef (in1, in2)% # codegen= 0(大小(in));%的输入元素个数(in)转换为整数类型%匹配cAdd函数签名coder.ceval (“cAdd”coder.rref (in) coder.rref (in2) coder.wref(出),int32(元素个数(in)));结束
C代码,cAdd.c
使用线性索引访问数组的元素:
# include < stdio。h > # include < stdlib。cAdd h > # include”。h”空白cAdd (const双* in1, const双* in2,双*,int元素个数){int我;(我= 0;我<元素个数;我+ +){[我]= in1[我]+ in2[我];}}
构建C代码必须提供一个头文件,cAdd.h
的函数签名:
空白cAdd (const双* in1, const双* in2,双*,int元素个数);
测试的C代码生成一个墨西哥人函数和比较其输出与MATLAB的加法操作的输出。
一个=兰德(2,2)+ 1;B =兰德(2,2)+ 10;codegenadderRefarg游戏{A、B}cAdd.ccAdd.h报告如果(adderRef_mex (A, B) - (A + B) = = 0)流([' \ n '“adderRef成功了。”]);结束
代码生成成功:查看报告,打开(“codegen /墨西哥人/ adderRef / html / report.mldatx”) adderRef是成功的。
集成外部代码,使用自定义数据类型
这个例子显示了如何调用一个C函数,使用本机数据类型没有定义在MATLAB®。
例如,如果您的C代码执行文件输入或输出一个C文件*的类型,在MATLAB没有相应的类型。与这个数据类型在MATLAB代码中,你必须通过函数来初始化它coder.opaque
。的结构类型,您可以使用coder.cstructname
。
例如,考虑MATLAB函数addCTypes.m
。这个函数使用coder.ceval
外部代码中定义的输入类型。这个函数coder.opaque
初始化输入MATLAB。
函数[出]= addCTypes (a, b)% # codegen%为头文件生成包括语句coder.cinclude (“MyStruct.h”);coder.cinclude (“createStruct.h”);coder.cinclude (“useStruct.h”);%初始化变量在使用前在= coder.opaque (“MyStruct”);= 0;%调用C函数在= coder.ceval (“createStruct”,a, b);= coder.ceval (“useStruct”,);结束
的createStruct
函数输出C结构类型:
# include < stdio。h > # include < stdlib。h > # include " MyStruct。h createStruct # include。h”struct MyStruct createStruct(双,双b) {struct MyStruct;出去了。p1 =一个;出去了。p2 = b;返回; }
的useStruct
函数执行一个操作C类型:
# include“MyStruct。h useStruct # include。h“双重useStruct (struct MyStruct){返回。p1 + in.p2;}
来生成代码,指定源文件作为输入(c):
codegenaddCTypesarg游戏{1,2}报告createStruct.cuseStruct.c
代码生成成功:查看报告,打开(“codegen /墨西哥人/ addCTypes / html / report.mldatx”)
集成外部代码,使用指针、结构和数组
这个例子展示了如何将外部代码运行在C风格数组与MATLAB®代码。外部代码计算总和数组数据。您可以自定义代码来改变输入数据或计算。
这个例子展示了如何结合多个不同元素的外部代码集成功能。例如,您:
通过使用接口与外部结构类型
coder.cstructname
通过使用接口与外部指针类型
coder.opaque
执行外部代码使用
coder.ceval
通过引用传递数据到外部代码通过使用
coder.ref
探索整合代码
extSum函数使用外部C代码计算求和操作在一个32位的整数数组。数组大小是由用户输入。
函数x = extSum (u)% # codegen%设置界限输入类型使用静态内存分配u = int32 (u);断言(0 < u & & < 101);%初始化数组temparray = int32 (1): u;%声明外部结构和使用它s = makeStruct (u);x = callExtCode(年代,temparray);
为了简化生成的代码,设置数组的大小范围。边界阻止了在生成的代码中使用动态内存分配。
这个函数makeStruct
声明一个MATLAB结构类型并初始化一个指针类型使用的字段coder.opaque
。C结构对应于这个定义包含在一个头文件,你提供使用HeaderFile
参数coder.cstructname
函数。C结构类型提供了一个简单的表示一个整数数组。
函数s = makeStruct (u)%创建基于外部头结构类型定义年代。元素个数= u;年代。瓦尔斯= coder.opaque (“int32_T *”,“零”);coder.cstructname(年代,“myArrayType”,“外来的”,“HeaderFile”,“arrayCode.h”);
与外部结构类型完全初始化,你将它作为输入传递给外部代码callExtCode
函数。该函数初始化数组,调用一个操作数组返回一个输出,然后释放内存初始化。
函数x = callExtCode(年代,temparray)%声明输出类型x = int32 (0);%声明外部源文件coder.updateBuildInfo (“addSourceFiles”,“arrayCode.c”);%调用c代码coder.ceval (“arrayInit”coder.ref (s), coder.ref (temparray));x = coder.ceval (“arraySum”coder.ref (s));coder.ceval (“arrayDest”coder.ref (s));
这个函数使用coder.updateBuildInfo
提供c文件代码生成器。
生成一个墨西哥人的功能
生成一个墨西哥人的功能,你可以在MATLAB运行和测试,输入:
codegenextSumarg游戏{10}
代码生成成功。
墨西哥人的功能测试。输入:
extSum_mex (10)
ans = int32 55
外部C代码,包含在文件中arrayCode.c
和arrayCode.h
使用自定义类型定义int32_T
。代码生成的墨西哥人生产和使用这个自定义类型定义。如果你想生成独立的(自由、dll或exe)使用这个自定义的数据类型的代码,然后你可以修改DataTypeReplacement
您的配置对象的属性。看到MATLAB的类型映射到生成的代码类型。
另请参阅
codegen
|coder.wref
|coder.ceval
|coder.rref
|coder.ref
|coder.cinclude
|coder.cstructname
|coder.opaque
|coder.reservedName