主要内容

调用自定义的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.rrefcoder.wref让你返回多个输出从外部C / c++函数。

例如,假设您编写一个MATLAB函数喷火这需要两个输入xy并返回三个输出一个,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.wrefcoder.rref功能,而不是coder.ref。在某些情况下,这些功能可以使生成的代码的进一步优化。当你使用coder.wref (arg)通过参数通过参考,外部C / c++函数必须完全初始化内存引用参数

通过引用传递数据

这个例子展示了如何通过引用传递数据和从外部C函数。

通过引用是一个重要的C / c++代码的技术集成。当你以引用的方式传递数据,程序不需要复制数据从一个到另一个函数。按值传递,C代码可以只返回单个标量变量。通过引用传递,C代码可以返回多个变量,包括数组。

考虑到MATLAB函数adderRef。这个函数使用外部C代码添加两个数组。的coder.rrefcoder.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.carrayCode.h使用自定义类型定义int32_T。代码生成的墨西哥人生产和使用这个自定义类型定义。如果你想生成独立的(自由、dll或exe)使用这个自定义的数据类型的代码,然后你可以修改DataTypeReplacement您的配置对象的属性。看到MATLAB的类型映射到生成的代码类型

另请参阅

||||||||

相关的话题