coder.cevalgydF4y2Ba

调用外部C / C ++函数gydF4y2Ba

描述gydF4y2Ba

例子gydF4y2Ba

coder.ceval (gydF4y2Bacfun_namegydF4y2Ba)gydF4y2Ba执行指定的外部C/ c++函数gydF4y2Bacfun_namegydF4y2Ba。确定gydF4y2Bacfun_namegydF4y2Ba在外部的C / C ++源文件或库。提供外部电源,库和到代码发生器的头文件。gydF4y2Ba

例子gydF4y2Ba

coder.ceval (gydF4y2Bacfun_namegydF4y2Ba,gydF4y2Bacfun_argumentsgydF4y2Ba)gydF4y2Ba执行gydF4y2Bacfun_namegydF4y2Ba使用参数gydF4y2Bacfun_argumentsgydF4y2Ba。gydF4y2Bacfun_argumentsgydF4y2Ba以逗号分隔的输入参数列表的顺序是gydF4y2Bacfun_namegydF4y2Ba需要。gydF4y2Ba

默认,gydF4y2Bacoder.cevalgydF4y2Ba当C/ c++支持按值传递参数时,按值传递参数给C/ c++函数。万博1manbetx为了使gydF4y2Bacoder.cevalgydF4y2Ba通过引用传递参数,使用该构建体gydF4y2Bacoder.refgydF4y2Ba,gydF4y2Bacoder.rrefgydF4y2Ba和gydF4y2Bacoder.wrefgydF4y2Ba。如果C/ c++不支持按值传递参数,万博1manbetx例如,如果参数是数组,gydF4y2Bacoder.cevalgydF4y2Ba按引用传递参数。如果你不使用gydF4y2Bacoder.refgydF4y2Ba,gydF4y2Bacoder.rrefgydF4y2Ba要么gydF4y2Bacoder.wrefgydF4y2Ba时,参数的副本可以出现在所生成的代码来执行MATLABgydF4y2Ba®gydF4y2Ba语义阵列。gydF4y2Ba

例子gydF4y2Ba

coder.ceval (gydF4y2Ba“全球”gydF4y2Ba,gydF4y2Bacfun_namegydF4y2Ba)gydF4y2Ba执行gydF4y2Bacfun_namegydF4y2Ba并指出gydF4y2Bacfun_namegydF4y2Ba使用一个或多个MATLAB全局变量。然后,代码生成器可以生成与此全局变量使用一致的代码。gydF4y2Ba

coder.ceval (gydF4y2Ba“全球”gydF4y2Ba,gydF4y2Bacfun_namegydF4y2Ba,gydF4y2Bacfun_argumentsgydF4y2Ba)gydF4y2Ba执行gydF4y2Bacfun_namegydF4y2Ba使用参数gydF4y2Bacfun_argumentsgydF4y2Ba并指出gydF4y2Bacfun_namegydF4y2Ba使用一个或多个MATLAB全局变量。gydF4y2Ba

coder.ceval (gydF4y2Ba'-gpudevicefcn'gydF4y2Ba,devicefun_name,devicefun_arguments)gydF4y2Ba允许你打电话给CUDAgydF4y2Ba®gydF4y2BaGPUgydF4y2Ba__设备__gydF4y2Ba来自内核的函数。gydF4y2Ba'-gpudevicefcn'gydF4y2Ba指示gydF4y2Bacoder.cevalgydF4y2Ba该目标函数是GPU的设备上。gydF4y2Badevicefun_namegydF4y2Ba是的名称gydF4y2Ba__设备__gydF4y2Ba功能gydF4y2Badevicefun_argumentsgydF4y2Ba以逗号分隔的输入参数列表的顺序是gydF4y2Badevicefun_namegydF4y2Ba需要。这个选项需要GPU编码器™产品。gydF4y2Ba

例子gydF4y2Ba

coder.ceval (gydF4y2Ba'-layout:rowMajor'gydF4y2Ba,gydF4y2Bacfun_namegydF4y2Ba,gydF4y2Bacfun_argumentsgydF4y2Ba)gydF4y2Ba执行gydF4y2Bacfun_namegydF4y2Ba使用参数gydF4y2Bacfun_argumentsgydF4y2Ba并通过存储在行主要布局数据。从使用列优先布局的函数调用,代码生成器转换输入行主布局和转换输出返回到列优先布局。对于更短的语法,使用gydF4y2Bacoder.ceval(‘行’,…)gydF4y2Ba。gydF4y2Ba

