HP 3000 Manuals

Assignment Statement (Executable) [ HP FORTRAN 77/iX Reference ] MPE/iX 5.0 Documentation


HP FORTRAN 77/iX Reference

Assignment Statement (Executable) 

The assignment statement evaluates an expression and assigns the
resulting value to a data item.  There are four kinds of assignment
statements:

   *   Arithmetic
   *   Logical
   *   Character
   *   Aggregate

[]
---------------------------------------------------------------------------------------------- | | | | | Item | Description/Default | Restrictions | | | | | ---------------------------------------------------------------------------------------------- | | | | | variable1 | Variable or array element. | If arithmetic assignment, | | array_element | | type must be integer, real, | | scalar_record_field_name | | or complex. | | substring | | | | | | If logical assignment, type | | | | must be logical. | | | | | | | | If character assignment, | | | | type must be character. | | | | | ---------------------------------------------------------------------------------------------- | | | | | expression | The expression to which the | If the variable or array | | | variable or array element is | element is arithmetic, | | | being assigned. | expression must be an | | | | arithmetic expression; if | | | | logical, expression must of | | | | type logical; if character, | | | | expression must be of type | | | | character. | | | | | ---------------------------------------------------------------------------------------------- | | | | | aggregate1 | A record with one or more | Both must be declared with | | aggregate2 | fields. | the same structure. | | | | | ---------------------------------------------------------------------------------------------- Arithmetic Assignment Statement (Executable) Semantics If the type of the variable on the left of the equal sign differs from that of the expression, type conversion takes place. The expression is evaluated and the result is converted to the type of the variable on the left. The converted result then replaces the current value of the variable. Conversion rules for the assignment statement are shown in Table 3-3 , followed by examples in Table 3-4 . See also Table 2-4 . Table 3-3. Type Conversion for Arithmetic Assignment Statements of the Form: Variable = Expression -------------------------------------------------------------------------------------------------- | | | | | | Rule | Variable Type | Expression Type | Rules | | | | | | -------------------------------------------------------------------------------------------------- | | | | | | a. | INTEGER*k | INTEGER*n | If k >= n, assign INTEGER*k. If k < n, | | | (or LOGICAL*k) | | assign least significant byte or half word | | | (see Note 3) | | to variable. See Note 1. | | | | | | -------------------------------------------------------------------------------------------------- | | | | | | b. | INTEGER*k | REAL*n | Truncation. | | | (or LOGICAL*k) | | | | | (see Note 3) | | | | | | | | -------------------------------------------------------------------------------------------------- | | | | | | c. | INTEGER*k | COMPLEX*8 | Real part is REAL*4. Apply rule b to real | | | (or LOGICAL*k) | | part. Imaginary part is not used. | | | (see Note 3) | | | | | | | | -------------------------------------------------------------------------------------------------- | | | | | | d. | INTEGER*k | COMPLEX*16 | Real part is REAL*8. Apply rule b to real | | | (or LOGICAL*k) | | part. Imaginary part is not used. | | | (see Note 3) | | | | | | | | -------------------------------------------------------------------------------------------------- | | | | | | e. | REAL*k | INTEGER*n | Float and assign REAL*k. See Note 2. | | | | | | -------------------------------------------------------------------------------------------------- | | | | | | f. | REAL*k | REAL*n | Round and assign REAL*k. | | | | | | -------------------------------------------------------------------------------------------------- | | | | | | g. | REAL*k | COMPLEX*8 | Real part is REAL*4. Apply rule f to real | | | | | part. Imaginary part is not used. | | | | | | -------------------------------------------------------------------------------------------------- | | | | | | h. | REAL*k | COMPLEX*16 | Real part is REAL*8. Apply rule f to real | | | | | part. Imaginary part is not used. | | | | | | -------------------------------------------------------------------------------------------------- | | | | | | i. | COMPLEX*8 | INTEGER or REAL | Convert to REAL*4 by rule e or f and assign | | | | | to real part. Imaginary part = 0. | | | | | | -------------------------------------------------------------------------------------------------- | | | | | | j. | COMPLEX*16 | INTEGER or REAL | Convert to REAL*8 by rule e or f and assign | | | | | to real part. Imaginary part = 0. | | | | | | -------------------------------------------------------------------------------------------------- | | | | | | k. | COMPLEX*k | COMPLEX*n | Apply rule f to real and imaginary parts. | | | | | | -------------------------------------------------------------------------------------------------- Notes for Table 3-3 1. If the value of the expression is between -32768 and +32767, the result of the conversion from INTEGER*4 to INTEGER*2 is correct; otherwise, the result is incorrect. 2. When converting from INTEGER*4 to REAL*4, the precision can be lost because INTEGER*4 holds 31 significant bits, while the number of significant bits for REAL*4 is system dependent. Refer to Chapter 10 for more details on data representation. 3. As an extension to the ANSI 77 standard, logical variables appearing in an arithmetic context may be treated as integer variables, depending upon compiler directives. In Table 3-4 , k and n represent examples of possible combinations of byte sizes for the particular data type. For example, if the variable is INTEGER*k and the expression is REAL*n, k can be 2 or 4, while n can be 4, 8, or 16. This represents six possible combinations of byte sizes. Table 3-4. Examples of Type Conversions for Arithmetic Assignment Statements of the Form: Variable = Expression ---------------------------------------------------------------------------------------------------- | | | | | | | Rule | Variable Type | Variable Value | Expression Value | Expression Type | | | | | | | ---------------------------------------------------------------------------------------------------- | | | | | | | a. | INTEGER*4 | 542 | 542 | INTEGER*2 | | | or LOGICAL*4 | | | | | | | | | | ---------------------------------------------------------------------------------------------------- | | | | | | | a. | INTEGER*2 | Undefined (see Note | 86420 | INTEGER*4 | | | or LOGICAL*2 | 1). | | | | | | | | | ---------------------------------------------------------------------------------------------------- | | | | | | | b. | INTEGER*2 | 3 | 3.842 | REAL*4 | | | or INTEGER*2 | | | | | | | | | | ---------------------------------------------------------------------------------------------------- | | | | | | | b. | INTEGER*2 | 373 | 373.7Q0 | REAL*16 | | | or LOGICAL*2 | | | | | | | | | | ---------------------------------------------------------------------------------------------------- | | | | | | | c. | INTEGER*2 | 502 | (5.0297E2,1.27E-5) | COMPLEX*8 | | | or LOGICAL*2 | | | | | | | | | | ---------------------------------------------------------------------------------------------------- | | | | | | | d. | INTEGER*4 | -48170 | (-4.817D4,1.0096D7) | COMPLEX*16 | | | or LOGICAL*4 | | | | | | | | | | ---------------------------------------------------------------------------------------------------- | | | | | | | e. | REAL*4 | 59. | 59 | INTEGER*2 | | | | | | | ---------------------------------------------------------------------------------------------------- | | | | | | | f. | REAL*8 | 10.D+09 | 10.E+09 | REAL*4 | | | | | | | ---------------------------------------------------------------------------------------------------- | | | | | | | f. | REAL*4 | 1.7014E+38 | 1.7014118344D+38 | REAL*8 | | | | | | | ---------------------------------------------------------------------------------------------------- | | | | | | | h. | REAL*4 | 8.425 | (8.425,-6.02E-2) | COMPLEX*8 | | | | | | | ---------------------------------------------------------------------------------------------------- | | | | | | | h. | REAL*8 | 2.2964D-8 | (2.2964D-8,6.2881D-4) | COMPLEX*16 | | | | | | | ---------------------------------------------------------------------------------------------------- | | | | | | | h. | REAL*16 | 3.57Q297 | (3.57D297,-1.0D32) | COMPLEX*16 | | | | | | | ---------------------------------------------------------------------------------------------------- | | | | | | | i. | COMPLEX*8 | (50.0,0) | 50 | INTEGER*2 | | | | | | | ---------------------------------------------------------------------------------------------------- | | | | | | | i. | COMPLEX*8 | (25.0,0) | 25 | REAL*4 | | | | | | | ---------------------------------------------------------------------------------------------------- | | | | | | | j. | COMPLEX*16 | (14.23D-17,0.) | 14.23E-17 | REAL*4 | | | | | | | ---------------------------------------------------------------------------------------------------- | | | | | | | j. | COMPLEX*16 | (1.0D28,0.0D0) | 1.0000000000000000000635Q28| REAL*16 | | | | | | | ---------------------------------------------------------------------------------------------------- | | | | | | | k. | COMPLEX*8 | (-4.817E4,1.0096E7 | (-4.817D4,1.0096D7) | COMPLEX*16 | | | | | | | ---------------------------------------------------------------------------------------------------- | | | | | | | k. | COMPLEX*16 | (8.425D0,_6.02D-2) | (8.425,-6.02E-2) | COMPLEX*8 | | | | | | | ---------------------------------------------------------------------------------------------------- Examples Notes -------------------------------------------------------------------------------------- total = subtotal + tally Defines the value of total as the value of subtotal + tally. sum = sum + 1 Replaces the value of sum with the value of sum + 1. rate(10) = new_rate * 5 Defines the 10th element of the array rate as the value of new_rate multiplied by 5. Logical Assignment Statement (Executable) Semantics Both the variable and the expression must logical types in a logical assignment statement. Examples Notes --------------------------------------------------------------------------------------- LOGICAL log1 log1 is assigned the value .TRUE. because i i = 10 equals 10. log1 = i .EQ. 10 LOGICAL log_res, flag_set log_res is assigned the value .FALSE. num = 100 because num is not greater than 200. flag_set = .TRUE. log_res = NUM .GT. 200 .AND. flag_set Character Assignment Statement (Executable) Semantics If the length of the variable is greater than the length of the expression, the value of the expression is left-justified in the variable, and blanks are placed in the remaining positions. If the length of the variable is less than the length of the expression, the value of the expression is truncated from the right until it is the same length as the variable. Examples Notes --------------------------------------------------------------------------------------- CHARACTER*6 name The variable name is assigned the character CHARACTER*4 instrument(6),k string "CYBELE". name = 'CYBELE' : k = 'horn' The fifth element of the array instrument instrument(5) = k is assigned the character string "horn". : instrument(4) = name(3:5) // 'L' The fourth element of the array instrument is assigned the character string "BELL". CHARACTER*21 employee_name The variable employee_name is assigned the employee_name = 'GEORGE WASHINGTON' value "GEORGE Delta WASHINGTON Delta Delta Delta Delta ". CHARACTER security_code*4 The variable security_code is assigned the security_code = 'ZXYwvu' value "ZXYw". CHARACTER address*20 The first through fourth characters of the address (1:4) = '1645' variable address are assigned the value address(6:14) = 'First St.' "1645" and the sixth through fourteenth the value "First St.". Aggregate Assignment Statement (Executable) Semantics The field values of the aggregate on the left side of the equal sign are assigned to the corresponding fields of the aggregate on the right side of the equal sign. The two aggregates must be declared with the same structure name. Examples Notes --------------------------------------------------------------------------------------- STRUCTURE/student/ A structure named student is declared with CHARACTER*32 name two fields, name, a 32-byte character type, INTEGER*2 age and age, a 2-byte integer type. END STRUCTURE STRUCTURE/teacher/ A structure named teacher is declared with CHARACTER*32 name two fields whose names and data types are INTEGER*2 age identical to the structure student. END STRUCTURE RECORD/student/math_student Two records named math_student and RECORD/student/english_student english_student are declared using the RECORD/teacher/math_teacher structure named student. One record named math_teacher is declared using the structure named teacher. math_student = english_student This is a valid aggregate assignment statement, since both variables were declared with the same structure name. math_student = math_teacher This is an illegal aggregate assignment statement, since the two variables were declared with different structure names, even though the two structures are identical in form.


MPE/iX 5.0 Documentation