主要内容

升级Fortran MEX文件以使用64位API

中的步骤升级MEX文件到使用64位API适用于Fortran和C/ c++源文件。Fortran使用类似的API签名mwSize/mwIndex类型,以及类似的编译器和调试器。

但是,要使您的Fortran源代码兼容64位,请执行这些额外的任务。

使用Fortran API头文件

要使Fortran MEX文件与64位API兼容,请使用fintrf.h在你的Fortran源文件中的头文件。用大写字母命名源文件.F文件扩展名。有关这些需求的更多信息,请参见Fortran MEX文件的组件

声明Fortran指针

指针是基于机器类型的32位或64位地址。这个需求没有直接与数组维绑定,但是在将32位代码移动到64位机器时,作为转换的一部分,您可能会遇到问题。

有关更多信息,请参见预处理器宏mwPointer

C/ c++编译器自动处理指针大小。在Fortran, MATLAB®使用mwPointer类型以处理这种差异。例如,mxCreateDoubleMatrix返回A.mwPointer

mwPointer mxCreateDoubleMatrix(m, n, ComplexFlag) mwSize m, n integer*4 ComplexFlag . mwPointer mxCreateDoubleMatrix(m, n, ComplexFlag

需要Fortran类型声明

Fortran使用隐式类型定义。以字母开头的未声明变量通过N隐式声明类型整数.以其他字母开头的变量名称是隐式声明的类型真正的* 4.使用隐式整数类型可以用于32位索引,但对于大型数组维MEX文件不安全。要强制声明所有变量,请添加隐含无语句到你的Fortran子例程中。例如:

子例程mexFunction(nlhs, plhs, nrhs, prhs)隐式none

此语句有助于识别不具有显式类型声明的代码中的32位整数。然后,您可以将它们声明为整数* 4.或者mwSize/mwIndex,如适当。有关隐含无,请参阅Fortran编译器文档。

在函数调用中使用变量

如果使用数字作为函数的实参,那么Fortran编译器可能会将实参赋给一个错误的类型。在64位平台上,不正确的类型可能产生内存不足错误,分割违规,或不正确的结果。的参数类型的定义mxCreateDoubleMatrix函数是:

mwPointer mxCreateDoubleMatrix(m, n, ComplexFlag) mwSize m, n integer*4 ComplexFlag . mwPointer mxCreateDoubleMatrix(m, n, ComplexFlag

假设你有一个C/ c++ MEX文件,里面有以下语句:

myArray = mxcreatedoublematix(2,3,mxreal);

大多数C / C ++编译器解释数字2作为64位值。一些Fortran编译器无法检测到这个需求,并提供一个32位的值。例如,等价的Fortran语句是:

myArray = mxCreateDoubleMatrix(2,3,0)

编译器解释了价值复杂氟争论0正确的类型整数* 4..然而,编译器可以解释参数2作为32位值,即使是争论被声明类型mwSize

一个独立于编译器的解决方案是声明并使用mwSize/mwIndex变量而不是文字值。例如,下面的语句明确地调用mxCreateDoubleMatrix用Fortran函数:

mwSize nrows, ncols INTEGER*4 flag nrows = 2 ncols = 3 flag = 0 myArray = mxCreateDoubleMatrix(nrows, ncols, flag)

管理减少的Fortran编译器警告

一些Fortran编译器不能像类似的C/ c++编译器那样检测到那么多类型不匹配。这种无能会使步骤复杂化解决- largearraydimms构建失败和警告让调试器在这一步中找到更多的问题执行64位MEX文件,并与32位版本的结果进行比较

另请参阅

||

相关的例子

更多关于

外部网站