yangjj2005的个人博客分享 http://blog.sciencenet.cn/u/yangjj2005

博文

你会用Fortran“指针数组”吗?

已有 11793 次阅读 2013-4-12 15:49 |个人分类:交流讨论|系统分类:科研笔记| Fortran, 学习笔记, 指针数组

◆  问题的产生

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

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

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

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

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

整个代码改成:

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

问题就是这样。

◆  问题分析:

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

               TEMP = P(I)

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

               TEMP => P(I)

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

原来这样改也有问题。这是因为: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不存在指针数组的概念(我想这会大家应该明白为什么在标题里给指针数组打上双引号了吧?)。帖子中给出的解决方法同改造前的代码。

   为了印证,继续打开第二个帖子(http://flyfeather.net/archives/213),一样的问题,一样的解答。

◆  总结

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

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

本文原代码:

改造前的Fortran源代码.txt



https://blog.sciencenet.cn/blog-517015-679554.html

上一篇:求教(一)——如何理解 the increment of plastic multiplier
下一篇:Fortran指针应用——环状双向串行
收藏 IP: 210.72.80.*| 热度|

1 孙宝玺

该博文允许注册用户评论 请点击登录 评论 (3 个评论)

数据加载中...

Archiver|手机版|科学网 ( 京ICP备07017567号-12 )

GMT+8, 2024-12-24 03:24

Powered by ScienceNet.cn

Copyright © 2007- 中国科学报社

返回顶部