我正在编写一个子程序和主要函数来调用它,但得到的错误为undefined reference to ___
。我发现了一个原因:当我将main和子程序保存在同一个文件中时,编译并运行该文件,一切运行完美。但是,当我将它们保存到不同的.f90
文件并尝试运行主文件时,我收到错误。有什么办法可以让子程序进入一个单独的文件并调用主调用程序吗?
我在另一个地方感到困惑 - 在!------ERROR------
地方的主程序中。我提到Automatic width integer descriptor in fortran 90我可以使用I0
作为自动宽度显示指示器。但是当我使用相同的时候,运行时错误expected integer but got character.
对此有任何想法吗?
! saved as sub_program.f90 file
SUBROUTINE sub_program (v1,v2,ctr)
IMPLICIT NONE
INTEGER, INTENT(IN) :: ctr
INTEGER, INTENT (OUT) :: v1,v2
SELECT CASE (ctr)
CASE (1)
v1=1
v2=0
CASE (2)
v1=0
v2=1
END SELECT
RETURN
END SUBROUTINE
! main calling program, saved as caller.f90
PROGRAM caller
IMPLICIT NONE
INTEGER :: v1,v2,ctr
DO ctr = 1,2,1
CALL sub_program (v1,v2,ctr)
WRITE (*,100) 'STEP = ',ctr,'V1 = ',v1,'V2 = ',v2 !------ERROR------
100 FORMAT (I0)
END DO
END PROGRAM
谢谢!
答案 0 :(得分:2)
你的编译命令是什么?对我来说,这会编译并正常运行
gfortran caller.f90 foo.f90 && ./a.out
I0
是一个整数指示符,但WRITE
语句后面的一些项是字符串。例如,您可以尝试
100 FORMAT (3(A, I0, 1X))
其中1X
指的是空格。
请注意,如果格式化不是非常重要,并且您只对看到一些快速结果感兴趣,则可以使用自由格式输出(WRITE(*,*) ...
)。
编辑:我错误地将FORMAT
称为过时。