coder.cevalGÿdF4y2Ba

调用外部C / C ++函数GÿdF4y2Ba

描述GÿdF4y2Ba

例GÿdF4y2Ba

coder.ceval(GÿdF4y2Bacfun_nameGÿdF4y2Ba)GÿdF4y2Ba执行由指定的外部的C / C ++函数GÿdF4y2Bacfun_nameGÿdF4y2Ba。限定GÿdF4y2Bacfun_nameGÿdF4y2Ba在外部的C / C ++源文件或库。提供外部电源,库和到代码发生器的头文件。GÿdF4y2Ba

例GÿdF4y2Ba

coder.ceval(GÿdF4y2Bacfun_nameGÿdF4y2Ba,GÿdF4y2Bacfun_argumentsGÿdF4y2Ba)GÿdF4y2Ba执行GÿdF4y2Bacfun_nameGÿdF4y2Ba带参数GÿdF4y2Bacfun_argumentsGÿdF4y2Ba。GÿdF4y2Bacfun_argumentsGÿdF4y2Ba是输入参数的顺序来以逗号分隔的列表GÿdF4y2Bacfun_nameGÿdF4y2Ba需要。GÿdF4y2Ba

默认,GÿdF4y2Bacoder.cevalGÿdF4y2Ba由值与C / C ++函数每当C / C ++支持值传递参数传递参数。金宝app为了使GÿdF4y2Bacoder.cevalGÿdF4y2Ba通过引用传递参数,使用该构建体GÿdF4y2Bacoder.refGÿdF4y2Ba,GÿdF4y2Bacoder.rrefGÿdF4y2Ba和GÿdF4y2Bacoder.wrefGÿdF4y2Ba。如果C / C ++不支持由值传递参金宝app数,例如,如果该参数是一个数组,GÿdF4y2Bacoder.cevalGÿdF4y2Ba按引用传递参数。如果你不使用GÿdF4y2Bacoder.refGÿdF4y2Ba,GÿdF4y2Bacoder.rrefGÿdF4y2Ba要么GÿdF4y2Bacoder.wrefGÿdF4y2Ba时,参数的副本可以出现在所生成的代码来执行MATLABGÿdF4y2Ba®GÿdF4y2Ba语义阵列。GÿdF4y2Ba

例GÿdF4y2Ba

coder.ceval(GÿdF4y2Ba'-全球'GÿdF4y2Ba,GÿdF4y2Bacfun_nameGÿdF4y2Ba)GÿdF4y2Ba执行GÿdF4y2Bacfun_nameGÿdF4y2Ba并指出GÿdF4y2Bacfun_nameGÿdF4y2Ba使用一个或多个MATLAB全局变量。然后,该代码发生器可以产生代码,并与这个全局变量的使用是一致的。GÿdF4y2Ba

coder.ceval(GÿdF4y2Ba'-全球'GÿdF4y2Ba,GÿdF4y2Bacfun_nameGÿdF4y2Ba,GÿdF4y2Bacfun_argumentsGÿdF4y2Ba)GÿdF4y2Ba执行GÿdF4y2Bacfun_nameGÿdF4y2Ba带参数GÿdF4y2Bacfun_argumentsGÿdF4y2Ba并指出GÿdF4y2Bacfun_nameGÿdF4y2Ba使用一个或多个MATLAB全局变量。GÿdF4y2Ba

coder.ceval(GÿdF4y2Ba'-gpudevicefcn'GÿdF4y2Ba,devicefun_name,devicefun_arguments)GÿdF4y2Ba允许你调用CUDAGÿdF4y2Ba®GÿdF4y2BaGPUGÿdF4y2Ba__设备__GÿdF4y2Ba从内核内的功能。GÿdF4y2Ba'-gpudevicefcn'GÿdF4y2Ba指示GÿdF4y2Bacoder.cevalGÿdF4y2Ba该目标函数是GPU的设备上。GÿdF4y2Badevicefun_nameGÿdF4y2Ba是的名称GÿdF4y2Ba__设备__GÿdF4y2Ba功能GÿdF4y2Badevicefun_argumentsGÿdF4y2Ba是输入参数的顺序来以逗号分隔的列表GÿdF4y2Badevicefun_nameGÿdF4y2Ba需要。这个选项需要GPU编码器™产品。GÿdF4y2Ba

例GÿdF4y2Ba

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

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

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

例GÿdF4y2Ba

cfun_return = coder.ceval(GÿdF4y2Ba___GÿdF4y2Ba)GÿdF4y2Ba执行GÿdF4y2Bacfun_nameGÿdF4y2Ba并返回单个标量值,GÿdF4y2Bacfun_returnGÿdF4y2Ba中,对应于值的C / C ++中的函数返回GÿdF4y2Ba返回GÿdF4y2Ba声明。要一致与C / C ++,GÿdF4y2Bacoder.cevalGÿdF4y2Ba只能返回标量值。它不能返回数组。使用任何在前面的语法输入参数组合的这个选项。GÿdF4y2Ba

