塞瓦尔编码员gydF4y2Ba

呼叫外部C / C ++函数gydF4y2Ba

描述gydF4y2Ba

例子gydF4y2Ba

coder.ceval (gydF4y2Bacfun_名称gydF4y2Ba)gydF4y2Ba执行指定的外部C/ c++函数gydF4y2Bacfun_名称gydF4y2Ba.定义gydF4y2Bacfun_名称gydF4y2Ba在外部C / C ++源文件或库中。将外部源,库和标头文件提供给代码生成器。gydF4y2Ba

例子gydF4y2Ba

coder.ceval (gydF4y2Bacfun_名称gydF4y2Ba,gydF4y2Bacfun_论点gydF4y2Ba)gydF4y2Ba执行gydF4y2Bacfun_名称gydF4y2Ba使用参数gydF4y2Bacfun_论点gydF4y2Ba.gydF4y2Bacfun_论点gydF4y2Ba逗号分隔的输入参数列表是否按照这个顺序gydF4y2Bacfun_名称gydF4y2Ba需要。gydF4y2Ba

默认情况下,gydF4y2Ba塞瓦尔编码员gydF4y2Ba当C/ c++支持按值传递参数时,将参数按值传递给C/ c++函数。金宝app为了使gydF4y2Ba塞瓦尔编码员gydF4y2Ba通过引用传递参数,使用构造gydF4y2Ba编码参考gydF4y2Ba,gydF4y2Bacoder.rrefgydF4y2Ba,及gydF4y2Ba编码器gydF4y2Ba.如果C/ c++不支持按值传递参数,金宝app例如,如果参数是一个数组,gydF4y2Ba塞瓦尔编码员gydF4y2Ba通过引用传递参数。如果不使用gydF4y2Ba编码参考gydF4y2Ba,gydF4y2Bacoder.rrefgydF4y2Ba或gydF4y2Ba编码器gydF4y2Ba,参数的副本可以出现在生成的代码中,以强制执行MATLABgydF4y2Ba®gydF4y2Ba数组的语义。gydF4y2Ba

例子gydF4y2Ba

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

coder.ceval (gydF4y2Ba“全球”gydF4y2Ba,gydF4y2Bacfun_名称gydF4y2Ba,gydF4y2Bacfun_论点gydF4y2Ba)gydF4y2Ba执行gydF4y2Bacfun_名称gydF4y2Ba使用参数gydF4y2Bacfun_论点gydF4y2Ba并表示gydF4y2Bacfun_名称gydF4y2Ba使用一个或多个MATLAB全局变量。gydF4y2Ba

例子gydF4y2Ba

coder.ceval (gydF4y2Ba'-layout:rowmajor'gydF4y2Ba,gydF4y2Bacfun_名称gydF4y2Ba,gydF4y2Bacfun_论点gydF4y2Ba)gydF4y2Ba执行gydF4y2Bacfun_名称gydF4y2Ba使用参数gydF4y2Bacfun_论点gydF4y2Ba和传递存储在行主布局中的数据。从使用列主布局的函数调用时,代码生成器将输入转换为行主布局,并将输出转换回列主布局。对于较短的语法,请使用gydF4y2Bacoder.ceval(‘行’,…)gydF4y2Ba.gydF4y2Ba

coder.ceval (gydF4y2Ba“-布局:columnMajor”gydF4y2Ba,gydF4y2Bacfun_名称gydF4y2Ba,gydF4y2Bacfun_论点gydF4y2Ba)gydF4y2Ba执行gydF4y2Bacfun_名称gydF4y2Ba使用参数gydF4y2Bacfun_论点gydF4y2Ba并传递存储在列主布局中的数据。从使用行主布局的函数调用时,代码生成器将输入转换为列主布局,并将输出转换回行主布局。对于较短的语法,请使用gydF4y2Bacoder.ceval('-col',…)gydF4y2Ba.gydF4y2Ba

