如何修复 mex 文件中的非法字符错误
Posted
技术标签:
【中文标题】如何修复 mex 文件中的非法字符错误【英文标题】:How to fix illegal character error in mex files 【发布时间】:2019-06-25 08:48:42 【问题描述】:当我尝试在 matlab 上编译 fortran 代码时收到一些错误消息。
>> mex points.f
Warning: MATLAB FORTRAN MEX Files are now defaulting to -largeArrayDims and 8 byte integers.
If you are building a FORTRAN S-Function, please recompile using the -compatibleArrayDims flag.
You can find more about adapting code to use 64-bit array dimensions at:
https://www.mathworks.com/help/matlab/matlab_external/upgrading-mex-files-to-use-64-bit-api.html.
Building with 'Intel Parallel Studio XE 2019 for Fortran with Microsoft Visual Studio 2017'.
Error using mex
C:\Users\Kinan\Desktop\Strathshare\Personal Folders\PhD\MATLABPERIDYNAMICS\points.f(44): error #5149: Illegal character in statement
label field [r]
re*8 dx, ral
----^
C:\Users\Kinan\Desktop\Strathshare\Personal Folders\PhD\MATLABPERIDYNAMICS\points.f(45): error #5149: Illegal character in statement
label field [r]
re*8 coordx, coordy, coordz
----^
>C:\Users\Kinan\Desktop\Strathshare\Personal Folders\PhD\MATLABPERIDYNAMICS\points.f(46): error #5149: Illegal character in statement
label field [r]
real*8 coord(totnode,3)
----^
实际代码是
#include "fintrf.h"
C======================================================================
C points.f
C Computational function that creates a cube of equdistant points
C This is a MEX file for MATLAB.
C======================================================================
C Gateway routine
subroutine mexFunction(nlhs, plhs, nrhs, prhs)
C Declarations
implicit none
C mexFunction arguments:
mwPointer plhs(*), prhs(*)
integer nlhs, nrhs
C Function declarations:
mwPointer mxGetDoubles
mwPointer mxCreateDoubleMatrix
integer mxIsNumeric
mwPointer mxGetM, mxGetN
C Pointers to input/output mxArrays:
mwPointer x_ptr, y_ptr
C Array information:
mwPointer mrows, ncols
mwSize size
C Arguments for computational routine:
real*8 dx, r
real*8 coordx, coordy, coordz
real*8 coord(totnode,3)
real*8 ndivx, ndivy, ndivz
integer i, j, k
C Get the size of the input array.
mrows = mxGetM(prhs(1))
ncols = mxGetN(prhs(1))
size = mrows*ncols
MX_HAS_INTERLEAVED_COMPLEX
x_ptr = mxGetDoubles(prhs(1))
C Create matrix for the return argument.
plhs(1) = mxCreateDoubleMatrix(29791,3,0)
y_ptr = mxGetDoubles(plhs(1))
call points(coord,r,dx,ndivx,ndivy,ndivz)
C Load the data into y_ptr, which is the output to MATLAB.
call mxCopyReal8ToPtr(y_output,y_ptr,size)
return
end
C-----------------------------------------------------------------------
C Computational routine
subroutine points(coord,r,dx,ndivx,ndivy,ndivz)
C Arguments for computational routine:
real*8 dx, r, coordx, coordy, coordz
real*8 coord(totnode,3), ndivx, ndivy, ndivz
integer i, j, k
do i = 1,ndivx
do j = 1,ndivy
do k = 1,ndivz
coordx = -1.0d0 / 2.0d0 * r + (dx / 2.0d0) + (i - 1) * dx
coordy = -1.0d0 / 2.0d0 * r + (dx / 2.0d0) + (j - 1) * dx
coordz = -1.0d0 / 2.0d0 * r + (dx / 2.0d0) + (k - 1) * dx
nnum = nnum + 1
coord(nnum,1) = coordx
coord(nnum,2) = coordy
coord(nnum,3) = coordz
enddo
enddo
enddo
return
end
我有几个 for 循环我需要这样做,所以如果我能得到一个工作模板,那会很有帮助。
对不起,我尝试添加更多错误消息,但它说我有太多代码
【问题讨论】:
是的,我知道这很奇怪。是的,这是我遵守的代码。我想知道它是否与一开始的这个版本警告有关,但我真的不明白这是否有影响。MX_HAS_INTERLEAVED_COMPLEX
是什么?是***复制错误吗?
MX_HAS_INTERLEAVED_COMPLEX 是一个错误,它的前面应该有一个注释。今晚我会上传更多错误信息和更正代码
为什么有些行不在第 8 列开始?是***复制错误还是实际的源文件?
我同意 PTRK ...您有固定格式的源代码,但您在第 1-6 列中有代码,这些代码是为标签和延续保留的,因此会出现错误。您需要修复源代码并缩进所有代码,使其超出第 6 列。(也许这有制表符而不是空格?)
【参考方案1】:
我设法 MEX 代码,但错误太多...
要抑制有关largeArrayDims
的警告,您可以执行:warning('Off', 'MATLAB:mex:FortranLargeArrayDimsWarn_link');
注意:您的 Fortran 代码应用 MX_HAS_INTERLEAVED_COMPLEX
,因此您需要将 -2018a
标志添加到 mex
命令。
使用-2018a
标志时,我找不到避免警告的方法。
MEX 命令行使用-2018a
标志:mex -R2018a points.F
为了通过编译,我不得不对您的代码进行太多修改:
我在行首添加了空格。
我删除了MX_HAS_INTERLEAVED_COMPLEX
。
我不知道如何处理 totnode
,所以我将其替换为值 100
。
我不知道如何处理y_output
,所以我将其替换为coord
。
这是您通过编译的修改代码:
#include "fintrf.h"
C======================================================================
C points.f
C Computational function that creates a cube of equdistant points
C This is a MEX file for MATLAB.
C======================================================================
C Gateway routine
subroutine mexFunction(nlhs, plhs, nrhs, prhs)
C Declarations
implicit none
C mexFunction arguments:
mwPointer plhs(*), prhs(*)
integer nlhs, nrhs
C Function declarations:
mwPointer mxGetDoubles
mwPointer mxCreateDoubleMatrix
integer mxIsNumeric
mwPointer mxGetM, mxGetN
C Pointers to input/output mxArrays:
mwPointer x_ptr, y_ptr
C Array information:
mwPointer mrows, ncols
mwSize size
C Arguments for computational routine:
real*8 dx, r
real*8 coordx, coordy, coordz
C What is totnode???
C real*8 coord(totnode,3)
real*8 coord(100,3)
real*8 ndivx, ndivy, ndivz
integer i, j, k
C Get the size of the input array.
mrows = mxGetM(prhs(1))
ncols = mxGetN(prhs(1))
size = mrows*ncols
C MX_HAS_INTERLEAVED_COMPLEX
x_ptr = mxGetDoubles(prhs(1))
C Create matrix for the return argument.
plhs(1) = mxCreateDoubleMatrix(29791,3,0)
y_ptr = mxGetDoubles(plhs(1))
call points(coord,r,dx,ndivx,ndivy,ndivz)
C Load the data into y_ptr, which is the output to MATLAB.
C call mxCopyReal8ToPtr(y_output,y_ptr,size) What is y_output???
call mxCopyReal8ToPtr(coord,y_ptr,size)
return
end
C-----------------------------------------------------------------------
C Computational routine
subroutine points(coord,r,dx,ndivx,ndivy,ndivz)
C Arguments for computational routine:
real*8 dx, r, coordx, coordy, coordz
C What is totnode???
C real*8 coord(totnode,3), ndivx, ndivy, ndivz
real*8 coord(100,3), ndivx, ndivy, ndivz
integer i, j, k
do i = 1,ndivx
do j = 1,ndivy
do k = 1,ndivz
coordx = -1.0d0 / 2.0d0 * r + (dx / 2.0d0) + (i - 1) * dx
coordy = -1.0d0 / 2.0d0 * r + (dx / 2.0d0) + (j - 1) * dx
coordz = -1.0d0 / 2.0d0 * r + (dx / 2.0d0) + (k - 1) * dx
nnum = nnum + 1
coord(nnum,1) = coordx
coord(nnum,2) = coordy
coord(nnum,3) = coordz
enddo
enddo
enddo
return
end
我希望它可以帮助你继续你的发展。
【讨论】:
谢谢你,这是一个巨大的帮助。 totnode 是一个输入,它是我尝试通过执行 real*8 dx, r real*8 coordx, coordy, coordz, totnode 来添加它的节点总数,但我得到```错误#6219:这个变量,在规范表达式中使用,必须是虚拟参数、COMMON 块对象或可通过主机或使用关联访问的对象。 [TOTNODE] real*8 coordx, coordy, coordz, totnode ------------------------- ^ C:\Users\Kinan\Desktop\Strathshare\Personal Folders\PhD\MATLABPERIDYNAMICS\points.f 的编译中止(代码 1)``` 不能实现完整的代码,然后开始检查。从一小部分开始实现你的代码,测试它,扩展它,然后再次测试。建议你在 Visual Studio 中开始测试,在测试代码时制作 MEX 界面。 为了测试您的代码,您可以使用 Matlab 创建输入,将输入数据保存到文件中,并在 Fortran 中读取输入(从文件中)... 将 Fortran 输出存储到文件中,读取在 Matlab 中输出(来自文件),并在 Matlab 中检查输出的正确性。为了检查输出,您可能需要在 Matlab 中实现内核函数。听起来工作量很大,但这种方式要快得多…… @kbez 您收到此错误是因为您声明了一个假定大小的数组,而下限不是常量或虚拟参数(它甚至没有声明 根本 )。 @PTRK 抱歉,但我不知道这意味着什么。以上是关于如何修复 mex 文件中的非法字符错误的主要内容,如果未能解决你的问题,请参考以下文章
Error:(1, 1) java: 非法字符: ‘ufeff’