coder.ceval (gydF4y2Ba'-layout:columnMajor'gydF4y2Ba,gydF4y2Bacfun_namegydF4y2Ba,gydF4y2Bacfun_argumentsgydF4y2Ba)gydF4y2Ba执行gydF4y2Bacfun_namegydF4y2Ba使用参数gydF4y2Bacfun_argumentsgydF4y2Ba并将存储在列主布局数据。当从一个使用行主布局,代码生成器转换输入列优先布局和输出转换回行主布局的函数调用。对于更短的语法,使用gydF4y2Bacoder.ceval( ' - 山坳',...)gydF4y2Ba。gydF4y2Ba

coder.ceval (gydF4y2Ba'-layout:任何'gydF4y2Ba,gydF4y2Bacfun_namegydF4y2Ba,gydF4y2Bacfun_argumentsgydF4y2Ba)gydF4y2Ba执行gydF4y2Bacfun_namegydF4y2Ba使用参数gydF4y2Bacfun_argumentsgydF4y2Ba并用其当前的阵列布局通过数据,即使当阵列布局不匹配。代码生成器不转换输入或输出数据的阵列布局。gydF4y2Ba

例子gydF4y2Ba

cfun_return = coder.ceval(gydF4y2Ba___gydF4y2Ba)gydF4y2Ba执行gydF4y2Bacfun_namegydF4y2Ba并返回单个标量值,gydF4y2Bacfun_returngydF4y2Ba中,对应于值的C / C ++中的函数返回gydF4y2Ba返回gydF4y2Ba声明。要一致与C / C ++,gydF4y2Bacoder.cevalgydF4y2Ba只能返回标量值。它不能返回数组。对前面语法中的任何输入参数组合使用此选项。gydF4y2Ba

例子gydF4y2Ba

全部折叠gydF4y2Ba

调用C函数。gydF4y2BaFOO(U)gydF4y2Ba从MATLAB函数,即你打算生成C代码。gydF4y2Ba

创建一个C头文件gydF4y2Bafoo。gydF4y2Ba一个函数gydF4y2Ba喷火gydF4y2Ba它接受两个类型的输入参数gydF4y2Ba双gydF4y2Ba并返回类型的值gydF4y2Ba双gydF4y2Ba。gydF4y2Ba

双进一,双进二;gydF4y2Ba

编写C函数gydF4y2Bafoo.cgydF4y2Ba。gydF4y2Ba

的#include 中的#include 中的#include “foo.h中” 双FOO(双IN1,IN2双){返回IN1 + IN2;}gydF4y2Ba

写一个函数gydF4y2BacallfoogydF4y2Ba该呼叫gydF4y2Ba喷火gydF4y2Ba通过使用gydF4y2Bacoder.cevalgydF4y2Ba。在函数中为代码生成器提供源文件和头文件。gydF4y2Ba

功能gydF4y2BaY = callfoogydF4y2Ba%#代码生成gydF4y2Bay = 0.0;gydF4y2Ba如果gydF4y2Bacoder.target(gydF4y2Ba'MATLAB'gydF4y2Ba)gydF4y2Ba%在MATLAB中执行,调用MATLAB等效的gydF4y2Ba% C函数foogydF4y2BaY = 10 + 20;gydF4y2Ba其他的gydF4y2Ba%在执行所生成的代码,调用C函数foogydF4y2Bacoder.updateBuildInfo(gydF4y2Ba'addSourceFiles'gydF4y2Ba,gydF4y2Ba'foo.c的'gydF4y2Ba);coder.cinclude(gydF4y2Ba'了foo.h'gydF4y2Ba);y = coder.ceval (gydF4y2Ba“富”gydF4y2Ba10、20);gydF4y2Ba结束gydF4y2Ba结束gydF4y2Ba

为函数生成C库代码gydF4y2BacallfoogydF4y2Ba。的gydF4y2Ba代码生成gydF4y2Ba功能在生成C代码gydF4y2Ba\ codegen \ lib \ callfoogydF4y2Ba子文件夹。gydF4y2Ba

