|||
◆ 问题的产生
最近,筹划使用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
本文原代码:
Archiver|手机版|科学网 ( 京ICP备07017567号-12 )
GMT+8, 2024-12-24 03:24
Powered by ScienceNet.cn
Copyright © 2007- 中国科学报社