我试图通过使用contains调用函数来进行基本计算
Program main
implicit none
integer*8 Nmax,i
Parameter (Nmax=5)
real*8 x, f(Nmax), n
do i=1, Nmax
n=i
f=func(n,Nmax)
write(*,*) f(i)
end do
Contains
real*8 function func(x,Nmax)
integer*8 Nmax,i
real*8 x, f(Nmax)
do i=1, Nmax-1
f(i)=i**2d0-4d0*i-7d0
end do
end function
end program main
I get this result:
-9.255963134931783E+061
-9.255963134931783E+061
-9.255963134931783E+061
-9.255963134931783E+061
-9.255963134931783E+061
我认为我在定义错误的变量。谢谢您的帮助。
答案 0 :(得分:4)
您的程序存在多个问题。
首先,您可能打算写:
f(i)=func(n,Nmax)
。如果没有下标,则会为数组的每个元素分配相同的值。您可能会认为这可以解释结果,但事实并非如此,因为您仍然会看到期望的结果。
当我使用Intel Fortran编译代码时收到以下警告,突出显示了另一个问题:
t.f90(14): warning #6178: The return value of this FUNCTION has not been defined. [FUNC]
real*8 function func(x,Nmax)
-------------------^
您永远不会分配func的值,因此您会在返回寄存器中得到任何垃圾。
您拥有的功能也不是您想要的。您可能想要一个可以计算并返回标量(单个)值的函数,因此在func内部不需要数组。
第三个问题是func忽略了n参数(与约定相反,您已将其声明为实数。)
如果要在主程序中循环,请让函数计算并根据传递给它的参数返回单个结果。不需要每次都传递循环索引和nmax。其他一些稍微高级一点的选择是将数组分配保留在主程序中,但取消那里的循环,使函数返回数组或使函数ELEMENTAL生效。一旦您弄清了您的实际意图,我将把它留给您练习。
最后,我不鼓励您使用非标准语法,例如“ real * 8”。请了解KIND说明符和SELECTED_REAL_KIND内部函数。