Fortran基本计算之赋值语句

上传人:飞*** 文档编号:47522404 上传时间:2018-07-02 格式:PDF 页数:17 大小:50.30KB
返回 下载 相关 举报
Fortran基本计算之赋值语句_第1页
第1页 / 共17页
Fortran基本计算之赋值语句_第2页
第2页 / 共17页
Fortran基本计算之赋值语句_第3页
第3页 / 共17页
Fortran基本计算之赋值语句_第4页
第4页 / 共17页
Fortran基本计算之赋值语句_第5页
第5页 / 共17页
点击查看更多>>
资源描述

《Fortran基本计算之赋值语句》由会员分享,可在线阅读,更多相关《Fortran基本计算之赋值语句(17页珍藏版)》请在金锄头文库上搜索。

1、第9章基本计算 (一)赋值语句从计算机的实际状态来看,给出表达式并不意味着计算的开始,真正能够驱动计算的是可执行语句, 而最直接驱动表达式的计算过程的就是赋值语句,完成一个赋值步骤,就意味着机器的状态的局部或全局发生了一个根本的变化。从语法的角度来看,一个表达式还只是一个比较复杂的复合词汇,还不能构成一个完整的语句, 而赋值语句则是一个在语法意义上的完整的语句,表达式在赋值语句中扮演关键的语法作用。从计算问题的角度来看,赋值可以说是基本的计算步骤,考虑一下我们人工计算的过程就可以发现, 任何一个完整的计算步骤,都可以说就是一个赋值步骤,特别是公式演算和数值计算,完成一个局部运算过程的标志,往往

2、就是求出某个中间变量的数值或表达式。FORTRAN 语言作为一种以公式翻译为初衷的高级语言,它的赋值语句的一般形式就是一个数学等式, 当然不是那种公式恒等变换得到的恒等式,而是要把运算的结果赋予一个变量,因此它的一般句法形式为:variable = expression variable = expression 可以看到一个赋值语句作为一个完整的语句,分为三个部分: 被赋值的变量 赋值符号 计算 (表达式 ) 其中被赋值的变量,通过赋值,就拥有了明确的取值形式,如果该变量含有下标,片断下标或子串范围,则赋值的前提是它们都已经获得具体的取值。基于表达式结果的不同种类,赋值语句分为: 固有赋值:

3、固有赋值是把任意类型的值赋予一个非指针变量,或把一个指针变量赋予一个与之相关联的目标。 自定义赋值:自定义赋值得以构成的前提是存在一个可访问的子例行程序,它包含一个具有ASSIGNMENT形式的赋值界面,其属性与自定义赋值语句里的变量和表达式的属性保持一致。 指针赋值:指针赋值把一个指针变量关联到它的目标对象,或者说把一个目标对象赋予到一个指针变量。在形式上它使用符号=。 过滤数组赋值:这个赋值过程是对满足一定条件的数组元素进行赋值,而不是对数组整体进行赋值。 并行指标数组赋值。这种赋值形式给出了一种有效的并行机制,能够大规模地对多重指标变量进行赋值。下面我们将分节讨论这5 类赋值形式,首先给

4、出一些例子如下:【例 9-1】X=X-2 实型的固有赋值CHAR(5 :8)=“M_30”逻辑型的固有赋值SAMPLE=NOTE_2 结构的固有赋值STRING= ”MYSAMPLE”可变串结构的自定义赋值WHERE(X/=0.0) A=B/X END WHERE 过滤数组赋值FORALL(I=0:N,J=1:N) A(I,J)=3.0/(I-J+2) B(I,J)%PTR=C(I:N,J:N) END FORALL PTR=X 并行指标结构并行指标赋值并行指标指针赋值指针赋值9.1 固有赋值语句所谓固有赋值的主要特征就是被赋值的变量不能是指针变量,赋值语句本身就是对变量的定义或重定义,变量的

