Fortran基本计算之赋值语句文档格式.docx
《Fortran基本计算之赋值语句文档格式.docx》由会员分享,可在线阅读,更多相关《Fortran基本计算之赋值语句文档格式.docx(20页珍藏版)》请在冰豆网上搜索。
固有赋值:
固有赋值是把任意类型的值赋予一个非指针变量,或把一个指针变量赋予一个与之相关联的目标。
自定义赋值:
自定义赋值得以构成的前提是存在一个可访问的子例行程序,它包含一个具有ASSIGNMENT形式的赋值界面,其属性与自定义赋值语句里的变量和表达式的属性保持一致。
指针赋值:
指针赋值把一个指针变量关联到它的目标对象,或者说把一个目标对象赋予到一个指针变量。
在形式上它使用符号=>
。
过滤数组赋值:
这个赋值过程是对满足一定条件的数组元素进行赋值,而不是对数组整体进行赋值。
并行指标数组赋值。
这种赋值形式给出了一种有效的并行机制,能够大规模地对多重指标变量进行赋值。
下面我们将分节讨论这5类赋值形式,首先给出一些例子如下:
【例9-1】
X=X-2
实型的固有赋值
CHAR(5:
8)=“M_30”
逻辑型的固有赋值
SAMPLE=NOTE_2
结构的固有赋值
STRING=”MYSAMPLE”
可变串结构的自定义赋值
WHERE(X/=0.0)
A=B/X
ENDWHERE
过滤数组赋值
FORALL(I=0:
N,J=1:
N)
A(I,J)=3.0/(I-J+2)
B(I,J)%PTR=>
C(I:
N,J:
ENDFORALL
PTR=>
X
并行指标结构
并行指标赋值
并行指标指针赋值
指针赋值
9.1
固有赋值语句
所谓固有赋值的主要特征就是被赋值的变量不能是指针变量,赋值语句本身就是对变量的定义或重定义,变量的取值就是直接计算赋值语句右边的表达式所得。
不需要额外的子程序来加以说明。
下面说明固有赋值语句的用法:
固有赋值中变量与表达式所能够具有的类型,以及它们的一致性要求见表9-1。
表9-1固有赋值中变量与表达式的类型
变量的类型
表达式的类型
INTEGER
INTEGER,REAL,COMPLEX
REAL
COMPLEX
CHARACTER
变量为具有相同种别参数的CHARACTER
LOGICAL
派生类型
变量为相同的派生类型
如果变量是标量,那么表达式也必须是标量。
如果变量是数组,那么表达式或者是标量,或者是相同形状的数组。
如果变量是显形数组,那么变量的形状可以通过说明语句说明。
如果变量是待定形数组,那么它的形状由ALLOCATE语句,或指针赋值语句确定。
如果变量是哑形数组,那么它的形状由变量里的片断下标,或实元确定。
变量不能是哑尺度数组,除非存在含有最后一个维度上的上界的片断下标,或数组的下标向量,或者标量下标。
表达式的形状由算元的形状,表达式里的运算,以及其中的函数引用决定。
如果变量是一个指针,那么它必定已经关联到一个目标,赋值语句把表达式的值赋予指针的目标。
指针所关联的目标可以是一个数组,指针决定数组的秩,而每个维度的宽度则由目标决定。
在赋值过程本身被执行之前,赋值语句右边表达式以及表达式和变量里面包含的下标与下标片断表达式,都必须预先求值完毕。
如果变量的类型以及种别参数和表达式的不一致,那么在执行赋值语句之前,还必须完成必要的针对表达式的类型转换,固有转换函数见下表9-2:
表9-2
固有转换函数
被赋的值
INT(expression,KIND(variable))
REAL(expression,KIND(variable))
CMPLX(expression,KIND(variable))
LOGICAL(expression,KIND(variable))
表达式里面可以使用赋值语句左边变量的部分值。
【例9-2】
DATE(5:
10)=DATE(2:
6)
注意这是FORTAN现代版本所增加的功能,在FORTRAN77里面是不允许的。
如果变量和表达式都是字符型的,那么它们必须具有相同的种别参数值。
如果变量和表达式是具有不同长度属性的字符型对象,那么赋值过程遵循以下规则:
如果变量的长度比表达式的短,那么把表达式的右边长出来的部分截除;
如果变量的长度比表达式的长,那么在表达式的右边添加空格,直到跟变量一样长。
如果在赋值语句左边的变量里面含有表达式,例如下标表达式,那么这个表达式的计算与取值完全与赋值语句右边的表达式无关,因为左边变量的任何表达式都必须是预先完成计算的。
如果把一个标量赋值给一个数组,为了保持形状的一致性,需要把该标量扩充为一个与左边数组同样形状的数组,该数组的每个元素都是那个标量。
【例9-3】
INTEGERX(100)
X=5.0
经过赋值后X的取值为含有100个元素的数组,每个元素都是5.0。
数组的赋值过程是按照元素位置一一对应进行的。
【例9-4】设有两个相同形状的数组X和Y,有赋值语句:
X=Y
那么具体的赋值过程就是Y的元素赋予X的相同位置的元素,至于不同位置的元素是按照什么顺序来进行赋值的,并不需要考虑,可以认为所有元素的赋值是同时进行的。
对于派生类型的对象的固有赋值,变量与表达式必须是属于同一个派生类型,而赋值方法类似于数组,在相同位置的成员之间进行赋值,如果某个成员是指针,则该成员的赋值过程按照指针赋值的规则进行。
9.2
自定义赋值语句
如果需要进行赋值的变量和表达式是不符合表9-1,表9-2所规定的一致性要求的固有类型或派生类型,那么就需要使用自定义赋值语句,它提供赋值界面与相应子例行程序以供访问,从而完成赋值。
自定义赋值是由具有赋值说明符ASSIGNMENT(=)的子例行程序来完成赋值操作的。
用户可以在子例行程序当中通过定义新的规则,来扩充可以进行赋值的类型。
下面介绍自定义赋值运算的用法:
自定义赋值运算由具有两个哑元的子例行程序声明。
(子例行程序可以是外部或模块子例行程序里的对象。
)
子例行程序的哑元按照其出现的前后顺序,分别表示自定义赋值的变量与表达式。
其中第一个哑元必须具有INTENT的OUT或INOUT的属性,而第二个哑元必须具有INTENT的IN的属性。
具有ASSIGNMENT(=)形式的通用说明符的子例行程序必须带有界面块。
变量与表达式的类型以及种别参数必须与哑元保持一致。
对于一个非基本子例行程序,变量与表达式的秩必须与哑元的秩相同。
对于一个基本子例行程序,变量必须是数组,而表达式与之保持一致;
或者两者都是标量。
如果变量和表达式同时与一个基本子例行程序和一个非基本子例行程序的界面匹配,那么赋值运算由非基本子例行程序定义。
两个哑元或者有一个是派生类型,或者都是固有类型,但不满足固有赋值的一致性条件。
对变量的自定义赋值的结果由所引用的子例行程序决定。
【例9-5】
INTERFACEASSIGNMENT(=)
ELEMENTALSUBROUTINGRATIONAL_TO_REAL(L,R)
USERATIONAL_MODULE
TYPE(RATIONAL),INTENT(IN):
:
R
REAL,INTENT(OUT)
:
L
ENDSUBROUTINGRATIONAL_TO_REAL
ELEMENTALSUBROUTINGREAL_TO_RATIONAL(L,R)
REALINTENT(IN)
R
TYPE(RATIONAL),INTENT(OUT):
ENDSUBROUTINGREAL_TO_RATIONAL
ENDINTERFACE
上面的界面块通过两个外部子例行程序给出了自定义赋值,一个把派生类型RATIONAL的对象赋值给实型对象,另一个把实型对象赋值给派生类型RATIONAL的对象。
有了上面的界面块,就可以进行下面的自定义赋值:
REALR_VALUE,R_ARRAY(20)
TYPE(RATIONAL)RAT_VALUE,RAT_ARRAY(20)
R_VALUE=RATIONAL(5,8)
RAT_VALUE=6.2
9.3
指针赋值
所谓指针赋值,实际上就是把指针变量关联到一个具有TARGET属性的对象上,即使得指针变量成为目标对象的一个“别名”。
如果指针所关联的目标的状态发生改变,例如去关联,或去定义,那么指针的状态也发生相应的改变。
一旦指针赋值语句被执行之后,指针的关联状态就不会改变了,除非执行另外一个指针赋值语句来改变其状态,或执行ALLOCATE,DEALLOCATE,NULLIFY语句对指针重定义。
指针赋值的一般形式(R736)为:
pointer-object=>
target
其中指针对象(pointer-object)的一般形式(R630)为:
variable-name
structure-component
而目标(target)的一般形式(R737)为:
variable
下面说明指针赋值的用法:
如果指针对象为变量名称或结构成员,那么它们都必须具有POINTER属性。
如果目标是命名变量,那么它必须具有TARGET或POINTER属性。
如果目标是子对象指示符,那么它的父结构必须