为什么在使用函数并包含在fortran中时总是得到相同的结果

时间:2019-06-16 15:05:03

标签: fortran

我试图通过使用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

我认为我在定义错误的变量。谢谢您的帮助。

1 个答案:

答案 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内部函数。