HP OpenVMS Systems Documentation
HP Fortran for OpenVMS
References to record fields must correspond to the kind of field being referenced. Aggregate field references refer to composite structures (and substructures). Scalar field references refer to singular data items, such as variables.
An operation on a record can involve one or more fields.
Record field references take one of the following forms:
Aggregate Field Reference
Scalar Field Reference
record-nameIs the name used in a RECORD statement to identify a record.
aggregate-field-nameIs the name of a field that is a substructure (a record or a nested structure declaration) within the record structure identified by the record name.
scalar-field-nameIs the name of a data item (having a data type) defined within a structure declaration.
An automatic array cannot be a record field.
A scalar field reference consists of the name of a record (as specified in a RECORD statement) and zero or more levels of aggregate field names followed by the name of a scalar field. A scalar field reference refers to a single data item (having a data type) and can be treated like a normal reference to a Fortran variable or array element.
You can use scalar field references in statement functions and in executable statements. However, they cannot be used in COMMON, SAVE, NAMELIST, or EQUIVALENCE statements, or as the control variable in an indexed DO-loop.
Type conversion rules for scalar field references are the same as those for variables and array elements.
An aggregate field reference consists of the name of a record (as specified in a RECORD statement) and zero or more levels of aggregate field names.
You can only assign an aggregate field to another aggregate field (record = record) if the records have the same structure. HP Fortran supports no other operations (such as arithmetic or comparison) on aggregate fields.
HP Fortran requires qualification on all levels. While some languages allow omission of aggregate field names when there is no ambiguity as to which field is intended, HP Fortran requires all aggregate field names to be included in references.
You can use aggregate field references in unformatted I/O statements; one I/O record is written no matter how many aggregate and array name references appear in the I/O list. You cannot use aggregate field references in formatted, namelist, and list-directed I/O statements.
You can use aggregate field references as actual arguments and record dummy arguments. The declaration of the dummy record in the subprogram must match the form of the aggregate field reference passed by the calling program unit; each structure must have the same number and types of fields in the same order. The order of map fields within a union declaration is irrelevant.
Because periods are used in record references to separate fields, you should not use relational operators (.EQ., .XOR.), logical constants (.TRUE., .FALSE.), and logical expressions (.AND., .NOT., .OR.) as field names in structure declarations.
The following examples show record and field references. Consider the following structure declarations:
STRUCTURE /DATE/ INTEGER*1 DAY, MONTH INTEGER*2 YEAR END STRUCTURE
STRUCTURE /APPOINTMENT/ RECORD /DATE/ APP_DATE STRUCTURE /TIME/ APP_TIME(2) INTEGER*1 HOUR, MINUTE END STRUCTURE CHARACTER*20 APP_MEMO(4) LOGICAL*1 APP_FLAG END STRUCTURE
The following RECORD statement creates a variable named NEXT_APP and a 10-element array named APP_LIST. Both the variable and each element of the array take the form of the structure APPOINTMENT.
RECORD /APPOINTMENT/ NEXT_APP,APP_LIST(10)
Each of the following examples of record and field references are derived from the previous structure declarations and RECORD statement:
Aggregate Field References
Scalar Field References
The aggregate assignment statement assigns the value of each field of the aggregate on the right of an equal sign to the corresponding field of the aggregate on the left. Both aggregates must be declared with the same structure.
The following example shows valid aggregate assignments:
STRUCTURE /DATE/ INTEGER*1 DAY, MONTH INTEGER*2 YEAR END STRUCTURE RECORD /DATE/ TODAY, THIS_WEEK(7) STRUCTURE /APPOINTMENT/ ... RECORD /DATE/ APP_DATE END STRUCTURE RECORD /APPOINTMENT/ MEETING DO I = 1,7 CALL GET_DATE (TODAY) THIS_WEEK(I) = TODAY THIS_WEEK(I).DAY = TODAY.DAY + 1 END DO MEETING.APP_DATE = TODAY
This appendix describes the ASCII and DEC Multinational character sets that are available on OpenVMS systems.
Figure C-1 represents the ASCII character set (characters with decimal values 0 through 127). The first half of each of the numbered columns identifies the character as you would enter it on a terminal or as you would see it on a printer. Except for SP and HT, the characters with names are nonprintable. In Figure C-1, the characters with names are defined as follows:
|NUL||Null||DC1||Device Control 1 (XON)|
|SOH||Start of Heading||DC2||Device Control 2|
|STX||Start of Text||DC3||Device Control 3 (XOFF)|
|ETX||End of Text||DC4||Device Control 4|
|EOT||End of Transmission||NAK||Negative Acknowledge|
|ACK||Acknowledge||ETB||End of Transmission Block|
|BS||Backspace||EM||End of Medium|
|VT||Vertical Tab||FS||File Separator|
|FF||Form Feed||GS||Group Separator|
|CR||Carriage Return||RS||Record Separator|
|SO||Shift Out||US||Unit Separator|
|DLE||Data Link Escape||DEL||Delete|
The remaining half of each column identifies the character by the binary value of the byte; the value is stated in three radixes---octal, decimal, and hexadecimal. For example, the uppercase letter A has, under ASCII conventions, a storage value of hexadecimal 41 (a bit configuration of 01000001), equivalent to 101 in octal notation and 65 in decimal notation.
Figure C-1 Graphic Representation of the ASCII Character Set
The ASCII character set comprises the first half of the DEC Multinational Character Set. Figure C-2 represents the second half of the DEC Multinational Character Set (characters with decimal values 128 through 255). The first half of each of the numbered columns identifies the character as you would see it on a terminal or printer (these characters cannot be output on some older terminals and printers). The characters with names are nonprintable. In Figure C-2, the characters with names are defined as follows:
|IND||Index||PU1||Private Use 1|
|NEL||Next Line||PU2||Private Use 2|
|SSA||Start of Selected Area||STS||Set Transmit State|
|ESA||End of Selected Area||CCH||Cancel Character|
|HTS||Horizontal Tab Set||MW||Message Waiting|
|HTJ||Horizontal Tab Set with Justification||SPA||Start of Protected Area|
|VTS||Vertical Tab Set||EPA||End of Protected Area|
|PLD||Partial Line Down||CSI||Control Sequence Introducer|
|PLU||Partial Line Up||ST||String Terminator|
|RI||Reverse Index||OSC||Operating System Command|
|SS2||Single Shift 2||PM||Privacy Message|
|SS3||Single Shift 3||APC||Application|
|DCS||Device Control String|
The shaded boxes in Figure C-2 indicate positions that are not part of the character set.
Figure C-2 Graphic Representation of the DEC Multinational Extension to the ASCII Character Set
Several of the numeric intrinsic functions are defined by a model set for integers (for each integer kind used) and reals (for each real kind used). The bit functions are defined by a model set for bits (binary digits). This appendix describes these models.
For more information on the range of values for each data type (and
kind), see the HP Fortran for OpenVMS User Manual.
D.1 Model for Integer Data
In general, the model set for integers is defined as follows:
i = s x <sum symbol><limits symbol>k=1q w_k x rk-1
The model for INTEGER(4) is as follows:
i = s x <sum symbol><limits symbol>k=131 w_k x 2k-1
The following example shows the general integer model for i = --20 using a base (r) of 2:
i = (-1) x (0 x 20 + 0 x 21 + 1 x 22 + 0 x 23 + 1 x 24)
i = (-1) x (4 + 16)
i = -1 x 20
i = -20
|VAX D_floating||53 1|
For x = 0 , its exponent e and digits fk are defined to be zero.
The model set for single-precision real (REAL(4)) is defined as one of
x = 0
x = s x 2e x <left symbol><sum symbol><limits symbol>k=224 f_k x 2-k<right symbol> -125 <= e <= 128
The following example shows the general real model for x = 20.0 using a base (b) of 2:
x = 1 x 25 x (1 x 2-1 + 0 x 2-2 + 1 x 2-3)
x = 1 x 32 x (.5 + .125)
x = 32 x (.625)
x = 20.0
The model set for bits (binary digits) interprets a nonnegative scalar
data object of type integer as a sequence, as follows:
j = <sum symbol><limits symbol>k=0s-1 w_k x 2k
The following values apply to this model set:
The bits are numbered from right to left beginning with 0.
The following example shows the bit model for j = 1001 (integer 9) using a bit number (s) of 4:
1 0 0 1
<swarrow symbol> <downarrow symbol> <downarrow symbol> <searrow symbol>
w_3 w_2 w_1 w_0
j = (w_0 x 20) + (w_1 x 21) + (w_2 x 22) + (w_3 x 23)
j = 1 + 0 + 0 + 8
j = 9