回 帖 发 新 帖 刷新版面

主题:为什么我子程序调子程序时出现虚实参数数据类型不符的问题

如下所示,我在子程序A里调子程序B,并传参数 A,B,C。
传参时,我直接原样拷了A,B,C。 A,B,C可能是整型,实数,数组。 但运行时老是报错说参数类型不对。还说实参和虚参个数要一致。

我是在正确程序上修改的,我只不过在参数列里添了几个,而且实参虚参都对应好了,应该不会出问题。实际上,我把程序重新建个project,再编译就不报错了。但用一会又会出问题。同一个编译器,怎么能出2个不同的结果呢。。。被这个郁闷几天了。我用的是IVF10,带界面的。

我把程序简化后贴在下面了,方便大家查看:



MAIN program

call subroutine_A(A,B,C)

END

   SUBROUTINE subroutine_A (A,B,C)
   
   CALL subroutine_B (A,B,C)

   END

      
      SUBROUTINE subroutine_B (A,B,C)
      
      END


还有,程序老警告我说参数没定义,但我以经通过Implicit 说明过了。调函数时用到的参数也都是参数列表里的,如果是数组也通过dimension开辟空间了。为什么还有什么问题



===========================
子程序A:
...
CALL ITERATION_NEW (N,NPT,X,RHOEND,IPRINT,XOPT,XNEW,XPT)
...
END

子程序B:

SUBROUTINE ITERATION_NEW (N,NPT,X,RHOEND,IPRINT,XOPT,XNEW,XPT)
IMPLICIT REAL*8 (A-H,O-Z)
DIMENSION X(*),XOPT(*),XNEW(*),XPT(NPT,*)
...

回复列表 (共6个回复)

沙发


忘了贴error信息了:

Error: The number of actual arguments cannot be greater than the number of dummy arguments. (这纯扯淡,几个参数我还是数的清的,但不知道怎么会有这种报错的)

Error: The type of the actual argument differs from the type of the dummy argument

Error: If the actual argument is scalar, the corresponding dummy argument shall be scalar unless the actual argument is an element of an array that is not an assumed-shape or pointer array, or a substring of such an element

The shape matching rules of actual arguments and dummy arguments have been violated.

需要说明的是,我把源程序重新建个project粘贴一下就没问题了,但只要一改参数,比如添加一个参数,就又出同样问题。很不稳定。

板凳

我也遇到同样的问题了,重建project好了。
真是奇怪。

3 楼

用 Implicit None 。

数组用 Real 或 Integer 之类的显示声明,不用 dimension。

注意精度。

4 楼

清理一下solution,重新编译即可
在ivf中,选build-clean solution,然后重新运行即可。
出现这种问题的原因:除了虚实参数的个数和类型的确不符之外,还有可能是前次编译的结果被保留,在对subroutine的参变量进行数目、类型等修改之后,引用和被引用的二者之一未变(?谁未变我还没弄清楚),导致虚实不符。

5 楼

楼上挖坟

6 楼

clean solution一下果然有用~~

我来回复

您尚未登录,请登录后再回复。点此登录或注册