【问题标题】:Fortran subroutines with arrays带数组的 Fortran 子例程
【发布时间】:2012-11-08 01:26:06
【问题描述】:

我在这个程序中的子程序有问题,它位于程序的末尾。我在子例程中得到一个数组划分错误,它说“不可分类的语句”。希望有人能帮忙!

PROGRAM subroutine1
IMPLICIT NONE

INTEGER:: err, ierr, counter, y ,i ,j 
!INTEGER, ALLOCATABLE:: gamenum(:)
CHARACTER(30):: fname
REAL, ALLOCATABLE:: AB(:), H(:), TB(:), BA (:), SP(:)

100 Format (A)
200 Format (I2)
300 Format (F9.3)

! 1.Open file

WRITE(*,100)"Please enter a filename:"
READ(*,*) fname

OPEN (UNIT=10, FILE=fname, STATUS="OLD", ACTION="READ", IOSTAT=err)
IF(err.NE.0) STOP "An error occured when opening the file."

! 2.Count Lines

READ(10,*)

counter=0
DO
    READ(10,*,IOSTAT=ierr)
    IF(ierr .NE. 0) EXIT
    counter=counter+1
END DO

!WRITE(*,200) counter

! 3. allocate array

ALLOCATE(AB(counter)) 
ALLOCATE(H(counter))
ALLOCATE(TB(counter)) 
ALLOCATE(BA (counter)) 
ALLOCATE(SP(counter))

! 4. read in data

REWIND(10)

READ(10,*)

DO i=1,counter
    READ(10,*) AB(i), H(i), TB(i)   
END DO

REWIND(10)

! 5. Call subroutine

    CALL arraycalc(counter,AB,H,TB,BA,SP)

! 6. Write out
WRITE(*,100)"Game    AB       H       TB       BA       SP" 

DO i=1,counter
    WRITE(*,200,ADVANCE="NO") i
    WRITE(*,'(5F9.3)') AB(i), H(i), TB(i), BA(i), SP(i)
END DO

END PROGRAM subroutine1

!HERE IS THE PART WHERE I'M HAVING TROUBLE  

SUBROUTINE arraycalc(counter,AB,H,TB,BA,SP)
IMPLICIT NONE

INTEGER, INTENT(IN)::counter
INTEGER::i
REAL,INTENT(INOUT)::AB,H,TB
REAL,INTENT(INOUT):: BA,SP

DO i=1,counter
    BA(i)=H(i)/AB(i)
END DO

DO i=1,counter
    SP(i)=TB(i)/AB(i)
END DO

END SUBROUTINE

【问题讨论】:

    标签: arrays fortran subroutine


    【解决方案1】:

    在子程序内部,ABHTBBASP 没有声明为数组,所以给出错误的语句确实没有意义。它们是标量,因此不能被索引。

    【讨论】:

    • DIMENSION(:) 应添加到例程 arraycalc 中的定义中
    • 如果您将您的程序放入一个模块并“使用”该模块,您将避免其他错误。不这样做是 Stackoverflow 上 Fortran 问题的常见原因。
    • @DaveP,具有假定形状参数的过程(即DIMENSION(:))还必须在调用代码中具有显式接口(或者是模块过程)。
    • @HristoIliev:术语说明:它不是“模块中的显式接口”;将过程放入模块中会自动提供显式接口。另一种方法是在接口块中手动指定接口。
    • @M.S.B.:可靠的建议。我没有提到模块,因为它不会避免编译错误。
    猜你喜欢
    • 2016-05-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-11
    • 2017-02-26
    • 2014-08-24
    相关资源
    最近更新 更多