5、取值就是直接计算赋值语句右边的表达式所得。不需要额外的子程序来加以说明。下面说明固有赋值语句的用法: 固有赋值中变量与表达式所能够具有的类型,以及它们的一致性要求见表9-1。表 9-1 固有赋值中变量与表达式的类型变量的类型表达式的类型INTEGER INTEGER ,REAL ,COMPLEX REAL INTEGER ,REAL ,COMPLEX COMPLEX INTEGER ,REAL ,COMPLEX CHARACTER 变量为具有相同种别参数的CHARACTER LOGICAL LOGICAL 派生类型变量为相同的派生类型 如果变量是标量,那么表达式也必须是标量。 如果变量是数组,

6、那么表达式或者是标量,或者是相同形状的数组。 如果变量是显形数组,那么变量的形状可以通过说明语句说明。 如果变量是待定形数组,那么它的形状由ALLOCATE语句,或指针赋值语句确定。 如果变量是哑形数组,那么它的形状由变量里的片断下标,或实元确定。变量不能是哑尺度数组,除非存在含有最后一个维度上的上界的片断下标,或数组的下标向量,或者标量下标。 表达式的形状由算元的形状,表达式里的运算,以及其中的函数引用决定。 如果变量是一个指针,那么它必定已经关联到一个目标,赋值语句把表达式的值赋予指针的目标。指针所关联的目标可以是一个数组,指针决定数组的秩,而每个维度的宽度则由目标决定。 在赋值过程本身被