coder.ceval (gydF4y2Ba'-layout:任何'gydF4y2Ba,gydF4y2Bacfun_名称gydF4y2Ba,gydF4y2Bacfun_论点gydF4y2Ba)gydF4y2Ba执行gydF4y2Bacfun_名称gydF4y2Ba使用参数gydF4y2Bacfun_论点gydF4y2Ba和使用其当前数组布局传递数据,即使数组布局不匹配。代码生成器不会转换输入或输出数据的数组布局。gydF4y2Ba

例子gydF4y2Ba

cfun_return = coder.ceval(gydF4y2Ba___gydF4y2Ba)gydF4y2Ba执行gydF4y2Bacfun_名称gydF4y2Ba并返回单个标量值,gydF4y2Bacfun_返回gydF4y2Ba,对应于C/C++函数在gydF4y2Ba返回gydF4y2Ba语句。为了与C/C++保持一致,gydF4y2Ba塞瓦尔编码员gydF4y2Ba只能返回标量值。它不能返回数组。将此选项与前面语法中的任何输入参数组合一起使用。gydF4y2Ba

例子gydF4y2Ba

全部折叠gydF4y2Ba

调用C函数gydF4y2Ba傅(u)gydF4y2Ba从您打算生成C代码的MATLAB功能。gydF4y2Ba

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

Double foo(Double in1, Double in2);gydF4y2Ba

编写C函数gydF4y2Bafoo.cgydF4y2Ba.gydF4y2Ba

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

写一个函数gydF4y2BacallfoogydF4y2Ba那个呼叫gydF4y2Ba喷火gydF4y2Ba通过使用gydF4y2Ba塞瓦尔编码员gydF4y2Ba.将源文件和头文件提供给函数中的代码生成器。gydF4y2Ba

功能gydF4y2Bay = callfoo.gydF4y2Ba%#编码基因gydF4y2Bay = 0.0;gydF4y2Ba如果gydF4y2Ba编码目标(gydF4y2Ba'matlab'gydF4y2Ba)gydF4y2Ba%在MATLAB中执行,调用MATLAB等价gydF4y2Ba% C函数gydF4y2Bay=10+20;gydF4y2Ba其他的gydF4y2Ba%在生成的代码中执行,调用C函数foogydF4y2Bacoder.updateBuildInfo(gydF4y2Ba“addSourceFiles”gydF4y2Ba,gydF4y2Ba‘foo.c’gydF4y2Ba); 编码员(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

编写一个MATLAB函数gydF4y2BamyabsvalgydF4y2Ba.gydF4y2Ba

功能gydF4y2Bay=我的绝对值(u)gydF4y2Ba%#编码基因gydF4y2Bay = abs (u);gydF4y2Ba

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

编码基因gydF4y2Ba-config:libgydF4y2BamyabsvalgydF4y2Baarg游戏gydF4y2Ba{0.0}gydF4y2Ba
的gydF4y2Ba编码基因gydF4y2Ba函数创建库文件gydF4y2Bamyabsval.libgydF4y2Ba和标题文件gydF4y2Bamyabsval.h.gydF4y2Ba在文件夹gydF4y2Ba\codegen\lib\myabsvalgydF4y2Ba(库文件扩展名可以根据您的平台进行更改。)它生成函数gydF4y2Bamyabsval_初始化gydF4y2Ba和gydF4y2Bamyabsval_终止gydF4y2Ba在同一个文件夹中。gydF4y2Ba

编写MATLAB函数以调用生成的C库功能gydF4y2Ba塞瓦尔编码员gydF4y2Ba.gydF4y2Ba

功能gydF4y2Bay = callmyabsval (y)gydF4y2Ba%#编码基因gydF4y2Ba%检查目标。不要使用编码器。如果callmyabsval是gydF4y2Ba%在MATLAB中执行gydF4y2Ba如果gydF4y2Ba编码目标(gydF4y2Ba'matlab'gydF4y2Ba)gydF4y2Ba%在matlab中执行,调用函数myabsvalgydF4y2Bay = myabsval (y);gydF4y2Ba其他的gydF4y2Ba%将所需的include语句添加到生成的函数代码中gydF4y2Bacoder.updateBuildInfo(gydF4y2Ba“附加路径”gydF4y2Ba,gydF4y2Ba'$(start_dir)\ codegen \ lib \ myabsval'gydF4y2Ba); 编码员(gydF4y2Ba“myabsval_initialize.h”gydF4y2Ba); 编码员(gydF4y2Ba“myabsval.h”gydF4y2Ba); 编码员(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%之后调用terminate函数gydF4y2Ba%在最后一次调用C函数gydF4y2Bacoder.ceval (gydF4y2Ba“myabsval_终止”gydF4y2Ba);gydF4y2Ba结束gydF4y2Ba

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

