fortran指针数组与c语言数组,科学网—你会用Fortran“指针数组”吗? - 杨俊杰的博文...

◆  问题的产生

最近,筹划使用Fortran语言编程计算。也许是看惯了以往的编程风格(基于过程的,一步一步按部就班),不由得想起了另一种风格——Macro Based Programming(有点面向对象的风格,把一些“对象”的数据和方法写在一个module里面),但是里面涉及到很多指针的操作,好久没用到指针,于是操起一本教科书开始爬格子。先照猫画虎写了这样一段代码:

0188609a69bbfdd561cbdfddb270c0e7.png

cd37b60bcff40bcf9559a2a1c79eede8.png

运行没有发现问题,心里美滋滋!回头看了一眼module文件,发现其中定义了一个PPERSON的数据类型:

TYPE PPERSON

TYPE(PERSON),POINTER :: PENDTYPE

顿生疑惑,为什么要这样定义,直接使用指针数组多简单。着手将其改造成这样:

TYPE(PERSON),POINTER :: P(:)

整个代码改成:

031212b59ba3be8460c973be664ac1cc.png

ea7b61ea017656ddb364c1eb6b29b57a.png

编译通过,运行出错,弹出:

4d9635f67983fe4467577ca9f898ba37.png

问题就是这样。

◆  问题分析:

按图索骥,找到主程序调用子程序时出错,子程序在第24行出错:

TEMP = P(I)

第一反应是两个数据类型不对造成的,顺手改成:

TEMP => P(I)

再次运行,没有报错。仔细一瞧,结果和预期的结果对不上:

fae140b85db9525c46b407f95b84a6a6.png

原来这样改也有问题。这是因为:TEMP是一个指针,它指向的变量如发生变动,那么它本身也会跟着变,而我们希望TEMP在交换时不随前一个变量变动,因而出来这样的结果。进一步分析,也没有找到其他合理的解释——为什么不能这样给TEMP赋值?

◆  问题解决

继续,在网上查找类似的问题,果不其然,找到一篇(http://www.douban.com/note/184396109/)。不过好心的网友回答地不甚清楚,好在他(她)提供了两个其他的帖子,我先打开(http://software.intel.com/en-us/forums/topic/280765)。同样的问题,回复是:The concept of "array of pointers" does not exist in Fortran. 很惊讶,原来Fortran不存在指针数组的概念(我想这会大家应该明白为什么在标题里给指针数组打上双引号了吧?)。帖子中给出的解决方法同改造前的代码。

◆  总结

至此终于知道了问题的所在:Fortran不存在指针数组的概念,不能直接使用指针数组,必须通过一个包含指针的数据类型(如下)来定义数组,其效果等同于"指针数组"。

TYPE PPERSON

TYPE(PERSON),POINTER :: PENDTYPE

本文原代码:

转载本文请联系原作者获取授权,同时请注明本文来自杨俊杰科学网博客。

链接地址:http://blog.sciencenet.cn/blog-517015-679554.html

上一篇:求教(一)——如何理解 the increment of plastic multiplier

下一篇:Fortran指针应用——环状双向串行

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值