数组的动态分配

a)    可分配数组

数组可以是静态的也可以是动态的。如果数组是静态的,则在编译时就被分配了固定的储存空间,并且直到程序退出时才被释放。程序运行时静态数组的大小不能改变。静态数组的缺陷是,即使数组已经使用完毕,它仍占据着内存空间,浪费了系统资源。在给定的计算机内存资源情况下,耗费了其他数组可以利用的内存,并且超过资源的数组将导致程序执行错误。因此,F90增加了动态的数组功能,动态数组的储存在程序运行当中是可以分配、改变和释放的。

动态数组只有两种:可分配数组和自动数组。自动数组和可分配数组很类似,区别在于当程序开始或结束时,自动数组会自动分配和释放内存。当用户分配动态存储空间时,数组的大小是在运行时而不是在编译时确定的。动态分配可以用于标量和任何类型的数组。当用户给数组指定了可分配属性时并没有立即分配内存,而是直到使用ALLOCATE语句后才分配。随后还可以用DEALLOCATE语句释放内存空间,这时数组可以以其它形状或目的来使用。

应该注意的是,WinNT/9x上运行的Visual Fortran动态内存分配受一些因素的限制,包括交换文件的大小和其它同时运行的应用程序所需的内存大小。如果动态分配的内存太大或试图使用其它应用程序的保护内存会产生一般内存保护错误。碰到这类问题可以通过控制面板来改变虚拟内存的大小或交换文件的大小,还有一些编程技术可以降低内存需要。

b)    ALLOCATE语句

ALLOCATE语句动态创建可分配数组,使内存和对象相联系。分配的对象可以被命名为任何有ALLOCATABLE属性的变量。它的一般形式为:

ALLOCATE(数组名[维界符][,数组名[(维界符[,维界符...])] ] ...[,STAT=状态值])。

例:REAL A(:),B(:,:,:)

ALLOCATABLE A,B

ALLOCATE(A(-2:40),B(3,3,3))

当数组被分配时,内存分配给指定大小的数组。ALLOCATE语句中的秩必须和可分配数组的秩相同。在分配的同时,ALLOCATE语句中的上下界决定了数组的大小和形状。边界的值可以是正数、负数或零,缺省的下界为1。如果维上界比下界小,则该维的长度为零,并且数组的大小为零。大小为零的数组不能被赋值。

当前被分配的数组不能被再分配,否则会引起运行错误。错误状态可以由ALLOCATE语句中的STAT值获得。如果指定STAT选项,语句的成功执行时将返回0,否则返回正值。若未指定STAT选项且出现错误时,程序将中止执行。

例:INTEGER, ALLOCATABLE :: A(:),B(:)

INTEGER ERR_MESSAGE

ALLOCATE(A(10:25),B(SIZE(A)),STAT=ERR_MESSAGE)

IF(ERR_MESSAGE.NE.0) PRINT *,'ALLOCATION ERROR'

可以用内在函数ALLOCATED来判断一个数组是否已被分配。它的形式为:ALLOCATED(数组名)。返回值是逻辑标量,已被分配时为真,现在还未被分配时为假,当数组的分配状态未定义时它也是未定义的。

例:REAL, ALLOCATABLE :: A(:)

...

IF(.NOT.ALLOCATED(A)) ALLOCATE(A(5))

c)    DEALLOCATE语句

DEALLOCATE语句用来释放已分配数组的内存。它的一般形式为:DEALLOCATE(数组名[,数组名]...[,STAT=状态值])。

例:INTEGER, ALLOCATABLE :: A(:),B(:)

INTEGER ERR_MESSAGE

ALLOCATE(A(10:25),B(SIZE(A)))

DEALLOCATE(A,B,STAT=ERR_MESSAGE)

IF(ERR_MESSAGE.NE.0) PRINT *,'DEALLOCATION ERROR'

例:INTEGER,DIMENSION(:),ALLOCATABLE :: freq

READ *,limit

ALLOCATE(freq(1:limit))

DEALLOCATE(freq)

只有被ALLOCATE语句分配的内存空间才可以被DEALLOCATE语句释放,否则产生运行错误。可以使用ALLOCATED语句判断数组是否被分配,错误状态可以由ALLOCATE语句中的STAT值获得。

当过程的执行被RETURN或END语句中止时,除非可分配数组是有SAVE属性的,否则它的分配状态变成未定义的。但是,RETURN和END语句并不释放数组分配的内存,所以应该在退出子程序前主动释放数组分配的内存。

可分配数组的联合状态可以是已分配的(该数组被ALLOCATE语句分配,可以被引用、定义或释放)或是目前未联合(该数组从未分配或上一个操作是释放,数组不能被引用或定义)。

当可分配数组赋值时就被定义。

例:INTEGER, ALLOCATABLE :: A(:)

ALLOCATE(A(100))          ! A被分配但未定义,A的分配状态是己分配

A(1:100)=1                ! A被定义

