中的步骤升级MEX文件到使用64位API适用于Fortran和C/ c++源文件。Fortran使用类似的API签名mwSize
/mwIndex
类型,以及类似的编译器和调试器。
但是,要使您的Fortran源代码兼容64位,请执行这些额外的任务。
要使Fortran MEX文件与64位API兼容,请使用fintrf.h
在你的Fortran源文件中的头文件。用大写字母命名源文件.F
文件扩展名。有关这些需求的更多信息,请参见Fortran MEX文件的组件.
指针是基于机器类型的32位或64位地址。这个需求没有直接与数组维绑定,但是在将32位代码移动到64位机器时,作为转换的一部分,您可能会遇到问题。
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使用隐式类型定义。以字母开头的未声明变量我
通过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编译器不能像类似的C/ c++编译器那样检测到那么多类型不匹配。这种无能会使步骤复杂化解决- largearraydimms构建失败和警告让调试器在这一步中找到更多的问题执行64位MEX文件,并与32位版本的结果进行比较.