【问题标题】:Error: Rank mismatch in argument (rank-1 and scalar)错误:参数中的等级不匹配(等级 1 和标量)
【发布时间】:2016-01-05 13:53:07
【问题描述】:

我遇到了这些错误。

colsys.f:1367.51:

     1          NOLD, ALDIF, K, NCOMP, M, MSTAR, 3,DUMM,0)              
                                                   1
Warning: Rank mismatch in argument 'dmval' at (1) (rank-1 and scalar)
colsys.f:814.33:

     1          EALPHA, A, IPIV, INTEGS, RNORM, 0, FSUB,                
                                 1
Warning: Actual argument contains too few elements for dummy argument 'integs' (1/3) at (1)

这里我给出了程序链接。下面提供的链接中有更多错误。我修复的一些错误。但是我不知道如何附加更新的程序,因为它太长了,无法复制和粘贴。

http://www4.ncsu.edu/~mtchu/Teaching/Lectures/MA581/colsys.f

【问题讨论】:

    标签: fortran


    【解决方案1】:

    链接代码是 1981 年(超过 35 年前!)编写的旧代码,似乎所有警告消息都来自现在已过时的使用单元素数组作为假定大小数组的方法,例如,

          DIMENSION M(1), ZETA(1), IPAR(1), LTOL(1), TOL(1),
    

    所以,我想只要编译成功,就可以忽略所有警告消息。如果需要,可以通过某些编译器选项或通过将此类数组修改为假定大小的数组来抑制警告,例如

          DIMENSION M(*), ZETA(*), IPAR(*), LTOL(*), TOL(*),
    

    另一个问题是作者将一个名为DUMM 等的标量变量传递给了一个子程序中没有使用的虚拟数组参数。因此,为了避免警告,我们还需要在调用方将这些变量显式声明为DUMM(1)

    要实际修改代码,请将DIMENSION 语句中的(*),*) 中的虚拟参数替换为(1),1)(可以手动或通过sed/awk 完成)。那么原始代码和修改代码之间的区别如下。虽然目前还不清楚代码是否正常工作,但这至少消除了 gfortran 和 ifort 的所有警告。

    457,458c457,461
    <       DIMENSION M(1), ZETA(1), IPAR(1), LTOL(1), TOL(1),
    <      1          FIXPNT(1), ISPACE(1), FSPACE(1)
    ---
    >       DIMENSION M(*), ZETA(*), IPAR(*), LTOL(*), TOL(*),
    >      1          FIXPNT(*), ISPACE(*), FSPACE(*)
    > 
    >       dimension dum1(1), dum2(1), dum3(1), dum4(1)
    > 
    769,771c772,774
    <       DIMENSION XI(1), XIOLD(1), XIJ(1), ALPHA(1), ALDIF(1), RHS(1)
    <       DIMENSION A(1), VALSTR(1), SLOPE(1), ACCUM(1), IPIV(1), INTEGS(1)
    <       DIMENSION DALPHA(1), EALPHA(1) , FIXPNT(1)
    ---
    >       DIMENSION XI(*), XIOLD(*), XIJ(*), ALPHA(*), ALDIF(*), RHS(*)
    >       DIMENSION A(*), VALSTR(*), SLOPE(*), ACCUM(*), IPIV(*), INTEGS(*)
    >       DIMENSION DALPHA(*), EALPHA(*) , FIXPNT(*)
    1260,1261c1263,1266
    <       DIMENSION D1(40), D2(40), ZV(40), SLOPE(1), ACCUM(1), VALSTR(1)
    <       DIMENSION XI(1), XIOLD(1), XIJ(1), ALDIF(1), FIXPNT(1)
    ---
    >       DIMENSION D1(40), D2(40), ZV(40), SLOPE(*), ACCUM(*), VALSTR(*)
    >       DIMENSION XI(*), XIOLD(*), XIJ(*), ALDIF(*), FIXPNT(*)
    > 
    >       dimension dumm(1)
    1755c1760,1762
    <       DIMENSION XIOLD(1), ALDIF(1), VALSTR(1), WORK(MSTAR,1)
    ---
    >       DIMENSION XIOLD(*), ALDIF(*), VALSTR(*), WORK(MSTAR,*)
    > 
    >       dimension dumm(1)
    1899,1900c1906,1907
    <       DIMENSION  ALPHO(1), XI(1), XIOLD(1), XIJ(1), ALPHA(1)
    <       DIMENSION ALDIF(1), RHS(1), A(1), IPIV(1), INTEGS(3,1)
    ---
    >       DIMENSION  ALPHO(*), XI(*), XIOLD(*), XIJ(*), ALPHA(*)
    >       DIMENSION ALDIF(*), RHS(*), A(*), IPIV(*), INTEGS(3,*)
    1901a1909,1910
    > 
    >       dimension dummy(1)
    2163,2164c2172,2173
    <       DIMENSION Q(NROW,1), Z(1), DF(NCOMP,1)
    <       DIMENSION XI(1), BASEF(620), ALPHO(1), DG(40)
    ---
    >       DIMENSION Q(NROW,*), Z(*), DF(NCOMP,*)
    >       DIMENSION XI(*), BASEF(620), ALPHO(*), DG(40)
    2329c2338,2341
    <       DIMENSION Z(1), FSPACE(1), ISPACE(1)
    ---
    >       DIMENSION Z(*), FSPACE(*), ISPACE(*)
    > 
    >       dimension dumm(1)
    > 
    2332c2344,2345
    <       CALL APPROX (ISPACE(5), X, Z, FSPACE(IS6), FSPACE, ISPACE,
    ---
    >       CALL APPROX (ISPACE(5), X, Z, FSPACE(IS6), FSPACE, ISPACE(1),
    > c      CALL APPROX (ISPACE(5), X, Z, FSPACE(IS6), FSPACE, ISPACE,
    2374c2387
    <       DIMENSION Z(1), VN(1), XI(1), ALDIF(1), M(1), DMVAL(1)
    ---
    >       DIMENSION Z(*), VN(*), XI(*), ALDIF(*), M(*), DMVAL(*)
    2482c2495
    <       DIMENSION VN(1), M(1)
    ---
    >       DIMENSION VN(*), M(*)
    2532c2545
    <       DIMENSION VN(1), XI(1), M(1)
    ---
    >       DIMENSION VN(*), XI(*), M(*)
    2612c2625
    <       DIMENSION BASEF(1), VN(1), XMESH(1)
    ---
    >       DIMENSION BASEF(*), VN(*), XMESH(*)
    2889c2902
    <       DIMENSION ALDIF(1), ALPHA(1), XI(1), M(1)
    ---
    >       DIMENSION ALDIF(*), ALPHA(*), XI(*), M(*)
    3004,3005c3017,3018
    <       DIMENSION UHIGH(1) , AR(20), ARM1(20)
    <       DIMENSION ALDIF(1), XIOLD(1)
    ---
    >       DIMENSION UHIGH(*) , AR(20), ARM1(20)
    >       DIMENSION ALDIF(*), XIOLD(*)
    

    【讨论】:

      【解决方案2】:

      要么

      a) 在过程声明中(functionsubroutine)参数 dumm 被定义为 rank-1 数组(如果您愿意,可以使用 1 维数组,但 'rank-1 ' 是您的编译器使用的 Fortran 术语),并且当您的代码调用该过程时,它会被赋予一个标量值。请特别注意,标量值与只有一个元素的 rank-1 数组不同(用于参数匹配)。

      b) 反之亦然

      无论哪种方式,过程定义中的参数与调用过程时传递的参数不匹配。

      您报告的第二个错误类似,似乎在调用该过程时它需要一个 3 元素数组,但只得到一个 1 元素数组。或者类似的东西。

      就我个人而言,我不倾向于通过站外链接来寻找更多要修复的错误。

      【讨论】:

        猜你喜欢
        • 2012-03-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-05-05
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多