编码基因gydF4y2Ba配置:墨西哥人gydF4y2BaCallmyAbvalgydF4y2Bacodegen\lib\myabsval\myabsval.libgydF4y2Baarg游戏gydF4y2Ba{-2.75}gydF4y2Ba

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

coder.updateBuildInfo(gydF4y2Ba“addLinkObjects”gydF4y2Ba,gydF4y2Ba“MyAbval.lib”gydF4y2Ba,gydF4y2Ba'$(start_dir)\ codegen \ lib \ myabsval'gydF4y2Ba, 100年,真的,真的);gydF4y2Ba

运行MEX函数gydF4y2Bacallmyabsval_mexgydF4y2Ba它调用库函数gydF4y2BamyabsvalgydF4y2Ba.gydF4y2Ba

callmyabsval_mex(-2.75)gydF4y2Ba
ans = 2.7500gydF4y2Ba

调用MATLAB函数gydF4y2BaCallmyAbvalgydF4y2Ba.gydF4y2Ba

CallMyAbval(-2.75)gydF4y2Ba
ans = 2.7500gydF4y2Ba
的gydF4y2BaCallmyAbvalgydF4y2Ba功能展示了在MATLAB和代码生成中执行所需的行为。gydF4y2Ba

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

编写一个MATLAB函数gydF4y2Baumerglobal.gydF4y2Ba调用C函数gydF4y2BaaddGlobalgydF4y2Ba.使用gydF4y2Ba“全球”gydF4y2Ba向代码生成器指示C函数使用全局变量的标志。gydF4y2Ba

功能gydF4y2Bay = useGlobal ()gydF4y2Ba全球的gydF4y2Bag、 t=g;gydF4y2Ba%比较带有/不带'-global'标志的执行情况gydF4y2Bacoder.ceval (gydF4y2Ba“全球”gydF4y2Ba,gydF4y2Ba'addglobal'gydF4y2Ba)y=t;gydF4y2Ba结束gydF4y2Ba

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

空白addGlobal(无效);gydF4y2Ba

编写C函数gydF4y2BaaddGlobalgydF4y2Ba在文件中gydF4y2BaaddGlobal.cgydF4y2Ba。此函数包括头文件gydF4y2BauseGlobal_data.hgydF4y2Ba代码生成器在为函数生成代码时创建的gydF4y2Baumerglobal.gydF4y2Ba。此头文件包含的全局变量声明gydF4y2BaggydF4y2Ba.gydF4y2Ba

#include“addGlobal.h”#include“useGlobal_data.h”void addGlobal(void){g++}gydF4y2Ba

生成MEX功能gydF4y2Baumerglobal.gydF4y2Ba.要将输入定义为代码生成器,请在工作区中声明全局变量。gydF4y2Ba

全球的gydF4y2BaG;g = 1;编码基因gydF4y2Baumerglobal.gydF4y2Ba-报告gydF4y2BaaddGlobal.hgydF4y2BaaddGlobal.cgydF4y2Bay=使用全局_mex();gydF4y2Ba

和gydF4y2Ba“全球”gydF4y2Ba标志,MEX功能会产生结果gydF4y2Bay=1gydF4y2Ba.的gydF4y2Ba“全球”gydF4y2Ba标志向代码生成器指示C函数可能修改全局变量gydF4y2Baumerglobal.gydF4y2Ba,代码生成器会产生此代码:gydF4y2Ba