代码生成gydF4y2Ba-config:LIBgydF4y2BacallfoogydF4y2Ba-报告gydF4y2Ba

呼叫从MATLAB代码C库函数。gydF4y2Ba

写功能的MATLABgydF4y2BamyabsvalgydF4y2Ba。gydF4y2Ba

功能gydF4y2BaY = myabsval(u)的gydF4y2Ba%#代码生成gydF4y2Bay = abs (u);gydF4y2Ba

生成一个C静态库gydF4y2BamyabsvalgydF4y2Ba, 使用gydF4y2Baarg游戏gydF4y2Ba选项来指定尺寸,类型和输入参数的复杂性。gydF4y2Ba

代码生成gydF4y2Ba-config:LIBgydF4y2BamyabsvalgydF4y2Baarg游戏gydF4y2Ba{0.0}gydF4y2Ba
的gydF4y2Ba代码生成gydF4y2Ba函数创建库文件gydF4y2Bamyabsval.libgydF4y2Ba和头文件gydF4y2Bamyabsval.hgydF4y2Ba在文件夹gydF4y2Ba\代码生成\ LIB \ myabsvalgydF4y2Ba。(库文件扩展名可以根据您的平台更改。)它生成的功能gydF4y2Bamyabsval_initializegydF4y2Ba和gydF4y2Bamyabsval_terminategydF4y2Ba在同一个文件夹中。gydF4y2Ba

写MATLAB函数使用调用生成的C库函数gydF4y2Bacoder.cevalgydF4y2Ba。gydF4y2Ba

功能gydF4y2Bay = callmyabsval (y)gydF4y2Ba%#代码生成gydF4y2Ba检查目标。不要使用编码器。如果callmyabsval是gydF4y2Ba%的MATLAB执行gydF4y2Ba如果gydF4y2Bacoder.target(gydF4y2Ba'MATLAB'gydF4y2Ba)gydF4y2Ba%的MATLAB执行,通话功能myabsvalgydF4y2Bay = myabsval (y);gydF4y2Ba其他的gydF4y2Ba%添加所需的包括语句生成功能码gydF4y2Bacoder.updateBuildInfo(gydF4y2Ba'addIncludePaths'gydF4y2Ba,gydF4y2Ba'$(START_DIR)\代码生成\ LIB \ myabsval'gydF4y2Ba);coder.cinclude(gydF4y2Ba'myabsval_initialize.h'gydF4y2Ba);coder.cinclude(gydF4y2Ba'myabsval.h'gydF4y2Ba);coder.cinclude(gydF4y2Ba“myabsval_terminate.h”gydF4y2Ba);gydF4y2Ba%执行在生成的代码。gydF4y2Ba%调用之前调用初始化函数gydF4y2Ba首次%C功能gydF4y2Bacoder.ceval (gydF4y2Ba“myabsval_initialize”gydF4y2Ba);gydF4y2Ba%调用生成的C库函数myabsvalgydF4y2Bay = coder.ceval (gydF4y2Ba'myabsval'gydF4y2Ba,Y);gydF4y2Ba%调用函数终止后gydF4y2Ba%调用最后一次的C函数gydF4y2Bacoder.ceval (gydF4y2Ba'myabsval_terminate'gydF4y2Ba);gydF4y2Ba结束gydF4y2Ba

生成MEX函数gydF4y2Bacallmyabsval_mexgydF4y2Ba。提供在命令行所生成的库文件。gydF4y2Ba

代码生成gydF4y2Ba配置:墨西哥人gydF4y2BacallmyabsvalgydF4y2Ba代码生成\ LIB \ myabsval \ myabsval.libgydF4y2Baarg游戏gydF4y2Ba{} -2.75gydF4y2Ba

您可以使用,而不是在命令行提供库gydF4y2Bacoder.updateBuildInfogydF4y2Ba指定函数中的库。使用此选项预配置版本。该行添加到gydF4y2Ba其他的gydF4y2Ba布洛克:gydF4y2Ba

coder.updateBuildInfo(gydF4y2Ba“addLinkObjects”gydF4y2Ba,gydF4y2Ba'myabsval.lib'gydF4y2Ba,gydF4y2Ba'$(START_DIR)\代码生成\ LIB \ myabsval'gydF4y2Ba,100年,真的,真的);gydF4y2Ba