7、执行之前,赋值语句右边表达式以及表达式和变量里面包含的下标与下标片断表达式,都必须预先求值完毕。 如果变量的类型以及种别参数和表达式的不一致,那么在执行赋值语句之前,还必须完成必要的针对表达式的类型转换,固有转换函数见下表9-2:表 9-2 固有转换函数变量的类型被赋的值INTEGER INT(expression ,KIND(variable) REAL REAL(expression ,KIND(variable) COMPLEX CMPLX(expression ,KIND(variable) LOGICAL LOGICAL(expression ,KIND(variable) 表达式里

8、面可以使用赋值语句左边变量的部分值。【例 9-2】DATE(5 :10)=DATE(2 :6) 注意这是 FORTAN 现代版本所增加的功能,在FORTRAN77 里面是不允许的。 如果变量和表达式都是字符型的,那么它们必须具有相同的种别参数值。 如果变量和表达式是具有不同长度属性的字符型对象,那么赋值过程遵循以下规则: 如果变量的长度比表达式的短,那么把表达式的右边长出来的部分截除; 如果变量的长度比表达式的长,那么在表达式的右边添加空格,直到跟变量一样长。 如果在赋值语句左边的变量里面含有表达式,例如下标表达式,那么这个表达式的计算与取值完全与赋值语句右边的表达式无关,因为左边变量的任何表

9、达式都必须是预先完成计算的。 如果把一个标量赋值给一个数组,为了保持形状的一致性,需要把该标量扩充为一个与左边数组同样形状的数组,该数组的每个元素都是那个标量。【例 9-3】INTEGER X(100) X=5.0 经过赋值后X 的取值为含有100 个元素的数组,每个元素都是5.0。 数组的赋值过程是按照元素位置一一对应进行的。【例 9-4】 设有两个相同形状的数组X 和 Y,有赋值语句:X=Y 那么具体的赋值过程就是Y 的元素赋予X 的相同位置的元素,至于不同位置的元素是按照什么顺序来进行赋值的,并不需要考虑,可以认为所有元素的赋值是同时进行的。 对于派生类型的对象的固有赋值,变量与表达式必

10、须是属于同一个派生类型,而赋值方法类似于数组,在相同位置的成员之间进行赋值,如果某个成员是指针,则该成员的赋值过程按照指针赋值的规则进行。9.2 自定义赋值语句如果需要进行赋值的变量和表达式是不符合表9-1,表 9-2 所规定的一致性要求的固有类型或派生类型, 那么就需要使用自定义赋值语句,它提供赋值界面与相应子例行程序以供访问,从而完成赋值。自定义赋值是由具有赋值说明符ASSIGNMENT(=) 的子例行程序来完成赋值操作的。用户可以在子例行程序当中通过定义新的规则,来扩充可以进行赋值的类型。下面介绍自定义赋值运算的用法: 自定义赋值运算由具有两个哑元的子例行程序声明。(子例行程序可以是外部

11、或模块子例行程序里的对象。) 子例行程序的哑元按照其出现的前后顺序,分别表示自定义赋值的变量与表达式。其中第一个哑元必须具有INTENT 的 OUT 或 INOUT 的属性,而第二个哑元必须具有INTENT 的 IN 的属性。 具有 ASSIGNMENT(=)形式的通用说明符的子例行程序必须带有界面块。 变量与表达式的类型以及种别参数必须与哑元保持一致。 对于一个非基本子例行程序,变量与表达式的秩必须与哑元的秩相同。 对于一个基本子例行程序,变量必须是数组,而表达式与之保持一致;或者两者都是标量。 如果变量和表达式同时与一个基本子例行程序和一个非基本子例行程序的界面匹配,那么赋值运算由非基本子

12、例行程序定义。 两个哑元或者有一个是派生类型,或者都是固有类型,但不满足固有赋值的一致性条件。 对变量的自定义赋值的结果由所引用的子例行程序决定。【例 9-5】INTERFACE ASSIGNMENT(=) ELEMENTAL SUBROUTING RATIONAL_TO_REAL(L,R) USE RATIONAL_MODULE TYPE (RATIONAL), INTENT(IN) : R REAL, INTENT(OUT) :L END SUBROUTING RATIONAL_TO_REAL ELEMENTAL SUBROUTING REAL_TO_RATIONAL (L,R) USE

13、RATIONAL_MODULE REAL INTENT(IN) :R TYPE (RATIONAL), INTENT(OUT):L END SUBROUTING REAL_TO_RATIONAL END INTERFACE 上 面 的 界 面 块 通 过 两 个 外 部 子 例 行 程 序 给 出 了 自 定 义 赋 值 , 一 个 把 派 生 类 型RATIONAL的对象赋值给实型对象,另一个把实型对象赋值给派生类型RATIONAL的对象。有了上面的界面块,就可以进行下面的自定义赋值:REAL R_VALUE, R_ARRAY(20) TYPE (RATIONAL) RAT_VALUE, R

14、AT_ARRAY(20) R_VALUE=RATIONAL(5,8) RAT_VALUE=6.2 9.3 指针赋值所谓指针赋值,实际上就是把指针变量关联到一个具有TARGET 属性的对象上,即使得指针变量成为目标对象的一个“别名”。如果指针所关联的目标的状态发生改变,例如去关联,或去定义,那么指针的状态也发生相应的改变。一旦指针赋值语句被执行之后,指针的关联状态就不会改变了,除非执行另外一个指针赋值语句来改变其状态,或执行ALLOCATE ,DEALLOCATE ,NULLIFY语句对指针重定义。指针赋值的一般形式(R736)为:pointer-object= target 其中指针对象(po

15、inter-object) 的一般形式 (R630) 为:variable-name structure-component 而目标 (target)的一般形式 (R737)为:variable expression 下面说明指针赋值的用法: 如果指针对象为变量名称或结构成员,那么它们都必须具有POINTER 属性。 如果目标是命名变量,那么它必须具有TARGET 或 POINTER 属性。 如果目标是子对象指示符,那么它的父结构必须具有TARGET 或 POINTER 属性,或者它必须是一个在最右边成员具有POINTER 属性的结构引用。 目标与指针对象的类型,种别参数,长度参数,秩都必须一

16、样。 如果 =右边的变量具有TARGET 属性,那么 =左边的指针对象就被关联到该目标。 如果 =右边的变量具有POINTER 属性,并且处于关联状态,那么=左边的指针对象在指针赋值语句执行之后,也被关联到目标指针所关联的同一个数据对象。 如果 =右边的变量具有POINTER属性,并且处于去关联状态,或者右边的表达被引用到固有函数NULL ,那么 =左边的指针对象也成为去关联状态。 如果 =右边的变量具有POINTER 属性,并且处于去定义关联状态,那么=左边的指针对象也成为去定义关联状态。 指针赋值语句终止了指针对象此前所具有的任何关联状态,从而产生一个新的关联状态。 如果指针对象是待定形数组,那么指针赋值语句就能够确立指针数组每个维度的宽度,即其目标的相应维度的宽度,除非目标本身是去关联指针或去定义指针。【例 9-6】 执行以下语句:INTEGER ,TARGET : T(11:20) INTE

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 行业资料 > 其它行业文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号