如何修复 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’

下载 CSV 文件时路径错误中的非法字符

如何修复 hadoop 中的“非法分区”错误?

java编程中出现的错误“非法字符:\56288”是啥意思?

如何修复php非法偏移错误[重复]

如何修复非法 Parquet 类型:INT64 (TIMESTAMP_MICROS) 错误