real_T useGlobal(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使用global(const emlrtstack * sp){(void)sp;addGlobal ();返回g;}gydF4y2Ba

假设你有一个c函数gydF4y2Ba试验室gydF4y2Ba这旨在使用行主要布局。您希望将此功能集成到Matlab函数中gydF4y2Ba酒吧gydF4y2Ba它在数组上运行gydF4y2Ba酒吧gydF4y2Ba设计采用栏主布局,采用gydF4y2Bacoder.columnMajorgydF4y2Ba指令。gydF4y2Ba

功能gydF4y2Ba输出=巴(英寸)gydF4y2Ba%#编码基因gydF4y2Bacoder.column少校;coder.ceval(gydF4y2Ba'-layout:rowmajor'gydF4y2Ba,gydF4y2Ba'testrm'gydF4y2Ba,gydF4y2Ba...gydF4y2Ba编码器.rref(in),编码器.wref(out));gydF4y2Ba结束gydF4y2Ba

在生成的代码中,代码生成器在变量上插入从列主布局到行主布局的布局转换gydF4y2Ba在gydF4y2Ba在交给gydF4y2Ba试验室gydF4y2Ba.在输出变量上gydF4y2Ba出去gydF4y2Ba,代码生成器将布局转换返回到列柱中。gydF4y2Ba

通常,如果不指定gydF4y2Ba布局gydF4y2Ba选择gydF4y2Ba塞瓦尔编码员gydF4y2Ba,则假定外部函数参数使用column-major。gydF4y2Ba

输入参数gydF4y2Ba

全部折叠gydF4y2Ba

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

例子:gydF4y2Bacoder.ceval(“foo”)gydF4y2Ba

数据类型:gydF4y2BachargydF4y2Ba|gydF4y2Ba一串gydF4y2Ba

以逗号分隔的输入参数列表,顺序如下gydF4y2Bacfun_名称gydF4y2Ba需要。gydF4y2Ba

例子:gydF4y2Ba编码员:塞瓦尔('foo',10,20);gydF4y2Ba

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

数据类型:gydF4y2Ba单一的gydF4y2Ba|gydF4y2Ba双倍的gydF4y2Ba|gydF4y2Baint8gydF4y2Ba|gydF4y2Baint16gydF4y2Ba|gydF4y2BaINT32.gydF4y2Ba|gydF4y2BaINT64.gydF4y2Ba|gydF4y2Bauint8gydF4y2Ba|gydF4y2Bauint16gydF4y2Ba|gydF4y2Bauint32gydF4y2Ba|gydF4y2Bauint64gydF4y2Ba|gydF4y2Ba逻辑gydF4y2Ba|gydF4y2BachargydF4y2Ba|gydF4y2Ba结构体gydF4y2Ba
复数的支持:金宝appgydF4y2Ba对gydF4y2Ba

局限性gydF4y2Ba

  • 你不能使用gydF4y2Ba塞瓦尔编码员gydF4y2Ba在你声明外部的函数上gydF4y2Bacoder.extrinsicgydF4y2Ba.gydF4y2Ba

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

  • 如果属性具有get方法、set方法或验证器,或者是具有某些属性的System对象™属性,则不能通过引用将属性传递给外部函数。看到gydF4y2Ba某些属性不支持通过引用传递金宝appgydF4y2Ba.gydF4y2Ba

提示gydF4y2Ba

  • 对于代码生成,请在主叫之前gydF4y2Ba塞瓦尔编码员gydF4y2Ba,必须指定返回值和输出参数的类型,大小和复杂性数据类型。gydF4y2Ba

  • 应用gydF4y2Ba塞瓦尔编码员gydF4y2Ba对于接受或返回MATLAB代码中不存在的变量(如指针)的函数,gydF4y2Ba文件gydF4y2Ba文件I / O的类型,以及C / C ++宏,使用gydF4y2Ba不透明编码器gydF4y2Ba函数。gydF4y2Ba

  • 使用gydF4y2Ba塞瓦尔编码员gydF4y2Ba仅在MATLAB中进行代码生成。gydF4y2Ba塞瓦尔编码员gydF4y2Ba在未编译的MATLAB代码中产生错误。要确定一个MATLAB函数是否在MATLAB中执行,请使用gydF4y2Bacoder.targetgydF4y2Ba.如果函数在MATLAB中执行,调用C/ c++函数的MATLAB版本。gydF4y2Ba

介绍了R2011agydF4y2Ba