错误:参数中的排名不匹配(排名-1和标量)

时间:2016-01-05 13:53:08

标签: fortran

我遇到了这些错误。

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

2 个答案:

答案 0 :(得分:2)

无论

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

b)反之亦然

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

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

就我个人而言,我并不倾向于在网站外关注链接以寻找更多错误来解决。

答案 1 :(得分:1)

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

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

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

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

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

要实际修改代码,请在(1)语句,1)DIMENSION语句中用(*),*)替换伪参数(可以通过手或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(*)