所以我试图让我的Fortran 95代码仅用于基本功能和程序定义。对于每行说“意外”或“未分类”,我几乎都会收到错误。我想知道它是否是我的编译器(gfortran在cygwin终端中使用)或者我是否应该在文件的开头放一些东西?在这里,如果有人能告诉我任何事情。
double precision :: pi = 3.14159265359
PROGRAM Diffraction
write (*,*) sinc(0)
write (*,*) sinc(pi)
write (*,*) 1_Slit(0, 1, 550E-9)
end PROGRAM Diffraction
function SINC(angle) result(sinc)
double precision :: sinc
double precision :: angle
if angle == 0.0 then
sinc == 1
else
sinc = (sin(angle)/angle)
endif
end function SINC
function I(angle, d, wl) result(I)
double precision :: I_0 = 0.01
double precision :: angle, d, wl, I
A = (d * pi)/wl
B = SIN(angle)
I = I_0 * (SINC(A*B)**f2)
return
end function I
我编译的方式是: gfortran Diffraction.f95
答案 0 :(得分:1)
一般来说,将所有定义放在主程序或模块中是个好主意。所以你的“浮动”定义有点奇怪。
您的程序应以PROGRAM [name]
开头,然后是您使用过的模块。在您的情况下,没有这样的模块。在此之后,最好写一下IMPLICIT NONE
。这意味着,没有变量具有预定义类型。否则,从I
到N
开头的每个变量都属于INTEGER
类型,而其他所有变量都属于REAL
类型。
下一部分是变量定义部分,其中定义了变量。 (示例中的第一行。)
在此之后,主要部分是跟随,您执行代码。
最后一部分是CONTAINS
部分,你的函数和子程序放在那里,它可以使用在程序中定义的每个变量(但这会是糟糕的实践......)。
所以你的例子(有一些更正)看起来像是:
PROGRAM Diffraction
IMPLICIT NONE
double precision :: pi = 3.14159265359d0
write (*,*) sinc(0.d0)
write (*,*) sinc(pi)
write (*,*) one_slit(0.d0, 1.d0, 550.d-9)
CONTAINS
function SINC(angle) result(snc)
double precision :: snc
double precision :: angle
if (angle == 0.d0) then
snc = 1.d0
else
snc = (sin(angle)/angle)
endif
end function SINC
function one_slit(angle, d, wl) result(I)
double precision :: I0 = 0.01d0, A, B
double precision :: angle, d, wl, I, f2=2.d0
A = (d * pi)/wl
B = SIN(angle)
I = I0 * (SINC(A*B)**f2)
end function one_slit
end PROGRAM Diffraction