在子程序中调用时丢失(更改)的数字值

时间:2014-07-23 13:27:05

标签: fortran

我写了两个.f90文本文件prog1.f90:

    PROGRAM prog1

        READ (5,*) A,B,C

        PRINT*, "A = ",A
        PRINT*, "B = ",B
        PRINT*, "C = ",C

    CALL test(A,B,C)


    END PROGRAM prog1

和aux.f90

    SUBROUTINE test(E,F,G)

        real(kind=8) :: E,F,G

        PRINT*,"E = ",E
        PRINT*,"F = ",F
        PRINT*,"G = ",G

    END SUBROUTINE test

使用Makefile编译:

    FC = gfortran
    FCFLAGS = -g -fbounds-check
    FCFLAGS = -O2
    FCFLAGS += -I/usr/include

    PROGRAMS = prog1 

    all: $(PROGRAMS)

    prog1: aux.o

    %: %.o
        $(FC) $(FCFLAGS) -o $@ $^ $(LDFLAGS)

    %.o: %.f90
        $(FC) $(FCFLAGS) -c $<

    %.o: %.F90
        $(FC) $(FCFLAGS) -c $<

    .PHONY: clean veryclean

    clean:
        rm -f *.o *.mod *.MOD

    veryclean: clean
        rm -f *~ $(PROGRAMS)

我使用这个makefile编译prog1然后用输入文件input.inp运行prog1:

    0.0033943878 0.0018085515 0.0011798956

我希望此代码的输出为

    A = 0.339439E-02     
    B = 0.180855E-02     
    C = 0.117990E-02
    E = 0.339439E-02     
    F = 0.180855E-02     
    G = 0.117990E-02

然而它是:

    A = 0.339439E-02     
    B = 0.180855E-02     
    C = 0.117990E-02
    E = 0.100765847236215E-21
    F = 0.750936901926887E-24
    G = 0.261410786221168-313

子程序中的数字要小得多,并且似乎与原始A,B和C没有逻辑连接,并且从子程序返回。

我认为我的错误是与我存储这些数字的类型有关,即它们不是真实的读取(kind = 8)但是被转换成这种类型会导致错误,但我不确定是什么类型应该在子程序中,或者如果这是原因。我可能只是遗漏了一些明显的东西。

任何帮助都将不胜感激,如果我需要澄清我写的任何内容,请告诉我。

感谢您的时间。

詹姆斯

2 个答案:

答案 0 :(得分:2)

您在常规错误中忘记了程序开头的IMPLICIT NONE语句。 (至少,强烈建议避免这种错误。)

因此,所有以IJKLMN开头的变量属于{ {1}}以及INTEGER(4)类型的所有其他变量。这意味着,您的变量REAL(4)AB属于C。将它们传递给子程序会导致未检测到的类型不匹配,导致误解的值。

您应该始终将REAL(4)放在程序和模块的开头,以强制为变量指定显式类型!

答案 1 :(得分:0)

我认为我已通过更正prog1.f90来解决此错误:

PROGRAM prog1

    real(kind=8) :: A,B,C

    READ (5,*) A,B,C

    PRINT*, "A = ",A
    PRINT*, "B = ",B
    PRINT*, "C = ",C

    CALL test(A,B,C)


END PROGRAM prog1