例子GÿdF4y2Ba

全部收缩GÿdF4y2Ba

调用C函数。GÿdF4y2BaFOO(U)GÿdF4y2Ba从MATLAB函数,即你打算生成C代码。GÿdF4y2Ba

创建一个C头文件GÿdF4y2Bafoo.h中GÿdF4y2Ba一个函数GÿdF4y2BaFOOGÿdF4y2Ba即采用类型的两个输入参数GÿdF4y2Ba双GÿdF4y2Ba并返回类型的值GÿdF4y2Ba双GÿdF4y2Ba。GÿdF4y2Ba

双FOO(双IN1,IN2双);GÿdF4y2Ba

编写C函数GÿdF4y2Bafoo.c的GÿdF4y2Ba。GÿdF4y2Ba

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

写一个函数GÿdF4y2BacallfooGÿdF4y2Ba该呼叫GÿdF4y2BaFOOGÿdF4y2Ba通过使用GÿdF4y2Bacoder.cevalGÿdF4y2Ba。提供源和头文件中的函数的代码生成器。GÿdF4y2Ba

功能GÿdF4y2BaY = callfooGÿdF4y2Ba%#代码生成GÿdF4y2BaY = 0.0;GÿdF4y2Ba如果GÿdF4y2Bacoder.target(GÿdF4y2Ba'MATLAB'GÿdF4y2Ba)GÿdF4y2Ba%执行在MATLAB,呼叫相当于MATLABGÿdF4y2Ba%C函数fooGÿdF4y2BaY = 10 + 20;GÿdF4y2Ba其他GÿdF4y2Ba%在执行所生成的代码,调用C函数fooGÿdF4y2Bacoder.updateBuildInfo(GÿdF4y2Ba'addSourceFiles'GÿdF4y2Ba,GÿdF4y2Ba'foo.c的'GÿdF4y2Ba);coder.cinclude(GÿdF4y2Ba'了foo.h'GÿdF4y2Ba);Y = coder.ceval(GÿdF4y2Ba“富”GÿdF4y2Ba,10,20);GÿdF4y2Ba结束GÿdF4y2Ba结束GÿdF4y2Ba

生成函数C库代码GÿdF4y2BacallfooGÿdF4y2Ba。该GÿdF4y2Ba代码生成GÿdF4y2Ba功能在生成C代码GÿdF4y2Ba\代码生成\ LIB \ callfooGÿdF4y2Ba子文件夹。GÿdF4y2Ba

代码生成GÿdF4y2Ba-config:LIBGÿdF4y2BacallfooGÿdF4y2Ba-报告GÿdF4y2Ba

呼叫从MATLAB代码C库函数。GÿdF4y2Ba

写功能的MATLABGÿdF4y2BamyabsvalGÿdF4y2Ba。GÿdF4y2Ba

功能GÿdF4y2BaY = myabsval(u)的GÿdF4y2Ba%#代码生成GÿdF4y2BaY = ABS(U);GÿdF4y2Ba

生成一个C静态库GÿdF4y2BamyabsvalGÿdF4y2Ba, 使用GÿdF4y2Ba-argsGÿdF4y2Ba选项来指定尺寸,类型和输入参数的复杂性。GÿdF4y2Ba

代码生成GÿdF4y2Ba-config:LIBGÿdF4y2BamyabsvalGÿdF4y2Ba-argsGÿdF4y2Ba{0.0}GÿdF4y2Ba
该GÿdF4y2Ba代码生成GÿdF4y2Ba函数创建库文件GÿdF4y2Bamyabsval.libGÿdF4y2Ba和头文件GÿdF4y2Bamyabsval.hGÿdF4y2Ba在文件夹中GÿdF4y2Ba\代码生成\ LIB \ myabsvalGÿdF4y2Ba。(库文件扩展名可以根据您的平台更改。)它生成的功能GÿdF4y2Bamyabsval_initializeGÿdF4y2Ba和GÿdF4y2Bamyabsval_terminateGÿdF4y2Ba在同一个文件夹中。GÿdF4y2Ba

写MATLAB函数使用调用生成的C库函数GÿdF4y2Bacoder.cevalGÿdF4y2Ba。GÿdF4y2Ba

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

生成的MEX函数GÿdF4y2Bacallmyabsval_mexGÿdF4y2Ba。提供在命令行所生成的库文件。GÿdF4y2Ba

