我写了两个.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)但是被转换成这种类型会导致错误,但我不确定是什么类型应该在子程序中,或者如果这是原因。我可能只是遗漏了一些明显的东西。
任何帮助都将不胜感激,如果我需要澄清我写的任何内容,请告诉我。
感谢您的时间。
詹姆斯
答案 0 :(得分:2)
您在常规错误中忘记了程序开头的IMPLICIT NONE
语句。 (至少,强烈建议避免这种错误。)
因此,所有以I
,J
,K
,L
,M
或N
开头的变量属于{ {1}}以及INTEGER(4)
类型的所有其他变量。这意味着,您的变量REAL(4)
,A
和B
属于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