fortran基础第11章
fortran
函数ASSOCIATED的一般形式为: ASSOCIATED ( P1 [,P2] )
其中,第一个参数P1为待检查的指针,第二个参数 为可选项。除下列情况外,函数的值都为假。 ⑴ P2缺省,如果P1指向某个目标变量,则函数值 为真。 ⑵ P2不缺省,且P2是一个目标变量,当P1指向P2, 则函数值为真。 ⑶ P2不缺省,且P2是一个指针变量,当P1与P2指 向同一个目标变量,则函数值为真。
指 针 赋 值 语 句 P1=>P2 的 作 用 是 断开P1与X的连接, 使P1指向Y。
12
11.1.5 指针变量的使用举例
【例11-1】 定义一个指针并指向目标,改 变目标值后打印指针与目标变 量的值。
13
PROGRAM EXAM1 IMPLICIT NONE INTEGER, TARGET :: R = 3 INTEGER, POINTER :: PR PR => R PRINT *, R, PR R = 2 * PR PRINT *, R, PR END PROGRAM EXAM1
【例11-7】动态变量的例子之三。
PROGRAM EXAM7 IMPLICIT NONE TYPE STUDENT_TYPE INTEGER :: NUM REAL :: SCORE TYPE (STUDENT_TYPE), POINTER :: NEXT END TYPE STUDENT_TYPE TYPE (STUDENT_TYPE), POINTER :: P_S1, P_S2 ALLOCATE (P_S1) ALLOCATE (P_S2) READ *, P_S1 % NUM, P_S1 % SCORE READ *, P_S2 % NUM, P_S2 % SCORE NULLIFY (P_S1 % NEXT) NULLIFY (P_S2 % NEXT) PRINT *, P_S1 %NUM, P_S1 % SCORE PRINT *, P_S2 %NUM, P_S2 % SCORE DEALLOCATE (P_S1) DEALLOCATE (P_S2) END PROGRAM EXAM7
Fluent 流固耦合基础教程
O 点处的位移和梁截面的转角可以通过有限元的形函数求得。
图9
9
图 10 给出了梁变形后其表面上流体网格节点的位置。两个端点处的流体网格没 有加以控制,而是交给 fluent 自动处理,这只是对当前这种支撑情况有效。对 于一般情况,如悬臂梁,则需要人工计算。
endif计算表面力计算表面力计算表面力计算表面力见见见62626262将数据传输到主节点将数据传输到主节点将数据传输到主节点将数据传输到主节点省略省略省略省略计算梁的响应计算梁的响应计算梁的响应计算梁的响应见见见63636363将数据传输到计算节点将数据传输到计算节点将数据传输到计算节点将数据传输到计算节点省略省略省略省略更新网格更新网格更新网格更新网格见见见6464646462626262力的计算力的计算力的计算力的计算梁表面所受到的激励分为法向力和切向力
图2 4. 流体模型 流体模型的建立是关键的一环,因为流体模型的好坏直接影响到所得解的合理性。建立好的
2
流体模型需要 利用流体力学知识对所处理的问题进行综合分析。根据流体的雷诺数和其它 特征建立合适的网格,选择合理的湍流模型和算法。我们希望流体模型能够尽量准确地捕 捉 到梁表面的力,因此准确的 near-wall 处理方法很重要。采用 wall function 还是精确地模拟 边界层,需要给出适当的理由。由于我们处理的是动力问题,希望模型对梁表面力的变化给 出准确的值。采用动态 k-epsilon 或者 k-omega 湍流模型计算所得的激励幅值明显偏小,这 是由于雷诺平均造成的。这里我们采用对流体动力特性捕捉比较好的大涡湍流模型(Large Eddy Simulation, LES)。LES 对 near-wall 处理方法要求比较高,需要边界上的第一层网格厚度 满足 y+ ~ 1。在 Gambit 里可以方便地建立边界层网格,达到以上要求。如何建立良好的网 格是个复杂的话题,这里且不涉及。
Fortran 程序基础
2021/7/1
26
数组操作
PROGRAM TEST IMPLICIT NONE ! 变量定义 REAL :: A1, A2,A3,A4,A5,B(5,5) READ(*, *)A1,A2,A3,A4,A5 ! 数组片断的引用 B(1,1:5) = A1 B(2,1:5) = A2 B(3,1:5) = A3 B(4,1:5) = A4 B(5,1:5) = A5
数组可用DIMENSION语句定义 DIMENSION runoff(365) Real runoff ※使用数组必须先定义
2021/7/1
25
数组操作
数组引用
(1)引用数组元素 数组名(下标),如 runoff(15),rain(3,5)
(2)引用全部数组 数组名,如: real B(10),A(10) B=A
2021/7/1
8
数据类型及I/0格式
变量的定义及类型说明:
(1)类型说明语句
integer year, month, day
real runoff
character*10 station
(2)隐含约定
I~N 规则
2021/7/1
9
数据类型及I/0格式
输入、输出语句
READ(设备号, 格式说明或格式说明语句标号) [变量列表] WRITE (设备号, 格式说明或格式说明语句标号) [变量列表]
其他程序控制语句 End Pause stop
2021/7/1
22
Fortran程序流程控制
实例分析
(1)1~100求和 (2)输入5个数,按大小排序
2021/7/1
23
数组操作
Fortran语言基础PPT学习教案
1.数值型常量及其类型 (1)整型常量
整型常量又称为整型常数或整数,包括正数、负 数和0。 例如:+5 -367 0 98
第9页/共65页
(2)实型常量
实型常量即实型常数或简称为实数。它有两种形式: ①小数形式:12.3 -3.5 100. .56 ② 指 数 形 式 : 5.35E5 表 示 5.35×105 , 2.66E-3 表 示 2.66×10-3
第10页/共65页
当单精度实数不足以表示一个数的大小或 精度时,可以用双精度实数表示,只是将 实数指数部分中的字母E改成字母D即可。 例如,6.85746304857D5, .3875479654765D+3等都是双精度实数。
第11页/共65页
(3)复型常量 复型常量即复型常数或简称为复数。 如:(1.0,1.0)表示复数1.0+1.0i,(2.1,-4.5) 表示复数2.1-4.5i,(-6.0,0) 表示复数-6.0。
字符串
.EQ.,.NE., ==,/=
两个操作数或者同时是任意数值 类型与任意种别参数的数值,或 者同时是具有相同种别参数的任 意长度的字符串
.GT.,.GE.,.LT.,.LE., >,>=,<,<=
两个操作数或者同时是除了复型 之外的任意数值类型与任意种别 参数的数值,或者同时是具有相 同种别参数的任意长度的字符串
end
第1页/共65页
2.1 字符集与保留字
1.字符集
FORTRAN规定允许使用的字符为:
英文字母
A-Z及a-z(大小写不区分)
阿拉伯数字
0-9
特殊符号 空格 = + - * ( ) ,. ’ : “ ! & ; < > $ ? _
第11章 Fortran概述
• 在第3章中,介绍了简单的输入输出操作(也称为 表控输入输出、直接列表输入输出)语句READ、 WRITE和PRINT。这些输入输出操作语句简单易学、 使用方便。但是如果想要使输入输出的数据更为 美观、易读易用或是想要实现一些特殊的效果, 这些简单输入输出语句就显得力不从心了。在本 章中,将介绍同高级输入输出相关的语句设置、 不同种类的格式编辑符等内容。通过本章的介绍, 就可以使程序在输入输出这方面显得更加专业。
11.2.3 READ语句引用格式说明语句
• 在从外部设备中输入时,语法形式如下: • READ(设备号, [FMT=]格式说明语句标号) [变量 列表] • 语句中,设备号表示要在其上输入数据的设备, 当设备号为星号“*”时,表示从默认的设备(一 般是键盘)输入;关键字段“FMT=”用来显示说 明其后所跟的标号为格式说明语句的标号,当 WRITE语句说明项中只含有一项时,“FMT=”可以 省略;语句中允许变量列表为空,此时READ语句 将等待输入,指导用户键入回车键。
•
ห้องสมุดไป่ตู้
•
11.4.4 D编辑符
• D编辑符适用于双精度数据的输出。其一般形式为: • Dw.d • D是英文单词“Double Precision”的首字母,表示“双精 度编辑符”。 • w仍然表示输出数据所占的字段宽度;d表示指数部分所占 的位数。具体的含义同E编辑符。 • 在使用方法上,D编辑符与E编辑符相似。只是把字母“E” 换成“D”,在数据输出时,指数部分的字母“E”用“D” 来代替。实际上,F编辑符也可用于双精度数据的输出,和 用于实型数据输出相似。但此时可能会由于不能确切估计 实际数据的大小而出现“大数印错,小数印丢”的情况。
11.2.4 第一个输入输出综合应用
fortran教程.ppt
N-S 图——结构化流程图 S=0
例2 用N-S图表示
N=1
S+1/N= S
N+1= N
直到N>100为止
打印 S 值
例1 用N-S图表示
N=0 T=0
输入 A A+T →T N+1 →N 直到N≥100 为止 打印 T
例3
L=1
N=1
S=1
SUM = 1
L+2 → L
-S → S
N+1 → N
SUM+S/L →SUM
(3)输入一个数给“收入变量”A
(4)将A和T的值相加,其和值放在变量T中 A+TT;
(5)使N的值加1,即N+1 N(N的值表示已累加数据的个数)
(6)若N﹤100,则返回(3)继续执行以后各步,否 则转到执行(7)
(7)打印出总和T的值
以上算法体现“迭代”的思想—计算机算法的最大特 点
例2 求 1
将高级语言程序(源程序)转换为机器语言程序(目标程序)
的工作由“编译程序”来完成。 编译
执行
高级语言程序
机器指令目标程序
计算结果
编译程序 (预先存如电脑)
裸机
用户源程序
操作系统
高级语言编译系统
计算机系统与操作系统关系示意图
§ 1-2 算法(Algorithm)与程序设计(Programming)
1. 近50年的丰富积累,资源不浪费,对原有程 序向下兼容。而C语言与Matlab才20多年
2. FORTRAN书写和语法要求严格,更适合于 严谨的科学计算。而C对数组不提供越界检查, 容易出错,而且不容易查出
3. FORTRAN 90~95可以直接对矩阵和复数进行 运算。而C语言则要用多重循环
fortran知识点总结
fortran知识点总结一、语法结构Fortran语言的语法结构遵循一套严格的规则。
下面是一些常见的语法结构:1. 程序单元:Fortran程序由一个或多个程序单元组成。
每个程序单元由一个或多个声明和执行语句组成。
2. 注释:在Fortran中,注释可以用来提高代码的可读性。
注释以感叹号(!)开头,直到行末为止。
3. 标识符:Fortran中的标识符由字母、数字和下划线组成,且区分大小写。
标识符用于表示变量、函数、子程序等。
4. 变量声明:在Fortran中,变量声明使用关键字“REAL”、“INTEGER”、“LOGICAL”等来指定变量的数据类型。
例如,REAL :: x 表示声明了一个实数类型的变量x。
5. 程序控制结构:Fortran提供了多种控制结构,包括顺序结构、条件结构和循环结构。
这些结构提供了程序的流程控制和逻辑控制。
6. 函数和子程序:Fortran支持函数和子程序的定义和调用。
函数和子程序可以帮助程序员组织和重用代码。
7. 模块和接口:Fortran中的模块和接口提供了一种组织代码的方式。
模块可以包含多个子程序和全局变量,接口可以用来定义子程序的接口。
二、数据类型在Fortran中,数据类型用于表示数据的类型和大小。
Fortran提供了多种数据类型,包括整数、实数、逻辑值、字符、复数等。
下面是一些常见的数据类型:1. 整数:整数类型用于表示整数值。
在Fortran中,整数类型包括“INTEGER”、“LOGICAL” 和“CHARACTER”类型。
2. 实数:实数类型用于表示实数值。
在Fortran中,实数类型包括“REAL”和“COMPLEX”类型。
REAL类型用于表示实数,COMPLEX类型用于表示复数。
3. 字符:字符类型用于表示字符值。
在Fortran中,字符类型使用CHARACTER关键字进行声明。
字符类型可以表示单个字符或者字符数组。
4. 数组:数组类型用于表示多个相同类型的数据。
Fortran教程第十一章 文件
(3)文件状态说明:
STATUS=status。status是一个字符串表达式,其值由 用户给出,可以是以下五种字符串之一: 可以是以下五种字符串之一: ·OLD:表示指定的文件是已经存在的老文件。 ·NEW:表示指定的文件尚不存在。 ·SCRATCH: 表示与单元号连接的文件为临时文件, 在关闭文件或程序中断时将自动删除。此状态不能 与说明项FILE=file共存,它只能用于由系统指定的 文件名,使该文件作为程序运行过程中的一个临时 性文件。 ·REPLACE: 表示替代在磁盘上和指定文件名同名 的文件。如果不存在这样的文件,则创建一个新文 件。 ·UNKNOWN: 表示由计算机来规定文件的状态。
(7)记录结束说明:
EOR=eor。eor为本程序单元中某条可执 行语句的标号。此说明项只能用于非推 进型的有格式顺序存取方式。当读到一 个记录结束标志时,转向执行用户指定 的这个标号其后的语句。
例11.3 按顺序存取方式在格式文件中写入三种不 同类型的数据。 CHARACTER*20 string NUMBER=123 VALUE=987.65 STRING="AN EXAMPLE" OPEN(8,FILE="FILE11-4.TXT") WRITE(8,100)number WRITE(8,200)value WRITE(8,300)string 100 FORMAT(I6) 200 FORMAT(F8.3) 300 FORMAT(A10) CLOSE(8) END
11.3 文件的读写
11.3.1 有格式顺序存取文件
READ ( [UNIT=] unit [,{ [FMT=]fmt|[NML=]nml }] [,ADVANCE=advance] [ , ERR=err] [ ,IOSTAT=iostat] [ , END=end] [ , EOR=eor] [ , SIZE=size] ) 输入项表 WRITE( [UNIT=]unit[,{[FMT=]fmt|[NML=]nml }] [,ADVANCE=advance] [ , ERR=err] [ , IOSTAT=iostat] ) 输出项表
FORTRAN语言自学基础
《FORTRAN语言》自学提纲第一章1 FORTRAN基础1. 一个FORTRAN程序由一个主程序或一个主程序与若干个子程序组成。
但一个完整的FORTRAN程序只能有一个主程序,主程序的第一个语句是PROGRAM语句,用以说明主程序的名称。
这个语句也可以省略,省略时默认为主程序的名称为MAIN。
2.FORTRAN的子程序主要有三种:⑴函数子程序,其第一个语句为FUNCTION;⑵子例行子程序,其第一个语句为SUBROUTINE;⑶数据块子程序,其第一个语句为BLOCK DATA。
主程序与各个子程序可以独立编译,最后再链接成一个可执行程序。
在编写并输入一个FORTRAN程序时,既可以将主程序与各个子程序存放在一个文件中,也可以将它们分别存放在不同的文件中。
但必须注意,主程序与各个子程序都是独立的程序单位,每个程序单位的最后一行必须用END语句作为结束。
在主程序中,虽然END语句还具有使程序停止运行的作用,但由于一个程序单位只能在最后一行有END语句,因此,在程序的其它位置处需要停止运行时,只能用STOP 语句,不能用END语句。
同样的道理,在子程序中,虽然END语句还具有使程序流程返回到调用程序的作用,但在子程序的其它位置(不是最后一行)需要返回到调用程序时,只能用RETURN语句,不能用END语句。
3.FOPTRAN源程序的书写格式有严格的规定。
⑴一行中第一列为“C”或“*”时,该行被认为是注释行。
注释行可以写在四个区中的一个区,且注释行可以出现在程序单位的任何位置。
但注释行不能有续行,需要时可以将连续若干行都定义为注释行。
⑵FORTRAN语句部分不能占用标号区及续行标志区,只能从第七列开始。
当语句太长时,可以使用续行。
在继续行的标号区内必须为空白(即继续行不允许有标号),标号只能出现在起始行上。
⑶起始行与继续行或各继续行之间的空格不起作用,因此,对于一般的语句,可以不必到72列才转为继续行,继续行也不必一定要从第7列接着写,但是,包括在引号内的字符串中的空格是有效的,因此,对于字符串要使用继续行时应特别注意,最好写到一行的72列时再转为继续行,且要从继续行的第7列接着写。
fortran与c语言接口参数传递混合编程
Sun Studio 12:Fortran 编程指南∙Previous: 第10 章并行化第11 章C-Fortran 接口本章论述Fortran 与C 的互操作性方面的问题,内容仅适用于Sun Studio Fortran 95 和C 编译器的特定情况。
11.9 Fortran 2003 与C 的互操作性简要说明了Fortran 2003 标准第15 部分中提到的C 绑定功能。
(此标准可以从国际Fortran 标准Web 站点获得)。
Fortran 95 编译器实现了标准中所述的这些功能。
如不特别注明,32 位x86 处理器视为与32 位SPARC 处理器等同。
对于64 位x86 处理器和64 位SPARC 处理器也是如此,只是x86 系统未定义REAL*16 和COMPLEX*32 数据类型,这些数据类型只能用于SPARC。
11.1 兼容性问题大多数 C-Fortran 接口必须在以下这些方面全部保持一致:∙函数和子例程的定义及调用∙数据类型的兼容性∙参数传递(按引用或按值)∙参数的顺序∙过程名(大写、小写或带有结尾下划线(_))∙向链接程序传递正确的库引用某些C-Fortran 接口还必须符合:∙数组索引及顺序∙文件描述符和stdio∙文件权限11.1.1 函数还是子例程?函数一词在 C 和Fortran 中有不同的含义。
根据具体情况做出选择很重要:∙在C 中,所有的子程序都是函数;但void函数不会返回值。
∙在Fortran 中,函数会传递一个返回值,但子例程一般不传递返回值。
当Fortran 例程调用C 函数时:∙如果被调用的C 函数返回一个值,则将其作为函数从Fortran 中调用。
∙如果被调用的C 函数不返回值,则将其作为子例程调用。
当C 函数调用Fortran 子程序时:∙如果被调用的Fortran 子程序是一个函数,则将其作为一个返回兼容数据类型的函数从 C 中调用。
∙如果被调用的Fortran 子程序是一个子例程,则将其作为一个返回int(与Fortran INTEGER*4兼容)或void值的函数从C 中调用。
Fortran基本计算之循环控制结构
第11章 基本计算(三)循环控制结构 上章讨论的控制结构的特点是通过判别条件来对结构内的块进行选择,所对应的算法结构,最简单的例子,就是解一元二次方程,在输入方程所以的参数值之后,需要首先计算一个判别式,然后根据判别式的值,再选择使用哪个公式,也就是计算的途径,才能够给出最终的解。
在本章所讨论的控制结构的特点则是针对结构内的块进行多次的重复运算,每完成一次运算,都判别一下是否需要把此次运算结果作为输入,再进行一次运算。
这种控制结构所对应的算法结构,一个最简单的例子,就是求级数的部分和。
我们知道对于具有通项表达式的级数,求它的部分和的每一项,总是需要进行同样的运算过程,如果使用按照序列形式排列的程序结构,那么需要计算多少项,就需要写下多少条语句,把它们顺序排列下来,才能做到程序走一遍即完成计算。
这样的算法设计显然是没有利用运算过程里所表现的循环结构,如果使用一种控制结构与循环过程对应,让程序的运行能够重复表示通项公式的表达式计算,就能够用一个表达式代替所有项的表达式,显然更加合理。
【例11-1】 设有一个级数:311/ni x i ==∑如果要求级数在N=K 时的值,如果一定要使用序列结构的程序,那么在程序当中肯定会出现如下K 个表达式顺序排列的情形:…I=1SUM=1/I**3I=2SUM=SUM+1/I**3I=3SUM=SUM+1/I**3…I=KSUM=SUM+1/I**3由于这K 个表达式是一样的,因此如果使用如下的一个控制结构,只需要使用一个表达式赋值语句,就可以表示整个循环运算过程:…SUM=0.0DO I=1,KSUM= SUM+1/I**3END DO上面的控制结构,就是本章所要讨论的DO结构。
实际上这是一种基本的计算过程,为很多重要算法的实现提供了基础。
FORTRAN语言提供用来进行循环控制的主要结构就是DO结构,因此本章主要讨论的就是DO结构。
最后还会简略的讨论有关分支转移的实现问题,尽管它们不属于循环控制,但是由于在现代结构性编程风格的要求下,这种分支转移是一种过时的方式,因此简略地附加在本章后面。
fortran绘图
integer(4) function GETPIXELRGB[_W]( x, y )
– 功能:取得(x,y)点的颜色,返回值为RGB模式的颜色值。
integer(2) function LINETO[_W]( x, y )
– 功能:从目前画笔位置到(x,y)间画一条直线。 – 参数:integer(2) x,y指定画线的终点,返回值如果不为0,代
5
integer(2) function SetColorRGB( color ) 用RGB方法来设定颜色,参数color中的第0~7个bits用
来设定红光,第8~15 bits用来设定绿光,第16~23 bits 用来设定蓝光,其它位不使用。Visual Fortran中以#符 号开头的数字,代表一个16进制的数字,例如使用 SetColorRGB(#FF0000)来设定颜色。 16进制数值在0~9时和10进制数字相同,但是接在9下 面的数字为A、B、C、D、E、F。其中A等于10进制的 10,B=11,C=12.....,同理可推得1016=16, FF16=255。使用16进制的系统可以比较容易来操作这 种需要控制到位内容的数值。
4
integer(4) function RGBToInteger(R,G,B) 全彩模式中,RGB三种色光可以各自有256种色阶变
化,所以一个颜色需要使用3 bytes的空间来做记录。 但是FORTRAN中通常一个整数使用4 bytes的空间来 做记录,如果分别使用3个变量来记录一个颜色值会很 浪费空间,因为这3个变量都只会使用到最低的8个位 ,其它地方都不会使用。 这个函数可以重新组合R G B这三个传入的整数,取出 这三个整数中最低8个位的数值,把它重新安排到返回 值color中。color中的第0~7 bits用存放原本的R, 8~15 bits会存放原本的G,16~23 bits会存放原本的B ,剩下第24~31 bits的空间则不会使用。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
例如: REAL,POINTER::P1,P2 含义:说明了变量P1,P2是指向实型变量的 指针 INTEGER,POINTER::PA,PB,PC 含义:说明了变量PA,PB,PC都是指向整型 变量的指针 下面语句与上述语句是等价的: INTEGER::PA,PB,PC POINTER::PA,PB,PC
28
函数ASSOCIATED的一般形式为: ASSOCIATED ( P1 [,P2] )
其中,第一个参数P1为待检查的指针,第二个参数 为可选项。除下列情况外,函数的值都为假。 ⑴ P2缺省,如果P1指向某个目标变量,则函数值 为真。 ⑵ P2不缺省,且P2是一个目标变量,当P1指向P2, 则函数值为真。 ⑶ P2不缺省,且P2是一个指针变量,当P1与P2指 向同一个目标变量,则函数值为真。
31
11.2.6 悬空指针和无法访问的内存
⒈ 悬空指针
设P1和P2是两个同类型的指针变量,执行下列语 句后会导致悬空指针。 ALLOCATE(P2) P1=>P2 DEALLOCATE (P2)
⒉ 无名内存
设P1是一个指针变量,A是一个同类型的目标变 量,执行下列语句后会导致无名内存。 ALLOCATE(P1) P1=>A
24
11.2.4 动态变量例题
【例11-5】 动态变量的例子之一。 PROGRAM EXAM5 IMPLICIT NONE REAL, POINTER :: P ALLOCATE ( P ) P = 13 PRINT *, P DEALLOCATE ( P ) END PROGRAM EXAM5
25
16
结
1.
2. 3.
论
4.
指针赋值,就是建立指针变量和目 标变量之间的指向关系。 对于一个指针变量的访问,实际上 就是对其目标变量的访问; 可以有多个指针同时指向同一个目 标变量,但一个指针变量不可能同 时指向多个目标变量; 指针赋值可以改变当前的别名。
17
【例11-4】用指针的方法实现将任意两个整型数进行交换。 PROGRAM EXAM4 IMPLICIT NONE INTEGER,POINTER::PA,PB,PC INTEGER,TARGET::A,B,C READ *,A,B PA=>A;PB=>B PRINT *,A,B C=A PC=>C;PA=PB;PB=PC PRINT *,A,B END PROGRAM EXAM4
9
11.1.4 指针赋值语句
P1=>X;P2=>Y
X P1 P2 Y
10
11.1.4 指针赋值语句
2. 注意:
指向关系建立以后,使用 X和使 用它的指针 P1 的作用是相同的, 即X和P1具有同样的值。
11
11.1.4 指针赋值语句
3. 指针赋值语句与普通赋值语 句的区别:
当P1=>X;
P2=>Y 后,普通赋值语句 P1=P2相当于赋值 语句X=Y;
32
11.3 指针数组
指针数组定义的一般形式为: 数据类型,DIMENSION(:[,:]), POINTER::V
注意: 这里的数组V一定要定义为一个假定形状数组。 有了上面的说明,V可以指向任何一个一维数组,或 二维数组。例如有下列语句: REAL,DIMENSION(:),POINTER::P REAL,DIMENSION(5,6),TARGET:: ARR P=>ARR (4,:) 使P变成了数组ARR第四行的别名。如果对P执行赋 值语句:P= 1,就是将数组ARR的第四行全部设置 为1。当然,此处的目标数组ARR必须具有TARGET 属性。
18
11.2 指针的使用
一、指针的状态 二、NULLIFY语句 三、动态变量
19
11.2.1 指针的状态
程序中的指针都处于以下两种状态之一:
未关联状态,此时指针不指向任何对象
或指向空对象(指向空对象的指针也被 称作空指针)。 关联状态,此时指针已经指向某个已经 定义的目标对象。
20
11.2.2 NULLIFY语句
P1=>R;P2=>Q PRINT *,P1,P2,R,Q P1=P2 PRINT*,P1,P2,R,Q END
P1=>R;P2=>Q PRINT*,P1,P2,R,Q P1=>P2 PRINT *,P1,P2,R,Q END
15
11.1.5 指针变量的使用举例
【例11-3】 PROGRAM EXAM3
27
11.2.5 ASSOCIATED固有函数
固有函数ASSOCIATED是一个逻辑函数, 其作用是用来检查一个指针是否指向一 个目标或是否为另一个对象的别名。 在使用这个函数时,被操作的指针必须 是有定义的,就是说它必须是某个数据 对象的别名或是一个空指针。函数 ASSOCIATED指出指针到底处于上面两种 状态的哪一种,这也提供了检查一个指 针是否为空指针的途径。
第 11 章
指针与递归
1
11.1 指针的概念
11.1.1 数据结构的概念 数据结构,指的是数据的组 织形式,也就是若干个数据之间的 连接方式。
Байду номын сангаас
2
11.1.1 数据结构的概念
逻辑结构:
结点和结点之间的逻辑关系称为数据的逻
辑结构。
存储结构:
数据在计算机中的存储表示称为数据的存
储结构。
3
常见的几种数据结构
1.
数组
数组中的数据类型必须相同 数组的引用 结构灵活,可以根据要求定义 由派生结构定义一个节点,包含一 个指针。
4
2. 3.
派生结构
链表结构
11.1.2 指针变量的定义
存放地址的变量称为 指针变量,简称指针
回忆一下普通变量的 有关知识点
指针的定义方式为: 1. 类型,POINTER :: 变量名表 2. 类型 ::变量名表 POINTER ::变量名表
6
11.1.3 目标变量及其定义
指针变量所指的对象称为目标变量 目标变量的定义格式为: 类型,TARGET :: 变量名表
例如: REAL,TARGET::A,B 含义:说明变量A,B是实型目标变量 INTEGER,TARGET::X,Y,Z 含义:说明变量X,Y,Z是整型目标变量
7
11.1.4 指针赋值语句
23
11.2.3 动态变量
DEALLOCATE语句是ALLOCATE语句的逆向操作, 其作用是释放原本分配给某个指针变量的内存空间并 置空该指针。DEALLOCATE语句的一般形式为:
DEALLOCATE ( P [, STAT = 整型变量名] )
例如: DEALLOCATE (P1) 使指针P1脱离任何一个目标体并成为一个空指针。如 图11-16所示。 P1被释放后,任何需要有值的情况都不能再使用它, 但它还是可以出现在指针赋值语句的右边。如果另外 有指针指向P1,则其也将成为一个空指针。
26
使用动态变量时,需要小心,看下面的例子。
PROGRAM EXAM REAL, POINTER :: P1, P2, P3 ALLOCATE (P1) P1 = 5 P2 => P1 DEALLOCATE( P1) ALLOCATE(P3) P3=7 PRINT *, P2 DEALLOCATE(P3) END PROGRAM EXAM
【例11-7】动态变量的例子之三。
PROGRAM EXAM7 IMPLICIT NONE TYPE STUDENT_TYPE INTEGER :: NUM REAL :: SCORE TYPE (STUDENT_TYPE), POINTER :: NEXT END TYPE STUDENT_TYPE TYPE (STUDENT_TYPE), POINTER :: P_S1, P_S2 ALLOCATE (P_S1) ALLOCATE (P_S2) READ *, P_S1 % NUM, P_S1 % SCORE READ *, P_S2 % NUM, P_S2 % SCORE NULLIFY (P_S1 % NEXT) NULLIFY (P_S2 % NEXT) PRINT *, P_S1 %NUM, P_S1 % SCORE PRINT *, P_S2 %NUM, P_S2 % SCORE DEALLOCATE (P_S1) DEALLOCATE (P_S2) END PROGRAM EXAM7
1. 指针赋值语句的一般形式为:
指针变量=> 目标变量
如: P1=>A P2=>B
8
11.1.4 指针赋值语句
指针赋值语句的说明: 指针变量和目标变量应具有相同的数 据类型。 指针赋值语句的赋值号是‘ =>’ ,读 作“指向”。 它只能用于给指针变量赋指针值,使 指针变量与目标变量之间建立指向关 系。
30
例如下面的程序将输出逻辑值F PROGRAM TEST IMPLICIT NONE REAL,TARGET,DIMENSION (4)::A=(/1,2,3,4/) REAL, POINTER, DIMENSION (:) :: P, Q P => A (1 : 3) Q => A (2 : 4) PRINT *, ASSOCIATED (P, Q) END
指 针 赋 值 语 句 P1=>P2 的 作 用 是 断开 P1 与 X 的连接 , 使P1指向Y。
12
11.1.5 指针变量的使用举例
【例11-1】 定义一个指针并指向目标,改 变目标值后打印指针与目标变 量的值。
13
PROGRAM EXAM1 IMPLICIT NONE INTEGER, TARGET :: R = 3 INTEGER, POINTER :: PR PR => R PRINT *, R, PR R = 2 * PR PRINT *, R, PR END PROGRAM EXAM1