运行MEX函数gydF4y2Bacallmyabsval_mexgydF4y2Ba其中调用库函数gydF4y2BamyabsvalgydF4y2Ba。gydF4y2Ba

callmyabsval_mex(-2.75)gydF4y2Ba
ans = 2.7500gydF4y2Ba

调用MATLAB函数gydF4y2BacallmyabsvalgydF4y2Ba。gydF4y2Ba

callmyabsval(-2.75)gydF4y2Ba
ans = 2.7500gydF4y2Ba
的gydF4y2BacallmyabsvalgydF4y2Ba功能表现出对在MATLAB和在代码生成执行所需的行为。gydF4y2Ba

使用gydF4y2Ba“全球”gydF4y2Ba当调用修改全局变量的C函数时,使用标记。gydF4y2Ba

写功能的MATLABgydF4y2BauseGlobalgydF4y2Ba调用一个C函数gydF4y2BaaddGlobalgydF4y2Ba。使用gydF4y2Ba“全球”gydF4y2Ba标志以指示C函数使用一个全局变量的代码生成器。gydF4y2Ba

功能gydF4y2Bay = useGlobal ()gydF4y2Ba全球gydF4y2BaG;T =克;gydF4y2Ba%比较带/不带“-global”标志的执行gydF4y2Bacoder.ceval (gydF4y2Ba“全球”gydF4y2Ba,gydF4y2Ba'addGlobal'gydF4y2Ba);Y =吨;gydF4y2Ba结束gydF4y2Ba

创建一个C头文件gydF4y2BaaddGlobal.hgydF4y2Ba函数的gydF4y2BaaddGlobalgydF4y2Ba。gydF4y2Ba

空白addGlobal(无效);gydF4y2Ba

编写C函数gydF4y2BaaddGlobalgydF4y2Ba在文件中gydF4y2BaaddGlobal.cgydF4y2Ba。这个功能包括头文件gydF4y2BauseGlobal_data.hgydF4y2Ba该代码生成器创建,当你为函数生成代码gydF4y2BauseGlobalgydF4y2Ba。这个头文件包含了全局变量声明gydF4y2BaggydF4y2Ba。gydF4y2Ba

的#include “addGlobal.h” 的#include “useGlobal_data.h” 空隙addGlobal(无效){克++;}gydF4y2Ba

生成的MEX函数gydF4y2BauseGlobalgydF4y2Ba。定义输入到代码生成器,声明在工作区中的全局变量。gydF4y2Ba

全球gydF4y2BaG;G = 1;代码生成gydF4y2BauseGlobalgydF4y2Ba-报告gydF4y2BaaddGlobal.hgydF4y2BaaddGlobal.cgydF4y2BaY = useGlobal_mex();gydF4y2Ba

随着gydF4y2Ba“全球”gydF4y2Ba旗,MEX函数产生的结果gydF4y2BaY = 1gydF4y2Ba。的gydF4y2Ba“全球”gydF4y2Ba标志指示到代码发生器的C函数可能修改全局变量。对于gydF4y2BauseGlobalgydF4y2Ba中,代码生成器产生的代码:gydF4y2Ba

user global (const emlrtStack *sp) {real_T y;(空白)sp;y = g;addGlobal ();返回y;}gydF4y2Ba

没有gydF4y2Ba“全球”gydF4y2Ba旗,MEX函数产生gydF4y2BaY = 2gydF4y2Ba。因为没有迹象表明C函数修改gydF4y2BaggydF4y2Ba中,代码生成假定gydF4y2BaygydF4y2Ba和gydF4y2BaggydF4y2Ba是相同的。产生这种C代码:gydF4y2Ba

real_T useGlobal(常量emlrtStack * SP){(无效)的藻;addGlobal ();返回克;}gydF4y2Ba

假设你有一个C函数gydF4y2BatestRMgydF4y2Ba被设计为使用行主要的布局。你想这个功能集成到MATLAB功能gydF4y2Ba酒吧gydF4y2Ba其操作上的阵列。功能gydF4y2Ba酒吧gydF4y2Ba都是采用列主布局设计,采用的gydF4y2Bacoder.columnMajorgydF4y2Ba指令。gydF4y2Ba

