Fortran子程序
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
函数与子程序
子程序和主程序之间最大不同在于:主程序的程序代码,在程序一开始 就自动被执行,而子程序的代码只有在被‚调用‛才会执行。
一个包含子程序的Fortran程序在结构上大致如下:
program main ← 主程序 „„ „„ ←主程序代码 „„ end program main ←主程序结束 subroutine sub1() ←第1个子程序 „„ „„ ←子程序码 „„ end subroutine sub1 ←第1个子程序结束 subroutine sub2() ←第2个子程序 „„ „„ ←子程序码 „„ end subroutine sub2 ← 第2个子程序结束
函数与子程序
使用common还有一些技巧,见下面实例。主程序中有全局变量a,b, 子程序中有大小为2的数组a(2),根据使用相同内存空间的策略,a等于 a(1),而b等于a(2)。
program ex0814 implicit none real :: a,b common a,b ! 把浮点数a,b放在全局变量中 a = 1.0 b = 2.0 call ShowCommon() stop end subroutine ShowCommon() implicit none real :: a(2) common a ! 把数组a放在全局变量中 write(*,*) a(1), a(2) return end
传递参数与使用全局变量都可以在 不同程序之间共享数据,简单的说,当 需要共享的变量不多,而且只由少数几 个程序需要使用这些数据时,就使用参 数;当共享大笔数据,或是有很多个不 同程序都要使用这些数据时,就使用全 局变量。
函数与子程序
2、BLOCK DATA 的使用 关于common设臵初值的方法,common变量不能直接在子 程序或主程序中使用DATA来设臵初值,要在BLOCK DATA程序模块中使用DATA命令来设臵初值,看一个程序:
函数与子程序
主程序不一定要放在开头,可在程序中任何位臵,如下图 所示。
subroutine sub1() „„ „„ „„ end subroutine sub1 program main „„ „„ „„ end program main subroutine sub2() „„ „„ „„ end subroutine sub2
函数与子程序
自定义函数示例:
program ex0807 implicit none real :: a=1 real :: b=2 real, external :: add
语句函数:
program ex0808 implicit none real :: a = 1 real :: b real :: add !自定义函数的声明 add(a,b) = a+b ! 直接把函数写在里面 write(*,*) add(a,3.0) !自定义函数的调用 stop end
write(*,*) add(a,b) stop end function add(a,b) implicit none real :: a,b ! 传入的参数 real :: add add = a+b return end function
函数与子程序
三、全局变量(COMMON) 不同的程序之间,也就是在不同函数之间,主程序与 函数之间,除了通过传递参数的方法来共享内存,还可以 通过‚全局变量‛来让不同程序中声明出来的变量使用相 同的内存位臵。这是另一种在不同程序间传递数据的方法。
函数与子程序
Fortran 在传递参数时使用的是传址调用
program ex0805 implicit none integer :: a = 1 integer :: b = 2 write(*,*) a,b call add(a) call add(b) write(*,*) a,b stop end subroutine add(num) implicit none integer :: num num = num+1 return end
program ex0812 implicit none integer :: a,b common a,b ! a,b放在不署名(无名)的全局变量空间中 integer :: c,d common /group1/ c,d ! c,d放在group1的全局变量空间中 integer :: e,f common /group2/ e,f ! e,f放在group2的全局变量空间中 write(*,"(6I4)") a,b,c,d,e,f 1. Block data类似于子程序,是一 stop 段独立的程序模块,拥有自己的 end 变量声明,不过它不需被调用就 能执行,它会在主程序前生效。 block data 2. 不过它仅限于设置全局变量初值, implicit none 不能有其他执行命令出现。全局 integer :: a,b 变量不能是常量,所以Block common a,b ! a,b放在不署名的全局变量空间中 data中无parameter. data a,b /1,2/ ! 同样使用data设定a,b的初值 integer :: c,d common /group1/ c,d ! c,d放在group1的全局变量空间中 data c,d /3,4/ ! 设定c,d的初值 integer :: e,f common /group2/ e,f ! e,f放在group2的全局变量空间中 data e,f /5,6/ ! 设定e,f的初值 end block data
函数与子程序
二、自定义函数(FUNCTION) Fortran编译系统自带有一些常用函数,例如:SIN(x), COS(X), MOD(a,b)等。我们使用的函数不再函数库中时, 需要自己创造一个。 自定义函数的运行和子程序大致相同,也是需要经过调用 才能执行,可以独立声明变量,参数的传递方法也和子程 序一样,二者只有两点不同: 1.调用自定义函数前要先声明。 2.自定义函数执行后会返回一个数值。
函数与子程序
(教材的第8章)
‚函数‛是自定义函数和子程序的总称。子程序可以用来独
立出某一段具有特定功能的程序代码,供其它地方调用。自
定义函数可以用来自由扩充出Fortran库函数中原来不存在 的函数。
函数与子程序
一、子程序(SUBROUTINE)的使用 写程序时,可以把某一段经常被使用,具有特定功能的程 序代码独立出来,封装成子程序,以后只要经过调用的 CALL命令就可以执行这一段程序代码。先来看一个使用 子程使用‚地址对应‛的方法共享数据,所以 在程序设计时常出现下面麻烦,如下图所示。
program main implicit none integer a,b,c,d,e,f common a,b,c,d,e,f …… …… end
这里使用了6个全域变量
subroutine sub() implicit none integer n1,n2,n3,n4,n5,f common n1,n2,n3,n4,n5,f …… …… end
函数与子程序
子程序除了可以让主程序调用之外,子程序之间也可以相互 调用(见实例)。
1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. program ex0802 implicit none call sub1() call sub2() stop end program ex0802 subroutine sub1() implicit none write(*,*) "This is sub1" call sub2() return end subroutine sub1 subroutine sub2() implicit none write(*,*) "This is sub2" return end subroutine sub2
函数与子程序
1、COMMON的使用
program ex0810 implicit none integer :: a,b common a,b ! 定义a,b是全局变量中的第1及第2个变量 a=1 b=2 call ShowCommon() stop end subroutine ShowCommon() implicit none integer :: num1, num2 common num1, num2 ! 定义a,b是全局变量中的第1及第2个变量 write(*,*) num1, num2 return end
program ex0801 implicit none call message() ! 调用子程序message call message() ! 再调用一次 stop end program ex0801 ! 子程序message subroutine message() implicit none write(*,*) "Hello." return end subroutine message
函数与子程序
3、注意事项 使用COMMON时注意两点: 1)变量的类型 program ex0813 2)变量的位臵 implicit none
real :: a common a ! 把浮点数a放在全局变量中 a = 1.0 call ShowCommon() stop end subroutine ShowCommon() implicit none integer :: a common a ! 把整数a放在全局变量中 write(*,*) a return end
假设子程序只要使用第6个 全域变量,它仍要宣告出前 5个垫着,才能使用第6个。
函数与子程序
这种麻烦在全局变量多的情况 下更为惊人,把变量归类、放在彼 此独立的COMMON区间中可以解决 此问题,示例见右边代码:
1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. program ex0811 implicit none integer :: a,b common /group1/ a common /group2/ b a=1 b=2 call ShowGroup1() call ShowGroup2() end subroutine ShowGroup1() implicit none integer :: num1 common /group1/ num1 write(*,*) num1 end subroutine ShowGroup2() implicit none integer :: num1 common /group2/ num1 write(*,*) num1 end
主程序调用sub1时 所显示
sub1调用sub2时 所显示
主程序调用sub2时 所显示
函数与子程序
传递参数
program ex0804 implicit none integer :: a = 1 integer :: b = 2 call add(a,b) ! 把变量a及b交给子程序add来处理 stop end subroutine add(first, second) ! In c, add (int first, int second) implicit none integer :: first, second write(*,*) first+second return end
1. 子程序以subroutine开头,以 end或end subroutine结束。 2. 其名字(在此为message)不能随 意修改,在命名时是要让大家都 能够认识的。 3. 通常最后一个命令是return(而 非stop),程序要返回原来调用 它的地方继续执行。return可省 略,也可在子程序中任何地方使 其提早返回。