代码生成GÿdF4y2Ba-config:MEXGÿdF4y2BacallmyabsvalGÿdF4y2Ba代码生成\ LIB \ myabsval \ myabsval.libGÿdF4y2Ba-argsGÿdF4y2Ba{} -2.75GÿdF4y2Ba

而不是在命令行提供的库,你可以使用GÿdF4y2Bacoder.updateBuildInfoGÿdF4y2Ba指定函数中的库。使用此选项预配置版本。该行添加到GÿdF4y2Ba其他GÿdF4y2Ba块:GÿdF4y2Ba

coder.updateBuildInfo(GÿdF4y2Ba'addLinkObjects'GÿdF4y2Ba,GÿdF4y2Ba'myabsval.lib'GÿdF4y2Ba,GÿdF4y2Ba'$(START_DIR)\代码生成\ LIB \ myabsval'GÿdF4y2Ba,100,真实,TRUE);GÿdF4y2Ba

运行MEX功能GÿdF4y2Bacallmyabsval_mexGÿdF4y2Ba其中调用库函数GÿdF4y2BamyabsvalGÿdF4y2Ba。GÿdF4y2Ba

callmyabsval_mex(-2.75)GÿdF4y2Ba
ANS = 2.7500GÿdF4y2Ba

调用功能的MATLABGÿdF4y2BacallmyabsvalGÿdF4y2Ba。GÿdF4y2Ba

callmyabsval(-2.75)GÿdF4y2Ba
ANS = 2.7500GÿdF4y2Ba
该GÿdF4y2BacallmyabsvalGÿdF4y2Ba功能表现出对在MATLAB和在代码生成执行所需的行为。GÿdF4y2Ba

使用GÿdF4y2Ba'-全球'GÿdF4y2Ba标志,当你调用一个C函数修改一个全局变量。GÿdF4y2Ba

写功能的MATLABGÿdF4y2BauseGlobalGÿdF4y2Ba调用一个C函数GÿdF4y2BaaddGlobalGÿdF4y2Ba。使用GÿdF4y2Ba'-全球'GÿdF4y2Ba标志以指示C函数使用一个全局变量的代码生成器。GÿdF4y2Ba

功能GÿdF4y2BaY = useGlobal()GÿdF4y2Ba全球GÿdF4y2BaG;T =克;GÿdF4y2Ba%与/比较执行而不“-global”标志GÿdF4y2Bacoder.ceval(GÿdF4y2Ba'-全球'GÿdF4y2Ba,GÿdF4y2Ba'addGlobal'GÿdF4y2Ba);Y =吨;GÿdF4y2Ba结束GÿdF4y2Ba

创建一个C头文件GÿdF4y2BaaddGlobal.hGÿdF4y2Ba该函数GÿdF4y2BaaddGlobalGÿdF4y2Ba。GÿdF4y2Ba

空隙addGlobal(无效);GÿdF4y2Ba

编写C函数GÿdF4y2BaaddGlobalGÿdF4y2Ba在文件中GÿdF4y2BaaddGlobal.cGÿdF4y2Ba。这个功能包括头文件GÿdF4y2BauseGlobal_data.hGÿdF4y2Ba该代码生成器创建,当你为函数生成代码GÿdF4y2BauseGlobalGÿdF4y2Ba。这个头文件包含了全局变量声明GÿdF4y2BaGGÿdF4y2Ba。GÿdF4y2Ba

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

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

全球GÿdF4y2BaG;G = 1;代码生成GÿdF4y2BauseGlobalGÿdF4y2Ba-报告GÿdF4y2BaaddGlobal.hGÿdF4y2BaaddGlobal.cGÿdF4y2BaY = useGlobal_mex();GÿdF4y2Ba

随着GÿdF4y2Ba'-全球'GÿdF4y2Ba旗,MEX函数产生的结果GÿdF4y2BaY = 1GÿdF4y2Ba。该GÿdF4y2Ba'-全球'GÿdF4y2Ba标志指示到代码发生器的C函数可能修改全局变量。对于GÿdF4y2BauseGlobalGÿdF4y2Ba中,代码生成器产生的代码:GÿdF4y2Ba

real_T useGlobal(常量emlrtStack * SP){real_Tÿ;(空隙)的藻;Y =克;addGlobal();返回是;}GÿdF4y2Ba

没有GÿdF4y2Ba'-全球'GÿdF4y2Ba旗,MEX函数产生GÿdF4y2BaY = 2GÿdF4y2Ba。因为没有迹象表明C函数修改GÿdF4y2BaGGÿdF4y2Ba中,代码生成假定GÿdF4y2BaÿGÿdF4y2Ba和GÿdF4y2BaGGÿdF4y2Ba是相同的。产生这种C代码:GÿdF4y2Ba

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

