sqs 发表于 2022-4-4 16:05 如楼上所言,这样写的话,func函数就和主程序耦合在一起了。 当你需要把 func函数拷贝到其他地方使用时,就会有点“难受”。就不如单纯的解耦之后的函数那样,直接拷贝后直接调用。 对于小型的程序,当然怎么写差别都不大。对于大型程序,为了提高代码的复用性,推荐各程序单元间尽可能解耦。 |
布衣龙共 发表于 2022-4-3 21:24 而且我不增加输出端,而是直接对主程序当中的变量进行赋值,这样可以么 [Fortran] syntaxhighlighter_viewsource syntaxhighlighter_copycode program para
implicit none
real(8)::f
call func(1.0d0,1.0d0)
print*,f
end program
subroutine func(x,y)
implicit none
real(8),intent(in) :: x, y
real(8) :: f
f = 2*x+3*y
end subroutine
~
~ 这两者又有什么区别呢 |
布衣龙共 发表于 2022-4-3 21:24 啊哈,但是一旦我需要有三四个以上的输出结果,那这个时候就只能使用subroutine而不能使用function了呀,是这样吧 |
|
本帖最后由 布衣龙共 于 2022-4-3 21:29 编辑 楼主这个过程,是非常适合用函数的。 PS:任何程序,无论大小,都不推荐使用common,这东西就让它逝去吧。 [Fortran] syntaxhighlighter_viewsource syntaxhighlighter_copycode program main
use iso_fortran_env, only: real64
implicit none
real(real64) :: f
call func(1._real64, 1._real64)
print *, f
contains
subroutine func(x, y)
real(real64), intent(in) :: x, y
f = 2._real64*x + 3._real64*y
end subroutine func
end program main
|
|
本帖最后由 gps99 于 2022-4-3 21:03 编辑 增加输出位 是最直接的办法,上面的大咖已经给出代码。 另外,还有个老办法加common公共块。数据块内地址传递,和变量名无关。小程序可以用,数据多的话用module数据块代替 [Fortran] syntaxhighlighter_viewsource syntaxhighlighter_copycode program para
use , intrinsic :: iso_fortran_env, only: R8 => real64
implicit none
write(*,*) func(1.0_R8,1.0_R8)
contains
Pure real(R8) Function func(x,y) result(f)
real(R8),intent(in) :: x, y
f = 2._R8*x+3._R8*y
End Function func
end program para |
sqs 发表于 2022-4-3 13:47 子程序没有输出位。主程序中的 f等于没有赋值,每次运行 print的是个随机地址的初始值 |
唐汉 发表于 2022-4-3 01:35 好的,那为什么我每次执行a.out的时候输出的结果都不一致呢 |
|
你在主程序里面声明了一个f,在子程序里面又声明了一个f,而且,在子程序里面的f没有输出。像这种情况你可以直接用function,或者subroutine但是加上输出intent(out) [Fortran] syntaxhighlighter_viewsource syntaxhighlighter_copycode
program para
implicit none
real(8)::f
common /d1/ f
call func(1.0d0,1.0d0)
print*,f
end program para
subroutine func(x,y)
implicit none
real(8),intent(in) :: x, y
real(8) :: f
common /d1/ f
f = 2*x+3*y
end subroutine func
|
捐赠本站|Archiver|关于我们 About Us|小黑屋|Fcode ( 京ICP备18005632-2号 )
GMT+8, 2025-10-29 10:34