gpt4 book ai didi

arrays - 定义返回数组的函数

转载 作者:行者123 更新时间:2023-12-04 22:46:10 24 4
gpt4 key购买 nike

我有以下代码:

    Program function_as_an_array
implicit none
integer:: i
integer, parameter:: N=10
real*8:: x(N),y(N),f(N)

do i=1,N
x(i)=float(i)
end do

call func(f,N,x)

open(unit=20, file='test.dat')
do i=1,N
y(i)=f(i)
write(20,*) x(i),y(i)
end do
close(20)
Stop
End Program function_as_an_array


Subroutine func(f,N,x)
implicit none
integer i,N
real*8:: x(N),f(N)

do i=1,N
f(i)=x(i)**2
end do

end Subroutine func

我想让这个程序确实适合
“函数作为一个数组”,即我想替换 Subroutine func通过 function f并得到相同的结果(在主程序中,我希望保留像 y=f(x,N) 这样的语句)。我怎样才能做到这一点?

最佳答案

函数返回数组没有问题,就像 this question and answer :主要问题是您需要将函数放在模块中(或程序中的 contain 编辑),以便有一个自动显式接口(interface):( 编辑以添加 :或显式定义接口(interface)为亚历山大·沃格特的回答)

module functions
contains

function func(N,x)
implicit none
integer, intent(in) :: N
double precision, intent(in) :: x(N)
double precision, dimension(N) :: func

integer :: i

do i=1,N
func(i)=x(i)**2
end do

end function func

end module functions

Program function_as_an_array
use functions
implicit none
integer:: i
integer, parameter:: N=10
double precision:: x(N),y(N)

do i=1,N
x(i)=float(i)
end do

y = func(N,x)

open(unit=20, file='test.dat')
do i=1,N
write(20,*) x(i),y(i)
end do
close(20)
Stop
End Program function_as_an_array

但请注意,这种函数——对数组中的每个元素应用相同的操作——在 Fortran elemental 上做得更好。函数,定义为仅在标量上工作,Fortran 会自动为您将其映射到数组的所有元素上:
module functions
contains

elemental double precision function f(x)
implicit none
double precision, intent(in) :: x

f = x**2

end function f

end module functions

Program function_as_an_array
use functions
implicit none
integer:: i
integer, parameter:: N=10
double precision:: x(N),y(N)

do i=1,N
x(i)=float(i)
end do

y = f(x)

open(unit=20, file='test.dat')
do i=1,N
write(20,*) x(i),y(i)
end do
close(20)
Stop
End Program function_as_an_array

这样做的好处是它现在可以自动处理标量和任何等级的数组。只要有可能,最好让编译器为您完成工作。

关于arrays - 定义返回数组的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24910843/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com