假设你有一个C函数GÿdF4y2BatestRMGÿdF4y2Ba被设计为使用行主要的布局。你想这个功能集成到MATLAB功能GÿdF4y2Ba酒吧GÿdF4y2Ba其操作上的阵列。功能GÿdF4y2Ba酒吧GÿdF4y2Ba设计为使用列重大布局,采用GÿdF4y2Bacoder.columnMajorGÿdF4y2Ba指示。GÿdF4y2Ba

功能GÿdF4y2BaOUT =栏()GÿdF4y2Ba%#代码生成GÿdF4y2Bacoder.columnMajor;coder.ceval(GÿdF4y2Ba'-layout:rowMajor'GÿdF4y2Ba,GÿdF4y2Ba'testRM'GÿdF4y2Ba,GÿdF4y2Ba...GÿdF4y2Bacoder.rref(在),coder.wref(出));GÿdF4y2Ba结束GÿdF4y2Ba

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

在一般情况下,如果不指定GÿdF4y2Ba布局GÿdF4y2Ba选项GÿdF4y2Bacoder.cevalGÿdF4y2Ba,外部函数的参数假定使用列重大。GÿdF4y2Ba

输入参数GÿdF4y2Ba

全部收缩GÿdF4y2Ba

外部C / C ++函数调用的名称。GÿdF4y2Ba

例:GÿdF4y2Bacoder.ceval( '富')GÿdF4y2Ba

数据类型:GÿdF4y2Ba烧焦GÿdF4y2Ba|GÿdF4y2Ba串GÿdF4y2Ba

逗号分隔的顺序来的输入参数列表GÿdF4y2Bacfun_nameGÿdF4y2Ba需要。GÿdF4y2Ba

例:GÿdF4y2Bacoder.ceval( '富',10,20);GÿdF4y2Ba

例:GÿdF4y2Bacoder.ceval( 'myFunction的',coder.ref(X));GÿdF4y2Ba

数据类型:GÿdF4y2Ba单GÿdF4y2Ba|GÿdF4y2Ba双GÿdF4y2Ba|GÿdF4y2BaINT8GÿdF4y2Ba|GÿdF4y2BaINT16GÿdF4y2Ba|GÿdF4y2BaINT32GÿdF4y2Ba|GÿdF4y2BaInt64的GÿdF4y2Ba|GÿdF4y2BaUINT8GÿdF4y2Ba|GÿdF4y2BaUINT16GÿdF4y2Ba|GÿdF4y2BaUINT32GÿdF4y2Ba|GÿdF4y2BaUINT64GÿdF4y2Ba|GÿdF4y2Ba合乎逻辑GÿdF4y2Ba|GÿdF4y2Ba烧焦GÿdF4y2Ba|GÿdF4y2Ba结构GÿdF4y2Ba
复数支持:金宝appGÿdF4y2Ba是GÿdF4y2Ba

限制GÿdF4y2Ba

  • 您不能使用GÿdF4y2Bacoder.cevalGÿdF4y2Ba在函数声明外在与GÿdF4y2Bacoder.extrinsicGÿdF4y2Ba。GÿdF4y2Ba

  • 当LCC编译器创建一个库,它增加了一个前导下划线的库函数的名称。如果编译器的库是LCC和你的代码生成编译程序不LCC,你必须领先下划线添加到函数名称,例如,GÿdF4y2Bacoder.ceval( '_ mylibfun')GÿdF4y2Ba。如果编译器库不LCC,您不能使用LCC从MATLAB代码生成的代码从库调用函数。这些库函数的名称没有前导下划线的LCC编译器要求。GÿdF4y2Ba

  • 如果属性有get方法,set方法,或验证,或者是一个系统对象™财产具有一定的属性,那么你可以不参考属性传递给外部函数。看到GÿdF4y2Ba通过引用传递不支持一些性质金宝appGÿdF4y2Ba。GÿdF4y2Ba

提示GÿdF4y2Ba

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

  • 申请GÿdF4y2Bacoder.cevalGÿdF4y2Ba给接受或返回变量中不MATLAB代码存在,如指针的函数,GÿdF4y2Ba文件GÿdF4y2Ba类型的文件I / O,和C / C ++宏,使用GÿdF4y2Bacoder.opaqueGÿdF4y2Ba功能。GÿdF4y2Ba

  • 采用GÿdF4y2Bacoder.cevalGÿdF4y2Ba只有在MATLAB代码生成。GÿdF4y2Bacoder.cevalGÿdF4y2Ba生成未编译的MATLAB代码错误。如果要判断一个功能的MATLAB在MATLAB中执行,使用GÿdF4y2Bacoder.targetGÿdF4y2Ba。如果该函数在MATLAB执行,调用C / C ++函数的MATLAB版本。GÿdF4y2Ba

介绍了在R2011aGÿdF4y2Ba