fortran中可变数组的用法

fortran中对于可变数组的用法,在彭国伦的书中没有详细的介绍,只是介绍了相关的四个函数:


allocatable() ——  声明可变数组;
allocate() —— 对数组大小进行初始化;
allocated() —— 检测数组是否被分配内存;
以及deallocate() —— 释放数组的内存;


另外,在对可变数组的应用上,彭还提出了另外一种比较讨巧的办法,那就是事先声明一个较大的数组。
例如,事先声明一个数组ARRY(10000),那么在以后的使用过程中,对于任意元素个数不大于10000的一维数组,都可以“借用”ARRY的一部分来使用。
那么针对于这两种动态数组的使用方法究竟有什么优缺点呢?


在第一种方法中,数组使用前需要首先分配内存,否则是无法使用的
例如声明一个一维数组:
Integer,allocatable::ARRY()
那么在使用之前,首先要分配内存:
allocate(ARRY(100))
然后才可以使用这个ARRY(100).
如果需要使用一个具有101个元素的数组,那么首先要将其分配的内存释放掉:
deallocate(ARRY)
然后再次为其分配新的内存
allocate(ARRY(101))
从上述过程看来,新的数组ARRY(101)和旧的数组ARRY(100)不具有关系。也就是说,在新的数组中是不能保有旧数组的值的。
这样一来,想要“扩展”数组就变得很困难,甚至是不可能。
比如想在数组ARRY(100)的中间插入一个元素,使之变成ARRY(100),就不能使用这种方法。
当然这种方法的好处是显而易见的,比如节省内存。但是重复地进行allocate() ——deallocate() ——allocate()操作会导致内存中积累大量的不可用的小内存片段。


第二种方式是首先声明一个较大的数组。这样一来,上面的问题就可以解决了。无非就是将数组元素各向后挪一个位置罢了。
但是这种声明方式具有显而易见的缺点,那就是内存空间的浪费,如果事先声明的大数组较大的话,那么就有可能导致内存的极大浪费,如声明了ARRY(10000),而在实际的使用过程中,只用到了ARRY(101),那么为101之后元素所分配的内存就不会使用到。
因此,在编程使用动态数组的过程中,要求我们既要考虑到内存的使用量,也要考虑到计算的便利性,综合取舍。

你可能感兴趣的:(fortran中可变数组的用法)