Zhiguo 的个人资料Flexalice照片日志列表更多 ![]() | 帮助 |
Flexaliceblog my feeling, blog my life |
|||||
|
JHU学生手刃窃贼 前晚凌晨一点,一名盗贼潜入霍普金斯学校附近一所公寓欲行盗窃,被居住于该公寓的一名本科生发现。这名学生手持日本武士刀,当场砍断窃贼的手臂,并刺入其胸口,令其当场毙命。据悉,该窃贼是一名惯犯,刚从号子里放出来不久,不料如此死于非命。 枪击案昨晚10点左右,我和老婆听到几声很沉闷的枪响,当时感觉距离很近。不到3分钟,就有救护车风驰电掣的从我们楼前经过。我们当时就想,可能又有人被老黑做了。
果然,今天看到Baltimore Sun上这则消息:
那条街离我们的apartment也就不到2 miles的距离。
静态局部变量Fortran中的局部变量默认为静态局部变量,即每次子程序调用完毕,其局部变量的值可以保存至下次调用。比如:
program test
implicit none call s() call s() call s() stop end program test subroutine s() implicit none integer m C save m data m /0/ m=m+1 write(*, *) "Subroutine s() called ", m, " times." end 程序输出为:
Subroutine s() called 1 times.
Subroutine s() called 2 times. Subroutine s() called 3 times. 其中,语句save m显式地指定保存局部变量m的值,不过由于所有局部变量默认都被保存,注释该语句对结果无影响。那么,如何才能使局部变量像C语言中的局部变量一样,每次调用时具有相同的初值呢?最简单的办法是使用赋值语句,而非data初始化语句。这样每次调用时,赋值语句就覆盖了上次调用时保留下的值。程序如下:
program test
implicit none call s() call s() call s() stop end program test subroutine s() implicit none integer m m=0 m=m+1 write(*, *) "Subroutine s() called ", m, " times." end 输出如下:
Subroutine s() called 1 times.
Subroutine s() called 1 times. Subroutine s() called 1 times. Fortran 77中的变量类型 Fortran 77的变量类型相比较于C/C++而言更简单,只有两种:一种是common block,类似于C/C++的全局变量;另一种是局部变量,与C/C++中的相似。其中,common block比较难懂一点。就我的理解而言,common block其实就是定义了一块连续的公用内存,其存放的数据格式按照common语句定义的变量顺序进行解释。这块内存位于静态数据空间,而局部变量位于栈空间。
为了证实这两种变量类型在内存中的布局,可以用一个小程序来显示common block变量和局部变量的内存地址。程序如下:
program test1 implicit none C global integer a, b, c data b,c /1,2/ common /kk/ b, a(50), c C local integer j do j=1,50 a(j)=j enddo print *, Loc(a), " ", Loc(b), " ", Loc(c), " ", Loc(j) call s1() stop end program test1 subroutine s1() integer e, f, g, i common /kk/ f, e(50), g f=f+1 g=g+1 do i=1,50 e(i)=e(i)+1 enddo print *, Loc(e), " ", Loc(f), " ", Loc(g), " ", Loc(i) end 运行结果为:
4501588 4501584 4501788 4544052
4501588 4501584 4501788 4544056 Press any key to continue 可以看出,变量在common block “kk”中的分布为integer, interger(50), interger,其内存地址是连续的。
而局部变量i和j分布于更远的地址空间,且二者地址连续,说明其在栈空间上。
因此,common block有点类似C中的structure,将一堆数据放在一块连续的内存中,然后按照名字去索引。
只不过common block中的成员名是可以重新定义的,只要索引时是按照common语句中出现的顺序就行了,
这种行为很像子程序的参数传递。
华氏转摄氏心算口诀俺的原创发明哦 :)
华氏温度-32
所得数字/2 (大概摄氏温度)
所得数字小数点左移一位,然后与原数字相加(精确摄氏温度)
|
||||
|
|