DEALLOCATE(A)             ! A被释放,A的分配状态是未分配
本文来自大学力学论坛(http://www.xuelixue.cn)

ALLOCATE语句分配FORTRAN动态数组方法相关推荐

  1. 实验5.2 动态内存分配生成动态数组完成矩阵转置

    题目 使用动态内存分配生成动态数组来完成矩阵转置,使用指针实现函数的功能 AC的C++代码如下: #include<iostream> using namespace std; void ...

  2. C++中关于[]静态数组和new分配的动态数组的区别分析

    一.静态数据及动态数组的创建 静态数据: int a[10]: int a[]={1,2,3}; 数组的长度必须为常量. 动态数组: int len; int *a=new int [len]; de ...

  3. c++ 之动态数组简单介绍

    一.简单介绍 #include <iostream> #include <memory> using namespace std; int main() { //typedef ...

  4. C++ 数组、数组指针、指针数组、动态数组等详解

    文章目录 数组基础概念 数组的列表初始化 数组的赋值和拷贝?× 数组的维度 字符数组 复杂数组的解读 数组和指针 数组的遍历 多维数组 动态数组 数组基础概念 (1)数组大小固定. (2)存放类型相同 ...

  5. nginx学习七 高级数据结构之动态数组ngx_array_t

    1 ngx_array_t结构 ngx_array_t是nginx内部使用的数组结构.nginx的数组结构在存储上与大家认知的C语言内置的数组有相似性.比方实际上存储数据的区域也是一大块连续的内存. ...

  6. 研一寒假02-指针_new分配内存_使用new来创建动态数组_使用动态数组_使用delete来释放new分配的内存...

    #---------------------------------指针-----------------------------------# #include <iostream> i ...

  7. C语言动态数组建立方法

    动态数组是指在声明时没有确定数组大小的数组,即忽略圆括号中的下标:当要用它时,可随时用ReDim语句(C语言中用malloc语句)重新指出数组的大小.使用动态数组的优点是可以根据用户需要,有效利用存储 ...

  8. python fortran混合编程输入矩阵_如何将动态数组从Python传递到Fortran动态链接库

    我在Python调用fortran dll时遇到了一些问题,我真的需要一些帮助和建议. 我的问题是将动态数组传递给函数(由Fortran DLL提供).在 例如,我有一个带有动态数组的类型:Modul ...

  9. c++删除数组中重复元素_在VBA中如何使用动态数组,以及利用动态数组去除重复值的方法...

    大家好,我们今日继续讲解VBA数组与字典解决方案第22讲:在VBA中如何使用动态数组,以及利用动态数组去除重复值的方法.如果文本中含有大量的重复值,此时,如果我们要剔除重复值,该怎么办?用VBA的方法 ...

最新文章

  1. linux下听MP3
  2. vue-cli 4.x 配置 htmlWebpackPlugin.options.title
  3. mysql 函数修改无效_MySQL:无效使用组函数
  4. 移动5G套餐价格被工作人员曝光了?这价格没让我失望!
  5. 使用 Flask 框架写用户登录功能的Demo时碰到的各种坑(一)——创建应用
  6. 初学Laravel框架与ThinkPHP框架的不同
  7. IsPostBack详解
  8. Spring Cloud Gateway Session
  9. elasticsearch彻底删除文件命令行操作
  10. Typescript - enum 枚举类型(数值型枚举 / 字符串枚举 / 常量枚举 / 异构枚举 / 计算枚举成员 / 联合枚举和枚举成员类型 / 运行时的枚举 / 环境枚举 / 对象与枚举)教程
  11. 129. 求根节点到叶节点数字之和
  12. python爬虫汽车之家全车型及基本参数入数据库(截止50524个数据)(详解)
  13. 【JavaSE】算术运算符、关系运算符、逻辑运算符、赋值运算符与三元运算符
  14. Microduino王镇山:将物联网带进课堂
  15. 龙格现象及分段线性插值
  16. 刘盈盈计算机科学与技术,四川省2013年度中等职业学校省级优秀毕业生名单_29131...
  17. 洛谷P1024 [NOIP2001 提高组] 一元三次方程求解 C++ 思路加代码
  18. VS2012中--查找定义后从未被使用的函数
  19. 画世界怎么用光影_【色彩】色彩绘画时四种光影的运用~
  20. ZBlog源码资源站整站打包-带天兴娱乐资源主题+墨初用户中心插件

热门文章

  1. 美国的ACH支付体系
  2. 对随机数去重并进行排序 java
  3. 如何查看 安卓证书 的签名
  4. 网速dns怎么调快_手机dns怎么设置网速快
  5. android appwidget 空间动画,Android学习之AppWidget笔记分享
  6. C++实现模重复平方计算法
  7. 资深程序猿冒死揭开软件潜规则:无法维护的代码
  8. irq: nobody cared (try booting with the “irqpoll” option)
  9. 【从零开始的大数据学习】Flink官方教程学习笔记(一)
  10. java支付宝网站支付