功能gydF4y2BaOUT =栏()gydF4y2Ba%#代码生成gydF4y2Bacoder.columnMajor;coder.ceval (gydF4y2Ba'-layout:rowMajor'gydF4y2Ba,gydF4y2Ba'testRM'gydF4y2Ba,gydF4y2Ba...gydF4y2Bacoder.rref(在),coder.wref(出));gydF4y2Ba结束gydF4y2Ba

在生成的代码,代码生成器插入从列为主布局行主布局的布局转换对可变gydF4y2Ba在gydF4y2Ba它传递给前gydF4y2BatestRMgydF4y2Ba。在输出变量gydF4y2Ba出gydF4y2Ba中,代码生成插入一个布局转换回列优先。gydF4y2Ba

一般情况下,如果不指定gydF4y2Ba布局gydF4y2Ba选项gydF4y2Bacoder.cevalgydF4y2Ba时,假设外部函数参数使用列-major。gydF4y2Ba

输入参数gydF4y2Ba

全部折叠gydF4y2Ba

外部C / C ++函数调用的名称。gydF4y2Ba

例:gydF4y2Bacoder.ceval (“foo”)gydF4y2Ba

数据类型:gydF4y2Ba烧焦gydF4y2Ba|gydF4y2Ba串gydF4y2Ba

逗号分隔的顺序来的输入参数列表gydF4y2Bacfun_namegydF4y2Ba需要。gydF4y2Ba

例:gydF4y2Bacoder.ceval( '富',10,20);gydF4y2Ba

例:gydF4y2Bacoder.ceval ('myFunction', coder.ref(x));

数据类型:gydF4y2Ba单gydF4y2Ba|gydF4y2Ba双gydF4y2Ba|gydF4y2BaINT8gydF4y2Ba|gydF4y2BaINT16gydF4y2Ba|gydF4y2BaINT32gydF4y2Ba|gydF4y2BaInt64的gydF4y2Ba|gydF4y2BaUINT8gydF4y2Ba|gydF4y2BaUINT16gydF4y2Ba|gydF4y2BaUINT32gydF4y2Ba|gydF4y2BaUINT64gydF4y2Ba|gydF4y2Ba逻辑gydF4y2Ba|gydF4y2Ba烧焦gydF4y2Ba|gydF4y2Ba结构体gydF4y2Ba
复数的支持:万博1manbetxgydF4y2Ba是gydF4y2Ba

限制gydF4y2Ba

  • 您不能使用gydF4y2Bacoder.cevalgydF4y2Ba在外部声明的函数上gydF4y2Bacoder.extrinsicgydF4y2Ba。gydF4y2Ba

  • 当LCC编译器创建库时,它会在库函数名中添加前导下划线。如果库的编译器是LCC,而您的代码生成编译器不是LCC,则必须在函数名前加下划线,例如,gydF4y2Bacoder.ceval( '_ mylibfun')gydF4y2Ba。如果编译器库不LCC,您不能使用LCC从MATLAB代码生成的代码从库调用函数。这些库函数的名称没有前导下划线的LCC编译器要求。gydF4y2Ba

  • 如果属性具有get方法、set方法或验证器,或者是具有某些属性的System object™属性,那么您不能通过引用将该属性传递给外部函数。看到gydF4y2Ba某些属性不支持引用传递万博1manbetxgydF4y2Ba。gydF4y2Ba

提示gydF4y2Ba

  • 对于代码生成,之前调用gydF4y2Bacoder.cevalgydF4y2Ba,你必须指定类型,大小和复杂数据返回值和输出参数的类型。gydF4y2Ba

  • 应用gydF4y2Bacoder.cevalgydF4y2Ba给接受或返回变量中不MATLAB代码存在,如指针的函数,gydF4y2Ba文件gydF4y2Ba类型的文件I / O,和C / C ++宏,使用gydF4y2Bacoder.opaquegydF4y2Ba函数。gydF4y2Ba

  • 用gydF4y2Bacoder.cevalgydF4y2Ba只有在MATLAB代码生成。gydF4y2Bacoder.cevalgydF4y2Ba在未编译的MATLAB代码中生成错误。要确定一个MATLAB函数是否在MATLAB中执行,请使用gydF4y2Bacoder.targetgydF4y2Ba。如果函数在MATLAB中执行,则调用C/ c++函数的MATLAB版本。gydF4y2Ba

介绍了R2011agydF4y2Ba