回 帖 发 新 帖 刷新版面

主题:形参声明为数组,但调用时传递了标量作为实参,出错~

一个subroutine声明了数组参数,但调用时传递了标量,提示错误~在linux下面用gfortran编译成功,但是ifort(vs2005+ifort11)会提示出错~有没有什么开关选项可以关闭这个检查呢?

回复列表 (共11个回复)

沙发

"调用时传递了标量" 是什么意思? 你在linux下没有开检查,编译通过不代表代码就没问题的哦.

板凳

把非数组元素当成数组使用是非常危险的~~~~
楼主还是改改程序吧。。。

3 楼

是不是linux下面gfortran的检查比较松?发现有个别subroutine,声明的形参个数和调用时实参个数(实参少了一个)不一样都可以编译成功??
而对于一楼中的问题,具体的代码和出错信息如下:
//--------调用----------
      data  nz, idatm,isat,nf,iaer,jaer,isalb,ickp,iout,imom
     &    / 33,   2,   0,  2,   0,   0,    0,   0,  10,   0 /

      call ckint('idatm',idatm,1,0,6,kill)
//--------声明----------
      subroutine ckint(label,kk,nn,minval,maxval,kill)
      dimension kk(*)
     其中ckint的第二个参数kk在声明的时候是数组,而使用的时候直接用了标量。GFORTRAN编译可以通过,而ifort会有如下提示:
error #7836: 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.   [KK]
     有没有哪个选项可以调整IFORT检查级别的??没有的话,只能改代码了~

4 楼

改代码吧。这本来就是错的。

5 楼

改成这样,现在应该都是scalar了吧,但依然是同样的出错信息。哪位知道怎么解决,劳驾指点一二~
//--------调用----------
      integer idatm
      data  nz, idatm,isat,nf,iaer,jaer,isalb,ickp,iout,imom
     &    / 33,   2,   0,  2,   0,   0,    0,   0,  10,   0 /

      call ckint('idatm',idatm,1,0,6,kill)
//--------声明----------
      subroutine ckint(label,kk,nn,minval,maxval,kill)
      !dimension kk(*)
      integer kk

6 楼

帖部分源码吧. 我们不知道你省略了什么.

7 楼

是这样的,ckint()接受两个参数,第一个是字符串,第二个是整型,如下代码会产生前述错误提示,该怎么修改呢?(c程序员写fortran,外行了,望各位指教~):
    program Console1

    implicit none

    ! Variables
    integer kk
    data kk /2/
    ! Body of Console1
    print *, 'Hello World'
    call ckint('idatm',kk)

    end program Console1

    subroutine ckint(label,kk)
      character*(*) label
      !dimension kk(*)
      integer kk
    end

8 楼

C 程序员花一两天时间看看 Fortran 语法,不难的。

9 楼

那段代码应该是没问题的, 要不试试重新建立工程看看?

10 楼

[quote]那段代码应该是没问题的, 要不试试重新建立工程看看?[/quote]
的确建立新工程以后就没有这个问题了~好奇怪~暂时结贴吧~

我来回复

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