fortran中的错误,对子例程的未定义引用

时间:2015-04-15 00:45:49

标签: fortran fortran90 gfortran

我正在编写一个子程序和主要函数来调用它,但得到的错误为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     

谢谢!

1 个答案:

答案 0 :(得分:2)

  1. 你的编译命令是什么?对我来说,这会编译并正常运行

    gfortran caller.f90 foo.f90 && ./a.out
    
  2. I0是一个整数指示符,但WRITE语句后面的一些项是字符串。例如,您可以尝试

    100 FORMAT (3(A, I0, 1X))
    

    其中1X指的是空格。

  3. 请注意,如果格式化不是非常重要,并且您只对看到一些快速结果感兴趣,则可以使用自由格式输出(WRITE(*,*) ...)。

    编辑:我错误地将FORMAT称为过时。