ANSI X3J3/90.4
1. INTRODUCTION
1.1 Purpose
This standard specifies the form and establishes the
interpretation of programs expressed in the FORTRAN
language. The purpose of this standard is to promote
portability of FORTRAN programs for use on a variety of
data processing systems.
1.2 Processor
The combination of a data processing system and the
mechanism by which programs are transformed for use on
that data processing system is called a processor in
this standard.
1.3 Scope
1.3.1 Inclusions. This standard specifies:
(1) The form of a program written in the FORTRAN
language
(2) Rules for interpreting the meaning of such a
program and its data
(3) The form of writing input data to be processed
by such a program operating on data processing
systems
(4) The form of the output data resulting from the
use of such a program on data processing systems
1.3.2 Exclusions. This standard does not specify:
(1) The mechanism by which programs are transformed
for use on a data processing system
(2) The method of transcription of programs or their
input or output data to or from a data
processing medium
(3) The operations required for setup and control of
the use of programs on data processing systems
(4) The results when the rules of this standard fail
to establish an interpretation
(5) The size or complexity of a program and its data
that will exceed the capacity of any specific
FORTRAN 77 Full Language Page 1-1
INTRODUCTION ANSI X3J3/90.4
data processing system or the capability of a
particular processor
(6) The range or precision of numeric quantities and
the method of rounding of numeric results
(7) The physical properties of input/output records,
files, and units
(8) The physical properties and implementation of
storage
1.4 Conformance
The requirements, prohibitions, and options specified
in this standard generally refer to permissible forms
and relationships for standard-conforming programs
rather than for processors. The obvious exceptions are
the optional output forms produced by a processor,
which are not under the control of a program. The
requirements, prohibitions, and options for a
standard-conforming processor usually must be inferred
from those given for programs.
An executable program (2.4.2) conforms to this standard
if it uses only those forms and relationships described
herein and if the executable program has an
interpretation according to this standard. A program
unit (2.4) conforms to this standard if it can be
included in an executable program in a manner that
allows the executable program to be standard
conforming.
A processor conforms to this standard if it executes
standard-conforming programs in a manner that fulfills
the interpretations prescribed herein. A standard-
conforming processor may allow additional forms and
relationships provided that such additions do not
conflict with the standard forms and relationships.
However, a standard-conforming processor may allow
additional intrinsic functions (15.10) even though this
could cause a conflict with the name of an external
function in a standard-conforming program. If such a
conflict occurs, the processor is permitted to use the
intrinsic function unless the name appears in an
EXTERNAL statement within the program unit. A
standard-conforming program must not use intrinsic
functions that have been added by the processor. Note
that a standard-conforming program must not use any
forms or relationships that are prohibited by this
standard, but a standard-conforming processor may allow
FORTRAN 77 Full Language Page 1-2
INTRODUCTION ANSI X3J3/90.4
such forms and relationships if they do not change the
proper interpretation of a standard-conforming program.
Because a standard-conforming program may place demands
on the processor that are not within the scope of this
standard or may include standard items that are not
portable, such as external procedures defined by means
other than FORTRAN, conformance to this standard does
not ensure that a standard-conforming program will
execute consistently on all or any standard-conforming
processors.
1.4.1 Subset_Conformance. This standard describes two
levels of the FORTRAN language, referred to as FORTRAN
and subset FORTRAN. FORTRAN is the full language.
Subset FORTRAN is a subset of the full language.
An executable program conforms to the subset level of
this standard if it uses only those forms and
relationships described herein for that level and if
the executable program has an interpretation according
to this standard at that level and would have the same
interpretation in the full language. A program unit
conforms to the subset level of this standard if it can
be included in an executable program in a manner that
allows the executable program to be standard conforming
at that level.
A subset level processor conforms to the subset level
of this standard if it executes subset level standard-
conforming programs in a manner that fulfills the
interpretations prescribed herein for subset FORTRAN.
A subset level processor may include an extension that
has a form and would have an interpretation at the full
level only if the extension has the interpretation
provided by the full level. A subset level processor
may also include extensions that do not have forms and
interpretations in the full language.
1.5 Notation_Used_in_This_Standard
In this standard, "must" is. to be interpreted as a
requirement; conversely, "must not" is to be
interpreted as a prohibition.
In describing the form of FORTRAN statements or
constructs, the following metalanguage conventions and
symbols are used:
(1) Special characters from the FORTRAN character
set, uppercase letters, and uppercase words are
FORTRAN 77 Full Language Page 1-3
INTRODUCTION ANSI X3J3/90.4
to be written as shown, except where otherwise
noted.
(2) Lowercase letters and lowercase words indicate
general entities for which specific entities
must be substituted in actual statements. Once
a given lowercase letter or word is used in a
syntactic specification to represent an entity,
all subsequent occurrences of that letter or
word represent the same entity until that letter
or word is used in a subsequent syntactic
specification to represent a different entity.
(3) Brackets, [ ], are used to indicate optional
items.
(4) An ellipsis, ... , indicates that the preceding
optional items may appear one or more times in
succession.
(5) Blanks are used to improve readability, but
unless otherwise noted have no significance.
(6) Words or groups of words that have special
significance are underlined where their meaning
is described. Titles and the metalanguage
symbols described in 1.5(2) are also underlined.
An example illustrates the metalanguage. Given a
description of the form of a statement as:
CALL sub___ [( [a_ [,a_]...] )]
the following forms are allowed:
CALL sub___
CALL sub___ ()
CALL sub___ (a_)
CALL sub___ (a_, a_)
CALL sub___ (a_, a_, a_)
etc
When an actual statement is written, specific entities
are substituted for sub and each a_; for example:
CALL ABCD (X,1.0)
FORTRAN 77 Full Language Page 1-4
INTRODUCTION ANSI X3J3/90.4
1.6 Subset_Text
The section titles in the subset description are
identical to the section titles in the full language
description.
There are some instances in which a general situation
occurs in the full language but only a restricted case
applies to the subset. For example, in 3.6, the
"nonexecutable statements" that may appear between
executable statements may only be FORMAT statements in
the subset. In most of these instances, the more
general text of the full language description has been
retained in the subset description, even though it is
to be interpreted as covering only the restricted case.
To help find differences between the full and subset
languages, vertical bars have been added in the margins
where the text of the full and subset languages differ.
For example, this sentence does not appear in the
subset language text.
FORTRAN 77 Full Language Page 1-5
CONTENTS
1. INTRODUCTION.................................. 1-1
1.1 Purpose.................................. 1-1
1.2 Processor................................ 1-1
1.3 Scope.................................... 1-1
1.3.1 Inclusions........................ 1-1
1.3.2 Exclusions........................ 1-1
1.4 Conformance.............................. 1-2
1.4.1 Subset Conformance................ 1-3
1.5 Notation Used in This Standard........... 1-3
1.6 Subset Text.............................. 1-5
- i -
ANSI X3J3/90.4
2. FORTRAN_TERMS_AND_CONCEPTS
This section introduces basic terminology and concepts,
some of which are clarified further in later sections.
Many terms and concepts of more specialized meaning are
also introduced in later sections. The underlined
words are described here and used throughout this
standard.
2.1 Sequence
A sequence is a set ordered by a one-to-one
correspondence with the numbers 1, 2, through n_. The
number of elements in the sequence is n_. A sequence may
be empty, in which case it contains no elements.
The elements of a nonempty sequence are referred to as
the first element, second element, etc. The n_th
element, where n_ is the number of elements in the
sequence, is called the last element. An empty
sequence has no first or last element.
2.2 Syntactic_Items
Letters, digits, and special characters of the FORTRAN
character set (3.1) are used to form the syntactic
items of the FORTRAN language. The basic syntactic
items of the FORTRAN language are constants, symbolic
names, statement labels, keywords, operators, and
special characters.
The form of a constant is described in Section 4.
A symbolic name takes the form of a sequence of one to
six letters or digits, the first of which must be a
letter. Classification of symbolic names and
restrictions on their use are described in Section 18.
A statement label takes the form of a sequence of one
to five digits, one of which must be nonzero, and is
used to identify a statement (3.4).
A keyword takes the form of a specified sequence of
letters. The keywords that are significant in the
FORTRAN language are described in Sections 7 through
16. In many instances, a keyword or a portion of a
keyword also meets the requirements for a symbolic
name. Whether a particular sequence of characters
identifies a keyword or a symbolic name is implied by
context. There is no sequence of characters that is
reserved in all contexts in FORTRAN.
FORTRAN 77 Full Language Page 2-1
FORTRAN TERMS AND CONCEPTS ANSI X3J3/90.4
The set of special characters is described in 3.1.4. A
special character may be an operator or part of a
constant or have some other special meaning. The
interpretation is implied by context.
2.3 Statements,_Comments,_and_Lines
A FORTRAN statement is a sequence of syntactic items,
as described in Sections 7 through 16. Except for
assignment and statement function statements, each
statement begins with a keyword. In this standard, the
keyword or keywords that begin the statement are used
to identify that statement. For example, a DATA
statement begins with the keyword DATA.
A statement is written in one or more lines, the first
of which is called an initial line (3.2.2); succeeding
lines, if any, are called continuation lines (3.2.3).
There is also a line called a comment line (3.2.1),
which is not part of any statement and is intended to
provide documentation.
2.3.1 Classes_of_Statements. Each statement is
classified as executable or nonexecutable (Section 7).
Executable statements specify actions. Nonexecutable
statements describe the characteristics, arrangement,
and initial values of data; contain editing
information; specify statement functions; classify
program units; and specify entry points within
subprograms.
2.4 Program_Units_and_Procedures
A program unit consists of a sequence of statements and
optional comment lines. A program unit is either a
main program or a subprogram.
A main program is a program unit that does not have a
FUNCTION, SUBROUTINE, or BLOCK DATA statement as its
first statement; it may have a PROGRAM statement as its
first statement.
A subprogram is a program unit that has a FUNCTION,
SUBROUTINE, or BLOCK DATA statement as its first
statement. A subprogram whose first statement is a
FUNCTION statement is called a function subprogram. A
subprogram whose first statement is a SUBROUTINE
statement is called a subroutine subprogram. Function
subprograms and subroutine subprograms are called
procedure subprograms. A subprogram whose first
FORTRAN 77 Full Language Page 2-2
FORTRAN TERMS AND CONCEPTS ANSI X3J3/90.4
statement is a BLOCK DATA statement is called a block
data subprogram.
2.4.1 Procedures. Subroutines (15.6), external
functions (15.5), statement functions (15.4), and the
intrinsic functions (15.3) are called procedures.
Subroutines and external functions are called external
procedures. Function subprograms and subroutine
subprograms may specify one or more external functions
and subroutines, respectively (15.7). External
procedures may also be specified by means other than
FORTRAN subprograms.
2.4.2 Executable_Program. An executable program is a
collection of program units that consists of exactly
one main program and any number, including none, of
subprograms and external procedures.
2.5 Variable
A variable is an entity that has both a name and a
type. A variable name is a symbolic name of a datum.
Such a datum may be identified, defined (2.11), and
referenced (2.12). Note that the usage in this
standard of the word "variable" is more restricted than
its normal usage, in that it does not include array
elements.
The type of a variable is optionally specified by the
appearance of the variable name in a type-statement
(8.4). If it is not so specified, the type of a
variable is implied by the first letter of the variable
name to be integer or real (4.1.2), unless the initial
letter type implication is changed by the use of an
IMPLICIT statement (8.5).
At any given time during the execution of an executable
program, a variable is either defined or undefined
(2.11).
2.6 Array
An array is a nonempty sequence of data that has a name
and a type. The name of an array is a symbolic name.
2.6.1 Array_Elements. Each of the elements of an
array is called an array element. An array name
qualified by a subscript is an array element name and
identifies a particular element of the array (5.3).
Such a datum may be identified, defined (2.11), and
referenced (2.12). The number of array elements in an
FORTRAN 77 Full Language Page 2-3
FORTRAN TERMS AND CONCEPTS ANSI X3J3/90.4
array is specified by an array declarator (5.1).
An array element has a type. The type of all array
elements within an array is the same, and is optionally
specified by the appearance of the array name in a
type-statement (8.4). If it is not so specified, the
type of an array element is implied by the first letter
of the array name to be integer or real (4.1.2), unless
the initial letter type implication is changed by the
use of an IMPLICIT statement (8.5).
At any given time during the execution of an executable
program, an array element is either defined or
undefined (2.11).
2.7 Substring
A character datum is a nonempty sequence of characters.
A substring is a contiguous portion of a character
datum. The form of a substring name used to identify,
define (2.11), or reference (2.12) a substring is
described in 5.7.1.
At any given time during the execution of an executable
program, a substring is either defined or undefined
(2.11).
2.8 Dummy_Argument
A dummy argument in a procedure is either a symbolic
name or an asterisk. A symbolic name dummy argument
identifies a variable, array, or procedure that becomes
associated (2.14) with an actual argument of each
reference (2.12) to the procedure (15.2, 15.4.2,
15.5.2, and 15.6.2). An asterisk dummy argument
indicates that the corresponding actual argument is an
alternate return specifier (15.6.2.3, 15.8.3, and
15.9.3.5).
Each dummy argument name that is classified as a
variable, array, or dummy procedure may appear wherever
an actual name of the same class (Section 18) and type
may appear, except where explicitly prohibited.
2.9 Scope_of_Symbolic_Names_and_Statement_Labels
The scope of a symbolic name (18.1) is an executable
program, a program unit, a statement function
statement, or an implied-DO list in a DATA statement.
FORTRAN 77 Full Language Page 2-4
FORTRAN TERMS AND CONCEPTS ANSI X3J3/90.4
The name of the main program and the names of block
data subprograms, external functions, subroutines, and
common blocks have a scope of an executable program.
The names of variables, arrays, constants, statement
functions, intrinsic functions, and dummy procedures
have a scope of a program unit.
The names of variables that appear as dummy arguments
in a statement function statement have a scope of that
statement.
The names of variables that appear as the DO-variable
of an implied-DO in a DATA statement have a scope of
the implied-DO list.
Statement labels have a scope of a program unit.
2.10 List
A list is a nonempty sequence (2.1) of syntactic
entities separated by commas. The entities in the list
are called list items.
2.11 Definition_Status
At any gi ven time during the execution of an
executable program, the definition status of each
variable, array element, or substring is either defined
or undefined (Section 17).
A defined entity has a value. The value of a defined
!entity does not change until the entity becomes
undefined or is redefined with a different value.
If a variable, array element, or substring is
undefined, it does not have a predictable value.
A previously defined variable or array element may
become undefined. Subsequent definition of a defined
variable or array element is permitted, except where it
is explicitly prohibited.
A character variable, character array element, or
character substring is defined if every substring of
length one of the entity is defined. Note that if a
string is defined, every substring of the string is
defined, and if any substring of the string is
undefined, the string is undefined. Defining any
substring does not cause any other string or substring
to become undefined.
FORTRAN 77 Full Language Page 2-5
FORTRAN TERMS AND CONCEPTS ANSI X3J3/90.4
An entity is initially defined if it is assigned a
value in a DATA statement (Section 9). Initially
defined entities are in the defined state at the
beginning of execution of an executable program. All
variables and array elements not initially defined, or
associated (2.14) with an initially defined entity, are
undefined at the beginning of execution of an
executable program.
An entity must be defined at the time a reference to it
is executed.
2.12 Reference
A variable, array element, or substring reference is
the appearance of a variable, array element, or
substring name, respectively, in a statement in a
context requiring the value of that entity to be used
during the execution of the executable program. When a
reference to an entity is executed, its current value
is available. In this standard, the act of defining an
entity is not considered a reference to that entity.
A procedure reference is the appearance of a procedure
name in a statement in a context that requires the
actions specified by the procedure to be executed
during the execution of the executable program. When a
procedure reference is executed, the procedure must be
available.
2.13 Storage
A storage sequence is a sequence of storage units. A
storage unit is either a numeric storage unit or a
character storage unit.
An integer, real, or logical datum has one numeric
storage unit in a storage sequence. A double precision
or complex datum has two numeric storage units in a
storage sequence. A character datum has one character
storage unit in a storage sequence for each character
in the datum. This standard does not specify a
relationship between a numeric storage unit and a
character storage unit.
If a datum requires more than one storage unit in a
storage sequence, those storage units are consecutive.
The concept of a storage sequence is used to describe
relationships that exist among variables, array
elements, arrays, substrings, and common blocks. This
FORTRAN 77 Full Language Page 2-6
FORTRAN TERMS AND CONCEPTS ANSI X3J3/90.4
standard does not specify a relationship between the
storage sequence concept and the physical properties or
implementation of storage.
2.14 Association
Association of entities exists if the same datum may be
identified by different symbolic names in the same
program unit, or by the same name or a different name
in different program units of the same executable
program (17.1).
Entities may become associated by the following:
(1) Common association (8.3.4)
(2) Equivalence association (8.2.2)
(3) Argument association (15.9.3)
(4) Entry association (15.7.3)
FORTRAN 77 Full Language Page 2-7
CONTENTS
2. FORTRAN TERMS AND CONCEPTS.................... 2-1
2.1 Sequence................................ 2-1
2.2 Syntactic Items......................... 2-1
2.3 Statements, Comments, and Lines......... 2-2
2.3.1 Classes of Statements............ 2-2
2.4 Program Units and Procedures............ 2-2
2.4.1 Procedures....................... 2-3
2.4.2 Executable Program............... 2-3
2.5 Variable................................ 2-3
2.6 Array................................... 2-3
2.6.1 Array Elements................... 2-3
2.7 Substring............................... 2-4
2.8 Dummy Argument.......................... 2-4
2.9 Scope of Symbolic Names and Statement
Labels.................................. 2-4
2.10 List.................................... 2-5
2.11 Definition Status....................... 2-5
2.12 Reference............................... 2-6
2.13 Storage................................. 2-6
2.14 Association............................. 2-7
- i -
ANSI X3J3/90.4
3. CHARACTERS,_LINES,_AND_EXECUTION_SEQUENCE
3.1 FORTRAN_Character_Set
The FORTRAN character set consists of twenty-six
letters, ten digits, and thirteen special characters.
3.1.1 Letters. A letter is one of the twenty-six
characters:
A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
3.1.2 Digits. A digit is one of the ten characters:
0 1 2 3 4 5 6 7 8 9
A string of digits is interpreted in the decimal base
number system when a numeric interpretation is
appropriate.
3.1.3 Alphanumeric_Characters. An alphanumeric
character is a letter or a digit.
3.1.4 Special_Characters. A special character is one
of the thirteen characters:
8 __________________________________
Character Name of Character
8 __________________________________
Blank
8 _________________9 Equals
+ Plus
- Minus
* Asterisk
/ Slash
( Left Parenthesis
) Right Parenthesis
, Comma
$ Currency Symbol
' Apostrophe
: Colon
8 __________________________________
7 |7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|
|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|
|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|
3.1.5 Collating_Sequence_and_Graphics. The order in
which the letters are listed in 3.1.1 specifies the
collating sequence for the letters; A is less than Z.
The order in which the digits are listed in 3.1.2
specifies the collating sequence for the digits; 0 is
less than 9. The digits and letters must not be
intermixed in the collating sequence; all of the digits
must precede A or all of the digits must follow Z. The
9
FORTRAN 77 Full Language Page 3-1
CHARACTERS, LINES, AND EXECUTION SEQUENCEANSI X3J3/90.4
character blank is less than the letter A and less than
the digit 0. The order in which the special characters
are listed in 3.1.4 does not imply a collating
sequence.
Except for the currency symbol, the graphics used for
the forty-nine characters must be as given in 3.1.1,
3.1.2, and 3.1.4. However, the style of any graphic is
not specified.
3.1.6 Blank_Character. With the exception of the uses
specified (3.2.2, 3.2.3, 3.3, 4.8, 4.8.1, 13.5.1, and
13.5.2), a blank character within a program unit has no
meaning and may be used to improve the appearance of
the program unit, subject to the restriction on the
number of consecutive continuation lines (3.3).
3.2 Lines
A line in a program unit is a sequence of 72
characters. All characters must be from the FORTRAN
character set, except as described in 3.2.1, 4.8,
12.2.2, and 13.2.1.
The character positions in a line are called columns
and are numbered consecutively 1, 2, through 72. The
number indicates the sequential position of a character
in the line, beginning at the left and proceeding to
the right. Lines are ordered by the sequence in which
they are presented to the processor. Thus, a program
unit consists of a totally ordered set of characters.
3.2.1 Comment_Line. A comment line is any line that
contains a C or an asterisk in column 1, or contains
only blank characters in columns 1 through 72. A
comment line that contains a C or an asterisk in column
1 may contain any character capable of representation
in the processor in columns 2 through 72.
A comment line does not affect the executable program
in any way and may be used to provide documentation.
Comment lines may appear anywhere in the program unit.
Comment lines may precede the initial line of the first
statement of any program unit. Comment lines may
appear between an initial line and its first
continuation line or between two continuation lines.
3.2.2 Initial_Line. An initial line is any line that
is not a comment line and contains the character blank
or the digit 0 in column 6. Columns 1 through 5 may
FORTRAN 77 Full Language Page 3-2
CHARACTERS, LINES, AND EXECUTION SEQUENCEANSI X3J3/90.4
contain a statement label (3.4), or each of the columns
1 through 5 must contain the character blank.
3.2.3 Continuation_Line. A continuation line is any
line that contains any character of the FORTRAN
character set other than the character blank or the
digit 0 in column 6 and contains only blank characters
in columns 1 through 5. A statement must not have more
than nineteen continuation lines.
3.3 Statements
The statements of the FORTRAN language are described in
Sections 7 through 16 and are used to form program
units. Each statement is written in columns 7 through
72 of an initial line and as many as nineteen
continuation lines. An END statement is written only
in columns 7 through 72 of an initial line. No other
statement in a program unit may have an initial line
that appears to be an END statement. Note that a
statement must contain no more than 1320 characters.
Except as part of a logical IF statement (11.5), no
statement may begin on a line that contains any part of
the previous statement.
Blank characters preceding, within, or following a
statement do not change the interpretation of the
statement, except when they appear within the datum
strings of character constants or the H or apostrophe
edit descriptors in FORMAT statements. However, blank
characters do count as characters in the limit of total
characters allowed in any one statement.
3.4 Statement_Labels
Statement labels provide a means of referring to
individual statements. Any statement may be labeled,
but only labeled executable statements and FORMAT
statements may be referred to by the use of statement
labels. The form of a statement label is a sequence of
one to five digits, one of which must be nonzero. The
statement label may be placed anywhere in columns 1
through 5 of the initial line of the statement. The
same statement label must not be given to more than one
statement in a program unit. Blanks and leading zeros
are not significant in distinguishing between statement
labels.
FORTRAN 77 Full Language Page 3-3
CHARACTERS, LINES, AND EXECUTION SEQUENCEANSI X3J3/90.4
3.5 Order_of_Statements_and_Lines
A PROGRAM statement may appear only as the first
statement of a main program. The first statement of a
subprogram must be either a FUNCTION, SUBROUTINE, or
BLOCK DATA statement.
Within a program unit that permits the statements:
(1) FORMAT statements may appear anywhere;
(2) all specification statements must precede all
DATA statements, statement function statements,
and executable statements;
(3) all statement function statements must precede
all executable statements;
(4) DATA statements may appear anywhere after the
specification statements; and
(5) ENTRY statements may appear anywhere except
between a block IF statement and its
corresponding END IF statement, or between a DO
statement and the terminal statement of its DO-
loop.
Within the specification statements of a program unit,
IMPLICIT statements must precede all other
specification statements except PARAMETER statements.
Any specification statement that specifies the type of
a symbolic name of a constant must precede the
PARAMETER statement that defines that particular
symbolic name of a constant; the PARAMETER statement
must precede all other statements containing the
symbolic names of constants that are defined in the
PARAMETER statement.
The last line of a program unit must be an END
statement.
FORTRAN 77 Full Language Page 3-4
CHARACTERS, LINES, AND EXECUTION SEQUENCEANSI X3J3/90.4
Figure 1
Required Order of Statements and Comment Lines
8 _______________________________________________________
PROGRAM, FUNCTION, SUBROUTINE, or
BLOCK DATA Statement
8 _____________________________________________
IMPLICIT
Statements
PARAMETER8 _________________
9 Comment FORMAT Statements Other
Lines and Specification
ENTRY Statements
Statements8 _______________________________
9 Statement
Function
DATA Statements
Statements8 _________________
9 Executable
|8|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|999999999999999999999999999999999 |7|7|7|7|7|7|7|7|7|7|7|7|7|99999999999999999999999999 |7|7|7|7|7|7|7|7|7|7|7|7|7|99999999999999999999999999 Statements
8 _______________________________________________________
END Statement
8 _______________________________________________________
7 |8|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|
9 |8|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|
9 Figure 1 is a diagram of the required order of
statements and comment lines for a program unit.
Vertical lines delineate varieties of statements that
may be interspersed. For example, FORMAT statements
may be interspersed with statement function statements
and executable statements. Horizontal lines delineate
varieties of statements that must not be interspersed.
For example, statement function statements must not be
interspersed with executable statements. Note that an
END statement is also an executable statement and must
appear only as the last statement of a program unit.
3.6 Normal_Execution_Sequence_and_Transfer_of_Control
Normal execution sequence is the execution of
executable statements in the order in which they appear
in a program unit. Execution of an executable program
begins with the execution of the first executable
statement of the main program. When an external
procedure specified in a subprogram is referenced,
execution begins with the first executable statement
that follows the FUNCTION, SUBROUTINE, or ENTRY
statement that specifies the referenced procedure as
the name of a procedure.
FORTRAN 77 Full Language Page 3-5
CHARACTERS, LINES, AND EXECUTION SEQUENCEANSI X3J3/90.4
A transfer of control is an alteration of the normal
execution sequence. Statements that may cause a
transfer of control are:
(1) GO TO
(2) Arithmetic IF
(3) RETURN
(4) STOP
(5) An input/output statement containing an error
specifier or end-of-file specifier
(6) CALL with an alternate return specifier
(7) A logical IF statement containing any of the
above forms
(8) Block IF and ELSE IF
(9) The last statement, if any, of an IF-block or
ELSE IF-block
(10) DO
(11) The terminal statement of a DO-loop
(12) END
The effect of these statements on the execution
sequence is described in Sections 11, 12, and 15.
The normal execution sequence is not affected by the
appearance of nonexecutable statements or comment lines
between executable statements. Execution of a function
reference or a CALL statement is not considered a
transfer of control in the program unit that contains
the reference, except when control is returned to a
statement identified by an alternate return specifier
in a CALL statement. Execution of a RETURN or END
statement in a referenced procedure, or execution of a
transfer of control within a referenced procedure, is
not considered a transfer of control in the program
unit that contains the reference.
In the execution of an executable program, a procedure
subprogram must not be referenced a second time without
the prior execution of a RETURN or END statement in
that procedure.
FORTRAN 77 Full Language Page 3-6
CHARACTERS, LINES, AND EXECUTION SEQUENCEANSI X3J3/90.4
FORTRAN 77 Full Language Page 3-7
CONTENTS
3. CHARACTERS, LINES, AND EXECUTION SEQUENCE..... 3-
1
3.1 FORTRAN Character Set.................... 3-1
3.1.1 Letters........................... 3-1
3.1.2 Digits............................ 3-1
3.1.3 Alphanumeric Characters........... 3-1
3.1.4 Special Characters................ 3-1
3.1.5 Collating Sequence and
Graphics.......................... 3-1
3.1.6 Blank Character................... 3-2
3.2 Lines.................................... 3-2
3.2.1 Comment Line...................... 3-2
3.2.2 Initial Line...................... 3-2
3.2.3 Continuation Line................. 3-3
3.3 Statements............................... 3-3
3.4 Statement Labels......................... 3-3
3.5 Order of Statements and Lines............ 3-4
3.6 Normal Execution Sequence and Transfer
of Control............................... 3-5
- i -
ANSI X3J3/90.4
4. DATA_TYPES_AND_CONSTANTS
4.1 Data_Types
The six types of data are:
(1) Integer
(2) Real
(3) Double precision
(4) Complex
(5) Logical
(6) Character
Each type is different and may have a different
internal representation. The type may affect the
interpretation of the operations involving the datum.
4.1.1 Data_Type_of_a_Name. The name employed to
identify a datum or a function also identifies its data
type. A symbolic name representing a constant,
variable, array, or function (except a generic
function) must have only one type for each program
unit. Once a particular name is identified with a
particular type in a program unit, that type is implied
for any usage of the name in the program unit that
requires a type.
4.1.2 Type_Rules_for_Data_and_Procedure_Identifiers.
A symbolic name that identifies a constant, variable,
array, external function, or statement function may
have its type specified in a type-statement (8.4) as
integer, real, double precision, complex, logical, or
character. In the absence of an explicit declaration
in a type-statement, the type is implied by the first
letter of the name. A first letter of I, J, K, L, M,
or N implies type integer and any other letter implies
type real, unless an IMPLICIT statement (8.5) is used
to change the default implied type.
The data type of an array element name is the same as
the type of its array name.
The data type of a function name specifies the type of
the datum supplied by the function reference in an
expression.
FORTRAN 77 Full Language Page 4-1
DATA TYPES AND CONSTANTS ANSI X3J3/90.4
A symbolic name that identifies a specific intrinsic
function in a program unit has a type as specified in
15.10. An explicit type-statement is not required;
however, it is permitted. A generic function name does
not have a predetermined type; the result of a generic
function reference assumes a type that depends on the
type of the argument, as specified in 15.10. If a
generic function name appears in a type-statement, such
an appearance is not sufficient by itself to remove the
generic properties from that function.
In a program unit that contains an external function
reference, the type of the function is determined in
the same manner as for variables and arrays.
The type of an external function is specified
implicitly by its name, explicitly in a FUNCTION
statement, or explicitly in a type-statement. Note
that an IMPLICIT statement within a function subprogram
may affect the type of the external function specified
in the subprogram.
A symbolic name that identifies a main program,
subroutine, common block, or block data subprogram has
no data type.
4.1.3 Data_Type_Properties. The mathematical and
representation properties for each of the data types
are specified in the following sections. For real,
double precision, and integer data, the value zero is
considered neither positive nor negative. The value of
a signed zero is the same as the value of an unsigned
zero.
4.2 Constants
A constant is an arithmetic constant, logical constant,
or character constant. The value of a constant does
not change. Within an executable program, all
constants that have the same form have the same value.
4.2.1 Data_Type_of_a_Constant. The form of the string
representing a constant specifies both its value and
data type. A PARAMETER statement (8.6) allows a
constant to be given a symbolic name. The symbolic
name of a constant must not be used to form part of
another constant.
4.2.2 Blanks_in_Constants. Blank characters occurring
in a constant, except in a character constant, have no
effect on the value of the constant.
FORTRAN 77 Full Language Page 4-2
DATA TYPES AND CONSTANTS ANSI X3J3/90.4
4.2.3 Arithmetic_Constants. Integer, real, double
precision, and complex constants are arithmetic
constants.
4.2.3.1 Signs_of_Constants. An unsigned constant is a
constant without a leading sign. A signed constant is
a constant with a leading plus or minus sign. An
optionally signed constant is a constant that may be
either signed or unsigned. Integer, real, and double
precision constants may be optionally signed constants,
except where specified otherwise.
4.3 Integer_Type
An integer datum is always an exact representation of
an integer value. It may assume a positive, negative,
or zero value. It may assume only an integral value.
An integer datum has one numeric storage unit in a
storage sequence.
4.3.1 Integer_Constant. The form of an integer
constant is an optional sign followed by a nonempty
string of digits. The digit string is interpreted as a
decimal number.
4.4 Real_Type
A real datum is a processor approximation to the value
of a real number. It may assume a positive, negative,
or zero value. A real datum has one numeric storage
unit in a storage sequence.
4.4.1 Basic_Real_Constant. The form of a basic real
constant is an optional sign, an integer part, a
decimal point, and a fractional part, in that order.
Both the integer part and the fractional part are
strings of digits; either of these parts may be omitted
but not both. A basic real constant may be written
with more digits than a processor will use to
approximate the value of the constant. A basic real
constant is interpreted as a decimal number.
4.4.2 Real_Exponent. The form of a real exponent is
the letter E followed by an optionally signed integer
constant. A real exponent denotes a power of ten.
4.4.3 Real_Constant. The forms of a real constant
are:
(1) Basic real constant
FORTRAN 77 Full Language Page 4-3
DATA TYPES AND CONSTANTS ANSI X3J3/90.4
(2) Basic real constant followed by a real exponent
(3) Integer constant followed by a real exponent
The value of a real constant that contains a real
exponent is the product of the constant that precedes
the E and the power of ten indicated by the integer
following the E. The integer constant part of form (3)
may be written with more digits than a processor will
use to approximate the value of the constant.
4.5 Double_Precision_Type
A double precision datum is a processor approximation
to the value of a real number. The precision, although
not specified, must be greater than that of type real.
A double precision datum may assume a positive,
negative, or zero value. A double precision datum has
two consecutive numeric storage units in a storage
sequence.
4.5.1 Double_Precision_Exponent. The form of a double
precision exponent is the letter D followed by an
optionally signed integer constant. A double precision
exponent denotes a power of ten. Note that the form
and interpretation of a double precision exponent are
identical to those of a real exponent, except that the
letter D is used instead of the letter E.
4.5.2 Double_Precision_Constant. The forms of a
double precision constant are:
(1) Basic real constant followed by a double
precision exponent
(2) Integer constant followed by a double precision
exponent
The value of a double precision constant is the product
of the constant that precedes the D and the power of
ten indicated by the integer following the D. The
integer constant part of form (2) may be written with
more digits than a processor will use to approximate
the value of the constant.
4.6 Complex_Type
A complex datum is a processor approximation to the
value of a complex number. The representation of a
complex datum is in the form of an ordered pair of real
data. The first of the pair represents the real part
FORTRAN 77 Full Language Page 4-4
DATA TYPES AND CONSTANTS ANSI X3J3/90.4
of the complex datum and the second represents the
imaginary part. Each part has the same degree of
approximation as for a real datum. A complex datum has
two consecutive numeric storage units in a storage
sequence; the first storage unit is the real part and
the second storage unit is the imaginary part.
4.6.1 Complex_Constant. The form of a complex
constant is a left parenthesis followed by an ordered
pair of real or integer constants separated by a comma,
and followed by a right parenthesis. The first
constant of the pair is the real part of the complex
constant and the second is the imaginary part.
4.7 Logical_Type
A logical datum may assume only the values true or
false. A logical datum has one numeric storage unit in
a storage sequence.
4.7.1 Logical_Constant. The forms and values of a
logical constant are:
8 _________________
Form Value
8 _________________
.TRUE. true
.FALSE. false
8 _________________
7 |7|7|7|7|7|7|7|
|7|7|7|7|7|7|7|
|7|7|7|7|7|7|7|
4.8 Character_Type
A character datum is a string of characters. The
string may consist of any characters capable of
representation in the processor. The blank character
is valid and significant in a character datum. The
length of a character datum is the number of characters
in the string. A character datum has one character
storage unit in a storage sequence for each character
in the string.
Each character in the string has a character position
that is numbered consecutively 1, 2, 3, etc. The
number indicates the sequential position of a character
in the string, beginning at the left and proceeding to
the right.
9
FORTRAN 77 Full Language Page 4-5
DATA TYPES AND CONSTANTS ANSI X3J3/90.4
4.8.1 Character_Constant. The form of a character
constant is an apostrophe followed by a nonempty string
of characters followed by an apostrophe. The string
may consist of any characters capable of representation
in the processor. Note that the delimiting apostrophes
are not part of the datum represented by the constant.
An apostrophe within the datum string is represented by
two consecutive apostrophes with no intervening blanks.
In a character constant, blanks embedded between the
delimiting apostrophes are significant.
The length of a character constant is the number of
characters between the delimiting apostrophes, except
that each pair of consecutive apostrophes counts as a
single character. The delimiting apostrophes are not
counted. The length of a character constant must be
greater than zero.
FORTRAN 77 Full Language Page 4-6
CONTENTS
4. DATA TYPES AND CONSTANTS...................... 4-1
4.1 Data Types............................... 4-1
4.1.1 Data Type of a Name............... 4-1
4.1.2 Type Rules for Data and Procedure
Identifiers....................... 4-1
4.1.3 Data Type Properties.............. 4-2
4.2 Constants................................ 4-2
4.2.1 Data Type of a Constant........... 4-2
4.2.2 Blanks in Constants............... 4-2
4.2.3 Arithmetic Constants.............. 4-3
4.3 Integer Type............................. 4-3
4.3.1 Integer Constant.................. 4-3
4.4 Real Type................................ 4-3
4.4.1 Basic Real Constant............... 4-3
4.4.2 Real Exponent..................... 4-3
4.4.3 Real Constant..................... 4-3
4.5 Double Precision Type.................... 4-4
4.5.1 Double Precision Exponent......... 4-4
4.5.2 Double Precision Constant......... 4-4
4.6 Complex Type............................. 4-4
4.6.1 Complex Constant.................. 4-5
4.7 Logical Type............................. 4-5
4.7.1 Logical Constant.................. 4-5
4.8 Character Type........................... 4-5
4.8.1 Character Constant................ 4-6
- i -
ANSI X3J3/90.4
5. ARRAYS_AND_SUBSTRINGS
An array is a nonempty sequence of data. An array
element is one member of the sequence of data. An
array name is the symbolic name of an array. An array
element name is an array name qualified by a subscript
(5.3).
An array name not qualified by a subscript identifies
the entire sequence of elements of the array in certain
forms where such use is permitted (5.6); however, in an
EQUIVALENCE statement, an array name not qualified by a
subscript identifies the first element of the array
(8.2.4).
An array element name identifies one element of the
sequence. The subscript value (Table 1) specifies the
element of the array being identified. A different
array element may be identified by changing the
subscript value of the array element name.
An array name is local to a program unit (18.1.2).
A substring is a contiguous portion of a character
datum.
5.1 Array_Declarator
An array declarator specifies a symbolic name that
identifies an array within a program unit and specifies
certain properties of the array. Only one array
declarator for an array name is permitted in a program
unit.
5.1.1 Form_of_an_Array_Declarator. The form of an
array declarator is:
a_ (d_ [,d_]...)
where: a_ is the symbolic name of the array
d_ is a dimension declarator
The number of dimensions of the array is the number of
dimension declarators in the array declarator. The
minimum number of dimensions is one and the maximum is
seven.
5.1.1.1 Form_of_a_Dimension_Declarator. The form of a
dimension declarator is:
FORTRAN 77 Full Language Page 5-1
ARRAYS AND SUBSTRINGS ANSI X3J3/90.4
[d_918:] d_92
9 where: d_918 is the lower dimension bound
d_928 is the upper dimension bound
The lower and upper dimension bounds are arithmetic
expressions, called dimension bound expressions, in
which all constants, symbolic names of constants, and
variables are of type integer. The upper dimension
bound of the last dimension may be an asterisk in
assumed-size array declarators (5.1.2). A dimension
bound expression must not contain a function or array
element reference. Integer variables may appear in
dimension bound expressions only in adjustable array
declarators (5.1.2).
If the symbolic name of a constant or variable that
appears in a dimension bound expression is not of
default implied integer type (4.1.2), it must be
specified as integer by an IMPLICIT statement or a
type-statement prior to its appearance in a dimension
bound expression.
5.1.1.2 Value_of_Dimension_Bounds. The value of
either dimension bound may be positive, negative, or
zero; however, the value of the upper dimension bound
must be greater than or equal to the value of the lower
dimension bound. If only the upper dimension bound is
specified, the value of the lower dimension bound is
one. An upper dimension bound of an asterisk is always
greater than or equal to the lower dimension bound.
5.1.2 Kinds_and_Occurrences_of_Array_Declarators.
Each array declarator is either a constant array
declarator, an adjustable array declarator, or an
assumed-size array declarator. A constant array
declarator is an array declarator in which each of the
dimension bound expressions is an integer constant
expression (6.1.3.1). An adjustable array declarator
is an array declarator that contains one or more
variables. An assumed-size array declarator is a
constant array declarator or an adjustable array
declarator, except that the upper dimension bound of
the last dimension is an asterisk.
Each array declarator is either an actual array
declarator or a dummy array declarator.
FORTRAN 77 Full Language Page 5-2
ARRAYS AND SUBSTRINGS ANSI X3J3/90.4
5.1.2.1 Actual_Array_Declarator. An actual array
declarator is an array declarator in which the array
name is not a dummy argument. Each actual array
declarator must be a constant array declarator. An
actual array declarator is permitted in a DIMENSION
statement, type-statement, or COMMON statement (Section
8).
5.1.2.2 Dummy_Array_Declarator. A dummy array
declarator is an array declarator in which the array
name is a dummy argument. A dummy array declarator may
be either a constant array declarator, an adjustable
array declarator, or an assumed-size array declarator.
A dummy array declarator is permitted in a DIMENSION
statement or a type-statement but not in a COMMON
statement. A dummy array declarator may appear only in
a function or subroutine subprogram.
5.2 Properties_of_an_Array
The following properties of an array are specified by
the array declarator: the number of dimensions of the
array, the size and bounds of each dimension, and
therefore the number of array elements.
The properties of an array in a program unit are
specified by the array declarator for the array in that
program unit.
5.2.1 Data_Type_of_an_Array_and_an_Array_Element. An
array name has a data type (4.1.1). An array element
name has the same data type as the array name.
5.2.2 Dimensions_of_an_Array. The number of
dimensions of an array is equal to the number of
dimension declarators in the array declarator.
The size of a dimension is the value:
d_928 - d_918 + 1
where: d_918 is the value of the lower dimension bound
d_928 is the value of the upper dimension bound
Note that if the value of the lower dimension bound is
one, the size of the dimension is d_928.
The size of a dimension whose upper bound is an
asterisk is not specified.
FORTRAN 77 Full Language Page 5-3
ARRAYS AND SUBSTRINGS ANSI X3J3/90.4
The number and size of dimensions in one array
declarator may be different from the number and size of
dimensions in another array declarator that is
associated by common, equivalence, or argument
association.
5.2.3 Size_of_an_Array. The size of an array is equal
to the number of elements in the array. The size of an
array is equal to the product of the sizes of the
dimensions specified by the array declarator for that
array name. The size of an assumed-size dummy array
(5.5) is determined as follows:
(1) If the actual argument corresponding to the
dummy array is a noncharacter array name, the
size of the dummy array is the size of the
actual argument array.
(2) If the actual argument corresponding to the
dummy array name is a noncharacter array element
name with a subscript value of r_ in an array of
size x_, the size of the dummy array is x_ + 1 - r_
.
(3) If the actual argument is a character array
name, character array element name, or character
array element substring name and begins at
character storage unit t_ of an array with c_
character storage units, then the size of the
dummy array is INT((c_ + 1 - t_) / ln__), where ln__
is the length of an element of the dummy array.
If an assumed-size dummy array has n_ dimensions, the
product of the sizes of the first n_ - 1 dimensions must
be less than or equal to the size of the array, as
determined by one of the immediately preceding rules.
5.2.4 Array_Element_Ordering. The elements of an
array are ordered in a sequence (2.1). An array
element name contains a subscript (5.4.1) whose
subscript value (5.4.3) determines which element of the
array is identified by the array element name. The
first element of the array has a subscript value of
one; the second element has a subscript value of two;
the last element has a subscript value equal to the
size of the array.
Whenever an array name unqualified by a subscript is
used to designate the whole array (5.6), the appearance
of the array name implies that the number of values to
be processed is equal to the number of elements in the
FORTRAN 77 Full Language Page 5-4
ARRAYS AND SUBSTRINGS ANSI X3J3/90.4
array and that the elements of the array are to be
taken in sequential order.
5.2.5 Array_Storage_Sequence. An array has a storage
sequence consisting of the storage sequences of the
array elements in the order determined by the array
element ordering. The number of storage units in an
array is x_*z_, where x_ is the number of the elements in
the array and z_ is the number of storage units for each
array element.
5.3 Array_Element_Name
The form of an array element name is:
a_ (s_ [,s_]...)
where: a_ is the array name
(s_ [,s_]...) is a subscript (5.4.1)
s_ is a subscript expression (5.4.2)
The number of subscript expressions must be equal to
the number of dimensions in the array declarator for
the array name.
5.4 Subscript
5.4.1 Form_of_a_Subscript. The form of a subscript
is:
(s_ [,s_]...)
where s_ is a subscript expression.
Note that the term "subscript" includes the parentheses
that delimit the list of subscript expressions.
5.4.2 Subscript_Expression. A subscript expression is
an integer expression. A subscript expression may
contain array element references and function
references. Note that a restriction in the evaluation
of expressions (6.6) prohibits certain side effects.
In particular, evaluation of a function must not alter
the value of any other subscript expression within the
same subscript.
Within a program unit, the value of each subscript
expression must be greater than or equal to the
corresponding lower dimension bound in the array
FORTRAN 77 Full Language Page 5-5
ARRAYS AND SUBSTRINGS ANSI X3J3/90.4
declarator for the array. The value of each subscript
expression must not exceed the corresponding upper
dimension bound declared for the array in the program
unit. If the upper dimension bound is an asterisk, the
value of the corresponding subscript expression must be
such that the subscript value does not exceed the size
of the dummy array.
5.4.3 Subscript_Value. The subscript value of a
subscript is specified in Table 1. The subscript value
determines which array element is identified by the
array element name. Within a program unit, the
subscript value depends on the values of the subscript
expressions in the subscript and on the dimensions of
the array specified in the array declarator for the
array in the program unit. If the subscript value is r_
, the r_th element of the array is identified.
FORTRAN 77 Full Language Page 5-6
ARRAYS AND SUBSTRINGS ANSI X3J3/90.4
Table 1_______
Subscript Value
8 _________________________________________________________
n Dimension Subscript Subscript
Declarator Value
8 _________________________________________________________
1 (j918:k918) (s918) 1+(s918-j918)
8 _________________________________________________________
2 (j918:k918,j928:k928) (s918,s928) 1+(s918-j918)
+(s928-j928)*d91
8
8 _________________________________________________________
3 (j918:k918,j928:k928,j938:k938) (s918,s928,s938) 1+(s918-j918)
+(s928-j928)*d91
8 +(s938-j938)*d928*d91
8
8 _________________________________________________________
8 _________________________________________________________
n (j918:k918,...,j9n8:k9n8) (s918,...,s9n8) 1+(s918-j918)
+(s928-j928)*d91
8 +(s938-j938)*d928*d91
8 +...
+(s9n8-j9n8)*d9n-1
8 *d9n-28*...*d91
8
8 _________________________________________________________
7 |7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|
|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|
|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|
|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|
|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|
Notes for Table 1:
(1) n is the number of dimensions, 1 < n < 7.
(2) j9i8 is the value of the lower bound of the ith
dimension.
(3) k9i8 is the value of the upper bound of the ith
dimension.
(4) If only the upper bound is specified, then j9i8% =
1.
(5) s9i8 is the integer value of the ith subscript
expression.
9
FORTRAN 77 Full Language Page 5-7
ARRAYS AND SUBSTRINGS ANSI X3J3/90.4
(6) d9i8 = k9i8-j9i8+1 is the size of the ith dimension.
If the value of the lower bound is 1, then d9i8 =
k9i8.
Note that a subscript of the form (j918,...j9n8) has a
subscript value of one and identifies the first element
of the array. A subscript of the form (k918,...,k9n8)
identifies the last element of the array; its subscript
value is equal to the number of elements in the array.
The subscript value and the subscript expression value
are not necessarily the same, even for a one-
dimensional array. In the example:
DIMENSION A(-1:8),B(10,10)
A(2) = B(1,2)
A(2) identifies the fourth element of A, the subscript
is (2) with a subscript value of four, and the
subscript expression is 2 with a value of two. B(1,2)
identifies the eleventh element of B, the subscript is
(1,2) with a subscript value of eleven, and the
subscript expressions are 1 and 2 with values of one
and two.
5.5 Dummy_and_Actual_Arrays
A dummy array is an array for which the array
declarator is a dummy array declarator. An assumed-
size dummy array is a dummy array for which the array
declarator is an assumed-size array declarator. A
dummy array is permitted only in a function or
subroutine subprogram (Section 15).
An actual array is an array for which the array
declarator is an actual array declarator. Each array
in the main program is an actual array and must have a
constant array declarator. A dummy array may be used
as an actual argument.
5.5.1 Adjustable_Arrays_and_Adjustable_Dimensions. An
adjustable array is an array for which the array
declarator is an adjustable array declarator. In an
adjustable array declarator, those dimension
declarators that contain a variable name are called
adjustable dimensions.
An adjustable array declarator must be a dummy array
declarator. At least one dummy argument list of the
subprogram must contain the name of the adjustable
array. A variable name that appears in a dimension
FORTRAN 77 Full Language Page 5-8
ARRAYS AND SUBSTRINGS ANSI X3J3/90.4
bound expression of an array must also appear as a name
either in every dummy argument list that contains the
array name or in a common block in that subprogram.
At the time of execution of a reference to a function
or subroutine containing an adjustable array in its
dummy argument list, each actual argument that
corresponds to a dummy argument appearing in a
dimension bound expression for the array and each
variable in common appearing in a dimension bound
expression for the array must be defined with an
integer value. The values of those dummy arguments or
variables in common, together with any constants and
symbolic names of constants appearing in the dimension
bound expression, determine the size of the
corresponding adjustable dimension for the execution of
the subprogram. The sizes of the adjustable dimensions
and of any constant dimensions appearing in an
adjustable array declarator determine the number of
elements in the array and the array element ordering.
The execution of different references to a subprogram
or different executions of the same reference determine
possibly different properties (size of dimensions,
dimension bounds, number of elements, and array element
ordering) for each adjustable array in the subprogram.
These properties depend on the values of any actual
arguments and variables in common that are referenced
in the adjustable dimension expressions in the
subprogram.
During the execution of an external procedure in a
subprogram containing an adjustable array, the array
properties of dimension size, lower and upper dimension
bounds, and array size (number of elements in the
array) do not change. However, the variables involved
in an adjustable dimension may be redefined or become
undefined during execution of the external procedure
with no effect on the above-mentioned properties.
5.6 Use_of_Array_Names
In a program unit, each appearance of an array name
must be in an array element name except in the
following cases:
(1) In a list of dummy arguments
(2) In a COMMON statement
(3) In a type-statement
FORTRAN 77 Full Language Page 5-9
ARRAYS AND SUBSTRINGS ANSI X3J3/90.4
(4) In an array declarator. Note that although the
form of an array declarator may be identical to
that of an array element name, an array
declarator is not an array element name.
(5) In an EQUIVALENCE statement
(6) In a DATA statement
(7) In the list of actual arguments in a reference
to an external procedure
(8) In the list of an input/output statement if the
array is not an assumed-size dummy array
(9) As a unit identifier for an internal file in an
input/output statement if the array is not an
assumed-size dummy array
(10) As the format identifier in an input/output
statement if the array is not an assumed-size
dummy array
(11) In a SAVE statement
5.7 Character_Substring
A character substring is a contiguous portion of a
character datum and is of type character. A character
substring is identified by a substring name and may be
assigned values and referenced.
5.7.1 Substring_Name. The forms of a substring name
are:
v_ ( [e_918] : [e_928] )
a_ (s_ [,s_]...)( [e_918] : [e_928] )
where: v_ is a character variable name
a_ (s_ [,s_]...) is a character array element name
e_918 and e_928 are each an integer expression and are
called substring expressions
The value e_918 specifies the leftmost character position
of the substring, and the value e_928 specifies the
rightmost character position. For example, A(2:4)
specifies characters in positions two through four of
the character variable A, and B(4,3)(1:6) specifies
FORTRAN 77 Full Language Page 5-10
ARRAYS AND SUBSTRINGS ANSI X3J3/90.4
characters in positions one through six of the
character array element B(4,3).
The values of e_918 and e_928 must be such that:
1 < e_918 < e_928 < len___
where len is the length of the character variable or
array element (8.4.2). If e_918 is omitted, a value of
one is implied for e_918. If e_928 is omitted, a value of
len is implied for e_928. Both e_918 and e_928 may be omitted;
for example, the form v_(:) is equivalent to v_, and the
form a_ (s_ [,s_]...)(:) is equivalent to a_(s_ [,s_]...).
The length of a character substring is e_928 - e_918 + 1.
5.7.2 Substring_Expression. A substring expression
may be any integer expression. A substring expression
may contain array element references and function
references. Note that a restriction in the evaluation
of expressions (6.6) prohibits certain side effects.
In particular, evaluation of a function must not alter
the value of any other expression within the same
substring name.
FORTRAN 77 Full Language Page 5-11
CONTENTS
5. ARRAYS AND SUBSTRINGS........................ 5-1
5.1 Array Declarator........................ 5-1
5.1.1 Form of an Array
Declarator....................... 5-1
5.1.2 Kinds and Occurrences of Array
Declarators...................... 5-2
5.2 Properties of an Array.................. 5-3
5.2.1 Data Type of an Array and an
Array Element.................... 5-3
5.2.2 Dimensions of an Array........... 5-3
5.2.3 Size of an Array................. 5-4
5.2.4 Array Element Ordering........... 5-4
5.2.5 Array Storage Sequence........... 5-5
5.3 Array Element Name...................... 5-5
5.4 Subscript............................... 5-5
5.4.1 Form of a Subscript.............. 5-5
5.4.2 Subscript Expression............. 5-5
5.4.3 Subscript Value.................. 5-6
5.5 Dummy and Actual Arrays................. 5-8
5.5.1 Adjustable Arrays and Adjustable
Dimensions....................... 5-8
5.6 Use of Array Names...................... 5-9
5.7 Character Substring..................... 5-10
5.7.1 Substring Name................... 5-10
5.7.2 Substring Expression............. 5-11
- i -
ANSI X3J3/90.4
6. EXPRESSIONS
This section describes the formation, interpretation,
and evaluation rules for arithmetic, character,
relational, and logical expressions. An expression is
formed from operands, operators, and parentheses.
6.1 Arithmetic_Expressions
An arithmetic expression is used to express a numeric
computation. Evaluation of an arithmetic expression
produces a numeric !value.
The simplest form of an arithmetic expression is an
unsigned arithmetic constant, symbolic name of an
arithmetic constant, arithmetic variable reference,
arithmetic array element reference, or arithmetic
function reference. More complicated arithmetic
expressions may be formed by using one or more
arithmetic operands together with arithmetic operators
and parentheses. Arithmetic operands must identify
values of type integer, real, double precision, or
complex.
6.1.1 Arithmetic_Operators. The five arithmetic
operators are:
8 ____________________________________
Operator Representing
8 ____________________________________
** Exponentiation
/ Division
* Multiplication
- Subtraction or Negation
+ Addition or Identity
8 ____________________________________
7 |7|7|7|7|7|7|7|7|
|7|7|7|7|7|7|7|7|
|7|7|7|7|7|7|7|7|
Each of the operators **, /, and * operates on a pair
of operands and is written between the two operands.
Each of the operators + and - either:
(1) operates on a pair of operands and is written
between the two operands, or
(2) operates on a single operand and is written
preceding that operand.
9
FORTRAN 77 Full Language Page 6-1
EXPRESSIONS ANSI X3J3/90.4
6.1.2 Form and Interpretation of Arithmetic
Expressions. The interpretation of the expression
formed with each of the arithmetic operators in each
form of use is as follows:
8 ___________________________________________________
Use of Operator Interpretation
8 ___________________________________________________
x918 ** x928 Exponentiate x918 to the power x92
8
x918 / x928 Divide x918 by x92
8
x918 * x928 Multiply x918 and x92
8
x918 - x928 Subtract x928 from x91
8
- x928 Negate x92
8
x918 + x928 Add x918 and x92
8
+ x928 Same as x92
7 ___________________________________________________
7 |7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|
|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|
|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|
where: x918 denotes the operand to the left of the
operator
x928 denotes the operand to the right of the
operator
The interpretation of a division may depend on the data
types of the operands (6.1.5).
A set of formation rules is used to establish the
interpretation of an arithmetic expression that
contains two or more operators. There is a precedence
among the arithmetic operators, which determines the
order in which the operands are to be combined unless
the order is changed by the use of parentheses. The
precedence of the arithmetic operators is as follows:
8 _________________________
Operator Precedence
8 _________________________
** Highest
* and / Intermediate
+ and - Lowest
8 _________________________
7 |7|7|7|7|7|7|
|7|7|7|7|7|7|
|7|7|7|7|7|7|
For example, in the expression
FORTRAN 77 Full Language Page 6-2
EXPRESSIONS ANSI X3J3/90.4
- A ** 2
the exponentiation operator (**) has precedence over
the negation operator (-); therefore, the operands of
the exponentiation operator are combined to form an
expression that is used as the operand of the negation
operator. The interpretation of the above expression
is the same as the interpretation of the expression
- (A ** 2)
The arithmetic operands are:
(1) Primary
(2) Factor
(3) Term
(4) Arithmetic expression
The formation rules to be applied in establishing the
interpretation of arithmetic expressions are in 6.1.2.1
through 6.1.2.4.
6.1.2.1 Primaries. The primaries are:
(1) Unsigned arithmetic constant (4.2.3)
(2) Symbolic name of an arithmetic constant (8.6)
(3) Arithmetic variable reference (2.5)
(4) Arithmetic array element reference (5.3)
(5) Arithmetic function reference (15.2)
(6) Arithmetic expression enclosed in parentheses
(6.1.2.4)
6.1.2.2 Factor. The forms of a factor are:
(1) Primary
(2) Primary ** factor
Thus, a factor is formed from a sequence of one or more
primaries separated by the exponentiation operator.
Form (2) indicates that in interpreting a factor
containing two or more exponentiation operators, the
primaries are combined from right to left. For
FORTRAN 77 Full Language Page 6-3
EXPRESSIONS ANSI X3J3/90.4
example, the factor
2**3**2
has the same interpretation as the factor
2**(3**2)
6.1.2.3 Term. The forms of a term are:
(1) Factor
(2) Term / factor
(3) Term * factor
Thus, a term is formed from a sequence of one or more
factors separated by either the multiplication operator
or the division operator. Forms (2) and (3) indicate
that in interpreting a term containing two or more
multiplication or division operators, the factors are
combined from left to right.
6.1.2.4 Arithmetic_Expression. The forms of an
arithmetic expression are:
(1) Term
(2) + term
(3) - term
(4) Arithmetic expression + term
(5) Arithmetic expression - term
Thus, an arithmetic expression is formed from a
sequence of one or more terms separated by either the
addition operator or the subtraction operator. The
first term in an arithmetic expression may be preceded
by the identity or the negation operator. Forms (4)
and (5) indicate that in interpreting an arithmetic
expression containing two or more addition or
subtraction operators, the terms are combined from left
to right.
Note that these formation rules do not permit
expressions containing two consecutive arithmetic
operators, such as A**-B or A+-B. However, expressions
such as A**(-B) and A+(-B) are permitted.
FORTRAN 77 Full Language Page 6-4
EXPRESSIONS ANSI X3J3/90.4
6.1.3 Arithmetic_Constant_Expression. An arithmetic
constant expression is an arithmetic expression in
which each primary is an arithmetic constant, the
symbolic name of an arithmetic constant, or an
arithmetic constant expression enclosed in parentheses.
The exponentiation operator is not permitted unless the
exponent is of type integer. Note that variable, array
element, and function references are not allowed.
6.1.3.1 Integer_Constant_Expression. An integer
constant expression is an arithmetic constant
expression in which each constant or symbolic name of a
constant is of type integer. Note that variable, array
element, and function references are not allowed.
The following are examples of integer constant
expressions:
3
-3
-3+4
6.1.4 Type and Interpretation of Arithmetic
Expressions. The data type of a constant is determined
by the form of the constant (4.2.1). The data type of
an arithmetic variable reference, symbolic name of an
arithmetic constant, arithmetic array element
reference, or arithmetic function reference is
determined by the name of the datum or function
(4.1.2). The data type of an arithmetic expression
containing one or more arithmetic operators is
determined from the data types of the operands.
Integer expressions, real expressions, double precision
expressions, and complex expressions are arithmetic
expressions whose values are of type integer, real,
double precision, and complex, respectively.
When the operator + or - operates on a single operand,
the data type of the resulting expression is the same
as the data type of the operand.
When an arithmetic operator operates on a pair of
operands, the data type of the resulting expression is
given in Tables 2 and 3. In these tables, each letter
I, R, D, or C represents an operand or result of type
integer, real, double precision, or complex,
respectively.
The type of the result is indicated by the I, R, D, or
C that precedes the equals, and the interpretation is
FORTRAN 77 Full Language Page 6-5
EXPRESSIONS ANSI X3J3/90.4
indicated by the expression to the right of the equals.
REAL, DBLE, and CMPLX are the type-conversion functions
described in 15.10.
Table 2_______
Type and Interpretation of Result for x918 + x92
7 ________________________________________________________
x928 I928 R92
8 x91
7 ________________________________________________________
I918 I = I918 + I928 R = REAL(I918) + R92
8
R918 R = R918 + REAL(I928) R = R918 + R92
8
D918 D = D918 + DBLE(I928) D = D918 + DBLE(R928)
C918 C=C918+CMPLX(REAL(I928),0.) C = C918 + CMPLX(R928,0.)
8 ________________________________________________________
7 |7|7|7|7|7|7|7|7|7|7|7|
|7|7|7|7|7|7|7|7|7|7|7|
|7|7|7|7|7|7|7|7|7|7|7|
|7|7|7|7|7|7|7|7|7|7|7|
8 _______________________________________________________
x928 D928 C92
8 x91
7 _______________________________________________________
I918 D = DBLE(I928) + D928 C=CMPLX(REAL(I928),0.)+C92
8
R918 D = DBLE(R918) + D928 C = CMPLX(R918,0.) + C92
8
D918 D = D918 + D928 Prohibited
C918 Prohibited C = C918 + C92
7 _______________________________________________________
7 |7|7|7|7|7|7|7|7|7|7|7|
|7|7|7|7|7|7|7|7|7|7|7|
|7|7|7|7|7|7|7|7|7|7|7|
|7|7|7|7|7|7|7|7|7|7|7|
Tables giving the type and interpretation of
expressions involving -, *, and / may be obtained by
replacing all occurrences of + in Table 2 by -, *, or
/, respectively.
FORTRAN 77 Full Language Page 6-6
EXPRESSIONS ANSI X3J3/90.4
Table 3_______
Type and Interpretation of Result for x918**x92
7 _______________________________________________________
x928 I928 R92
8 x91
7 _______________________________________________________
I918 I = I918**I928 R = REAL(I918)**R92
8
R918 R = R918**I928 R = R918**R92
8
D918 D = D918**I928 D = D918**DBLE(R928)
C918 C = C918**I928 C = C918**CMPLX(R928,0.)
8 _______________________________________________________
7 |7|7|7|7|7|7|7|7|7|7|7|
|7|7|7|7|7|7|7|7|7|7|7|
|7|7|7|7|7|7|7|7|7|7|7|
|7|7|7|7|7|7|7|7|7|7|7|
8 _______________________________________________________
x928 D928 C92
8 x91
7 _______________________________________________________
I928 D = DBLE(I928)**D928 C=CMPLX(REAL(I928),0.)**C92
8
R918 D = DBLE(R918)**D928 C = CMPLX(R918,0.)**C92
8
D918 D = D918**D928 Prohibited
C918 Prohibited C = C918**C92
7 _______________________________________________________
7 |7|7|7|7|7|7|7|7|7|7|7|
|7|7|7|7|7|7|7|7|7|7|7|
|7|7|7|7|7|7|7|7|7|7|7|
|7|7|7|7|7|7|7|7|7|7|7|
Four entries in Table 3 specify an interpretation to be
a complex value raised to a complex power. In these
cases, the value of the expression is the "principal
value" determined by x918**x928 = EXP(x928*LOG(x918)), where
EXP and LOG are functions described in 15.10.
Except for a value raised to an integer power, Tables 2
and 3 specify that if two operands are of different
type, the operand that differs in type from the result
of the operation is converted to the type of the result
and then the operator operates on a pair of operands of
the same type. When a primary of type real, double
precision, or complex is raised to an integer power,
the integer operand need not be converted. If the
value of I928 is negative, the interpretation of I918**I92
8 is the same as the interpretation of 1/(I918**ABS(I928)),
which is subject to the rules for integer division
(6.1.5). For example, 2**(-3) has the value of
1/(2**3), which is zero.
FORTRAN 77 Full Language Page 6-7
EXPRESSIONS ANSI X3J3/90.4
The type and interpretation of an expression that
consists of an operator operating on either a single
operand or a pair of operands are independent of the
context in which the expression appears. In
particular, the type and interpretation of such an
expression are independent of the type of any other
operand of any larger expression in which it appears.
For example, if X is of type real, J is of type
integer, and INT is the real-to-integer conversion
function, the expression INT(X+J) is an integer
expression and X+J is a real expression.
6.1.5 Integer_Division. One operand of type integer
may be divided by another operand of type integer.
Although the mathematical quotient of two integers is
not necessarily an integer, Table 2 specifies that an
expression involving the division operator with two
operands of type integer is interpreted as an
expression of type integer. The result of such a
division is called an integer quotient and is obtained
as follows: If the magnitude of the mathematical
quotient is less than one, the integer quotient is
zero. Otherwise, the integer quotient is the integer
whose magnitude is the largest integer that does not
exceed the magnitude of the mathematical quotient and
whose sign is the same as the sign of the mathematical
quotient. For example, the value of the expression (-
8)/3 is (-2).
6.2 Character_Expressions
A character expression is used to express a character
string. Evaluation of a character expression produces
a result of type character.
The simplest form of a character expression is a
character constant, symbolic name of a character
constant, character variable reference, character array
element reference, character substring reference, or
character function reference. More complicated
character expressions may be formed by using one or
more character operands together with character
operators and parentheses.
6.2.1 Character_Operator. The character operator is:
FORTRAN 77 Full Language Page 6-8
EXPRESSIONS ANSI X3J3/90.4
8 __________________________
Operator Representing
8 __________________________
// Concatenation
8 __________________________
7 |7|7|7|7|
|7|7|7|7|
|7|7|7|7|
The interpretation of the expression formed with the
character operator is:
8 __________________________________________
Use of Operator Interpretation
8 __________________________________________
x918 // x928 Concatenate x918 with x92
7 __________________________________________
7 |7|7|7|7|
|7|7|7|7|
|7|7|7|7|
where: x918 denotes the operand to the left of the
operator
x928 denotes the operand to the right of the
operator
The result of a concatenation operation is a character
string whose value is the value of x918 concatenated on
the right with the value of x928 and whose length is the
sum of the lengths of x918 and x928. For example, the
value of 'AB' // 'CDE' is the string ABCDE.
6.2.2 Form and Interpretation of Character
Expressions. A character expression and the operands
of a character expression must identify values of type
character. Except in a character assignment statement
(10.4), a character expression must not involve
concatenation of an operand whose length specification
is an asterisk in parentheses (8.4.2) unless the
operand is the symbolic name of a constant.
6.2.2.1 Character_Primaries. The character primaries
are:
(1) Character constant (4.8.1)
(2) Symbolic name of a character constant (8.6)
(3) Character variable reference (2.5)
(4) Character array element reference (5.3)
(5) Character substring reference (5.7)
FORTRAN 77 Full Language Page 6-9
EXPRESSIONS ANSI X3J3/90.4
(6) Character function reference (15.2)
(7) Character expression enclosed in parentheses
(6.2.2.2)
6.2.2.2 Character_Expression. The forms of a
character expression are:
(1) Character primary
(2) Character expression // character primary
Thus, a character expression is a sequence of one or
more character primaries separated by the concatenation
operator. Form (2) indicates that in a character
expression containing two or more concatenation
operators, the primaries are combined from left to
right to establish the interpretation of the
expression. For example, the formation rules specify
that the interpretation of the character expression
'AB' // 'CD' // 'EF'
is the same as the interpretation of the character
expression
('AB' // 'CD') // 'EF'
The value of the character expression in this example
is the same as that of the constant 'ABCDEF'. Note
that parentheses have no effect on the value of a
character expression.
6.2.3 Character_Constant_Expression. A character
constant expression is a character expression in which
each primary is a character constant, the symbolic name
of a character constant, or a character constant
expression enclosed in parentheses. Note that
variable, array element, substring, and function
references are not allowed.
6.3 Relational_Expressions
A relational expression is used to compare the values
of two arithmetic expressions or two character
expressions. A relational expression may not be used
to compare the value of an arithmetic expression with
the value of a character expression.
Relational expressions may appear only within logical
expressions. Evaluation of a relational expression
FORTRAN 77 Full Language Page 6-10
EXPRESSIONS ANSI X3J3/90.4
produces a result of type logical, with a value of true
or false.
6.3.1 Relational_Operators. The relational operators
are:
8 _____________________________________
Operator Representing
8 _____________________________________
.LT. Less than
.LE. Less than or equal to
.EQ. Equal to
.NE. Not equal to
.GT. Greater than
.GE. Greater than or equal to
8 _____________________________________
7 |7|7|7|7|7|7|7|7|7|
|7|7|7|7|7|7|7|7|7|
|7|7|7|7|7|7|7|7|7|
6.3.2 Arithmetic_Relational_Expression. The form of
an arithmetic relational expression is:
e_918 relop_____ e_92
9 where: e_918 and e_928 are each an integer, real, double
precision, or complex expression
relop_____ is a relational operator
A complex operand is permitted only when the relational
operator is .EQ. or .NE.
6.3.3 Interpretation of Arithmetic Relational
Expressions. An arithmetic relational expression is
interpreted as having the logical value true if the
values of the operands satisfy the relation specified
by the operator. An arithmetic relational expression
is interpreted as having the logical value false if the
values of the operands do not satisfy the relation
specified by the operator.
If the two arithmetic expressions are of different
types, the value of the relational expression
e_918 relop_____ e_92
9 is the value of the expression
((e_918) - (e_928)) relop_____ 0
where 0 (zero) is of the same type as the expression ((e
_918) (e_928)), and relop_____ is the same relational operator in
both expressions. Note that the comparison of a double
9
FORTRAN 77 Full Language Page 6-11
EXPRESSIONS ANSI X3J3/90.4
precision value and a complex value is not permitted.
6.3.4 Character_Relational_Expression. The form of a
character relational expression is:
e_918 relop_____ e_92
9 where: e_918 and e_928 are character expressions
relop_____ is a relational operator
6.3.5 Interpretation of Character Relational
Expressions. A character relational expression is
interpreted as the logical value true if the values of
the operands satisfy the relation specified by the
operator. A character relational expression is
interpreted as the logical value false if the values of
the operands do not satisfy the relation specified by
the operator.
The character expression e_918 is considered to be less
than e_928 if the value of e_918 precedes the value of e_928 in
the collating sequence; e_918 is greater than e_928 if the
value of e_918 follows the value of e_928 in the collating
sequence (3.1.5). Note that the collating sequence
depends partially on the processor; however, the result
of the use of the operators .EQ. and .NE. does not
depend on the collating sequence. If the operands are
of unequal length, the shorter operand is considered as
if it were extended on the right with blanks to the
length of the longer operand.
6.4 Logical_Expressions
A logical expression is used to express a logical
computation. Evaluation of a logical expression
produces a result of type logical, with a value of true
or false.
The simplest form of a logical expression is a logical
constant, symbolic name of a logical constant, logical
variable reference, logical array element reference,
logical function reference, or relational expression.
More complicated logical expressions may be formed by
using one or more logical operands together with
logical operators and parentheses.
6.4.1 Logical_Operators. The logical operators are:
FORTRAN 77 Full Language Page 6-12
EXPRESSIONS ANSI X3J3/90.4
8 __________________________________________
Operator Representing
8 __________________________________________
.NOT. Logical Negation
.AND. Logical Conjunction
.OR. Logical Inclusive Disjunction
.EQV. Logical Equivalence
.NEQV. Logical Nonequivalence
8 __________________________________________
7 |7|7|7|7|7|7|7|7|
|7|7|7|7|7|7|7|7|
|7|7|7|7|7|7|7|7|
6.4.2 Form_and_Interpretation_of_Logical_Expressions.
A set of formation rules is used to establish the
interpretation of a logical expression that contains
two or more logical operators. There is a precedence
among the logical operators, which determines the order
in which the operands are to be combined unless the
order is changed by the use of parentheses. The
precedence of the logical operators is as follows:
8 ______________________________
Operator Precedence
8 ______________________________
.NOT. Highest
.AND.
.OR.
.EQV. or .NEQV. Lowest
8 ______________________________
7 |7|7|7|7|7|7|7|
|7|7|7|7|7|7|7|
|7|7|7|7|7|7|7|
For example, in the expression
A .OR. B .AND. C
the .AND. operator has higher precedence than the
&'.OR. operator; therefore, the interpretation of the
above expression is the same as the interpretation of
the expression
A .OR. (B .AND. C)
The logical operands are:
(1) Logical primary
(2) Logical factor
(3) Logical term
(4) Logical disjunct
FORTRAN 77 Full Language Page 6-13
EXPRESSIONS ANSI X3J3/90.4
(5) Logical expression
The formation rules to be applied in establishing the
interpretation of a logical expression are in 6.4.2.1
through 6.4.2.5.
6.4.2.1 Logical_Primaries. The logical primaries are:
(1) Logical constant (4.7.1)
(2) Symbolic name of a logical constant (8.6)
(3) Logical variable reference (2.5)
(4) Logical array element reference (5.3)
(5) Logical function reference (15.2)
(6) Relational expression (6.3)
(7) Logical expression enclosed in parentheses
(6.4.2.5)
6.4.2.2 Logical_Factor. The forms of a logical factor
are:
(1) Logical primary
(2) .NOT. logical primary
6.4.2.3 Logical_Term. The forms of a logical term
are:
(1) Logical factor
(2) Logical term .AND. logical factor
Thus, a logical term is a sequence of logical factors
separated by the .AND. operator. Form (2) indicates
that in interpreting a logical term containing two or
more .AND. operators, the logical factors are combined
from left to right.
6.4.2.4 Logical_Disjunct. The forms of a logical
disjunct are:
(1) Logical term
(2) Logical disjunct .OR. logical term
FORTRAN 77 Full Language Page 6-14
EXPRESSIONS ANSI X3J3/90.4
Thus, a logical disjunct is a sequence of logical terms
separated by the .OR. operator. Form (2) indicates
that in interpreting a logical disjunct containing two
or more .OR. operators, the logical terms are combined
from left to right.
6.4.2.5 Logical_Expression. The forms of a logical
expression are:
(1) Logical disjunct
(2) Logical expression .EQV. logical disjunct
(3) Logical expression .NEQV. logical disjunct
Thus, a logical expression is a sequence of logical
disjuncts separated by either the .EQV. operator or the
.NEQV. operator. Forms (2) and (3) indicate that in
interpreting a logical expression containing two or
more .EQV. or .NEQV. operators, the logical disjuncts
are combined from left to right.
6.4.3 Value of Logical Factors, Terms, Disjuncts, and
Expressions. The value of a logical factor involving
.NOT. is shown below:
8 __________________
x928 .NOT. x92
7 __________________
true false
false true
8 __________________
7 |7|7|7|7|7|
|7|7|7|7|7|
|7|7|7|7|7|
The value of a logical term involving .AND. is shown
below:
8 _____________________________
x918 x928 x918 .AND. x92
7 _____________________________
true true true
true false false
false true false
false false false
8 _____________________________
7 |7|7|7|7|7|7|7|
|7|7|7|7|7|7|7|
|7|7|7|7|7|7|7|
|7|7|7|7|7|7|7|
The value of a logical disjunct involving .OR. is shown
below:
FORTRAN 77 Full Language Page 6-15
EXPRESSIONS ANSI X3J3/90.4
8 ____________________________
x918 x928 x918 .OR. x92
7 ____________________________
true true true
true false true
false true true
false false false
8 ____________________________
7 |7|7|7|7|7|7|7|
|7|7|7|7|7|7|7|
|7|7|7|7|7|7|7|
|7|7|7|7|7|7|7|
The value of a logical expression involving .EQV. is
shown below:
8 _____________________________
x918 x928 x918 .EQV. x92
7 _____________________________
true true true
true false false
false true false
false false true
8 _____________________________
7 |7|7|7|7|7|7|7|
|7|7|7|7|7|7|7|
|7|7|7|7|7|7|7|
|7|7|7|7|7|7|7|
The value of a logical expression involving .NEQV. is
shown below:
8 ______________________________
x918 x928 x918 .NEQV. x92
7 ______________________________
true true false
true false true
false true true
false false false
8 ______________________________
7 |7|7|7|7|7|7|7|
|7|7|7|7|7|7|7|
|7|7|7|7|7|7|7|
|7|7|7|7|7|7|7|
6.4.4 Logical_Constant_Expression. A logical constant
expression is a logical expression in which each
primary is a logical constant, the symbolic name of a
logical constant, a relational expression in which each
primary is a constant expression, or a logical constant
expression enclosed in parentheses. Note that
variable, array element, and function references are
not allowed.
6.5 Precedence_of_Operators
In 6.1.2 and 6.4.2 precedences have been established
among the arithmetic operators and the logical
operators, respectively. There is only one character
operator. No precedence has been established among the
relational operators. The precedences among the various
operators are:
9
FORTRAN 77 Full Language Page 6-16
EXPRESSIONS ANSI X3J3/90.4
8 _________________________
Operator Precedence
8 _________________________
Arithmetic Highest
Character
Relational
Logical Lowest
8 _________________________
7 |7|7|7|7|7|7|7|
|7|7|7|7|7|7|7|
|7|7|7|7|7|7|7|
An expression may contain more than one kind of
operator. For example, the logical expression
L .OR. A + B .GE. C
where A, B, and C are of type real, and L is of type
logical, contains an arithmetic operator, a relational
operator, and a logical operator. This expression
would be interpreted the same as the expression
L .OR. ((A + B) .GE. C)
6.5.1 Summary_of_Interpretation_Rules. The order in
which primaries are combined using operators is
determined by the following:
(1) Use of parentheses
(2) Precedence of the operators
(3) Right-to-left interpretation of exponentiations
in a factor
(4) Left-to-right interpretation of multiplications
and divisions in a term
(5) Left-to-right interpretation of additions and
subtractions in an arithmetic expression
(6) Left-to-right interpretation of concatenations
in a character expression
(7) Left-to-right interpretation of conjunctions in
a logical term
(8) Left-to-right interpretation of disjunctions in
a logical disjunct
(9) Left-to-right interpretation of logical
equivalences in a logical expression
9
FORTRAN 77 Full Language Page 6-17
EXPRESSIONS ANSI X3J3/90.4
6.6 Evaluation_of_Expressions
This section applies to arithmetic, character,
relational, and logical expressions.
Any variable, array element, function, or character
substring referenced as an operand in an expression
must be defined at the time the reference is executed.
An integer operand must be defined with an integer
value rather than a statement label value. Note that
if a character string or substring is referenced, all
of the referenced characters must be defined at the
time the reference is executed.
Any arithmetic operation whose result is not
mathematically defined is prohibited in the execution
of an executable program. Examples are dividing by
zero and raising a zero- valued primary to a zero-
valued or negative-valued power. Raising a negative-
valued primary to a real or double precision power is
also prohibited.
The execution of a function reference in a statement
may not alter the value of any other entity within the
statement in which the function reference appears. The
execution of a function reference in a statement may
not alter the value of any entity in common (8.3) that
affects the value of any other function reference in
that statement. However, execution of a function
reference in the expression e_ of a logical IF statement
(11.5) is permitted to affect entities in the statement
st__ that is executed when the value of the expression e_
is true. If a function reference causes definition of
an actual argument of the function, that argument or
any associated entities must not appear elsewhere in
the same statement. For example, the statements
A(I) = F(I)
Y = G(X) + X
are prohibited if the reference to F defines I or the
reference to G defines X.
The data type of an expression in which a function
reference appears does not affect the evaluation of the
actual arguments of the function. The data type of an
expression in which a function reference appears is not
affected by the evaluation of the actual arguments of
the function, except that the result of a generic
function reference assumes a data type that depends on
FORTRAN 77 Full Language Page 6-18
EXPRESSIONS ANSI X3J3/90.4
the data type of its arguments as specified in 15.10.
Any execution of an array element reference requires
the evaluation of its subscript. The data type of an
expression in which a subscript appears does not
affect, nor is it affected by, the evaluation of the
subscript.
Any execution of a substring reference requires the
evaluation of its substring expressions. The data type
of an expression in which a substring name appears does
not affect, nor is it affected by, the evaluation of
the substring expressions.
6.6.1 Evaluation_of_Operands. It is not necessary for
a processor to evaluate all of the operands of an
expression if the value of the expression can be
determined otherwise. This principle is most often
applicable to logical express(ions, but it applies to
all expressions. For example, in evaluating the
logical expression
X .GT. Y .OR. L(Z)
where X, Y, and Z are real, and L is a logical
function, the function reference L(Z) need not be
evaluated if X is greater than Y. If a statement
contains a function reference in a part of an
expression that need not be evaluated, all entities
that would have become defined in the execution of that
reference become undefined at the completion of
evaluation of the expression containing the function
reference. In the example above, evaluation of the
expression causes Z to become undefined if L defines
its argument.
6.6.2 Order_of_Evaluation_of_Functions. If a
statement contains more than one function reference, a
processor may evaluate the functions in any order,
except for a logical IF statement and a function
argument list containing function references. For
example, the statement
Y = F(G(X))
where F and G are functions, requires G to be evaluated
before F is evaluated.
In a statement that contains more than one function
reference, the value provided by each function
reference must be independent of the order chosen by
FORTRAN 77 Full Language Page 6-19
EXPRESSIONS ANSI X3J3/90.4
the processor for evaluation of the function
references.
6.6.3 Integrity_of_Parentheses. The sections that
follow state certain conditions under which a processor
may evaluate an expression different from the one
obtained by applying the interpretation rules given in
6.1 through 6.5. However, any expression contained in
parentheses must be treated as an entity. For example,
in evaluating the expression A*(B*C), the product of B
and C must be evaluated and then multiplied by A; the
processor must not evaluate the mathematically
equivalent expression (A*B)*C.
6.6.4 Evaluation_of_Arithmetic_Expressions. The rules
given in 6.1.2 specify the interpretation of an
arithmetic expression. Once the interpretation has
been established in accordance with those rules, the
processor may evaluate any mathematically equivalent
expression, provided that the integrity of parentheses
is not violated.
Two arithmetic expressions are mathematically
equivalent if, for all possible values of their
primaries, their mathematical values are equal.
However, mathematically equivalent arithmetic
expressions may produce different computational
results.
The mathematical definition of integer division is
given in 6.1.5. The difference between the value of
the expression 5/2 and 5./2. is a mathematical
difference, not a computational difference.
The following are examples of expressions, along with
allowable alternative forms that may be used by the
processor in the evaluation of those expressions. A,
B, and C represent arbitrary real, double precision, or
complex operands; I and J represent arbitrary integer
operands; and X, Y, and Z represent arbitrary
arithmetic operands. (Note that Table 2 prohibits
combinations of double precision and complex data
types.)
FORTRAN 77 Full Language Page 6-20
EXPRESSIONS ANSI X3J3/90.4
8 _________________________________________
Expression Allowable Alternative Form
8 _________________________________________
X+Y Y+X
X*Y Y*X
-X+Y Y-X
X+Y+Z X+(Y+Z)
X-Y+Z X-(Y-Z)
X*B/Z X*(B/Z)
X*Y-X*Z X*(Y-Z)
A/B/C A/(B*C)
A/5.0 0.2*A
8 _________________________________________
7 |7|7|7|7|7|7|7|7|7|7|7|7|
|7|7|7|7|7|7|7|7|7|7|7|7|
|7|7|7|7|7|7|7|7|7|7|7|7|
The following are examples of expressions along with
forbidden forms that must not be used by the processor
in the evaluation of those expressions.
8 ________________________________________
Expression Nonallowable Alternative
Form
8 ________________________________________
I/2 0.5*I
X*I/J X*(I/J)
I/J/A I/(J*A)
(X*Y)-(X*Z) X*(Y-Z)
X*(Y-Z) X*Y-X*Z
8 ________________________________________
7 |7|7|7|7|7|7|7|7|7|
|7|7|7|7|7|7|7|7|7|
|7|7|7|7|7|7|7|7|7|
In addition to the parentheses required to establish
the desired interpretation, parentheses may be included
to restrict the alternative forms that may be used by
the processor in the actual evaluation of the
expression. This is useful for controlling the
magnitude and accuracy of intermediate values developed
during the evaluation of an expression. For example,
in the expression
A+(B-C)
the term (B-C) must be evaluated and then added to A.
Note that the inclusion of parentheses may change the
mathematical value of an expression. For example, the
two expressions:
A*I/J
A*(I/J)
may have different mathematical values if I and J are
FORTRAN 77 Full Language Page 6-21
EXPRESSIONS ANSI X3J3/90.4
factors of integer data type.
Each operand of an arithmetic operator has a data type
that may depend on the order of evaluation used by the
processor. For example, in the evaluation of the
expression
D+R+I
where D, R, and I represent terms of double precision,
real, and integer data type, respectively, the data
type of the operand that is added to I may be either
double precision or real, depending on which pair of
operands (D and R, R and I, or D and I) is added first.
6.6.5 Evaluation_of_Character_Expressions. The rules
given in 6.2.2 specify the interpretation of a
character expression as a string of characters. A
processor needs to evaluate only as much of the
character expression as is required by the context in
which the expression appears. For example, the
statements
CHARACTER*2 C1,C2,C3,CF
C1 = C2 // CF(C3)
do not require the function CF to be evaluated, because
only the value of C2 is needed to determine the value
of C1.
6.6.6 Evaluation_of_Relational_Expressions. The rules
given in 6.3.3 and 6.3.5 specify the interpretation of
relational expressions. Once the interpretation of an
expression has been established in accordance with
those rules, the processor may evaluate any other
expression that is relationally equivalent. For
example, the processor may choose to evaluate the
relational expression
I .GT. J
where I and J are integer variables, as
J - I .LT. 0
Two relational expressions are relationally equivalent
if their logical values are equal for all possible
values of their primaries.
FORTRAN 77 Full Language Page 6-22
EXPRESSIONS ANSI X3J3/90.4
6.6.7 Evaluation_of_Logical_Expressions. The rules
given in 6.4.2 specify the interpretation of a logical
expression. Once the interpretation of an expression
has been established in accordance with those rules,
the processor may evaluate any other expression that is
logically equivalent, provided that the integrity of
parentheses is not violated. For example, the
processor may choose to evaluate the logical expression
L1 .AND. L2 .AND. L3
where L1, L2, and L3 are logical variables, as
L1 .AND. (L2 .AND. L3)
Two logical expressions are logically equivalent if
their values are equal for all possible values of their
primaries.
6.7 Constant_Expressions
A constant expression is an arithmetic constant
expression (6.1.3), a character constant expression
(6.2.3), or a logical constant expression (6.4.4).
FORTRAN 77 Full Language Page 6-23
CONTENTS
6. EXPRESSIONS.................................. 6-1
6.1 Arithmetic Expressions.................. 6-1
6.1.1 Arithmetic Operators............. 6-1
6.1.2 Form and Interpretation of
Arithmetic Expressions........... 6-2
6.1.3 Arithmetic Constant
Expression....................... 6-5
6.1.4 Type and Interpretation of
Arithmetic Expressions........... 6-5
6.1.5 Integer Division................. 6-8
6.2 Character Expressions................... 6-8
6.2.1 Character Operator............... 6-8
6.2.2 Form and Interpretation of
Character Expressions............ 6-9
6.2.3 Character Constant
Expression....................... 6-10
6.3 Relational Expressions.................. 6-10
6.3.1 Relational Operators............. 6-11
6.3.2 Arithmetic Relational
Expression....................... 6-11
6.3.3 Interpretation of Arithmetic
Relational Expressions........... 6-11
6.3.4 Character Relational
Expression....................... 6-12
6.3.5 Interpretation of Character
Relational Expressions........... 6-12
6.4 Logical Expressions..................... 6-12
6.4.1 Logical Operators................ 6-12
6.4.2 Form and Interpretation of
Logical Expressions.............. 6-13
6.4.3 Value of Logical Factors, Terms,
Disjuncts, and Expressions....... 6-
15
6.4.4 Logical Constant
Expression....................... 6-16
6.5 Precedence of Operators................. 6-16
6.5.1 Summary of Interpretation
Rules............................ 6-17
6.6 Evaluation of Expressions............... 6-18
6.6.1 Evaluation of Operands........... 6-19
6.6.2 Order of Evaluation of
Functions........................ 6-19
6.6.3 Integrity of Parentheses......... 6-20
6.6.4 Evaluation of Arithmetic
Expressions...................... 6-20
6.6.5 Evaluation of Character
Expressions...................... 6-22
- i -
6.6.6 Evaluation of Relational
Expressions...................... 6-22
6.6.7 Evaluation of Logical
Expressions...................... 6-23
6.7 Constant Expressions.................... 6-23
- ii -
ANSI X3J3/90.4
7. EXECUTABLE AND NONEXECUTABLE STATEMENT CLASSIFICATION
Each statement is classified as executable or
nonexecutable. Executable statements specify actions
and form an execution sequence in an executable
program. Nonexecutable statements specify
characteristics, arrangement, and initial values of
data; contain editing information; specify statement
functions; classify program units; and specify entry
points within subprograms. Nonexecutable statements
are not part of the execution sequence. Nonexecutable
statements may be labeled, but such statement labels
must not be used to control the execution sequence.
7.1 Executable_Statements
The following statements are classified as executable:
(1) Arithmetic, logical, statement label (ASSIGN),
and character assignment statements
(2) Unconditional GO TO, assigned GO TO, and
computed GO TO statements
(3) Arithmetic IF and logical IF statements
(4) Block IF, ELSE IF, ELSE, and END IF statements
(5) CONTINUE statement
(6) STOP and PAUSE statements
(7) DO statement
(8) READ, WRITE, and PRINT statements
(9) REWIND, BACKSPACE, ENDFILE, OPEN, CLOSE, and
INQUIRE statements
(10) CALL and RETURN statements
(11) END statement
7.2 Nonexecutable_Statements
The following statements are classified as
nonexecutable:
(1) PROGRAM, FUNCTION, SUBROUTINE, ENTRY, and BLOCK
DATA statements
FORTRAN 77 Full Language Page 7-1
STATEMENT CLASSIFICATION ANSI X3J3/90.4
(2) DIMENSION, COMMON, EQUIVALENCE, IMPLICIT,
PARAMETER, EXTERNAL, INTRINSIC, and SAVE
statements
(3) INTEGER, REAL, DOUBLE PRECISION, COMPLEX,
LOGICAL, and CHARACTER type-statements
(4) DATA statement
(5) FORMAT statement
(6) Statement function statement
FORTRAN 77 Full Language Page 7-2
CONTENTS
7. EXECUTABLE AND NONEXECUTABLE STATEMENT CLASSIFICATION 7-
1
7.1 Executable Statements.................... 7-1
7.2 Nonexecutable Statements................. 7-1
- i -
ANSI X3J3/90.4
8. SPECIFICATION_STATEMENTS
There are nine kinds of specification statements:
(1) DIMENSION
(2) EQUIVALENCE
(3) COMMON
(4) INTEGER, REAL, DOUBLE PRECISION, COMPLEX,
LOGICAL, and CHARACTER type-statements
(5) IMPLICIT
(6) PARAMETER
(7) EXTERNAL
(8) INTRINSIC
(9) SAVE
All specification statements are nonexecutable.
8.1 DIMENSION_Statement
A DIMENSION statement is used to specify the symbolic
names and dimension specifications of arrays.
The form of a DIMENSION statement is:
DIMENSION a_(d_) [,a_(d_)]...
where each a_(d_) is an array declarator (5.1).
Each symbolic name a_ appearing in a DIMENSION statement
declares a_ to be an array in that program unit. Note
that array declarators may also appear in COMMON
statements and type-statements. Only one appearance of
a symbolic name as an array name in an array declarator
in a program unit is permitted.
8.2 EQUIVALENCE_Statement
An EQUIVALENCE statement is used to specify the sharing
of storage units by two or more entities in a program
unit. This causes association of the entities that
share the storage units.
FORTRAN 77 Full Language Page 8-1
SPECIFICATION STATEMENTS ANSI X3J3/90.4
If the equivalenced entities are of different data
types, the EQUIVALENCE statement does not cause type
conversion or imply mathematical equivalence. If a
variable and an array are equivalenced, the variable
does not have array properties and the array does not
have the properties of a variable.
8.2.1 Form_of_an_EQUIVALENCE_Statement. The form of
an EQUIVALENCE statement is:
EQUIVALENCE (nlist_____) [,(nlist_____)]...
where each nlist_____ is a list (2.10) of variable names,
array element names, array names, and character
substring names. Each list must contain at least two
names. Names of dummy arguments of an external
procedure in a subprogram must not appear in the list.
If a variable name is also a function name (15.5.1),
that name must not appear in the list.
Each subscript expression or substring expression in a
list nlist_____ must be an integer constant expression.
8.2.2 Equivalence_Association. An EQUIVALENCE
statement specifies that the storage sequences of the
entities whose names appear in a list nlist____ _ have the
same first storage unit. This causes the association
of the entities in the list nlist_ _ _ _ _ and may cause
association of other entities (17.1).
8.2.3 Equivalence_of_Character_Entities. An entity of
type character may be equivalenced only with other
entities of type character. The lengths of the
equivalenced entities are not required to be the same.
An EQUIVALENCE statement specifies that the storage
sequences of the character entities whose names appear
in a list nlist_____ have the same first character storage
unit. This causes the association of the entities in
the list nlist_____ and may cause association of other
entities (17.1). Any adjacent characters in the
associated entities may also have the same character
storage unit and thus may also be associated. In the
example:
CHARACTER A*4, B*4, C(2)*3
EQUIVALENCE (A,C(1)), (B,C(2))
the association of A, B, and C can be graphically
illustrated as:
FORTRAN 77 Full Language Page 8-2
SPECIFICATION STATEMENTS ANSI X3J3/90.4
| 01| 02| 03| 04
7 | 05| 06| 07|
| --------A--------|
--------B--------|
----C(1)---- ----C(2)----
7 |
7 |8|
8 |
8.2.4 Array_Names_and_Array_Element_Names. If an
array element name appears in an EQUIVALENCE statement,
the number of subscript expressions must be the same as
the number of dimensions specified in the array
declarator for the array name.
The use of an array name unqualified by a subscript in
an EQUIVALENCE statement has the same effect as using
an array element name that identifies the first element
of the array.
8.2.5 Restrictions_on_EQUIVALENCE_Statements. An
EQUIVALENCE statement must not specify that the same
storage unit is to occur more than once in a storage
sequence. For example,
DIMENSION A(2)
EQUIVALENCE (A(1),B), (A(2),B)
is prohibited, because it would specify the same
storage unit for A(1) and A(2). An EQUIVALENCE
statement must not specify that consecutive storage
units are to be nonconsecutive. For example, the
following is prohibited:
REAL A(2)
DOUBLE PRECISION D(2)
EQUIVALENCE (A(1),D(1)), (A(2),D(2))
8.3 COMMON_Statement
The COMMON statement provides a means of associating
entities in different program units. This allows
different program units to define and reference the
same data without using arguments, and to share storage
units.
8.3.1 Form_of_a_COMMON_Statement. The form of a
COMMON statement is:
COMMON [/[cb__]/] nlist_____ [[,]/[cb__]/ nlist_____]...
where: cb__ is a common block name (18.2.1)
FORTRAN 77 Full Language Page 8-3
SPECIFICATION STATEMENTS ANSI X3J3/90.4
nlist_____ is a list (2.10) of variable names, array
names, and array declarators. Only one
appearance of a symbolic name as a variable
name, array name, or array declarator is
permitted in all such lists within a program
unit. Names of dummy arguments of an
external procedure in a subprogram must not
appear in the list. If a variable name is
also a function name (15.5.1), that name
must not appear in the list.
Each omitted cb__ specifies the blank common block. If
the first cb_ _ is omitted, the first two slashes are
optional.
In each COMMON statement, the entities whose names
appear in an nlist_ _ _ __ following a block name cb__ are
declared to be in common block cb__. If the first cb__ is
omitted, all entities whose names appear in the first nlist_
_ _ _ _ are specified to be in blank common.
Alternatively, the appearance of two slashes with no
block name between them declares the entities whose
names appear in the list nlist_____ that follows to be in
blank common.
Any common block name cb__ or an omitted cb_ _ for blank
common may occur more than once in one or more COMMON
statements in a program unit. The list nlist_____ following
each successive appearance of the same common block
name is treated as a continuation of the list for that
common block name.
If a character variable or character array is in a
common block, all of the entities in that common block
must be of type character.
8.3.2 Common_Block_Storage_Sequence. For each common
block, a common block storage sequence is formed as
follows:
(1) A storage sequence is formed consisting of the
storage sequences of all entities in the lists nlist_
____Z for the common block. The order of the
storage sequence is the same as the order of the
appearance of the lists nlist____ _ in the program
unit.
(2) The storage sequence formed in (1) is extended
to include all storage units of any storage
sequence associated with it by equivalence
association. The sequence may be extended only
FORTRAN 77 Full Language Page 8-4
SPECIFICATION STATEMENTS ANSI X3J3/90.4
by adding storage units beyond the last storage
unit. Entities associated with an entity in a
common block are considered to be in that common
block.
8.3.3 Size_of_a_Common_Block. The size of a common
block is the size of its common block storage sequence,
including any extensions of the sequence resulting from
equivalence association.
Within an executable program, all named common blocks
that have the same name must be the same size. Blank
common blocks within an executable program are not
required to be the same size.
8.3.4 Common_Association. Within an executable
program, the common block storage sequences of all
common blocks with the same name have the same first
storage unit. Within an executable program, the common
block storage sequences of all blank common blocks have
the same first storage unit. This results in the
association (17.1) of entities in different program
units.
8.3.5 Differences between Named Common and Blank
Common. A blank common block has the same properties
as a named common block, except for the following:
(1) Execution of a RETURN or END statement sometimes
causes entities in named common blocks to become
undefined but never causes entities in blank
common to become undefined (15.8.4).
(2) Named common blocks of the same name must be of
the same size in all program units of an
executable program in which they appear, but
blank common blocks may be of different sizes.
(3) Entities in named common blocks may be initially
defined by means of a DATA statement in a block
data subprogram, but entities in blank common
must not be initially defined (Section 9).
8.3.6 Restrictions_on_Common_and_Equivalence. An
EQUIVALENCE statement must not cause the storage
sequences of two different common blocks in the same
program unit to be associated. Equivalence association
must not cause a common block storage sequence to be
extended by adding storage units preceding the first
storage unit of the first entity specified in a COMMON
statement for the common block. For example, the
FORTRAN 77 Full Language Page 8-5
SPECIFICATION STATEMENTS ANSI X3J3/90.4
following is not permitted:
COMMON /X/A
REAL B(2)
EQUIVALENCE (A,B(2))
8.4 Type-Statements
A type-statement is used to override or confirm
implicit typing and may specify dimension information.
The appearance of the symbolic name of a constant,
variable, array, external function, or statement
function in a type-statement specifies the data type
for that name for all appearances in the program unit.
Within a program unit, a name must not have its type
explicitly specified more than once.
A type-statement that confirms the type of an intrinsic
function whose name appears in the Specific Name column
of Table 5 is not required, but is permitted. If a
generic function name appears in a type-statement, such
an appearance is not sufficient by itself to remove the
generic properties from that function.
The name of a main program, subroutine, or block data
subprogram must not appear in a type-statement.
8.4.1 INTEGER, REAL, DOUBLE PRECISION, COMPLEX, and
LOGICAL Type-Statements. An INTEGER, REAL, DOUBLE
PRECISION, COMPLEX, or LOGICAL type-statement is of the
form:
typ___ v_[,v_]...
where: typ___ is one of INTEGER, REAL, DOUBLE PRECISION,
COMPLEX, or LOGICAL
v_ is a variable name, array name, array
declarator, symbolic name of a constant,
function name, or dummy procedure name
(18.2.11)
8.4.2 CHARACTER_Type-Statement. The form of a
CHARACTER type-statement is:
CHARACTER [*len___ [,]] nam___ [,nam___]...
where: nam___ is of one of the forms:
FORTRAN 77 Full Language Page 8-6
SPECIFICATION STATEMENTS ANSI X3J3/90.4
v_ [*len___]
a_ [(d_)] [*len___]
v_ is a variable name, symbolic name of a
constant, function name, or dummy procedure
name
a_ is an array name
a_(d_) is an array declarator
len___ is the length (number of characters) of a
character variable, character array element,
character constant that has a symbolic name,
or character function, and is called the length specification___
_________________. len_ _ _ is one of the
following:
(1) An unsigned, nonzero, integer constant
(2) An integer constant expression (6.1.3.1)
enclosed in parentheses and with a
positive value
(3) An asterisk in parentheses, (*)
A length len___ immediately following the word CHARACTER
is the length specification for each entity in the
statement not having its own length specification. A
length specification immediately following an entity is
the length specification for only that entity. Note
that for an array the length specified is for each
array element. If a length is not specified for an
entity, its length is one.
An entity declared in a CHARACTER statement must have a
length specification that is an integer constant
expression, unless that entity is an external function,
a dummy argument of an external procedure, or a
character constant that has a symbolic name.
If a dummy argument has a len__ _ of (*) declared, the
dummy argument assumes the length of the associated
actual argument for each reference of the subroutine or
function. If the associated actual argument is an
array name, the length assumed by the dummy argument is
the length of an array element in the associated actual
argument array.
FORTRAN 77 Full Language Page 8-7
SPECIFICATION STATEMENTS ANSI X3J3/90.4
If an external function has a len___ of (*) declared in a
function subprogram, the function name must appear as
the name of a function in a FUNCTION or ENTRY statement
in the same subprogram. When a reference to such a
function is executed, the function assumes the length
specified in the referencing program unit.
The length specified for a character function in the
program unit that references the function must be an
integer constant expression and must agree with the
length specified in the subprogram that specifies the
function. Note that there always is agreement of
length if a len___ of (*) is specified in the subprogram
that specifies the function.
If a character constant that has a symbolic name has a len
___ of (*) declared, the constant assumes the length of
its corresponding constant expression in a PARAMETER
statement.
The length specified for a character statement function
or statement function dummy argument of type character
must be an integer constant expression.
8.5 IMPLICIT_Statement
An IMPLICIT statement is used to change or confirm the
default implied integer and real typing.
The form of an IMPLICIT statement is:
IMPLICIT typ___ (a_ [,a_]...) [,typ___ (a_ [,a_]...)]...
where: typ___ is one of INTEGER, REAL, DOUBLE PRECISION,
COMPLEX, LOGICAL, or CHARACTER [*len___]
a_ is either a single letter or a range of
single letters in alphabetical order. A
range is denoted by the first and last
letter of the range separated by a minus.
Writing a range of letters a_918 - a_928 has the
same effect as writing a list of the single
letters a_918 through a_928.
len___ is the length of the character entities and
is one of the following:
(1) An unsigned, nonzero, integer constant
(2) An integer constant expression (6..
1.3.1) enclosed in parentheses and with
FORTRAN 77 Full Language Page 8-8
SPECIFICATION STATEMENTS ANSI X3J3/90.4
a positive value
If len___ is not specified, the length is one.
An IMPLICIT statement specifies a type for all
variables, arrays, symbolic names of constants,
external functions, and statement^ functions that
begin with any letter that appears in the
specification, either as a single letter or included in
a range of letters. IMPLICIT statements do not change
the type of any intrinsic functions. An IMPLICIT
statement applies only to the program unit that
contains it.
Type specification by an IMPLICIT statement may be
overridden or confirmed for any particular variable,
array, symbolic name of a constant, external function,
or statement function name by the appearance of that
name in a type-statement. An explicit type
specification in a FUNCTION statement overrides an
IMPLICIT statement for the name of that function
subprogram. Note that the length is also overridden
when a particular name appears in a CHARACTER or
CHARACTER FUNCTION statement.
Within the specification statements of a program unit,
IMPLICIT statements must precede all other
specification statements except PARAMETER statements.
A program unit may contain more than one IMPLICIT
statement.
The same letter must not appear as a single letter, or
be included in a range of letters, more than once in
all of the IMPLICIT statements in a program unit.
8.6 PARAMETER_Statement
The PARAMETER statement is used to give a constant a
symbolic name.
The form of a PARAMETER statement is:
PARAMETER (p_=e_ [,p_=e_]...)
where: p_ is a symbolic name
e_ is a constant expression (6.7)
If the symbolic name p_ is of type integer, real, double
precision, or complex, the corresponding expression e_
must be an arithmetic constant expression (6.1.3). If
FORTRAN 77 Full Language Page 8-9
SPECIFICATION STATEMENTS ANSI X3J3/90.4
the symbolic name p_ is of type character or logical,
the corresponding expression e_ must be a character
constant expression (6.2.3) or a logical constant
expression (6.4.4), respectively.
Each p_ is the symbolic name of a constant that becomes
defined with the value determined from the expression e_
that appears on the right of the equals, in accordance
with the rules for assignment statements (10.1, 10.2,
and 10.4).
Any symbolic name of a constant that appears in an
expression e_ must have been defined previously in the
same or a different PARAMETER statement in the same
program unit.
A symbolic name of a constant must not become defined
more than once in a program unit.
If a symbolic name of a constant is not of default
implied type, its type must be specified by a type-
statement or IMPLICIT statement prior to its first
appearance in a PARAMETER statement. If the length
specified for the symbolic name of a constant of type
character is not the default length of one, its length
must be specified in a type-statement or IMPLICIT
statement prior to the first appearance of the symbolic
name of the constant. Its length must not be changed
by subsequent statements including IMPLICIT statements.
Once such a symbolic name is defined, that name may
appear in that program unit in any subsequent statement
as a primary in an expression or in a DATA statement
(9.1). A symbolic name of a constant must not be part
of a format specification. A symbolic name of a
constant must not be used to form part of another
constant, for example, any part of a complex constant.
A symbolic name in a PARAMETER statement may identify
only the corresponding constant in that program unit.
8.7 EXTERNAL_Statement
An EXTERNAL statement is used to identify a symbolic
name as representing an external procedure or dummy
procedure, and to permit such a name to be used as an
actual argument.
The form of an EXTERNAL statement is:
FORTRAN 77 Full Language Page 8-10
SPECIFICATION STATEMENTS ANSI X3J3/90.4
EXTERNAL proc____ [,proc____]...
where each proc____ is the name of an external procedure,
dummy procedure, or block data subprogram. Appearance
of a name in an EXTERNAL statement declares that name
to be an external procedure name or dummy procedure
name, or block data subprogram name. If an external
procedure na`)me or a dummy procedure name is used as
an actual argument in a program unit, it must appear in
an EXTERNAL statement in that program unit. Note that
a statement function name must not appear in an
EXTERNAL statement.
If an intrinsic function name appears in an EXTERNAL
statement in a program unit, that name becomes the name
of some external procedure and an intrinsic function of
the same name is not available for reference in the
program unit.
Only one appearance of a symbolic name in all of the
EXTERNAL statements of a program unit is permitted.
8.8 INTRINSIC_Statement
An INTRINSIC statement is used to identify a symbolic
name as representing an intrinsic function (15.3). It
also permits a name that represents a specific
intrinsic function to be used as an actual argument.
The form of an INTRINSIC statement is:
INTRINSIC fun___ [,fun___]...
where each fun___ is an intrinsic function name.
Appearance of a name in an INTRINSIC statement declares
that name to be an intrinsic function name. If a
specific name of an intrinsic function is used as an
actual argument in a program unit, it must appear in an
INTRINSIC statement in that program unit. The names of
intrinsic functions for type conversion (INT, IFIX,
IDINT, FLOAT, SNGL, REAL, DBLE, CMPLX, ICHAR, CHAR),
lexical relationship (LGE, LGT, LLE, LLT), and for
choosing the largest or smallest value (MAX, MAX0,
AMAX1, DMAX1, AMAX0, MAX1, MIN, MIN0, AMIN1, DMIN1,
AMIN0, MIN1) must not be used as actual arguments.
The appearance of a generic function name in an
INTRINSIC statement does not cause that name to lose
its generic property.
FORTRAN 77 Full Language Page 8-11
SPECIFICATION STATEMENTS ANSI X3J3/90.4
Only one appearance of a symbolic name in all of the
INTRINSIC statements of a program unit is permitted.
Note that a symbolic name must not appear in both an
EXTERNAL and an INTRINSIC statement in a program unit.
8.9 SAVE_Statement
A SAVE statement is used to retain the definition
status of an entity after the execution of a RETURN or
END statement in a subprogram. Within a function or
subroutine subprogram, an entity specified by a SAVE
statement does not become undefined as a result of the
execution of a RETURN or END statement in the
subprogram. However, such an entity in a common block
may become undefined or redefined in another program
unit.
The form of a SAVE statement is:
SAVE [a_ [,a_]...]
where each a_ is a named common block name preceded and
followed by a slash, a variable name, or an array name.
Redundant appearances of an item are not permitted.
Dummy argument names, procedure names, and names of
entities in a common block must not appear in a SAVE
statement.
A SAVE statement without a list is treated as though it
contained the names of all allowable items in the
program unit.
The appearance of a common block name preceded and
followed by a slash in a SAVE statement has the effect
of specifying all of the entities in that common block.
If a particular common block name is specified by a
SAVE statement in a subprogram of an executable
program, it must be specified by a SAVE statement in
every subprogram in which that common block appears.
A SAVE statement is optional in a main program and has
no effect.
If a named common block is specified in a SAVE
statement in a subprogram, the current values of the
entities in the common block storage sequence (8.3.3)
at the time a RETURN or END statement is executed are
made available to the next program unit that specifies
that common block name in the execution sequence of an
FORTRAN 77 Full Language Page 8-12
SPECIFICATION STATEMENTS ANSI X3J3/90.4
executable program.
If a named common block is specified in the main
program unit, the current values of the common block
storage sequence are made available to each subprogram
that specifies that named common block; a SAVE
statement in the subprogram has no effect.
The definition status of each entity in the named
common block storage sequence depends on the
association that has been established for the common
block storage sequence (17.2 and 17.3).
If a local entity that is specified by a SAVE statement
and is not in a common block is in a defined state at
the time a RETURN or END statement is executed in a
subprogram, that entity is defined with the same value
at the next reference of that subprogram.
The execution of a RETURN statement or an END statement
within a subprogram causes all entities within the
subprogram to become undefined except for the
following:
(1) Entities specified by SAVE statements
(2) Entities in blank common
(3) Initially defined entities that have neither
been redefined nor become undefined
(4) Entities in a named common block that appears in
the subprogram and appears in at least one other
program unit that is referencing, either
directly or indirectly, that subprogram
FORTRAN 77 Full Language Page 8-13
CONTENTS
8. SPECIFICATION STATEMENTS..................... 8-1
8.1 DIMENSION Statement..................... 8-1
8.2 EQUIVALENCE Statement................... 8-1
8.2.1 Form of an EQUIVALENCE
Statement........................ 8-2
8.2.2 Equivalence Association.......... 8-2
8.2.3 Equivalence of Character
Entities......................... 8-2
8.2.4 Array Names and Array Element
Names............................ 8-3
8.2.5 Restrictions on EQUIVALENCE
Statements....................... 8-3
8.3 COMMON Statement........................ 8-3
8.3.1 Form of a COMMON
Statement........................ 8-3
8.3.2 Common Block Storage
Sequence......................... 8-4
8.3.3 Size of a Common Block........... 8-5
8.3.4 Common Association............... 8-5
8.3.5 Differences between Named Common
and Blank Common................. 8-5
8.3.6 Restrictions on Common and
Equivalence...................... 8-5
8.4 Type-Statements......................... 8-6
8.4.1 INTEGER, REAL, DOUBLE PRECISION,
COMPLEX, and LOGICAL Type-
Statements....................... 8-6
8.4.2 CHARACTER Type-Statement......... 8-6
8.5 IMPLICIT Statement...................... 8-8
8.6 PARAMETER Statement..................... 8-9
8.7 EXTERNAL Statement...................... 8-10
8.8 INTRINSIC Statement..................... 8-11
8.9 SAVE Statement.......................... 8-12
- i -
ANSI X3J3/90.4
9. DATA_STATEMENT
A DATA statement is used to provide initial values for
variables, arrays, array elements, and substrings. A
DATA statement is nonexecutable and may appear in a
program unit anywhere after the specification
statements, if any.
All initially defined entities are defined when an
executable program begins execution. All entities not
initially defined, or associated with an initially
defined entity, are undefined at the beginning of
execution of an executable program.
9.1 Form_of_a_DATA_Statement
The form of a DATA statement is:
DATA nlist_____ /clist_____/ [[,] nlist_____ /clist_____/]...
where: nlist_____ is a list (2.10) of variable names, array
names, array element names, substring names,
and implied-DO lists
clist_____ is a list of the form:
a_ [,a_]...
where a_ is one of the forms:
c_
r_*c_
c_ is a constant or the symbolic name of a
constant
r_ is a nonzero, unsigned, integer constant
or the symbolic name of such a constant.
The r_ *c_ form is equivalent to r_
successive appearances of the constant c_
.
9.2 DATA_Statement_Restrictions
Names of dummy arguments, functions, and entities in
blank common (including entities associated with an
entity in blank common) must not appear in the list nlist___
_ _ . Names of entities in a named common block may
appear in the list nlist____ _ only within a block data
subprogram.
FORTRAN 77 Full Language Page 9-1
DATA STATEMENT ANSI X3J3/90.4
There must be the same number of items specified by
each list nlist_ _ _ __ and its corresponding list clist_____.
There is a one-to-one correspondence between the items
specified by nlist_____ and the constants specified by clist_____
such that the first item of nlist_____ corresponds to the
first constant of clist_____, etc. By this correspondence,
the initial value is established and the entity is
initially defined. If an array name without a
subscript is in the list, there must be one constant
for each element of that array. The ordering of array
elements is determined by the array element subscript
value (5.2.4).
The type of the nlist____ _ entity and the type of the
corresponding clist_____ constant must agree when either is
of type character or logical. When the nlist_____ entity is
of type integer, real, double precision, or complex,
the 1corresponding clist_____ constant must also be of type
integer, real, double precision, or complex; if
necessary, the clist_____ constant is converted to the type
of the nlist_ _ _ _ _ entity according to the rules for
arithmetic conversion (Table 4). Note that if an nlist_____
entity is of type double precision and the clist_____
constant is of type real, the processor may supply more
precision derived from the constant than can be
contained in a real datum.
Any variable, array element, or substring may be
initially defined except for:
(1) an entity that is a dummy argument,
(2) an entity in blank common, which includes an
entity associated with an entity in blank
common, or
(3) a variable in a function subprogram whose name
is also the name of the function subprogram or
an entry in the function subprogram.
A variable, array element, or substring must not be
initially defined more than once in an executable
program. If two entities are associated, only one may
be initially defined in a DATA statement in the same
executable program.
Each subscript expression in the list nlist_____ must be an
integer constant expression except for implied-DO-
variables as noted in 9.3. Each substring expression
in the list nlist_ _ _ _ _ must be an integer constant
expression.
FORTRAN 77 Full Language Page 9-2
DATA STATEMENT ANSI X3J3/90.4
9.3 Implied-DO_in_a_DATA_Statement
The form of an implied-DO list in a DATA statement is:
( dlist_____, i_ = m_918, m_928 [,m_938 ] )
where: dlist_____ is a list of array element names and
implied-DO lists
i_ is the name of an integer variable, called
the implied_______-DO__-variable________
m_91,8 m_92,8 m_938 are each an integer constant
expression, except that the expression may
contain implied- DO-variables of other
implied-DO lists that have this implied-DO
list within their ranges
The range of an implied-DO list is the list dlist_____. An
iteration count and the values of the implied-DO-
variable are established from m_918, m_928, and m_938 exactly as
for a DO-loop (11.10), except that the iteration count
must be positive. When an implied-DO list appears in a
DATA statement, the list items in dlist_____ are specified
once for each iteration of the implied-DO list with the
appropriate substitution of values for any occurrence
of the implied-DO-variable i_. The appearance of an
implied-DO-variable name in a DATA statement does not
affect the definition status of a variable of the same
name in the same program unit.
Each subscript expression in the list dlist_____ must be an
integer constant expression, except that the expression
may contain implied-DO-variables of implied-DO lists
that have the subscript expression within their ranges.
The following is an example of a DATA statement that
contains implied-DO lists:
DATA (( X(J,I), I=1,J), J=1,5) / 15*0. /
9.4 Character_Constant_in_a_DATA_Statement
An entity in the list nlist___ _ _ that corresponds to a
character constant must be of type character.
If the length of the character entity in the list nlist_____
is greater than the length of its corresponding
character constant, the additional rightmost
characters in the entity are initially defined with
blank characters.
FORTRAN 77 Full Language Page 9-3
DATA STATEMENT ANSI X3J3/90.4
If the length of the character entity in the list nlist_____
is less than the length of its corresponding character
constant, the additional rightmost characters in the
constant are ignored.
Note that initial definition of a character entity
causes definition of all of the characters in the
entity, and that each character constant initially
defines exactly one variable, array element, or
substring.
FORTRAN 77 Full Language Page 9-4
CONTENTS
9. DATA STATEMENT................................ 9-1
9.1 Form of a DATA Statement................. 9-1
9.2 DATA Statement Restrictions.............. 9-1
9.3 Implied-DO in a DATA Statement........... 9-3
9.4 Character Constant in a DATA
Statement................................ 9-3
- i -
ANSI X3J3/90.4
10. ASSIGNMENT_STATEMENTS
Completion of execution of an assignment statement
causes definition of an entity.
There are four kinds of assignment statements:
(1) Arithmetic
(2) Logical
(3) Statement label (ASSIGN)
(4) Character
10.1 Arithmetic_Assignment_Statement
The form of an arithmetic assignment statement is:
v_ = e_
where: v_ is the name of a variable or array element
of type integer, real, double precision, or
complex
e_ is an arithmetic expression
Execution of an arithmetic assignment statement causes
the evaluation of the expression e_ by the rules in
Section 6, conversion of e_ to the type of v_ , and
definition and assignment of v_ with the resulting
value, as established by the rules in Table 4.
Table 4
Arithmetic Conversion and Assignment of e_ to v_
8 _____________________________
Type of v_ Value
Assigned
8 _____________________________
Integer INT(e_)
8 _____________________________
Real REAL(e_)
8 _____________________________
Double precision DBLE(e_)
8 _____________________________
Complex CMPLX(e_)
8 _____________________________
7 |8|7|7|7|7|7|7|7|7|7|7|7|7|
9 |8|7|7|7|7|7|7|7|7|7|7|7|7|
9 |8|7|7|7|7|7|7|7|7|7|7|7|7|
9
FORTRAN 77 Full Language Page 10-1
ASSIGNMENT STATEMENTS ANSI X3J3/90.4
The functions in the "Value Assigned" column of Table 4
are generic functions described in Table 5 (15.10).
10.2 Logical_Assignment_Statement
The form of a logical assignment statement is:
v_ = e_
where: v_ is the name of a logical variable or logical
array element
e_ is a logical expression
Execution of a logical assignment statement causes the
evaluation of the logical expression e_ and the
assignment and definition of v_ with the value of e_ .
Note that e_ must have a value of either true or false.
10.3 Statement_Label_Assignment_(ASSIGN)_Statement
The form of a statement label assignment statement is:
ASSIGN s_ TO i_
where: s_ is a statement label
i_ is an integer variable name
Execution of an ASSIGN statement causes the statement
label s_ to be assigned to the integer variable i_. The
statement label must be the label of a statement that
appears in the same program unit as the ASSIGN
statement. The statement label must be the label of an
executable statement or a FORMAT statement.
Execution of a statement label assignment statement is
the only way that a variable may be defined with a
statement label value.
A variable must be defined with a statement label value
when referenced in an assigned GO TO statement (11.3)
or as a format identifier (12.4) in an input/output
statement. While defined with a statement label value,
the variable must not be referenced in any other way.
An integer variable defined with a statement label
value may be redefined with the same or a different
statement label value or an integer value.
FORTRAN 77 Full Language Page 10-2
ASSIGNMENT STATEMENTS ANSI X3J3/90.4
10.4 Character_Assignment_Statement
The form of a character assignment statement is:
v_ = e_
where: v_ is the name of a character variable,
character array element, or character
substring
e_ is a character expression
Execution of a character assignment statement causes
the evaluation of the expression e_ and the assignment
and definition of v_ with the value of e_. None of the
character positions being defined in v_ may be
referenced in e_. v_ and e_ may have different lengths.
If the length of v_ is greater than the length of e_, the
effect is as though e_ were extended to the right with
blank characters until it is the same length as v_ and
then assigned. If the length of v_ is less than the
length of e_, the effect is as though e_ were truncated
from the right until it is the same length as v_ and
then assigned.
Only as much of the value of e_ must be defined as is
needed to define v_. In the example:
CHARACTER A*2,B*4
A=B
the assignment A=B requires that the substring B(1:2)
be defined. It does not require that the substring
B(3:4) be defined.
If v_ is a substring, e_ is assigned only to the
substring. The definition status of substrings not
specified by v_ is unchanged.
FORTRAN 77 Full Language Page 10-3
CONTENTS
10. ASSIGNMENT STATEMENTS....................... 10-1
10.1 Arithmetic Assignment Statement....... 10-1
10.2 Logical Assignment Statement.......... 10-2
10.3 Statement Label Assignment (ASSIGN)
Statement............................. 10-2
10.4 Character Assignment Statement........ 10-3
- i -
ANSI X3J3/90.4
11. CONTROL_STATEMENTS
Control statements may be used to control the execution
sequence.
There are sixteen control statements:
(1) Unconditional GO TO
(2) Computed GO TO
(3) Assigned GO TO
(4) Arithmetic IF
(5) Logical IF
(6) Block IF
(7) ELSE IF
(8) ELSE
(9) END IF
(10) DO
(11) CONTINUE
(12) STOP
(13) PAUSE
(14) END
(15) CALL
(16) RETURN
The CALL and RETURN statements are described in Section
15.
11.1 Unconditional_GO_TO_Statement
The form of an unconditional GO TO statement is:
GO TO s_
where s_ is the statement label of an executable
statement that appears in the same program unit as the
unconditional GO TO statement.
FORTRAN 77 Full Language Page 11-1
CONTROL STATEMENTS ANSI X3J3/90.4
Execution of an unconditional GO TO statement causes a
transfer of control so that the statement identified by
the statement label is executed next.
11.2 Computed_GO_TO_Statement
The form of a computed GO TO statement is:
GO TO (s_ [,s_]...) [,] i_
where: i_ is an integer expression
s_ is the statement label of an executable
statement that appears in the same program
unit as the computed GO TO statement. The
same statement label may appear more than
once in the same computed GO TO statement.
Execution of a computed GO TO statement causes
evaluation of the expression i_. The evaluation of i_ is
followed by a transfer of control so that the statement
identified by the i_th statement label in the list of
statement labels is executed next, provided that 1 < i_
< n_, where n_ is the number of statement labels in the
list of statement labels. If i_<1 or i_>n_, the execution
sequence continues as though a CONTINUE statement were
executed.
11.3 Assigned_GO_TO_Statement
The form of an assigned GO TO statement is:
GO TO i_ [[,] (s_ [,s_]...)]
where: i_ is an integer variable name
s_ is the statement label of an executable
statement that appears in the same program
unit as the assigned GO TO statement. The
same statement label may appear more than
once in the same assigned GO TO statement.
At the time of execution of an assigned GO TO
statement, the variable i_ must be defined with the
value of a statement label of an executable statement
that appears in the same program unit. Note that the
variable may be defined with a statement label value
only by an ASSIGN statement (10.3) in the same program
unit as the assigned GO TO statement. The execution of
the assigned GO TO statement causes a transfer of
control so that the statement identified by that
FORTRAN 77 Full Language Page 11-2
CONTROL STATEMENTS ANSI X3J3/90.4
statement label is executed next.
If the parenthesized list is present, the statement
label assigned to i_ must be one of the statement labels
in the list.
11.4 Arithmetic_IF_Statement
The form of an arithmetic IF statement is:
IF (e_) s_918 , s_928 , s_93
9 where: e_ is an integer, real, or double precision
expression
s_918, s_928, and s_938 are each the statement label of
an executable statement that appears in the
same program unit as the arithmetic IF
statement. The same statement label may
appear more than once in the same arithmetic
IF statement.
Execution of an arithmetic IF statement causes
evaluation of the expression e_ followed by a transfer
of control. The statement identified by s_918, s_928, or s_93
8 is executed next as the value of e_ is less than zero,
equal to zero, or greater than zero, respectively.
11.5 Logical_IF_Statement
The form of a logical IF statement is:
IF (e_) st__
where: e_ is a logical expression
st__ is any executable statement except a DO,
block IF, ELSE IF, ELSE, END IF, END, or
another logical IF statement
Execution of a logical IF statement causes evaluation
of the expression e_ . If the value of e_ is true,
statement st__ is executed. If the value of e_ is false,
statement st__ is not executed and the execution sequence
continues as though a CONTINUE statement were executed.
Note that the execution of a function reference in the
expression e_ of a logical IF statement is permitted to
affect entities in the statement st__.
FORTRAN 77 Full Language Page 11-3
CONTROL STATEMENTS ANSI X3J3/90.4
11.6 Block_IF_Statement
The block IF statement is used with the END IF
statement and, optionally, the ELSE IF and ELSE
statements to control the execution sequence.
The form of a block IF statement is:
IF (e_) THEN
where e_ is a logical expression.
11.6.1 IF-Level. The IF-level of a statement s_ is
n_918 - n_92
9 where n_918 is the number of block IF statements from the
beginning of the program unit up to and including s_,
and n_928 is the number of END IF statements in the
program unit up to but not including s_.
The IF-level of every statement must be zero or
positive. The IF-level of each block IF, ELSE IF,
ELSE, and END IF statement must be positive. The IF-
level of the END statement of each program unit must be
zero.
11.6.2 IF-Block. An IF-block consists of all of the
executable statements that appear following the block
IF statement up to, but not including, the next ELSE
IF, ELSE, or END IF statement that has the same IF-
level as the block IF statement. An IF-block may be
empty.
11.6.3 Execution_of_a_Block_IF_Statement. Execution
of a block IF statement causes evaluation of the
expression e_. If the value of e_ is true, normal
execution sequence continues with the first statement
of the IF-block. If the value of e_ is true and the
IF-block is empty, control is transferred to the next
END IF statement that has the same IF-level as the
block IF statement. If the value of e_ is false,
control is transferred to the next ELSE IF, ELSE, or
END IF statement that has the same IF-level as the
block IF statement.
Transfer of control into an IF-block from outside the
IF-block is prohibited.
If the execution of the last statement in the IF-block
does not result in a transfer of control, control is
FORTRAN 77 Full Language Page 11-4
CONTROL STATEMENTS ANSI X3J3/90.4
transferred to the next END IF statement that has the
same IF-level as the block IF statement that precedes
the IF-block.
11.7 ELSE_IF_Statement
The form of an ELSE IF statement is:
ELSE IF (e_) THEN
where e_ is a logical expression.
11.7.1 ELSE_IF-Block. An ELSE IF-block consists of
all of the executable statements that appear following
the ELSE IF statement up to, but not including, the
next ELSE IF, ELSE, or END IF statement that has the
same IF-level as the ELSE IF statement. An ELSE IF-
block may be empty.
11.7.2 Execution_of_an_ELSE_IF_Statement. Execution
of an ELSE IF statement causes evaluation of the
expression e_. If the value of e_ is true, normal
execution sequence continues with the first statement
of the ELSE IF-block. If the value of e_ is true and
the ELSE IF-block is empty, control is transferred to
the next END IF statement that has the same IF-level as
the ELSE IF statement. If the value of e_ is false,
control is transferred to the next ELSE IF, ELSE, or
END IF statement that has the same IF-level as the ELSE
IF statement.
Transfer of control into an ELSE IF-block from outside
the ELSE IF-block is prohibited. The statement label,
if any, of the ELSE IF statement must not be referenced
by any statement.
If execution of the last statement in the ELSE IF-block
does not result in a transfer of control, control is
transferred to the next END IF statement that has the
same IF-level as the ELSE IF statement that precedes
the ELSE IF-block.
11.8 ELSE_Statement
The form of an ELSE statement is:
ELSE
11.8.1 ELSE-Block. An ELSE-block consists of all of
the executable statements that appear following the
ELSE statement up to, but not including, the next END
FORTRAN 77 Full Language Page 11-5
CONTROL STATEMENTS ANSI X3J3/90.4
IF statement that has the same IF-level as the ELSE
statement. An ELSE-block may be empty.
An END IF statement of the same IF-level as the ELSE
statement must appear before the appearance of an ELSE
IF or ELSE statement of the same IF-level.
11.8.2 Execution_of_an_ELSE_Statement. Execution of
an ELSE statement has no effect.
Transfer of control into an ELSE-block from outside the
ELSE-block is prohibited. The statement label, if any,
of an ELSE statement must not be referenced by any
statement.
11.9 END_IF_Statement
The form of an END IF statement is:
END IF
Execution of an END IF statement has no effect.
For each block IF statement there must be a
corresponding END IF statement in the same program
unit. A corresponding END IF statement is the next END
IF statement that has the same IF-level as the block IF
statement.
11.10 DO_Statement
A DO statement is used to specify a loop, called a DO-
loop.
The form of a DO statement is:
DO s_ [,] i_ = e_918, e_928, [,e_938]
where: s_ is the statement label of an executable
statement. The statement identified by s_,
called the terminal________ statement________ _ of the DO-
loop, must follow the DO statement in the
sequence of statements within the same
program unit as the DO statement.
i_ is the name of an integer, real, or double
precision variable, called the DO-variable___________
e_918, e_928, and e_938 are each an integer, real, or
double precision expression
FORTRAN 77 Full Language Page 11-6
CONTROL STATEMENTS ANSI X3J3/90.4
The terminal statement of a DO-loop must not be an
unconditional GO TO, assigned GO TO, arithmetic IF,
block IF, ELSE IF, ELSE, END IF, RETURN, STOP, END, or
DO statement. If the terminal statement of a DO-loop
is a logical IF statement, it may contain any
executable statement except a DO, block IF, ELSE IF,
ELSE, END IF, END, or another logical IF statement.
11.10.1 Range_of_a_DO-Loop. The range of a DO-loop
consists of all of the executable statements that
appear following the DO statement that specifies the
DO-loop, up to and including the terminal statement of
the DO-loop.
If a DO statement appears within the range of a DO-
loop, the range of the DO-loop specified by that DO
statement must be contained entirely within the range
of the outer DO-loop. More than one DO-loop may have
the same terminal statement.
If a DO statement appears within an IF-block, ELSE IF-
block, or ELSE-block, the range of that DO-loop must be
contained entirely within that IF-block, ELSE IF-block,
or ELSE-block, respectively.
If a block IF statement appears within the range of a
DO-loop, the corresponding END IF statement must also
appear within the range of that DO-loop.
11.10.2 Active_and_Inactive_DO-Loops. A DO-loop is
either active or inactive. Initially inactive, a DO-
loop becomes active only when its DO statement is
executed.
Once active, the DO-loop becomes inactive only when:
(1) its iteration count is tested (11.10.4) and
determined to be zero,
(2) a RETURN statement is executed within its range,
(3) control is transferred to a statement that is in
the same program unit and is outside the range
of the DO-loop, or
(4) any STOP statement in the executable program is
executed, or execution is terminated for any
other reason (12.6).
Execution of a function reference or CALL statement
that appears in the range of a DO-loop does not cause
FORTRAN 77 Full Language Page 11-7
CONTROL STATEMENTS ANSI X3J3/90.4
the DO-loop to become inactive, except when control is
returned by means of an alternate return specifier in a
CALL statement to a statement that is not in the range
of the DO-loop.
When a DO-loop becomes inactive, the DO-variable of the
DO-loop retains its last defined value.
11.10.3 Executing_a_DO_Statement. The effect of
executing a DO statement is to perform the following
steps in sequence:
(1) The initial parameter m918, the terminal parameter
m928, and the incrementation parameter m938 are
established by evaluating e_918, e_928, and e_938,
respectively, including, if necessary,
conversion to the type of the DO-variable
according to the rules for arithmetic conversion
(Table 4). If e_938 does not appear, m_938 has a
value of one. m_938 must not have a value of zero.
(2) The DO-variable becomes defined with the value
of the initial parameter m_918.
(3) The iteration count is established and is the
value of the expression
MAX( INT( (m_928 - m_918 + m_938)/m_938), 0)
Note that the iteration count is zero whenever:
m_918 > m_928 and m_938 > 0, or
m_918 < m_928 and m_938 < 0.
At the completion of execution of the DO statement,
loop control processing begins.
11.10.4 Loop_Control_Processing. Loop control
processing determines if further execution of the range
of the DO-loop is required. The iteration count is
tested. If it is not zero, execution of the first
statement in the range of the DO-loop begins. If the
iteration count is zero, the DO-loop becomes inactive.
If, as a result, all of the DO-loops sharing the
terminal statement of this DO-loop are inactive, normal
execution continues with execution of the next
executable statement following the terminal statement.
However, if some of the DO-loops sharing the terminal
statement are active, execution continues with
incrementation processing, as described in 11.10.7.
FORTRAN 77 Full Language Page 11-8
CONTROL STATEMENTS ANSI X3J3/90.4
11.10.5 Execution_of_the_Range. Statements in the
range of a DO-loop are executed until the terminal
statement is reached. Except by the incrementation
described in 11.10.7, the DO-variable of the DO-loop
may neither be redefined nor become undefined during
execution of the range of the DO-loop.
11.10.6 Terminal_Statement_Execution. Execution of
the terminal statement occurs as a result of the normal
execution sequence or as a result of transfer of
control, subject to the restrictions in 11.10.8.
Unless execution of the terminal statement results in a
transfer of control, execution then continues with
incrementation processing, as described in 11.10.7.
11.10.7 Incrementation_Processing. Incrementation
processing has the effect of the following steps
performed in sequence:
(1) The DO-variable, the iteration count, and the
incrementation parameter of the active DO-loop
whose DO statement was most recently executed,
are selected for processing.
(2) The value of the DO-variable is incremented by
the value of the incrementation parameter m_938.
(3) The iteration count is decremented by one.
(4) Execution continues with loop control processing
(11.10.4) of the same DO-loop whose iteration
count was decremented.
For example:
N=0
DO 100 I=1,10
J=I
DO 100 K=1,5
L=K
100 N=N+1
101 CONTINUE
After execution of these statements and at the
execution of the CONTINUE statement, I=11, J=10, K=6,
L=5, and N=50.
Also consider the following example:
N=0
DO 200=I=1,10
FORTRAN 77 Full Language Page 11-9
CONTROL STATEMENTS ANSI X3J3/90.4
J=I
D0 200 K=5,1
L=K
200 N=N+1
201 CONTINUE
After execution of these statements and at the
execution of the CONTINUE statement, I=11, J=10, K=5,
and N=0. L is not defined by these statements.
11.10.8 Transfer_into_the_Range_of_a_DO-Loop.
Transfer of control into the range of a DO-loop from
outside the range is not permitted.
11.11 CONTINUE_Statement
The form of a CONTINUE statement is:
CONTINUE
Execution of a CONTINUE statement has no effect.
If the CONTINUE statement is the terminal statement of
a DO-loop, the next statement executed depends on the
result of the DO-loop incrementation processing
(11.10.7).
11.12 STOP_Statement
The form of a STOP statement is:
STOP [n_]
where n_ is a string of not more than five digits, or is
a character constant.
Execution of a STOP statement causes termination of
execution of the executable program. At the time of
termination, the digit string or character constant is
accessible.
11.13 PAUSE_Statement
The form of a PAUSE statement is:
PAUSE [n_]
where n_ is a string of not more than five digits, or is
a character constant.
FORTRAN 77 Full Language Page 11-10
CONTROL STATEMENTS ANSI X3J3/90.4
Execution of a PAUSE statement causes a cessation of
execution of the executable program. Execution must be
resumable. At the time of cessation of execution, the
digit string or character constant is accessible.
Resumption of execution is not under control of the
program. If execution is resumed, the execution
sequence continues as though a CONTINUE statement were
executed.
11.14 END_Statement
The END statement indicates the end of the sequence of
statements and comment lines of a program unit (3.5).
If executed in a function or subroutine subprogram, it
has the effect of a RETURN statement (15.8). If
executed in a main program, it terminates the execution
of the executable program.
The form of an END statement is:
END
An END statement is written only in columns 7 through
72 of an initial line. An END statement must not be
continued. No other statement in a program unit may
have an initial line that appears to be an END
statement.
The last line of every program unit must be an END
statement.
FORTRAN 77 Full Language Page 11-11
CONTENTS
11. CONTROL STATEMENTS......................... 11-1
11.1 Unconditional GO TO
Statement........................... 11-1
11.2 Computed GO TO Statement............ 11-2
11.3 Assigned GO TO Statement............ 11-2
11.4 Arithmetic IF Statement............. 11-3
11.5 Logical IF Statement................ 11-3
11.6 Block IF Statement.................. 11-4
11.6.1 IF-Level................... 11-4
11.6.2 IF-Block................... 11-4
11.6.3 Execution of a Block IF
Statement.................. 11-4
11.7 ELSE IF Statement................... 11-5
11.7.1 ELSE IF-Block.............. 11-5
11.7.2 Execution of an ELSE IF
Statement.................. 11-5
11.8 ELSE Statement...................... 11-5
11.8.1 ELSE-Block................. 11-5
11.8.2 Execution of an ELSE
Statement.................. 11-6
11.9 END IF Statement.................... 11-6
11.10 DO Statement........................ 11-6
11.10.1 Range of a DO-Loop......... 11-7
11.10.2 Active and Inactive DO-
Loops...................... 11-7
11.10.3 Executing a DO
Statement.................. 11-8
11.10.4 Loop Control
Processing................. 11-8
11.10.5 Execution of the
Range...................... 11-9
11.10.6 Terminal Statement
Execution.................. 11-9
11.10.7 Incrementation
Processing................. 11-9
11.10.8 Transfer into the Range of
a DO-Loop.................. 11-10
11.11 CONTINUE Statement.................. 11-10
11.12 STOP Statement...................... 11-10
11.13 PAUSE Statement..................... 11-10
11.14 END Statement....................... 11-11
- i -
ANSI X3J3/90.4
12. INPUT/OUTPUT_STATEMENTS
Input statements provide the means of transferring data
from external media to internal storage or from an
internal file to internal storage. This process is
called reading. Output statements provide the means of
transferring data from internal storage to external
media or from internal storage to an internal file.
This process is called writing. Some input/output
statements specify that editing of the data is to be
performed.
In addition to the statements that transfer data, there
are auxiliary input/output statements to manipulate the
external medium, or to inquire about or describe the
properties of the connection to the external medium.
There are nine input/output statements:
(1) READ
(2) WRITE
(3) PRINT
(4) OPEN
(5) CLOSE
(6) INQUIRE
(7) BACKSPACE
(8) ENDFILE
(9) REWIND
The READ, WRITE, and PRINT statements are data transfer
input/output statements (12.8). The OPEN, CLOSE,
INQUIRE, BACKSPACE, ENDFILE, and REWIND statements are
auxiliary input/output statements (12.10). The
BACKSPACE, ENDFILE, and REWIND statements are file
positioning input/output statements (12.10.4).
12.1 Records
A record is a sequence (2.1) of values or a sequence of
characters. For example, a punched card is usually
considered to be a record. However, a record does not
necessarily correspond to a physical entity. There are
three kinds of records:
FORTRAN 77 Full Language Page 12-1
INPUT/OUTPUT STATEMENTS ANSI X3J3/90.4
(1) Formatted
(2) Unformatted
(3) Endfile
12.1.1 Formatted_Record. A formatted record consists
of a sequence of characters that are capable of
representation in the processor. The length of a
formatted record is measured in characters and depends
primarily on the number of characters put into the
record when it is written. However, it may depend on
the processor and the external medium. The length may
be zero. Formatted records may be read or written only
by formatted input/output statements (12.8.1).
Formatted records may be prepared by some means other
than FORTRAN; for example, by some manual input device.
12.1.2 Unformatted_Record. An unformatted record
consists of a sequence of values in a processor-
dependent form and may contain both character and
noncharacter data or may contain no data. The length
of an unformatted record is measured in processor-
dependent units and depends on the output list (12.8.2)
used when it is written, as well as on the processor
and the external medium. The length may be zero.
Unformatted records may be read or written only by
unformatted input/output statements (12.8.1).
12.1.3 Endfile_Record. An endfile record is written
by an ENDFILE statement. An endfile record may occur
only as the last record of a file. An endfile record
does not have a length property.
12.2 Files
A file is a sequence (2.1) of records.
There are two kinds of files:
(1) External
(2) Internal
12.2.1 File_Existence. At any given time, there is a
processor-determined set of files that are said to
exist for an executable program. A file may be known
to the processor, yet not exist for an executable
program at a particular time. For example, security
FORTRAN 77 Full Language Page 12-2
INPUT/OUTPUT STATEMENTS ANSI X3J3/90.4
reasons may prevent a file from existing for an
executable program. A file may exist and contain no
records; an example is a newly created file not yet
written.
To create a file means to cause a file to exist that
did not previously exist. To delete a file means to
terminate the existence of the file.
All input/output statements may refer to files that
exist. The INQUIRE, OPEN, CLOSE, WRITE, PRINT, and
ENDFILE statements may also refer to files that do not
exist.
12.2.2 File_Properties. At any given time, there is a
processor-determined set of allowed access methods, a
processor-determined set of allowed forms, and a
processor-determined set of allowed record lengths for
a file.
A file may have a name; a file that has a name is
called a named file. The name of a named file is a
character string. The set of allowable names is
processor dependent and may be empty.
12.2.3 File_Position. A file that is connected to a
unit (12.3) has a position property. Execution of
certain input/output statements affects the position of
a file. Certain circumstances can cause the position
of a file to become indeterminate.
The initial point of a file is the position just before
the first record The terminal point is the position
just after the last record.
If a file is positioned within a record, that record is
the current record; otherwise, there is no current
record.
Let n_ be the number of records in the file. If 1 < i_ <
n_ and a file is positioned within the i_th record or
between the (i_-1)th record and the i_th record, the (i_ -
1)th record is the preceding record. If n_ >1 and the
file is positioned at its terminal point, the preceding
record is the n_th and last record. If n_=0 or if a file
is positioned at its initial point or within the first
record, there is no preceding record.
If 1 < i_ < n_ and a file is positioned within the i_ th
record or between the i_th and (i_+1)th record, the (i_+
1)th record is the next record. If n_ > 1 and the file
FORTRAN 77 Full Language Page 12-3
INPUT/OUTPUT STATEMENTS ANSI X3J3/90.4
is positioned at its initial point, the first record is
the next record. If n_=0 or if a file is positioned at
its terminal point or within the n_th and last record,
there is no next record.
12.2.4 File_Access. There are two methods of
accessing the records of an external file: sequential
and direct. Some files may have more than one allowed
access method; other files may be restricted to one
access method. For example, a processor may allow only
sequential access to a file on magnetic tape. Thus,
the set of allowed access methods depends on the file
and the processor.
The method of accessing the file is determined when the
file is connected to a unit (12.3.2).
An internal file must be accessed sequentially.
12.2.4.1 Sequential_Access. When connected for
sequential access, a file has the following properties:
(1) The order of the records is the order in which
they were written if the direct access method is
not a member of the set of allowed access
methods for the file. If the direct access
method is also a member of the set of allowed
access methods for the file, the order of the
records is the same as that specified for direct
access (12.2.4.2). The first record accessed by
sequential access is the record whose record
number is 1 for direct access. The second
record accessed by sequential access is the
record whose record number is 2 for direct
access, etc. A record that has not been written
since the file was created must not be read.
(2) The records of the file are either all formatted
or all unformatted, except that the last record
of the file may be an endfile record.
(3) The records of the file must not be read or
written by direct access input/output statements
(12.8.1).
12.2.4.2 Direct_Access. When connected for direct
access, a file has the following properties:
(1) The order of the records is the order of their
record numbers. The records may be read or
written in any order.
FORTRAN 77 Full Language Page 12-4
INPUT/OUTPUT STATEMENTS ANSI X3J3/90.4
(2) The records of the file are either all formatted
or all unformatted. If the sequential access
method is also a member of the set of allowed
access methods for the file, its endfile record,
if any, is not considered to be part of the file
while it is connected for direct access. If the
sequential access method is not a member of the
set of allowed access methods for the file, the
file must not contain an endfile record.
(3) Reading and writing records is accomplished only
by direct access input/output statements
(12.8.1).
(4) All records of the file have the same length.
(5) Each record of the file is uniquely identified
by a positive integer called the record number.
The record number of a record is specified when
the record is written. Once established, the
record number of a record can never be changed.
Note that a record may not be deleted; however,
a record may be rewritten.
(6) Records need not be read or written in the order
of their record numbers. Any record may be
written into the file while it is connected
(12.3.2) to a unit. For example, it is
permissible to write record 3, even though
records 1 and 2 have not been written. Any
record may be read from the file while it is
connected to a unit, provided that the record
was written since the file was created.
(7) The records of the file must not be read or
written using list-directed formatting.
12.2.5 Internal_Files. Internal files provide a means
of transferring and converting data from internal
storage to internal storage.
12.2.5.1 Internal_File_Properties. An internal file
has the following properties:
(1) The file is a character variable, character
array element, character array, or character
substring.
(2) A record of an internal file is a character
variable, character array element, or character
FORTRAN 77 Full Language Page 12-5
INPUT/OUTPUT STATEMENTS ANSI X3J3/90.4
substring.
(3) If the file is a character variable, character
array element, or character substring, it
consists of a single record whose length is the
same as the length of the variable, array
element, or substring, respectively. If the
file is a character array, it is treated as a
sequence of character array elements. Each
array element is a record of the file. The
ordering of the records of the file is the same
as the ordering of the array elements in the
array (5.2.4). Every record of the file has the
same length, which is the length of an array
element in the array.
(4) The variable, array element, or substring that
is the record of the internal file becomes
defined by writing the record. If the number of
characters written in a record is less than the
length of the record, the remaining portion of
the record is filled with blanks.
(5) A record may be read only if the variable, array
element, or substring that is the record is
defined.
(6) A variable, array element, or substring that is
a record of an internal file may become defined
(or undefined) by means other than an output
statement. For example, the variable, array
element, or substring may become defined by a
character assignment statement.
(7) An internal file is always positioned at the
beginning of the first record prior to data
transfer.
12.2.5.2 Internal_File_Restrictions. An internal file
has the following restrictions:
(1) Reading and writing records is accomplished only
by sequential access formatted input/output
statements (12.8.1) that do not specify list-
directed formatting.
(2) An auxiliary input/output statement must not
specify an internal file.
FORTRAN 77 Full Language Page 12-6
INPUT/OUTPUT STATEMENTS ANSI X3J3/90.4
12.3 Units
A unit is a means of referring to a file.
12.3.1 Unit_Existence. At any given time, there is a
processor-determined set of units that are said to
exist for an executable program.
All input/output statements may refer to units that
exist. The INQUIRE and CLOSE statements may also refer
to units that do not exist.
12.3.2 Connection_of_a_Unit. A unit has a property of
being connected or not connected. If connected, it
refers to a file. A unit may become connected by
preconnection or by the execution of an OPEN statement.
The property of connection is symmetric: if a unit is
connected to a file, the file is connected to the unit.
Preconnection means that the unit is connected to a
file at the beginning of execution of the executable
program and therefore may be referenced by input/output
statements without the prior execution of an OPEN
statement.
All input/output statements except OPEN, CLOSE, and
INQUIRE must reference a unit that is connected to a
file and thereby make use of or affect that file.
A file may be connected and not exist. An example is a
preconnected new file.
A unit must not be connected to more than one file at
the same time, and a file must not be connected to more
than one unit at the same time. However, means are
provided to change the status of a unit and to connect
a unit to a different file.
After a unit has been disconnected by the execution of
a CLOSE statement, it may be connected again within the
same executable program to the same file or a different
file. After a file has been disconnected by the
execution of a CLOSE statement, it may be connected
again within the same executable program to the same
unit or a different unit. Note, however, that the only
means to refer to a file that has been disconnected is
by its name in an OPEN or INQUIRE statement.
Therefore, there may be no means of reconnecting an
unnamed file once it is disconnected.
FORTRAN 77 Full Language Page 12-7
INPUT/OUTPUT STATEMENTS ANSI X3J3/90.4
12.3.3 Unit_Specifier_and_Identifier. The form of a
unit specifier is:
[UNIT =] u_
where u_ is an external unit identifier or an internal
file identifier.
An external unit identifier is used to refer to an
external file. An internal file identifier is used to
refer to an internal file.
An external unit identifier is one of the following:
(1) An integer expression i_ whose value must be zero
or positive
(2) An asterisk, identifying a particular
processor-determined external unit that is
preconnected for formatted sequential access
(12.9.2)
The external unit identified by the value of i_ is the
same external unit in all program units of the
executable program. In the example:
SUBROUTINE A
READ (6) X
SUBROUTINE B
N=6
REWIND N
the value 6 used in both program units identifies the
same external unit.
An external unit identifier in an auxiliary
input/output statement (12.10) must not be an asterisk.
An internal file identifier is the name of a character
variable, character array, character array element, or
character substring.
If the optional characters UNIT= are omitted from the
unit specifier, the unit specifier must be the first
item in a list of specifiers.
FORTRAN 77 Full Language Page 12-8
INPUT/OUTPUT STATEMENTS ANSI X3J3/90.4
12.4 Format_Specifier_and_Identifier
The form of a format specifier is:
[FMT =] f_
where f_ is a format identifier.
A format identifier identifies a format. A format
identifier must be one of the following:
(1) The statement label of a FORMAT statement that
appears in the same program unit as the format
identifier.
(2) An integer variable name that has been assigned
the statement label of a FORMAT statement that
appears in the same program unit as the format
identifier (10.3).
(3) A character array name (13.1.2).
(4) Any character expression except a character
expression involving concatenation of an operand
whose length specification is an asterisk in
parentheses unless the operand is the symbolic
name of a constant. Note that a character
constant is permitted.
(5) An asterisk, specifying list-directed
formatting.
If the optional characters FMT= are omitted from the
format specifier, the format specifier must be the
second item in the control information list and the
first item must be the unit specifier without the
optional characters UNIT=.
12.5 Record_Specifier
The form of a record specifier is:
REC = rn__
where rn__ is an integer expression whose value is
positive. It specifies the number of the record that
is to be read or written in a file connected for direct
access.
FORTRAN 77 Full Language Page 12-9
INPUT/OUTPUT STATEMENTS ANSI X3J3/90.4
12.6 Error_and_End-of-File_Conditions
The set of input/output error conditions is processor
dependent.
An end-of-file condition exists if either of the
following events occurs:
(1) An endfile record is encountered during the
reading of a file connected for sequential
access. In this case, the file is positioned
after the endfile record.
(2) An attempt is made to read a record beyond the
end of an internal file.
If an error condition occurs during execution of an
input/output statement, execution of the input/output
statement terminates and the position of the file
becomes indeterminate.
If an error condition or an end-of-file condition
occurs during execution of a READ statement, execution
of the READ statement terminates and the entities
specified by the input list and implied-DO-variables in
the input list become undefined. Note that variables
and array elements appearing only in subscripts,
substring expressions, and implied-DO parameters in an
input list do not become undefined when the entities
specified by the list become undefined.
If an error condition occurs during execution of an
output statement, execution of the output statement
terminates and implied-DO-variables in the output list
become undefined.
If an error condition occurs during execution of an
input/output statement that contains neither an
input/output status specifier (12.7) nor an error
specifier (12.7.1), or if an end-of-file condition
occurs during execution of a READ statement that
contains neither an input/output status specifier nor
an end-of-file specifier (12.7.2), execution of the
executable program is terminated.
FORTRAN 77 Full Language Page 12-10
INPUT/OUTPUT STATEMENTS ANSI X3J3/90.4
12.7 Input/Output Status, Error, and End-of-File
Specifiers
The form of an input/output status specifier is:
IOSTAT = ios___
where ios___ is an integer variable or integer array
element.
Execution of an input/output statement containing this
specifier causes ios___ to become defined:
(1) with a zero value if neither an error condition
nor an end-of-file condition is encountered by
the processor,
(2) with a processor-dependent positive integer
value if an error condition is encountered, or
(3) with a processor-dependent negative integer
value if an end-of-file condition is encountered
and no error condition is encountered.
12.7.1 Error_Specifier. The form of an error
specifier is:
ERR = s_
where s_ is the statement label of an executable
statement that appears in the same program unit as the
error specifier.
If an input/output statement contains an error
specifier and the processor encounters an error
condition during execution of the statement:
(1) execution of the input/output statement
terminates,
(2) the position of the file specified in the
input/output statement becomes
indeterminate,
(3) if the input/output statement contains an
input/output status specifier (12.7), the
variable or array element ios__ _ becomes defined
with a processor-dependent positive integer
value, and
FORTRAN 77 Full Language Page 12-11
INPUT/OUTPUT STATEMENTS ANSI X3J3/90.4
(4) execution continues with the statement labeled s_
.
12.7.2 End-of-File_Specifier. The form of an end-of-
file specifier is:
END = s_
where s_ is the statement label of an executable
statement that appears in the same program unit as the
end-of-file specifier.
If a READ statement contains an end-of-file specifier
and the processor encounters an end-of-file condition
and no error condition during execution of the
statement:
(1) execution of the READ statement terminates,
(2) if the READ statement contains an input/output
status specifier (12.7), the variable or array
element ios___ becomes defined with a processor-
dependent negative integer value, and
(3) execution continues with the statement labeled s_
.
12.8 READ,_WRITE,_and_PRINT_Statements
The READ statement is the data transfer input
statement. The WRITE and PRINT statements are the data
transfer output statements. The forms of the data
transfer input/output statements are:
READ (cilist______) [iolist______]
READ f_ [,iolist______]
WRITE (cilist______) [iolist______]
PRINT f_ [,iolist______]
where: cilist______ is a control information list (12.8.1)
that includes:
(1) A reference to the source or destination
of the data to be transferred
(2) Optional specification of= editing
processes
FORTRAN 77 Full Language Page 12-12
INPUT/OUTPUT STATEMENTS ANSI X3J3/90.4
(3) Optional specifiers that determine the
execution sequence on the occurrence of
certain events
(4) Optional specification to identify a
record
(5) Optional specification to provide t|%he
return of the input/output status
f_ is a format identifier (12.4)
iolist_ _ _ _ _ _ is an input/output list (12.8.2)
specifying the data to be transferred
12.8.1 Control_Information_List. A control
information list, cilist, is a list (2.10) whose list
items may be any of the following:
8 ______________
[UNIT =] u_
[FMT =] f_
REC = rn__
IOSTAT = ios___
ERR = s_
END = s_
8 ______________
7 |8|7|7|7|7|7|7|
9 |8|7|7|7|7|7|7|
9 A control information list must contain exactly one
unit specifier (12.3.3), at most one format specifier
(12.4), at most one record specifier (12.5), at most
one input/output status specifier (12.7), at most one
error specifier (12.7.1), and at most one end-of-file
specifier (12.7.2).
If the control information list contains a format
specifier, the statement is a formatted input/output
statement; otherwise, it is an unformatted input/output
statement.
If the control information list contains a record
specifier, the statement is a direct access
input/output statement; otherwise, it is a sequential
access input/output statement.
If the optional characters UNIT= are omitted from the
unit specifier, the unit specifier must be the first
item in the control information list.
If the optional characters FMT= are omitted from the
format specifier, the format specifier must be the
FORTRAN 77 Full Language Page 12-13
INPUT/OUTPUT STATEMENTS ANSI X3J3/90.4
second item in the control information list and the
first item must be the unit specifier without the
optional characters UNIT=.
A control information list must not contain both a
record specifier and an end-of-file specifier.
If the format identifier is an asterisk, the statement
is a list-directed input/output statement and a record
specifier must not be present.
In a WRITE statement, the control information list must
not contain an end-of-file specifier.
If the unit specifier specifies an internal file, the
control information list must contain a format
identifier other than an asterisk and must not contain
a record specifier.
12.8.2 Input/Output_List. An input/output list,
iolist, specifies the entities whose values are
transferred by a data transfer input/output statement.
An input/output list is a list (2.10) of input/output
list items and implied-DO lists (12.8.2.3). An
input/output list item is either an input list item or
an output list item.
If an array name appears as an input/output list item,
it is treated as if all of the elements of the array
were specified in the order given by array element
ordering (5.2.4). The name of an assumed-size dummy
array must not appear as an input/output list item.
12.8.2.1 Input_List_Items. An input list item must be
one of the following:
(1) A variable name
(2) An array element name
(3) A character substring name
(4) An array name
Only input list items may appear as input/output list
items in an input statement.
12.8.2.2 Output_List_Items. An output list item must
be one of the following:
FORTRAN 77 Full Language Page 12-14
INPUT/OUTPUT STATEMENTS ANSI X3J3/90.4
(1) A variable name
(2) An array element name
(3) A character substring name
(4) An array name
(5) Any other expression except a character
expression involving concatenation of an operand
whose length specification is an asterisk in
parentheses unless the operand is the symbolic
name of a constant
Note that a constant, an expression involving operators
or function references, or an expression enclosed in
parentheses may appear as an output list item but must
not appear as an input list item.
12.8.2.3 Implied-DO_List. An implied-DO list is of
the form:
( dlist_____, i_ = e_918, e_928 [,e_938 ] )
where: i_ , are as specified for the DO statement
(11.10)
dlistunde>r is an input/output list
The range of an implied-DO list is the list dlist_ _ _ _ _ .
Note that dlist_____ may contain implied-DO . lists. The
iteration count and the values of the DO-variable i_ are
established from e_918, e_928, and e_938 exactly as for a DO-
loop. In an input statement, the DO-variable i_, or an
associated entity, must not appear as an input list
item in dlist_____. When an implied-DO list appears in an
input/output list, the list items in dlist_ _ ___ are
specified once for each iteration of the implied-DO
list with appropriate substitution of values for any
occurrence of the DO-variable i_.
12.9 Execution of a Data Transfer Input/Output
Statement
The effect of executing a data transfer input/output
statement must be as if the following operations were
performed in the order specified:
(1) Determine the direction of data transfer
FORTRAN 77 Full Language Page 12-15
INPUT/OUTPUT STATEMENTS ANSI X3J3/90.4
(2) Identify the unit
(3) Establish the format if any is specified
(4) Position the file prior to data transfer
(5) Transfer data between the file and the entities
specified by the input/output list (if any)
(6) Position the file after data transfer
(7) Cause the specified integer variable or array
element in the input/output status specifier (if
any) to become defined
12.9.1 Direction_of_Data_Transfer. Execution of a
READ statement causes values to be transferred from a
file to the entities specified by the input list, if
one is specified.
Execution of a WRITE or PRINT statement causes values
to be transferred to a file from the entities specified
by the output list and format specification (if any).
Execution of a WRITE or PRINT statement for a file that
does not exist creates the file, unless an error
condition occurs.
12.9.2 Identifying_a_Unit. A data transfer
input/output statement that contains a control
information list (12.8.1) includes a unit specifier
that identifies an external unit or an internal file.
A READ statement that does not contain a control
information list specifies a particular processor-
determined unit, which is the same as the unit
identified by an asterisk in a READ statement that
contains a control information list. A PRINT statement
specifies some other processor-determined unit, which
is the same as the unit identified by an asterisk in a
WRITE statement. Thus, each data transfer input/output
statement identifies an external unit or an internal
file.
The unit identified by a data transfer input/output
statement must be connected to a file when execution of
the statement begins.
12.9.3 Establishing_a_Format. If the control
information list contains a format identifier other
than an asterisk, the format specification identified
by the format identifier is established. If the format
identifier is an asterisk, list-directed formatting is
FORTRAN 77 Full Language Page 12-16
INPUT/OUTPUT STATEMENTS ANSI X3J3/90.4
established.
On output, if an internal file has been specified, a
format specification (13.1) that is in the file or is
associated (17.1) with the file must not be specified.
12.9.4 File_Position_Prior_to_Data_Transfer. The
positioning of the file prior to data transfer depends
on the method of access: sequential or direct.
If the file contains an endfile record, the file must
not be positioned after the endfile record prior to
data transfer.
12.9.4.1 Sequential_Access. On input, the file is
positioned at the beginning of the next record. This
record becomes the current record. On output, a new
record is created and becomes the last record of the
file.
An internal file is always positioned at the beginning
of the first record of the file. This record becomes
the current record.
12.9.4.2 Direct_Access. For direct access, the file
is positioned at the beginning of the record specified
by the record specifier (12.5). This record becomes
the current record.
12.9.5 Data_Transfer. Data are transferred between
records and entities specified by the input/output
list. The list items are processed in the order of the
input/output list.
All values needed to determine which entities are
specified by an input/output list item are determined
at the beginning of the processing of that item. All
values are transmitted to or from the entities
specified by a list item prior to the processing of any
succeeding list item. In the example,
READ (3) N, A(N)
two values are read; one is assigned to N, and the
second is assigned to A(N) for the new value of N.
An input list item, or an entity associated with it
(17.1.3), must not contain any portion of the
established format specification.
FORTRAN 77 Full Language Page 12-17
INPUT/OUTPUT STATEMENTS ANSI X3J3/90.4
If an intern file has been specified, an input/output
list item must not be in the file or associated with
the file.
A DO-variable becomes defined at the beginning of
processing of the items that constitute the range of an
implied-DO list.
On output, every entity whose value is to be
transferred must be defined.
On input, an attempt to read a record of a file
connected for direct access that has not previously
been written causes all entities specified by the input
list to become undefined.
12.9.5.1 Unformatted_Data_Transfer. During
unformatted data transfer, data are transferred without
editing between the current record and the entities
specified by the input/output list. Exactly one record
is read or written.
On input, the file must be positioned so that the
record read is an unformatted record or an endfile
record.
On input, the number of values required by the input
list must be less than or equal to the number of values
in the record.
On input, the type of each value in the record must
agree with the type of the corresponding entity in the
input list, except that one complex value may
correspond to two real list entities or two real values
may correspond to one complex list entity. If an
entity in the input list is of type character, the
length of the character entity must agree with the
length of the character value.
On output to a file connected for direct access, the
output list must not specify more values than can fit
into a record.
On output, if the file is connected for direct access
and the values specified by the output list do not fill
the record, the remainder of the record is undefined.
If the file is connected for formatted input/output,
unformatted data transfer is prohibited.
FORTRAN 77 Full Language Page 12-18
INPUT/OUTPUT STATEMENTS ANSI X3J3/90.4
The unit specified must be an external unit.
12.9.5.2 Formatted_Data_Transfer. During formatted
data transfer, data are transferred with editing
between the entities specified by the input/output list
and the file. The current record and possibly
additional records are read or written.
On input, the file must be positioned so that the
record read is a formatted record or an endfile record.
If the file is connected for unformatted input/output,
formatted data transfer is prohibited.
12.9.5.2.1 Using_a_Format_Specification. If a format
specification has been established, format control
(13.3) is initiated and editing is performed as
described in 13.3 through 13.5.
On input, the input list and format specification must
not require more characters from a record than the
record contains.
If the file is connected for direct access, the record
number is increased by one as each succeeding record is
read or written.
On output, if the file is connected for direct access
or is an internal file and the characters specified by
the output list and format do not fill a record, blank
characters are added to fill the record.
On output, if the file is connected for direct access
or is an internal file, the output list and format
specification must not specify more characters for a
record than can fit into the record.
12.9.5.2.2 List-Directed_Formatting. If list-directed
formatting has been established, editing is performed
as described in 13.6.
12.9.5.2.3 Printing_of_Formatted_Records. The
transfer of information in a formatted record to
certain devices determined by the processor is called
printing. If a formatted record is printed, the first
character of the record is not printed. The remaining
characters of the record, if any, are printed in one
line beginning at the left margin.
The first character of such a record determines
vertical spacing as follows:
FORTRAN 77 Full Language Page 12-19
INPUT/OUTPUT STATEMENTS ANSI X3J3/90.4
8 ______________________________________________
Character Vertical Spacing Before Printing
8 ______________________________________________
Blank One Line
0 Two Lines
1 To First Line of Next Page
+ No Advance
8 ______________________________________________
7 |7|7|7|7|7|7|7|
|7|7|7|7|7|7|7|
|7|7|7|7|7|7|7|
If there are no characters in the record (13.5.4), the
vertical spacing is one line and no characters other
than blank are printed in that line.
A PRINT statement does not imply that printing will
occur, and a WRITE statement does not imply that
printing will not occur.
12.9.6 File_Position_After_Data_Transfer. If an end-
of-file condition exists as a result of reading an
endfile record, the file is positioned after the
endfile record.
If no error condition or end-of-file condition exists,
the file is positioned after the last record read or
written and that record becomes the preceding record.
A record written on a file connected for sequential
access becomes the last record of the file.
If the file is positioned after the endfile record,
execution of a data transfer input/output statement is
prohibited. However, a BACKSPACE or REWIND statement
may be used to reposition the file.
If an error condition exists, the position of the file
is indeterminate.
12.9.7 Input/Output_Status_Specifier_Definition. If
the data transfer input/output statement contains an
input/output status specifier, the integer variable or
array element ios_ _ _ becomes defined. If no error
condition or end-of-file condition exists, the value of
ios_ __ is zero. If an error condition exists, the value
of ios___ is positive. If an end-of-file condition exists
and no error condition exists, the value of ios___ is
negative.
9
FORTRAN 77 Full Language Page 12-20
INPUT/OUTPUT STATEMENTS ANSI X3J3/90.4
12.10 Auxiliary_Input/Output_Statements
12.10.1 OPEN_Statement. An OPEN statement may be used
to connect (12.3.2) an existing file to a unit, create
a file (12.2.1) that is preconnected, create a file and
connect it to a unit, or change certain specifiers of a
connection between a file and a unit.
The form of an OPEN statement is:
OPEN (olist_____)
where olist_____ is a list (2.10) of specifiers:
8 ______________
[UNIT =] u_
IOSTAT = ios___
ERR = s_
FILE = fin___
STATUS = sta___
ACCESS = acc___
FORM = fm__
RECL = rl__
BLANK = blnk____
8 ______________
7 |8|7|7|7|7|7|7|7|7|7|
9 |8|7|7|7|7|7|7|7|7|7|
9 olist_____ must contain exactly one external unit specifier
(12.3.3) and may contain at most one of each of the
other specifiers.
The other specifiers are described as follows:
IOSTAT = ios___
is an input/output status specifier (12.7).
Execution of an OPEN statement containing this
specifier causes ios___ to become defined with a
zero value if no error condition exists or with
a processor-dependent positive integer value if
an error condition exists.
ERR = s_
is an error specifier (12.7.1).
FILE = fin___
fin___ is a character expression whose value when
any trailing blanks are removed is the name of
the file to be connected to the specified unit.
The file name must be a name that is allowed by
FORTRAN 77 Full Language Page 12-21
INPUT/OUTPUT STATEMENTS ANSI X3J3/90.4
the processor. If this specifier is omitted and
the unit is not connected to a file, it becomes
connected to a processor-determined file. (See
also 12.10.1.1.)
STATUS = sta___
sta___ is a character expression whose value when
any trailing blanks are removed is OLD, NEW,
SCRATCH, or UNKNOWN. If OLD or NEW is
specified, a FILE= specifier must be given. If
OLD is specified, the file must exist. If NEW
is specified, the file must not exist.
Successful execution of an OPEN statement with
NEW specified creates the file and changes the
status to OLD (12.10.1.1). If SCRATCH is
specified with an unnamed file, the file is
connected to the specified unit for use by the
executable program but is deleted (12.2.1) at
the execution of a CLOSE statement referring to
the same unit or at the termination of the
executable program. SCRATCH must not be
specified with a named file. If UNKNOWN is
specified, the status is processor dependent.
If this specifier is omitted, a value of UNKNOWN
is assumed.
ACCESS = acc___
acc___ is a character expression whose value when
any trailing blanks are removed is SEQUENTIAL or
DIRECT. It specifies the access method for the
connection of the file as being sequential or
direct (12.2.4). If this specifier is omitted,
the assumed value is SEQUENTIAL. For an
existing file, the specified access method must
be included in the set of allowed access methods
for the file (12.2.4). For a new file, the
processor creates the file with a set of allowed
access methods that includes the specified
method.
FORM = fm__
fm__ is a character expression whose value when
any trailing blanks are removed is FORMATTED or
UNFORMATTED. It specifies that the file is
being connected for formatted or unformatted
input/output, respectively. If this specifier
is omitted, a value of UNFORMATTED is assumed if
the file is being connected for direct access,
FORTRAN 77 Full Language Page 12-22
INPUT/OUTPUT STATEMENTS ANSI X3J3/90.4
and a value of FORMATTED is assumed if the file
is being connected for sequential access. For
an existing file, the specified form must be
included in the set of allowed forms for the
file (12.2.2). For a new file, the processor
creates the file with a set of allowed forms
that includes the specified form.
RECL = rl__
rl__ is an integer expression whose value must be
positive. It specifies the length of each
record in a file being connected for direct
access. If the file is being connected for
formatted input/output, the length is the number
of characters. If the file is being connected
for unformatted input/output, the length is
measured in processor-dependent units. For an
existing file, the value of rl__ must be included
in the set of allowed record lengths for the
file (12.2.2). For a new file, the processor
creates the file with a set of allowed record
lengths that includes the specified value. This
specifier must be given when a file is being
connected for direct access; otherwise, it must
be omitted.
BLANK = blnk____
blnk____ is a character expression whose value when
any trailing blanks are removed is NULL or ZERO.
If NULL is specified, all blank characters in
numeric formatted input fields on the specified
unit are ignored, except that a field of all
blanks has a value of zero. If ZERO is
specified, all blanks other than leading blanks
are treated as zeros. If this specifier is
omitted, a value of NULL is assumed. This
specifier is permitted only for a file being
connected for formatted input/output.
The unit specifier is required to appear; all other
specifiers are optional, except that the record length rl
__ must be specified if a file is being connected for
direct access. Note that some of the specifications
have an assumed value if they are omitted.
The unit specified must exist.
A unit may be connected by execution of an OPEN
statement in any program unit of an executable program
FORTRAN 77 Full Language Page 12-23
INPUT/OUTPUT STATEMENTS ANSI X3J3/90.4
and, once connected, may be referenced in any program
unit of the executable program.
12.10.1.1 Open_of_a_Connected_Unit. If a unit is
connected to a file that exists, execution of an OPEN
statement for that unit is permitted. If the FILE=
specifier is not included in the OPEN statement, the
file to be connected to the unit is the same as the
file to which the unit is connected.
If the file to be connected to the unit does not exist,
but is the same as the file to which the unit is
preconnected, the properties specified by the OPEN
statement become a part of the connection.
If the file to be connected to the unit is not the same
as the file to which the unit is connected, the effect
is as if a CLOSE statement (12.10.2) without a STATUS=
specifier had been executed for the unit immediately
prior to the execution of the OPEN statement.
If the file to be connected to the unit is the same as
the file to which the unit is connected, only the
BLANK= specifier may have a value different from the
one currently in effect. Execution of the OPEN
statement causes the new value of the BLANK= specifier
to be in effect. The position of the file is
unaffected.
If a file is connected to a unit, execution of an OPEN
statement on that file and a different unit is not
permitted.
12.10.2 CLOSE_Statement. A CLOSE statement is used to
terminate the connection of a particular file to a
unit.
The form of a CLOSE statement is:
CLOSE (cllist______)
where cllist______ is a list (2.10) of specifiers:
8 ______________
[UNIT =] u_
IOSTAT = ios___
ERR = s_
STATUS = sta___
8 ______________
7 |8|7|7|7|7|
9 |8|7|7|7|7|
9
FORTRAN 77 Full Language Page 12-24
INPUT/OUTPUT STATEMENTS ANSI X3J3/90.4
cllist______ must contain exactly one external unit specifier
(12.3.3) and may contain at most one of each of the
other specifiers.
The other specifiers are described as follows:
IOSTAT = ios___
is an input/output status specifier (12.7).
Execution of a CLOSE statement containing this
specifier causes ios___ to become defined with a
zero value if no error condition exists or with
a processor-dependent positive integer value if
an error condition exists.
ERR = s_
is an error specifier (12.7.1).
STATUS = sta___
sta___ is a character expression whose value when
any trailing blanks are removed is KEEP or
DELETE. sta___ determines the disposition of the
file that is connected to the specified unit.
KEEP must not be specified for a file whose
status prior to execution of the CLOSE statement
is SCRATCH. If KEEP is specified for a file
that exists, the file continues to exist after
the execution of the CLOSE statement. If KEEP
is specified for a file that does not exist, the
file will not exist after the execution of the
CLOSE statement. If DELETE is specified, the
file will not exist after execution of the CLOSE
statement. If this specifier is omitted, the
assumed value is KEEP, unless the file status
prior to execution of the CLOSE statement is
SCRATCH, in which case the assumed value is
DELETE.
Execution of a CLOSE statement that refers to a unit
may occur in any program unit of an executable program
and need not occur in the same program unit as the
execution of an OPEN statement referring to that unit.
Execution of a CLOSE statement specifying a unit that
does not exist or has no file connected to it is
permitted and affects no file.
After a unit has been disconnected by execution of a
CLOSE statement, it may be connected again within the
FORTRAN 77 Full Language Page 12-25
INPUT/OUTPUT STATEMENTS ANSI X3J3/90.4
same executable program, either to the same file or to
a different file. After a file has been disconnected
by execution of a CLOSE statement, it may be connected
again within the same executable program, either to the
same unit or to a different unit, provided that the
file still exists.
12.10.2.1 Implicit_Close_at_Termination_of_Execution.
At termination of execution of an executable program
for reasons other than an error condition, all units
that are connected are closed. Each unit is closed
with status KEEP unless the file status prior to
termination of execution was SCRATCH, in which case the
unit is closed with status DELETE. Note that the
effect is as though a CLOSE statement without a STATUS=
specifier were executed on each connected unit.
12.10.3 INQUIRE_Statement. An INQUIRE statement may
be used to inquire about properties of a particular
named file or of the connection to a particular unit.
There are two forms of the INQUIRE statement: inquire
by file and inquire by unit. All value assignments are
done according to the rules for assignment statements.
The INQUIRE statement may be executed before, while, or
after a file is connected to a unit. All values
assigned by the INQUIRE statement are those that are
current at the time the statement is executed.
12.10.3.1 INQUIRE_by_File. The form of an INQUIRE by
file statement is:
INQUIRE (iflist______)
where iflist______ is a list (2.10) of specifiers that must
contain exactly one file specifier and may contain
other inquiry specifiers. The iflist______ may contain at
most one of each of the inquiry specifiers described in
12.10.3.3.
The form of a file specifier is:
FILE = fin___
where fin___ is a character expression whose value when
any trailing blanks are removed specifies the name of
the file being inquired about. The named file need not
exist or be connected to a unit. The value of fin___ must
be of a form acceptable to the processor as a file
name.
FORTRAN 77 Full Language Page 12-26
INPUT/OUTPUT STATEMENTS ANSI X3J3/90.4
12.10.3.2 INQUIRE_by_Unit. The form of an INQUIRE by
unit statement is:
INQUIRE (iulist______)
where iulist______ is a list (2.10) of specifiers that must
contain exactly one external unit specifier (12.3.3)
and may contain other inquiry specifiers. The iulist____ _ _
may contain at most one of each of the inquiry
specifiers described in 12.10.3.3. The unit specified
need not exist or be connected to a file. If it is
connected to a file, the inquiry is being made about
the connection and about the file connected.
12.10.3.3 Inquiry_Specifiers. The following inquiry
specifiers may be used in either form of the INQUIRE
statement:
8 ___________________
IOSTAT = ios___
ERR = s_
EXIST = ex__
OPENED = od__
NUMBER = num___
NAMED = nmd___
NAME = fn__
ACCESS = acc___
SEQUENTIAL = seq___
DIRECT = dir___
FORM = fm__
FORMATTED = fmt___
UNFORMATTED = unf___
RECL = rcl___
NEXTREC = nr__
BLANK = blnk____
8 ___________________
7 |8|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|
9 |8|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|
9 The specifiers are described as follows:
IOSTAT = ios___
is an input/output status specifier (12.7).
Execution of an INQUIRE statement containing
this specifier causes ios___ to become defined with
a zero value if no error condition exists or
with a processor-dependent positive integer
value if an error condition exists.
ERR = s_
FORTRAN 77 Full Language Page 12-27
INPUT/OUTPUT STATEMENTS ANSI X3J3/90.4
is an error specifier (12.7.1).
EXIST = ex__
ex__ is a logical variable or logical array
element. Execution of an INQUIRE by file
statement causes ex__ to be assigned the value
true if there exists a file with the specified
name; otherwise, ex__ is assigned the value false.
Execution of an INQUIRE by unit statement causes
ex_ _ to be assigned the value true if the
specified unit exists; otherwise, ex__ is assigned
the value false.
OPENED = od__
od__ is a logical variable or logical array
element. Execution of an INQUIRE by file
statement causes od__ to be assigned the value
true if the file specified is connected to a
unit; otherwise, od__ is assigned the value false.
Execution of an INQUIRE by unit statement causes
od_ _ to be assigned the value true if the
specified unit is connected to a file;
otherwise, od__ is assigned the value false.
NUMBER = num___
num___ is an integer variable or integer array
element that is assigned the value of the
external unit identifier of the unit that is
currently connected to the file. If there is no
unit connected to the file, num_ _ _ becomes
undefined.
NAMED = nmd___
nmd___ is a logical variable or logical array
element that is assigned the value true if the
file has a name; otherwise, it is assigned the
value false.
NAME = fn__
fn__ is a character variable or character array
element that is assigned the value of the name
of the file, if the file has a name; otherwise,
it becomes undefined. Note that if this
specifier appears in an INQUIRE by file
statement, its value is not necessarily the same
as the name given in the FILE= specifier. For
FORTRAN 77 Full Language Page 12-28
INPUT/OUTPUT STATEMENTS ANSI X3J3/90.4
example, the processor may return a file name
qualified by a user identification. However,
the value returned must be suitable for use as
the value of a FILE= specifier in an OPEN
statement.
ACCESS = acc___
acc___ is a character variable or character array#
element that is assigned the value SEQUENTIAL if
the file is connected for sequential access, and
DIRECT if the file is connected for direct
access. If there is no connection, acc___ becomes
undefined.
SEQUENTIAL = seq___
seq___ is a character variable or character array
element that is assigned the value YES if
SEQUENTIAL is included in the set of allowed
access methods for the file, NO if SEQUENTIAL is
not included in the set of allowed access
methods for the file, and UNKNOWN if the
processor is unable to determine whether or not
SEQUENTIAL is included in the set of allowed
access methods for the file.
DIRECT = dir___
dir___ is a character variable or character array
element that is assigned the value YES if DIRECT
is included in the set of allowed access methods
for the file, NO if DIRECT is not included in
the set of allowed access methods for the file,
and UNKNOWN if the processor is unable to
determine whether or not DIRECT is included in
the set of allowed access methods for the file.
FORM = fm__
fm__ is a character variable or character array
element that is assigned the value FORMATTED if
the file is connected for formatted
input/output, and is assigned the value
UNFORMATTED if the file is connected for
unformatted input/output. If there is no
connection, fm__ becomes undefined.
FORMATTED = fmt___
FORTRAN 77 Full Language Page 12-29
INPUT/OUTPUT STATEMENTS ANSI X3J3/90.4
fmt___ is a character variable or character array
element that is assigned the value YES if
FORMATTED is included in the set of allowed
forms for the file, NO if FORMATTED is not
included in the set of allowed forms for the
file, and UNKNOWN if the processor is unable to
determine whether or not FORMATTED is included
in the set of allowed forms for the file.
UNFORMATTED = unf___
unf___ is a character variable or character array
element that is assigned the value YES if
UNFORMATTED is included in the set of allowed
forms for the file, NO if UNFORMATTED is not
included in the set of allowed forms for the
file, and UNKNOWN if the processor is unable to
determine whether or not UNFORMATTED is included
in the set of allowed forms for the file.
RECL = rcl___
rcl___ is an integer variable or integer array
element that is assigned the value of the record
length of the file connected for direct access.
If the file is connected for formatted
input/output, the length is the number of
characters. If the file is connected for
unformatted input/output, the length is measured
in processor-dependent units. If there is no
connection or if the connection is not for
direct access, rcl___ becomes undefined.
NEXTREC = nr__
nr__ is an integer variable or integer array
element that is assigned the value n_+1, where n_
is the record number of the last record read or
written on the file connected for direct access.
If the file is connected but no records have
been read or written since the connection, nr__ is
assigned the value 1. If the file is not
connected for direct access or if the position
of the file is indeterminate because of a
previous error condition, nr__ becomes undefined.
BLANK = blnk____
blnk____ is a character variable or character array
element assigned the value NULL if null blank
control is in effect for the file connected for
FORTRAN 77 Full Language Page 12-30
INPUT/OUTPUT STATEMENTS ANSI X3J3/90.4
formatted input/output, and is assigned the
value ZERO if zero blank control is in effect
for the file connected for formatted
input/output. If there is no connection, or if
the connection is not for formatted
input/output, blnk____ becomes undefined.
A variable or array element that may become defined or
undefined as a result of its use as a specifier in an
INQUIRE statement, or any associated entity, must not
be referenced by any other specifier in the same
INQUIRE statement.
Execution of an INQUIRE by file statement causes the
specifier variables or array elements nmd, fn, seq,
dir, fmt, and unf to be assigned values only if the
value of fin___ is acceptable to the processor as a file
name and if there exists a file by that name;
otherwise, they become undefined. Note that num___
becomes defined it and only if od__ becomes defined with
the value true. Note also that the specifier variables
or array elements acc, fm, rcl, nr, and blnk may become
defined only if od__ becomes defined with the value true.
Execution of an INQUIRE by unit statement causes the
specifier variables or array elements num, nmd, fn,
acc, seq, dir, fm, fmt, unf, rcl, nr, and blnk to be
assigned values only if the specified unit exists and
if a file is connected to the unit; otherwise, they
become undefined.
If an error condition occurs during execution of an
INQUIRE statement, all of the inquiry specifier
variables and array elements except ios_ _ _ become
undefined.
Note that the specifier variables or array elements ex_ _
and od__ always become defined unless an error condition
occurs.
12.10.4 File_Positioning_Statements. The forms of the
file positioning statements are:
BACKSPACE u_
BACKSPACE (alist_____)
ENDFILE u_
ENDFILE (alist_____)
REWIND u_
REWIND (alist_____)
FORTRAN 77 Full Language Page 12-31
INPUT/OUTPUT STATEMENTS ANSI X3J3/90.4
where: u_ is an external unit identifier (12.3.3)
alist_____ is a list (2.20) of specifiers:
8 ______________
[ UNIT =] u_
IOSTAT = ios___
ERR = s_
8 ______________
7 |8|7|7|7|
9 |8|7|7|7|
9 alist_____ must contain exactly one external unit specifier
(12.3.3) and may contain at most one of each of the
other specifiers.
The external unit specified by a BACKSPACE, ENDFILE, or
REWIND statement must be connected for sequential
access.
Execution of a file positioning statement containing an
input/output status specifier causes ios___ to become
defined with a zero value if no error condition exists
or with a processor-dependent positive integer value if
an error condition exists.
12.10.4.1 BACKSPACE_Statement. Execution of a
BACKSPACE statement causes the file connected to the
specified unit to be positioned before the preceding
record. If there is no preceding record, the position
of the file is not changed. Note that if the preceding
record is an endfile record, the file becomes
positioned before the endfile record.
Backspacing a file that is connected but does not exist
is prohibited.
Backspacing over records written using list-directed
formatting is prohibited.
12.10.4.2 ENDFILE_Statement. Execution of an ENDFILE
statement writes an endfile record as the next record
of the file. The file is then positioned after the
endfile record. If the file may also be connected for
direct access, only those records before the endfile
record are considered to have been written. Thus, only
those records may be read during subsequent direct
access connections to the file.
After execution of an ENDFILE statement, a BACKSPACE or
REWIND statement must be used to reposition the file
prior to execution of any data transfer input/output
statement.
FORTRAN 77 Full Language Page 12-32
INPUT/OUTPUT STATEMENTS ANSI X3J3/90.4
Execution of an ENDFILE statement for a file that is
connected but does not exist creates the file.
12.10.4.3 REWIND_Statement. Execution of a REWIND
statement causes the specified file to be positioned at
its initial point. Note that if the file is already
positioned at its initial point, execution of this
statement has no effect on the position of the file.
Execution of a REWIND statement for a file that is
connected but does not exist is permitted but has no
effect.
12.11 Restrictions on Function References and List
Items
A function must not be referenced within an expression
appearing anywhere in an input/output statement if such
a reference causes an input/output statement to be
executed. Note that a restriction in the evaluation of
expressions (6.6) prohibits certain side effects.
12.12 Restriction_on_Input/Output_Statements
If a unit, or a file connected to a unit, does not have
all of the properties required for the execution of
certain input/output statements, those statements must
not refer to the unit.
FORTRAN 77 Full Language Page 12-33
CONTENTS
12. INPUT/OUTPUT STATEMENTS.................... 12-1
12.1 Records............................. 12-1
12.1.1 Formatted Record........... 12-2
12.1.2 Unformatted Record......... 12-2
12.1.3 Endfile Record............. 12-2
12.2 Files............................... 12-2
12.2.1 File Existence............. 12-2
12.2.2 File Properties............ 12-3
12.2.3 File Position.............. 12-3
12.2.4 File Access................ 12-4
12.2.5 Internal Files............. 12-5
12.3 Units............................... 12-7
12.3.1 Unit Existence............. 12-7
12.3.2 Connection of a
Unit....................... 12-7
12.3.3 Unit Specifier and
Identifier................. 12-8
12.4 Format Specifier and
Identifier.......................... 12-9
12.5 Record Specifier.................... 12-9
12.6 Error and End-of-File
Conditions.......................... 12-10
12.7 Input/Output Status, Error, and
End-of-File Specifiers.............. 12-11
12.7.1 Error Specifier............ 12-11
12.7.2 End-of-File
Specifier.................. 12-12
12.8 READ, WRITE, and PRINT
Statements.......................... 12-12
12.8.1 Control Information
List....................... 12-13
12.8.2 Input/Output List.......... 12-14
12.9 Execution of a Data Transfer
Input/Output Statement.............. 12-15
12.9.1 Direction of Data
Transfer................... 12-16
12.9.2 Identifying a Unit......... 12-16
12.9.3 Establishing a
Format..................... 12-16
12.9.4 File Position Prior to
Data Transfer.............. 12-17
12.9.5 Data Transfer.............. 12-17
12.9.6 File Position After Data
Transfer................... 12-20
12.9.7 Input/Output Status
Specifier
Definition................. 12-20
- i -
12.10 Auxiliary Input/Output
Statements.......................... 12-21
12.10.1 OPEN Statement............. 12-21
12.10.2 CLOSE Statement............ 12-24
12.10.3 INQUIRE Statement.......... 12-26
12.10.4 File Positioning
Statements................. 12-31
12.11 Restrictions on Function References
and List Items...................... 12-33
12.12 Restriction on Input/Output
Statements.......................... 12-33
- ii -
ANSI X3J3/90.4
13. FORMAT_SPECIFICATION
A format used in conjunction with formatted
input/output statements provides information that
directs the editing between the internal representation
and the character strings of a record or a sequence of
records in the file.
A format specification provides explicit editing
information. An asterisk (*) as a format identifier in
an input/output statement indicates list-directed
formatting (13.6).
13.1 Format_Specification_Methods
Format specifications may be given:
(1) In FORMAT statements
(2) As values of character arrays, character
variables, or other character expressions
13.1.1 FORMAT_Statement. The form of a FORMAT
statement is:
FORMAT fs__
where fs__ is a format specification, as described in
13.2. The statement must be labeled.
13.1.2 Character_Format_Specification. If the format
identifier (12.4) in a formatted input/output statement
is a character array name, character variable name, or
other character expression, the leftmost character
positions of the specified entity must be in a defined
state with character data that constitute a format
specification when the statement is executed.
A character format specification must be of the form
described in 13.2. Note that the form begins with a
left parenthesis and ends with a right parenthesis.
Character data may follow the right parenthesis that
ends the format specification, with no effect on the
format specification. Blank characters may precede the
format specification.
If the format identifier is a character array name, the
length of the format specification may exceed the
length of the first element of the array; a character
array format specification is considered to be a
concatenation of all the array elements of the array in
FORTRAN 77 Full Language Page 13-1
FORMAT SPECIFICATION ANSI X3J3/90.4
the order given by array element ordering (5.2.4).
However, if a character array element name is specified
as a format identifier, the length of the format
specification must not exceed the length of the array
element.
13.2 Form_of_a_Format_Specification
The form of a format specification is:
( [flist_____] )
where flist_____ is a list (2.10). The forms of the flist___ _ _
items are:
[r_] ed__
ned___
[r_] fs__
where: ed__ is a repeatable edit descriptor (13.2.1)
ned___ is a nonrepeatable edit descriptor (13.2.1)
fs__ is a format specification with a nonempty
list flist_____
r_ is a nonzero, unsigned, integer constant
called a repeat______ specification_____________
The comma used to separate list items in the list flist_____
may be omitted as follows:
(1) Between a P edit descriptor and an immediately
following F, E, D, or G edit descriptor (13.5.9)
(2) Before or after a slash edit descriptor (13.5.4)
(3) Before or after a colon edit descriptor (13.5.5)
13.2.1 Edit_Descriptors. An edit descriptor is either
a repeatable edit descriptor or a nonrepeatable edit
descriptor.
The forms of a repeatable edit descriptor are:
Iw_
Iw_.m_
Fw_.d_
Ew_.d_
FORTRAN 77 Full Language Page 13-2
FORMAT SPECIFICATION ANSI X3J3/90.4
Ew_.d_Ee_
Dw_.d_
Gw_.d_
Gw_.d_Ee_
Lw_
A
Aw_
where: I, F, E, D, G, L, and A indicate the manner of
editing
w_ and e_ are nonzero, unsigned, integer constants
d_ and m_ are unsigned integer constants
The forms of a nonrepeatable edit descriptor are:
'h_918 h_928 ... h_9n8'
n_Hh_918h_928 ... h_9n
8 Tc_
TLc_
TRc_
n_X
/
:
S
SP
SS
k_P
BN
BZ
where: apostrophe, H, T, TL, TR, X, slash, colon, S,
SP, SS, P, BN, and BZ indicate the manner of
editing
h_ is one of the characters capable of
representation by the processor
n_ and c_ are nonzero, unsigned, integer
constants
k_ is an optionally signed integer constant
13.3 Interaction_Between_Input/Output_List_and_Format
The beginning of formatted data transfer using a format
specification (12.9.5.2.1) initiates format control.
Each action of format control depends on information
jointly provided by:
FORTRAN 77 Full Language Page 13-3
FORMAT SPECIFICATION ANSI X3J3/90.4
(1) the next edit descriptor contained in the format
specification, and
(2) the next item in the input/output list, if one
exists.
If an input/output list specifies at least one list
item, at least one repeatable edit descriptor must
exist in the format specification. Note that an empty
format specification of the form ( ) may be used only
if no list items are specified; in this case, one input
record is skipped or one output record containing no
characters is written. Except for an edit descriptor
preceded by a repeat specification, r_ ed__, and a format
specification preceded by a repeat specification, r_(flist___
__), a format specification is interpreted from left to
right. A format specification or edit descriptor
preceded by a repeat specification r_ is processed as a
list of r_ format specifications or edit descriptors
identical to the format specification or edit
descriptor without the repeat specification. Note that
an omitted repeat specification is treated the same as
a repeat specification whose value is one.
To each repeatable edit descriptor interpreted in a
format specification, there corresponds one item
specified by the input/output list (12.8.2), except
that a list item of type complex requires the
interpretation of two F, E, D, or G edit descriptors.
To each P, X, T, TL, TR, S, SP, SS, H, BN, BZ, slash,
colon, or apostrophe edit descriptor, there is no
corresponding item specified by the input/output list,
and format control communicates information directly
with the record.
Whenever format control encounters a repeatable edit
descriptor in a format specification, it determines
whether there is a corresponding item specified by the
input/output list. If there is such an item, it
transmits appropriately edited information between the
item and the record, and then format control proceeds.
If there is no corresponding item, format control
terminates.
If format control encounters a colon edit descriptor in
a format specification and another list item is not
specified, format control terminates.
If format control encounters the rightmost parenthesis
of a complete format specification and another list
item is not specified, format control terminates.
FORTRAN 77 Full Language Page 13-4
FORMAT SPECIFICATION ANSI X3J3/90.4
However, if another list item is specified, the file is
positioned at the beginning of the next record and
format control then reverts to the beginning of the
format specification terminated by the last preceding
right parenthesis. If there is no such preceding right
parenthesis, format control reverts to the first left
parenthesis of the format specification. If such
reversion occurs, the reused portion of the format
specification must contain at least one repeatable edit
descriptor. If format control reverts to a parenthesis
that is preceded by a repeat specification, the repeat
specification is reused. Reversion of format control,
of itself, has no effect on the scale factor (13.5.7),
the S, SP, or SS edit descriptor sign control (13.5.6),
or the BN or BZ edit descriptor blank control (13.5.8).
13.4 Positioning_by_Format_Control
After each I, F, E, D, G, L, A, H, or apostrophe edit
descriptor is processed, the file is positioned after
the last character read or written in the current
record.
After each T, TL, TR, X, or slash edit descriptor is
processed, the file is positioned as described in
13.5.3 and 13.5.4.
If format control reverts as described in 13.3, the
file is positioned in a manner identical to the way it
is positioned when a slash edit descriptor is processed
(13.5.4).
During a read operation, any unprocessed characters of
the record are skipped whenever the next record is
read.
13.5 Editing
Edit descriptors are used to specify the form of a
record and to direct the editing between the characters
in a record and internal representations of data.
A field is a part of a record that is read on input or
written on output when format control processes one I,
F, E, D, G, L, A, H, or apostrophe edit descriptor.
The field width is the size in characters of the field.
The internal representation of a datum corresponds to
the internal representation of a constant of the
corresponding type (Section 4).
FORTRAN 77 Full Language Page 13-5
FORMAT SPECIFICATION ANSI X3J3/90.4
13.5.1 Apostrophe_Editing. The apostrophe edit
descriptor has the form of a character constant. It
causes characters to be written from the enclosed
characters (including blanks) of the edit descriptor
itself. An apostrophe edit descriptor must not be used
on input.
The width of the field is the number of characters
contained in, but not including, the delimiting
apostrophes. Within the field, two consecutive
apostrophes with no intervening blanks are counted as a
single apostrophe.
13.5.2 H_Editing. The n_ H edit descriptor causes
character information to be written from the n_
characters (including blanks) following the H of the n_H
edit descriptor in the format specification itself. An
H edit descriptor must not be used on input.
Note that if an H edit descriptor occurs within a
character constant and includes an apostrophe, the
apostrophe must be represented by two consecutive
apostrophes, which are counted as one character in
specifying n_.
13.5.3 Positional_Editing. The T, TL, TR, and X edit
descriptors specify the position at which the next
character will be transmitted to or from the record.
The position specified by a T edit descriptor may be in
either direction from the current position. On input,
this allows portions of a record to be processed more
than once, possibly with different editing.
The position specified by an X edit descriptor is
forward from the current position. On input, a
position beyond the last character of the record may be
specified if no characters are transmitted from such
positions.
On output, a T, TL, TR, or X edit descriptor does not
by itself cause characters to be transmitted and
therefore does not by itself affect the length of the
record. If characters are transmitted to positions at
or after the position specified by a T, TL, TR, or X
edit descriptor, positions skipped and not previously
filled are filled with blanks. The result is as if the
entire record were initially filled with blanks.
On output, a character in the record may be replaced.
However, a T, TL, TR, or X edit descriptor never
FORTRAN 77 Full Language Page 13-6
FORMAT SPECIFICATION ANSI X3J3/90.4
directly causes a character already placed in the
record to be replaced. Such edit descriptors may
result in positioning so that subsequent editing causes
a replacement.
13.5.3.1 T,_TL,_and_TR_Editing. The Tc _ edit
descriptor indicates that the transmission of the next
character to or from a record is to occur at the c_ th
character position.
The TLc_ edit descriptor indicates that the transmission
of the next character to or from the record is to occur
at the character position c_ characters backward from
the current position. However, if the current position
is less than or equal to position c_ , the TLc_ edit
descriptor indicates that the transmission of the next
character to or from the record is to occur at position
one of the current record.
The TRc_ edit descriptor indicates that the transmission
of the next character to or from the record is to occur
at the character position c_ characters forward from the
current position.
13.5.3.2 X_Editing. The n_X edit descriptor indicates
that the transmission of the next character to or from
a record is to occur at the position n_ characters
forward from the current position.
13.5.4 Slash_Editing. The slash edit descriptor
indicates the end of data transfer on the current
record.
On input from a file connected for sequential access,
the remaining portion of the current record is skipped
and the file is positioned at the beginning of the next
record. This record becomes the current record. On
output to a file connected for sequential access, a new
record is created and becomes the last and current
record of the file.
Note that a record that contains no characters may be
written on output. If the file is an internal file or
a file connected for direct access, the record is
filled with blank characters. Note also that an entire
record may be skipped on input.
For a file connected for direct access, the record
number is increased by one and the file is positioned
at the beginning of the record that has that record
number. This record becomes the current record.
FORTRAN 77 Full Language Page 13-7
FORMAT SPECIFICATION ANSI X3J3/90.4
13.5.5 Colon_Editing. The colon edit descriptor
terminates format control if there are no more items in
the input/output list (13.3). The colon edit
descriptor has no effect if there are more items in the
input/output list.
13.5.6 S,_SP,_and_SS_Editing. The S, SP, and SS edit
descriptors may be used to control optional plus
characters in numeric output fields. At the beginning
of execution of each formatted output statement, the
processor has the option of producing a plus in numeric
output fields. If an SP edit descriptor is encountered
in a format specification, the processor must produce a
plus in any subsequent position that normally contains
an optional plus. If an SS edit descriptor is
encountered, the processor must not produce a plus in
any subsequent position that normally contains an
optional plus. If an S edit descriptor is encountered,
the option of producing the plus is restored to the
processor.
The S, SP, and SS edit descriptors affect only I, F, E,
D, and G editing during the execution of an output
statement. The S, SP, and SS edit descriptors have no
effect during the execution of an input statement.
13.5.7 P_Editing. A scale factor is specified by a P
edit descriptor, which is of the form:
k_P
where k_ is an optionally signed integer constant,
called the scale factor.
13.5.7.1 Scale_Factor. The value of the scale factor
is zero at the beginning of execution of each
input/output statement. It applies to all subsequently
interpreted F, E, D, and G edit descriptors until
another scale factor is encountered, and then that
scale factor is established. Note that reversion of
format control (13.3) does not affect the established
scale factor.
The scale factor k_ affects the appropriate editing in
the following manner:
(1) On input, with F, E, D, and G editing (provided
that no exponent exists in the field) and F
output editing, the scale factor effect is that
the externally represented number equals the
internally represented number multiplied by 10**k
FORTRAN 77 Full Language Page 13-8
FORMAT SPECIFICATION ANSI X3J3/90.4
_
.(2) On input, with F, E, D, and G editing, the
scale factor has no effect if there is an
exponent in the field.
(3) On output, with E and D editing, the basic real
constant (4.4.1) part of the quantity to be
produced is multiplied by 10**k_ and the exponent
is reduced by k_.
(4) On output, with G editing, the effect of the
scale factor is suspended unless the magnitude
of the datum to be edited is outside the range
that permits the use of F editing. If the use
of E editing is required, the scale factor has
the same effect as with E output editing.
13.5.8 BN_and_BZ_Editing. The BN and BZ edit
descriptors may be used to specify the interpretation
of blanks, other than leading blanks, in numeric input
fields. At the beginning of execution of each
formatted input statement, such blank characters are
interpreted as zeros or are ignored, depending on the
value of the BLANK= specifier (12.10.1) currently in
effect for the unit. If a BN edit descriptor is
encountered in a format specification, all such blank
characters in succeeding numeric input fields are
ignored. The effect of ignoring blanks is to treat the
input field as if blanks had been removed, the
remaining portion of the field right-justified, and the
blanks replaced as leading blanks. However, a field of
all blanks has the value zero. If a BZ edit descriptor
is encountered in a format specification, all such
blank characters in succeeding numeric input fields are
treated as zeros.
The BN and BZ edit descriptors affect only I, F, E, D,
and G editing during execution of an input statement.
They have no effect during execution of an output
statement.
13.5.9 Numeric_Editing. The I, F, E, D, and G edit
descriptors are used to specify input/output of
integer, real, double precision, and complex data. The
following general rules apply:
(1) On input, leading blanks are not significant.
The interpretation of blanks, other than leading
blanks, is determined by a combination of any
FORTRAN 77 Full Language Page 13-9
FORMAT SPECIFICATION ANSI X3J3/90.4
BLANK= specifier and any BN or BZ blank control
that is currently in effect for the unit
(13.5.8). Plus signs may be omitted. A field
of all blanks is considered to be zero.
(2) On input, with F, E, D, and G editing, a decimal
point appearing in the input field overrides the
portion of an edit descriptor that specifies the
decimal point location. The input field may
have more digits than the processor uses to
approximate the value of the datum.
(3) On output, the representation of a positive or
zero internal value in the field may be prefixed
with a plus, as controlled by the S, SP, and SS
edit descriptors (13.5.6) or the processor. The
representation of a negative internal value in
the field must be prefixed with a minus.
However, the processor must not produce a
negative signed zero in a formatted output
record.
(4) On output, the representation is right-justified
in the field. If the number of characters
produced by the editing is smaller than the
field width, leading blanks will be inserted in
the field.
(5) On output, if the number of characters produced
exceeds the field width or if an exponent
exceeds its specified length using the Ew_.d_Ee_ or
Gw_.d_Ee_ edit descriptor, the processor will fill
the entire field of width w_ with asterisks.
However, the processor must not produce
asterisks if the field width is not exceeded
when optional characters are omitted. Note that
when an SP edit descriptor is in effect, a plus
is not optional (13.5.6).
13.5.9.1 Integer_Editing. The Iw_ and Iw_ .m_ edit
descriptors indicate that the field to be edited
occupies w_ positions. The specified input/output list
item must be of type integer. On input, the specified
list item will become defined with an integer datum.
On output, the specified list item must be defined with
an integer datum.
On input, an Iw_ .m_ edit descriptor is treated
identically to an Iw_ edit descriptor.
FORTRAN 77 Full Language Page 13-10
FORMAT SPECIFICATION ANSI X3J3/90.4
In the input field, the character string must be in the
form of an optionally signed integer constant, except
for the interpretation of blanks (13.5.9, item (1)).
The output field for the Iw_ edit descriptor consists of
zero or more leading blanks followed by a minus if the
value of the internal datum is negative, or an optional
plus otherwise, followed by the magnitude of the
internal value in the form of an unsigned integer
constant without leading zeros. Note that an integer
constant always consists of at least one digit.
The output field for the Iw_.m_ edit descriptor is the
same as for the Iw_ edit descriptor, except that the
unsigned integer constant consists of at least m_ digits
and, if necessary, has leading zeros. The value of m_
must not exceed the value of w_. If m_ is zero and the
value of the internal datum is zero, the output field
consists of only blank characters, regardless of the
sign control in effect.
13.5.9.2 Real_and_Double_Precision_Editing. The F, E,
D, and G edit descriptors specify the editing of real,
double precision, and complex data. An input/output
list item corresponding to an F, E, D, or G edit
descriptor must be real, double precision, or complex.
An input list item will become defined with a datum
whose type is the same as that of the list item. An
output list item must be defined with a datum whose
type is the same as that of the list item.
13.5.9.2.1 F_Editing. The Fw_ .d_ edit descriptor
indicates that the field occupies w_ positions, the
fractional part of which consists of d_ digits.
The input field consists of an optional sign, followed
by a string of digits optionally containing a decimal
point. If the decimal point is omitted, the rightmost d
_ digits of the string, with leading zeros assumed if
necessary, are interpreted as the fractional part of
the value represented. The string of digits may
contain more digits than a processor uses to
approximate the value of the constant. The basic form
may be followed by an exponent of one of the following
forms:
(1) Signed integer constant
(2) E followed by zero or more blanks, followed by
an optionally signed integer constant
FORTRAN 77 Full Language Page 13-11
FORMAT SPECIFICATION ANSI X3J3/90.4
(3) D followed by zero or more blanks, followed by
an optionally signed integer constant
An exponent containing a D is processed identically to
an exponent containing an E.
The output field consists of blanks, if necessary,
followed by a minus if the internal value is negative,
or an optional plus otherwise, followed by a string of
digits that contains a decimal point and represents the
magnitude of the internal value, as modified by the
established scale factor and rounded to d_ fractional
digits. Leading zeros are not permitted except for an
optional zero immediately to the left of the decimal
point if the magnitude of the value in the output field
is less than one. The optional zero must appear if
there would otherwise be no digits in the output field.
13.5.9.2.2 E_and_D_Editing. The Ew_.d_, Dw_.d_, and Ew_.d_Ee
_ edit descriptors indicate that the external field
occupies w_ positions, the fractional part of which
consists of d_ digits, unless a scale factor greater
than one is in effect, and the exponent part consists
of e_ digits. The e_ has no effect on input.
The form of the input field is the same as for F
editing (13.5.9.2.1).
The form of the output field for a scale factor of zero
is:
[+_] [0] . x918x928...x9d8 exp___
where: +_ signifies a plus or a minus (13.5.9)
x918,x928...x9d8 are the Ld_ most significant digits of
the value of the datum after rounding
exp___ is a decimal exponent, one of the following
forms:
FORTRAN 77 Full Language Page 13-12
FORMAT SPECIFICATION ANSI X3J3/90.4
8 _________________________________________________
Edit Absolute Value Form of
Descriptor of Exponent Exponent
8 _________________________________________________
Ew_.d_ |exp___|<99 E+_z_918z_928 or +_0z_918z_92
7 ____________________________________
99___|<999 +_z_918z_928z_93
7 _________________________________________________
Ew_.d_Ee_ |exp___|_)-1 E+_z_918z_928...z_9e
7 _________________________________________________
Dw_.d_ |exp___|<99 D+_z_918z_928 or E+_z_918z_92
8 or +_0z_918z_92
7 ____________________________________
99___|<999 +_z_918z_928z_93
7 _________________________________________________
7 |7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|
|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|
|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|
|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|
where z_ is a digit. The sign in the exponent is
required. A plus sign must be used if the exponent
value is zero. The forms Ew_.d_ and Dw_.d_ must not be
used if |exp___| > 999.
The scale factor k_ controls the decimal normalization
(13.5.7). If - d_ < k_ < 0, the output field contains
exactly |k_| leading zeros and d_ - |k_ | significant
digits after the decimal point. If 0 < k_ < d_ + 2, the
output field contains exactly k_ significant digits to
the left of the decimal point and d_ - k_ + 1 significant
digits to the right of the decimal point. Other values
of k_ are not permitted.
13.5.9.2.3 G_Editing. The Gw_.d_ and Gw_ .d_ Ee_ edit
descriptors indicate that the external field occupies w_
positions, the fractional part of which consists of d_
digits, unless a scale factor greater than one is in
effect, and the exponent part consists of e_ digits.
G input editing is the same as for F editing
(13.5.9.2.1).
The method of representation in the output field
depends on the magnitude of the datum being edited.
Let N be the magnitude of the internal datum. If
N < 0.1 or N > 10**d_,Gw_.d_ output editing is the same as
k_PEw_.d_ output editing and Gw_.d_Ee_ output editing is the
same as k_PEw_.d_Ee_ output editing, where k_ is the scale
factor currently in effect. If N is greater than or
equal to 0.1 and is less than 10**d_, the scale factor
has no effect, and the value of N determines the
editing as follows:
9
FORTRAN 77 Full Language Page 13-13
FORMAT SPECIFICATION ANSI X3J3/90.4
8 _______________________________________________
Magnitude of Datum Equivalent Conversion
8 _______________________________________________
0.1=N<1 F(w_-n_).d_, n_('b_')
1

_-n_).(d_-1), n_('b_')
. .
. .
. .
10**(d_-2)

_-1) F(w_-n_).1, n_('b_')
10**(d_-1)

_ F(w_-n_).0, n_('b_')
8 _______________________________________________
7 |7|7|7|7|7|7|7|7|7|7|7|7|7|7|
|7|7|7|7|7|7|7|7|7|7|7|7|7|7|
|7|7|7|7|7|7|7|7|7|7|7|7|7|7|
where: b_ is a blank
n_ is 4 for Gw_.d_ and e_+_2 for Gw_.d_Ee_
Note that the scale factor has no effect unless the
magnitude of the datum to be edited is outside of the
range that permits effective use of F editing.
13.5.9.2.4 Complex_Editing. A complex datum consists
of a pair of separate real data; therefore, the editing
is specified by two successively interpreted F, E, D,
or G edit descriptors. The first of the edit
descriptors specifies the real part; the second
specifies the imaginary part. The two edit descriptors
may be different. Note that nonrepeatable edit
descriptors may appear between the two successive F, E,
D, or G edit descriptors.
13.5.10 L_Editing. The Lw_ edit descriptor indicates
that the field occupies w_ positions. The specified
input/output list item must be of type logical. On
input, the list item will become defined with a logical
datum. On output, the specified list item must be
defined with a logical datum. The input field consists
of optional blanks, optionally followed by a decimal
point, followed by a T for true or F for false. The T
or F may be followed by additional characters in the
field. Note that the logical constants .TRUE. and
.FALSE. are acceptable input forms.
The output field consists of w_ - 1 blanks followed by a
T or F, as the value of the internal datum is true or
false, respectively.
9
FORTRAN 77 Full Language Page 13-14
FORMAT SPECIFICATION ANSI X3J3/90.4
13.5.11 A_Editing. The A[w_] edit descriptor is used
with an input/output list item of type character. On
input, the input list item will become defined with
character data. On output, the output list item must
be defined with character data.
If a field width w_ is specified with the A edit
descriptor, the field consists of w_ characters. If a
field width w_ is not specified with the A edit
descriptor, the number of characters in the field is
the length of the character input/output list item.
Let len___ be the length of the input/output list item.
If the specified field width w_ for A input is greater
than or equal to len___, the rightmost len___ characters will
be taken from the input field. If the specified field
width is less than len___, the w_ characters will appear
left-justified with len_ _ _ - w_ trailing blanks in the
internal representation.
If the specified field width w_ for A output is greater
than len___, the output field will consist of w_-len___ blanks
followed by the len_ _ _ characters from the internal
representation. If the specified field width w_ is less
than or equal to len___, the output field will consist of
the leftmost w _ characters from the internal
representation.
13.6 List-Directed_Formatting
The characters in one or more list-directed records
constitute a sequence of values and value separators.
The end of a record has the same effect as a blank
character, unless it is within a character constant.
Any sequence of two or more consecutive blanks is
treated as a single blank, unless it is within a
character constant.
Each value is either a constant, a null value, or of
one of the forms:
r_*c_
r_*
where r_ is an unsigned, nonzero, integer constant. The
r_ *c_ form is equivalent to r_ successive appearances of
the constant c_, add the r_* form is equivalent to r_
successive appearances of the null values. Neither of
these forms may contain embedded blanks, except where
permitted within the constant c_.
FORTRAN 77 Full Language Page 13-15
FORMAT SPECIFICATION ANSI X3J3/90.4
A value separator is one of the following:
(1) A comma optionally preceded by one or more
contiguous blanks and optionally followed by one
or more contiguous blanks
(2) A slash optionally preceded by one or more
contiguous blanks and optionally followed by one
or more contiguous blanks
(3) One or more contiguous blanks between two
constants or following the last constant
13.6.1 List-Directed_Input. Input forms acceptable to
format specifications for a given type are acceptable
for list-directed formatting, except as noted below.
The form of the input value must be acceptable for the
type of the input list item. Blanks are never used as
zeros, and embedded blanks are not permitted in
constants, except within character constants and
complex constants as specified below. Note that the
end of a record has the effect of a blank, except when
it appears within a character constant.
When the corresponding input list item is of type real
or double precision, the input form is that of a
numeric input field. A numeric input field is a field
suitable for F editing (13.5.9.2) that is assumed to
have no fractional digits unless a decimal point
appears within the field.
When the corresponding list item is of type complex,
the input form consists of a left parenthesis followed
by an ordered pair of numeric input fields separated by
a comma, and followed by a right parenthesis. The
first numeric input field is the real part of the
complex constant and the second is the imaginary part.
Each of the numeric input fields may be preceded or
followed by blanks. The end of a record may occur
between the real part and the comma or between the
comma and the imaginary part.
When the corresponding list item is of type logical,
the input form must not include either slashes or
commas among the optional characters permitted for L
editing (13.5.10).
When the corresponding list item is of type character,
the input form consists of a nonempty string of
characters enclosed in apostrophes. Each apostrophe
within a character constant must be represented by two
FORTRAN 77 Full Language Page 13-16
FORMAT SPECIFICATION ANSI X3J3/90.4
consecutive apostrophes without an intervening blank or
end of record. Character constants may be continued
from the end of one record to the beginning of the next
record. The end of the record does not cause a blank
or any other character to become part of the constant.
The constant may be continued on as many records as
needed. The characters blank, comma, and slash may
appear in character constants.
Let len___ be the length of the list item, and let w_ be
the length of the character constant. If len___ is less
than or equal to w_, the leftmost len___ characters of the
constant are transmitted to the list item. If len___ is
greater than w_, the constant is transmitted to the
leftmost w_ characters of the list item and the
remaining len___-w_ characters of the list item are filled
with blanks. Note that the effect is as though the
constant were assigned to the list item in a character
assignment statement (10.4).
A null value is specified by having no characters
between successive value separators, no characters
preceding the first value separator in the first record
read by each execution of a list-directed input
statement, or the r_* form. A null value has no effect
on the definition status of the corresponding input
list item. If the input list item is defined, it
retains its previous value; if it is undefined, it
remains undefined. A null value may not be used as
either the real or imaginary part of a complex
constant, but a single null value may represent an
entire complex constant. Note that the end of a record
following any other separator, with or without
separating blanks, does not specify a null value.
A slash encountered as a value separator during
execution of a list-directed input statement causes
termination of execution of that input statement after
the assignment of the previous value. If there are
additional items in the input list, the effect is as if
null values had been supplied for them.
Note that all blanks in a list-directed input record
are considered to be part of some value separator
except for the following:
(1) Blanks embedded in a character constant
(2) Embedded blanks surrounding the real or
imaginary part of a complex constant
FORTRAN 77 Full Language Page 13-17
FORMAT SPECIFICATION ANSI X3J3/90.4
(3) Leading blanks in the first record read by each
execution of a list-directed input statement,
unless immediately followed by a slash or comma
13.6.2 List-Directed_Output. The form of the values
produced is the same as that required for input, except
as noted otherwise. With the exception of character
constants, the values are separated by one of the
following:
(1) One or more blanks
(2) A comma optionally preceded by one or more
blanks and optionally followed by O

_ edit descriptor, for some reasonable value of w
_.
Real and double precision constants are produced with
the effect of either an F edit descriptor or an E edit
descriptor, depending on the magnitude x_ of the value
and a range 10**d_918 < x_ < 10**d_928, where d_918 and d_928 are
processor-dependent integer values. If the magnitude x_
is within this range, the constant is produced using
OPFw_.d_; otherwise, 1PEw_ .d_ Ee_ is used. Reasonable
processor-dependent values of w_, d_, and e_ are used for
each of the cases involved.
Complex constants are enclosed in parentheses, with a
comma separating the real and imaginary parts. The end
of a record may occur between the comma and the
imaginary part only if the entire constant is as long
as, or longer than, an entire record. The only
embedded blanks permitted within a complex constant are
between the comma and the end of a record and one blank
at the beginning of the next record.
Character constants produced are not delimited by
apostrophes, are not preceded or followed by a value
separator, have each internal apostrophe represented
externally by one apostrophe, and have a blank
FORTRAN 77 Full Language Page 13-18
FORMAT SPECIFICATION ANSI X3J3/90.4
character inserted by the processor for carriage
control at the beginning of any record that begins with
the continuation of a character constant from the
preceding record.
If two or more successive values in an output record
produced have identical values, the processor has the
option of producing a repeated constant of the form r_*c_
instead of the sequence of identical values.
Slashes, as value separators, and null values are not
produced by list-directed formatting.
Each output record begins with a blank character to
provide carriage control when the record is printed.
FORTRAN 77 Full Language Page 13-19
CONTENTS
13. FORMAT SPECIFICATION....................... 13-1
13.1 Format Specification Methods......... 13-1
13.1.1 FORMAT Statement............ 13-1
13.1.2 Character Format
Specification............... 13-1
13.2 Form of a Format
Specification........................ 13-2
13.2.1 Edit Descriptors............ 13-2
13.3 Interaction Between Input/Output
List and Format...................... 13-3
13.4 Positioning by Format Control........ 13-5
13.5 Editing.............................. 13-5
13.5.1 Apostrophe Editing.......... 13-6
13.5.2 H Editing................... 13-6
13.5.3 Positional Editing.......... 13-6
13.5.4 Slash Editing............... 13-7
13.5.5 Colon Editing............... 13-8
13.5.6 S, SP, and SS
Editing..................... 13-8
13.5.7 P Editing................... 13-8
13.5.8 BN and BZ Editing........... 13-9
13.5.9 Numeric Editing............. 13-9
13.5.10 L Editing................... 13-14
13.5.11 A Editing................... 13-15
13.6 List-Directed Formatting............. 13-15
13.6.1 List-Directed Input......... 13-16
13.6.2 List-Directed Output........ 13-
18
- i -
ANSI X3J3/90.4
14. MAIN_PROGRAM
A main program is a program unit that does not have a
FUNCTION, SUBROUTINE, or BLOCK DATA statement as its
first statement. It may have a PROGRAM statement as its
first statement.
There must be exactly one main program in an executable
program. Execution of an executable program begins
with the execution of the first executable statement of
the main program.
14.1 PROGRAM_Statement
The form of a PROGRAM statement is:
PROGRAM pgm___
where pgm___ is the symbolic name of the main program in
which the PROGRAM statement appears.
A PROGRAM statement is not required to appear in an
executable program. If it does appear, it must be the
first statement of the main program.
The symbolic name pgm_ _ _ is global (18.1.1) to the
executable program and must not be the same as the name
of an external procedure, block data subprogram, or
common block in the same executable program. The name pgm
___ must not be the same as any local name in the main
program.
14.2 Main_Program_Restrictions
The PROGRAM statement may appear only as the first
statement of a main program. A main program may
contain any other statement except a BLOCK DATA,
FUNCTION, SUBROUTINE, ENTRY, or RETURN statement. The
appearance of a SAVE statement in a main program has no
effect.
A main program may not be referenced from a subprogram
or from itself.
FORTRAN 77 Full Language Page 14-1
CONTENTS
14. MAIN PROGRAM................................ 14-1
14.1 PROGRAM Statement..................... 14-1
14.2 Main Program Restrictions............. 14-1
- i -
ANSI X3J3/90.4
15. FUNCTIONS_AND_SUBROUTINES
15.1 Categories_of_Functions_and_Subroutines
15.1.1 Procedures. Functions and subroutines are
procedures. There are four categories of procedures:
(1) Intrinsic functions
(2) Statement functions
(3) External functions
(4) Subroutines
Intrinsic functions, statement functions, and external
functions are referred to collectively as functions.
External functions and subroutines are referred to
collectively as external procedures.
15.1.2 External_Functions. There are two categories
of external functions:
(1) External functions specified in function
subprograms
(2) External functions specified by means other than
FORTRAN subprograms
15.1.3 Subroutines. There are two categories of
subroutines:
(1) Subroutines specified in subroutine subprograms
(2) Subroutines specified by means other than
FORTRAN subprograms
15.1.4 Dummy_Procedure. A dummy procedure is a dummy
argument that is identified as a procedure (18.2.11).
15.2 Referencing_a_Function
A function is referenced in an expression and supplies
a value to the expression. The value supplied is the
value of the function.
An intrinsic function may be referenced in the main
program or in any procedure subprogram of an executable
program.
FORTRAN 77 Full Language Page 15-1
FUNCTIONS AND SUBROUTINES ANSI X3J3/90.4
A statement function may be referenced only in the
program unit in which the statement function statement
appears.
An external function specified by a function subprogram
may be referenced within any other procedure subprogram
or the main program of the executable program. A
subprogram must not reference itself, either directly
or indirectly.
An external function specified by means other than a
subprogram may be referenced within any procedure
subprogram or the main program of the executable
program.
If a character function is referenced in a program
unit, the function length specified in the program unit
must be an integer constant expression.
15.2.1 Form_of_a_Function_Reference. A function
reference is used to reference an intrinsic function,
statement function, or external function.
The form of a function reference is:
fun___ ( [a_ [,a_]...] )
where: fun___ is the symbolic name of a function or a
dummy procedure
a_ is an actual argument
The type of the result of a statement function or
external function reference is the same as the type of
the function name. The type is specified in the same
manner as for variables and arrays (4.1.2). The type
of the result of an intrinsic function is specified in
Table 5 (15.10).
15.2.2 Execution_of_a_Function_Reference. A function
reference may appear only as a primary in an
arithmetic, logical, or character expression.
Execution of a function reference in an expression
causes the evaluation of the function identified by
fun.
Return of control from a referenced function completes
execution of the function reference. The value of the
function is available to the referencing expression.
FORTRAN 77 Full Language Page 15-2
FUNCTIONS AND SUBROUTINES ANSI X3J3/90.4
15.3 Intrinsic_Functions
Intrinsic functions are supplied by the processor and
have a special meaning. The specific names that
identify the intrinsic functions, their generic names,
function definitions, type of arguments, and type of
results appear in Table 5.
An IMPLICIT statement does not change the type of an
intrinsic function.
15.3.1 Specific_Names_and_Generic_Names. Generic
names simplify the referencing of intrinsic functions,
because the same function name may be used with more
than one type of argument. Only a specific intrinsic
function name may be used as an actual argument when
the argument is an intrinsic function.
If a generic name is used to reference an intrinsic
function, the type of the result (except for intrinsic
functions performing type conversion, nearest integer,
and absolute value with a complex argument) is the same
as the type of the argument.
For those intrinsic functions that have more than one
argument, all arguments must be of the same type.
If the specific name or generic name of an intrinsic
function appears in the dummy argument list of a
function or subroutine in a subprogram, that symbolic
name does not identify an intrinsic function in the
program unit. The data type identified with the
symbolic name is specified in the same manner as for
variables and arrays (4.1.2).
A name in an INTRINSIC statement must be the specific
name or generic name of an intrinsic function.
15.3.2 Referencing_an_Intrinsic_Function. An
intrinsic function is referenced by using its reference
as a primary in an expression. For each intrinsic
function described in Table 5, execution of an
intrinsic function reference causes the actions
specified in Table 5, and the result depends on the
values of the actual arguments. The resulting value is
available to the expression that contains the function
reference.
The actual arguments that constitute the argument list
must agree in order, number, and type with the
specification in Table 5 and may be any expression of
FORTRAN 77 Full Language Page 15-3
FUNCTIONS AND SUBROUTINES ANSI X3J3/90.4
the specified type. An actual argument in an intrinsic
function reference may be any expression except a
character expression involving concatenation of an
operand whose length specification is an asterisk in
parentheses unless the operand is the symbolic name of
a constant.
A specific name of an intrinsic function that appears
in an INTRINSIC statement may be used as an actual
argument in an external procedure reference; however,
the names of intrinsic functions for type conversion,
lexical relationship, and for choosing the largest or
smallest value must not be used as actual arguments.
Note that such an appearance does not cause the
intrinsic function to be classified as an external
function (18.2.10).
15.3.3 Intrinsic_Function_Restrictions. Arguments for
which the result is not mathematically defined or
exceeds the numeric range of the processor cause the
result of the function to become undefined.
Restrictions on the range of arguments and results for
intrinsic functions are described in 15.10.1.
15.4 Statement_Function
A statement function is a procedure specified by a
single statement that is similar in form to an
arithmetic, logical, or character assignment statement.
A statement function statement must appear only after
the specification statements and before the first
executable statement of the program unit in which it is
referenced (3.5).
A statement function statement is classified as a
nonexecutable statement; it is not a part of the normal
execution sequence.
15.4.1 Form_of_a_Statement_Function_Statement. The
form of a statement function statement is:
fun___ ( [d_ [,d_]...] ) = e_
where: fun__ _ is the symbolic name of the statement
function
d_ is a statement function dummy argument
e_ is an expression
FORTRAN 77 Full Language Page 15-4
FUNCTIONS AND SUBROUTINES ANSI X3J3/90.4
The relationship between fun___ and e_ must conform to the
assignment rules in 10.1, 10.2, and 10.4. Note that
the type of the expression may be different from the
type of the statement function name.
Each d_ is a variable name called a statement function
dummy argument. The statement function dummy argument
list serves only to indicate order, number, and type of
arguments for the statement function. The variable
names that appear as dummy arguments of a statement
function have a scope of that statement (18.1). A
given symbolic name may appear only once in any
statement function dummy argument list. The symbolic
name of a statement function dummy argument may be used
to identify other dummy arguments of the same type in
different statement function statements. The name may
also be used to identify a variable of the same type
appearing elsewhere in the program unit, including its
appearance as a dummy argument in a FUNCTION,
SUBROUTINE, or ENTRY statement. The name must not be
used to identify any other entity in the program unit
except a common block.
Each primary of the expression e_ must be one of the
following:
(1) A constant
(2) The symbolic name of a constant
(3) A variable reference
(4) An array element reference
(5) An intrinsic function reference
(6) A reference to a statement function for which
the statement function statement appears in
preceding lines of the program unit
(7) An external function reference
(8) A dummy procedure reference
(9) An expression enclosed in parentheses that meets
all of the requirements specified for the
expression e_
Each variable reference may be either a reference to a
dummy argument of the statement function or a reference
to a variable that appears within the same program unit
FORTRAN 77 Full Language Page 15-5
FUNCTIONS AND SUBROUTINES ANSI X3J3/90.4
as the statement function statement.
If a statement function dummy argument name is the same
as the name of another entity, the appearance of that
name in the expression of a statement function
statement is a reference to the statement function
dummy argument. A dummy argument that appears in a
FUNCTION or SUBROUTINE statement may be referenced in
the expression of a statement function statement within
the subprogram. A dummy argument that appears in an
ENTRY statement that precedes a statement function
statement may be referenced in the expression of the
statement function statement within the subprogram.
15.4.2 Referencing_a_Statement_Function. A statement
function is referenced by using its function reference
as a primary in an expression.
Execution of a statement function reference results in:
(1) evaluation of actual arguments that are
expressions,
(2) association of actual arguments with the
corresponding dummy arguments,
(3) evaluation of the expression e_, and
(4) conversion, if necessary, of an arithmetic
expression value to the type of the statement
function according to the assignment rules in
10.1 or a change, if necessary, in the length of
a character expression value according to the
rules in 10.4.
The resulting value is available to the expression that
contains the function reference.
The actual arguments, which constitute the argument
list, must agree in order, number, and type with the
corresponding dummy arguments. An actual argument in a
statement function reference may be any expression
except a character expression involving concatenation
of an operand whose length specification is an asterisk
in parentheses unless the operand is the symbolic name
of a constant.
When a statement function reference is executed, its
actual arguments must be defined.
FORTRAN 77 Full Language Page 15-6
FUNCTIONS AND SUBROUTINES ANSI X3J3/90.4
15.4.3 Statement_Function_Restrictions. A statement
function may be referenced only in the program unit
that contains the statement function statement.
A statement function statement must not contain a
reference to another statement function that appears
following the reference in the sequence of lines in the
program unit. The symbolic name used to identify a
statement function must not appear as a symbolic name
in any specification statement except in a type-
statement (to specify the type of the function) or as
the name of a common block in the same program unit.
An external function reference in the expression of a
statement function statement must not cause a dummy
argument of the statement function to become undefined
or redefined.
The symbolic name of a statement function is a local
name (18.1.2) and must not be the same as the name of
any other entity in the program unit except the name of
a common block.
The symbolic name of a statement function may not be an
actual argument. It must not appear in an EXTERNAL
statement.
A statement function statement in a function subprogram
must not contain a function reference to the name of
the function subprogram or an entry name in the
function subprogram.
The length specification of a character statement
function or statement function dummy argument of type
character must be an integer constant expression.
15.5 External_Functions
An external function is specified externally to the
program unit that references it. An external function
is a procedure and may be specified in a function
subprogram or by some other means.
15.5.1 Function_Subprogram_and_FUNCTION_Statement. A
function subprogram specifies one or more external
functions (15.7). A function subprogram is a program
unit that has a FUNCTION statement as its first
statement. The form of a function subprogram is as
described in 2.4 and 3.5, except as noted in 15.5.3 and
15.7.4.
FORTRAN 77 Full Language Page 15-7
FUNCTIONS AND SUBROUTINES ANSI X3J3/90.4
The form of a FUNCTION statement is:
[typ___] FUNCTION fun___ ( [d_ [,d_]...] )
where: typ___ is one of INTEGER, REAL, DOUBLE PRECISION,
COMPLEX, LOGICAL, or CHARACTER [*len___] where len
___ is the length specification of the
result of the character function. len___ may
have any of the forms allowed in a CHARACTER
statement (8.4.2) except that an integer
constant expression must not include the
symbolic name of a constant. If a length is
not specified in a CHARACTER FUNCTION
statement, the character function has a
length of one.
fun_ _ _ is the symbolic name of the function
subprogram in which the FUNCTION statement
appears. fun___ is an external function name.
d_ is a variable name, array name, or dummy
procedure name. d_ is a dummy argument.
The symbolic name of a function subprogram or an
associated entry name of the same type must appear as a
variable name in the function subprogram. During every
execution of the external function, this variable must
become defined and, once defined, may be referenced or
become redefined. The value of this variable when a
RETURN or END statement is executed in the subprogram
is the value of the function. If this variable is a
character variable with a length specification that is
an asterisk in parentheses, it must not appear as an
operand for concatenation except in a character
assignment statement (10.4).
An external function in a function subprogram may
define one or more of its dummy arguments to return
values in addition to the value of the function.
15.5.2 Referencing_an_External_Function. An external
function is referenced by using its reference as a
primary in an expression.
15.5.2.1 Execution_of_an_External_Function_Reference.
Execution of an external function reference results in:
(1) evaluation of actual arguments that are
expressions,
FORTRAN 77 Full Language Page 15-8
FUNCTIONS AND SUBROUTINES ANSI X3J3/90.4
(2) association of actual arguments with the
corresponding dummy arguments, and
(3) the actions specified by the referenced
function.
The type of the function name in the function reference
must be the same as the type of the function name in
the referenced function. The length of the character
function in a character function reference must be the
same as the length of the character function in the
referenced function.
When an external function reference is executed, the
function must be one of the external functions in the
executable program.
15.5.2.2 Actual_Arguments_for_an_External_Function.
The actual arguments in an external function reference
must agree in order, number, and type with the
corresponding dummy arguments in the referenced
function. The use of a subroutine name as an actual
argument is an exception to the rule requiring
agreement of type because subroutine names do not have
a type.
An actual argument in Tan external function reference
must be one of the following:
(1) An expression except a character expression
involving concatenation of an operand whose
length specification is an asterisk in
parentheses unless the operand is the symbolic
name of a constant
(2) An array name
(3) An intrinsic function name
(4) An external procedure name
(5) A dummy procedure name
Note that an actual argument in a function reference
may be a dummy argument that appears in a dummy
argument list within the subprogram containing the
reference.
15.5.3 Function_Subprogram_Restrictions. A FUNCTION
statement must appear only as the first statement of a
function subprogram. A function subprogram may contain
FORTRAN 77 Full Language Page 15-9
FUNCTIONS AND SUBROUTINES ANSI X3J3/90.4
any other statement except a BLOCK DATA, SUBROUTINE, or
PROGRAM statement.
The symbolic name of an external function is a global
name (18.1.1) and must not be the same as any other
global name or any local name, except a variable name,
in the function subprogram.
Within a function subprogram, the symbolic name of a
function specified by a FUNCTION or ENTRY statement
must not appear in any other nonexecutable statement,
except a type-statement. In an executable statement,
such a name may appear only as a variable.
If the type of a function is specified in a FUNCTION
statement, the function name must not appear in a
type-statement. Note that a name must not have its
type explicitly specified more than once in a program
unit.
If the name of a function subprogram is of type
character, each entry name in the function subprogram
must be of type character. If the name of the function
subprogram or any entry in the subprogram has a length
of (*) declared, all such entities must have a length
of (*) declared; otherwise, all such entities must have
a length specification of the same integer value.
In a function subprogram, the symbolic name of a dummy
argument is local to the program unit and must not
appear in an EQUIVALENCE, PARAMETER, SAVE, INTRINSIC,
DATA, or COMMON statement, except as a common block
name.
A character dummy argument whose length specification
is an asterisk in parentheses must not appear as an
operand for concatenation, except in a character
assignment statement (10.4).
A function specified in a subprogram may be referenced
within any other procedure subprogram or the main
program of the executable program. A function
subprogram must not reference itself, either directly
or indirectly.
15.6 Subroutines
A subroutine is specified externally to the program
unit that references it. A subroutine is a procedure
and may be specified in a subroutine subprogram or by
some other means.
FORTRAN 77 Full Language Page 15-10
FUNCTIONS AND SUBROUTINES ANSI X3J3/90.4
15.6.1 Subroutine_Subprogram_and_SUBROUTINE_Statement.
A subroutine subprogram specifies one or more
subroutines (15.7). A subroutine subprogram is a
program unit that has a SUBROUTINE statement as its
first statement. The form of a subroutine subprogram
is as described in 2.4 and 3.5, except as noted in
15.6.3 and 15.7.4.
The form of a SUBROUTINE statement is:
SUBROUTINE sub___ [( [d_ [,d_]...] )]
where: sub___ is the symbolic name of the subroutine
subprogram in which the SUBROUTINE statement
appears. sub___ is a subroutine name.
d_ is a variable name, array name, or dummy
procedure name, or is an asterisk
(15.9.3.5). d_ is a dummy argument.
Note that if there are no dummy arguments, either of
the forms sub___ or sub___() may be used in the SUBROUTINE
statement. A subroutine that is specified by either
form may be referenced by a CALL statement of the form
CALL sub___ or CALL sub___().
One or more dummy arguments of a subroutine in a
subprogram may become defined or redefined to return
results.
15.6.2 Subroutine_Reference. A subroutine is
referenced by a CALL statement.
15.6.2.1 Form_of_a_CALL_Statement. The form of a CALL
statement is:
CALL sub___ [( [a_ [,a_]...] )]
where: sub___ is the symbolic name of a subroutine or
dummy procedure
a_ is an actual argument
15.6.2.2 Execution_of_a_CALL_Statement. Execution of
a CALL statement results in
(1) evaluation of actual arguments that are
expressions,
(2) association of actual arguments with the
corresponding dummy arguments, and
FORTRAN 77 Full Language Page 15-11
FUNCTIONS AND SUBROUTINES ANSI X3J3/90.4
(3) the actions specified by the referenced
subroutine.
Return of control from the referenced subroutine
completes execution of the CALL statement.
A subroutine specified in a subprogram may be
referenced within any other procedure subprogram or the
main program of the executable program. A subprogram
must not reference itself, either directly or
indirectly.
When a CALL statement is executed, the referenced
subroutine must be one of the subroutines specified in
subroutine subprograms or by other means in the
executable program.
15.6.2.3 Actual_Arguments_for_a_Subroutine. The
actual arguments in a subroutine reference must agree
in order, number, and type with the corresponding dummy
arguments in the dummy argument list of the referenced
subroutine. The use of a subroutine name or an
alternate return specifier as an actual argument is an
exception to the rule requiring agreement of type.
An actual argument in a subroutine reference must be
one of the following:
(1) An expression except a character expression
involving concatenation of an operand whose
length specification is an asterisk in
parentheses unless the operand is the symbolic
name of a constant
(2) An array name
(3) An intrinsic function name
(4) An external procedure name
(5) A dummy procedure name
(6) An alternate return specifier, of the form *s_ ,
where s_ is the statement label of an executable
statement that appears in the same program unit
as the CALL statement (15.8.3)
Note that an actual argument in a subroutine reference
may be a dummy argument name that appears in a dummy
argument list within the subprogram containing the
reference. An asterisk dummy argument must not be used
FORTRAN 77 Full Language Page 15-12
FUNCTIONS AND SUBROUTINES ANSI X3J3/90.4
as an actual argument in a subprogram reference.
15.6.3 Subroutine_Subprogram_Restrictions. A
SUBROUTINE statement must appear only as the first
statement of a subroutine subprogram. A subroutine
subprogram may contain any other statement except a
BLOCK DATA, FUNCTION, or PROGRAM statement.
The symbolic name of a subroutine is a global name
(18.1.1) and must not be the same as any other global
name or any local name in the program unit.
In a subroutine subprogram, the symbolic name of a
dummy argument is local to the program unit and must
not appear in an EQUIVALENCE, PARAMETER, SAVE,
INTRINSIC, DATA, or COMMON statement, except as a
common block name.
A character dummy argument whose length specification
is an asterisk in parentheses must not appear as an
operand for concatenation, except in a character
assignment statement (10.4).
15.7 ENTRY_Statement
An ENTRY statement permits a procedure reference to
begin with a particular executable statement within the
function or subroutine subprogram in which the ENTRY
statement appears. It may appear anywhere within a
function subprogram after the FUNCTION statement or
within a subroutine subprogram after the SUBROUTINE
statement, except that an ENTRY statement must not
appear between a block IF statement and its
corresponding END IF statement, or between a DO
statement and the terminal statement of its DO-loop.
Optionally, a subprogram may have one or more ENTRY
statements.
An ENTRY statement is classified as a nonexecutable
statement.
15.7.1 Form_of_an_ENTRY_Statement. The form of an
ENTRY statement is:
ENTRY en__ [( [d_ [,d_]...] )]
where: en__ is the symbolic name of an entry in a
function or subroutine subprogram and is
called an entry name. If the ENTRY
statement appears in a subroutine
FORTRAN 77 Full Language Page 15-13
FUNCTIONS AND SUBROUTINES ANSI X3J3/90.4
subprogram, en__ is a subroutine name. If the
ENTRY statement appears in a function
subprogram, en__ is an external function name.
d_ is a variable name, array name, or
dummy procedure name, or is an
asterisk. d_ is a dummy argument. An
asterisk is permitted in an ENTRY statement
only in a subroutine subprogram.
Note that if there are no dummy arguments, either of
the forms en_ _ or en_ _ () may be used in the ENTRY
statement. A function that is specified by either form
must be referenced by the form en__() (15.2.1). A
subroutine that is specified by either form may be
referenced by a CALL statement of the form CALL en__ or
CALL en__().
The entry name en__ in a function subprogram may appear
in a type-statement.
15.7.2 Referencing_External_Procedure_by_Entry_Name.
An entry name in an ENTRY statement in a function
subprogram identifies an external function within the
executable program and may be referenced as an external
function (15.5.2). An entry name in an ENTRY statement
in a subroutine subprogram identifies a subroutine
within the executable program and may be referenced as
a subroutine (15.6.2).
When an entry name en__ is used to reference a procedure,
execution of the procedure begins with the first
executable statement that follows the ENTRY statement
whose entry name is en__.
An entry name is available for reference in any program
unit of an executable program, except in the program
unit that contains the entry name in an ENTRY
statement.
The order, number, type, and names of the dummy
arguments in an ENTRY statement may be different from
the order, number, type, and names of the dummy
arguments in the FUNCTION statement or SUBROUTINE
statement and other ENTRY statements in the same
subprogram. However, each reference to a function or
subroutine must use an actual argument list that agrees
in order, number, and type with the dummy argument list
in the corresponding FUNCTION, SUBROUTINE, or ENTRY
statement. The use of a subroutine name or an
alternate return specifier as an actual argument is an
FORTRAN 77 Full Language Page 15-14
FUNCTIONS AND SUBROUTINES ANSI X3J3/90.4
exception to the rule requiring agreement of type.
15.7.3 Entry_Association. Within a function
subprogram, all variables whose names are also the
names of entries are associated with each other and
with the variable, if any, whose name is also the name
of the function subprogram (17.1.3). Therefore, any
such variable that becomes defined causes all
associated variables of the same type to become defined
and all associated variables of different type to
become undefined. Such variables are not required to
be of the same type unless the type is character, but
the variable whose name is used to reference the
function must be in a defined state when a RETURN or
END statement is executed in the subprogram. An
associated variable of a different type must not become
defined during the execution of the function reference.
15.7.4 ENTRY_Statement_Restrictions. Within a
subprogram, an entry name must not appear both as an
entry name in an ENTRY statement and as a dummy
argument in a FUNCTION, SUBROUTINE, or ENTRY statement
and must not appear in an EXTERNAL statement.
In a function subprogram, a variable name that is the
same as an entry name must not appear in any statement
that precedes the appearance of the entry name in an
ENTRY statement, except in a type-statement.
If an entry name in a function subprogram is of type
character, each entry name and the name of the function
subprogram must be of type character. If the name of
the function subprogram or any entry in the subprogram
has a length of (*) declared, all such entities must
have a length of (*) declared; otherwise, all such
entities must have a length specification of the same
integer value.
In a subprogram, a name that appears as a dummy
argument in an ENTRY statement must not appear in an
executable statement preceding that ENTRY statement
unless it also appears in a FUNCTION, SUBROUTINE, or
ENTRY statement that precedes the executable statement.
In a subprogram, a name that appears as a dummy
argument in an ENTRY statement must not appear in the
expression of a statement function statement unless the
name is also a dummy argument of the statement
function, appears in a FUNCTION or SUBROUTINE
statement, or appears in an ENTRY statement that
precedes the statement function statement.
FORTRAN 77 Full Language Page 15-15
FUNCTIONS AND SUBROUTINES ANSI X3J3/90.4
If a dummy argument appears in an executable statement,
the execution of the executable statement is permitted
during the execution of a reference to the function or
subroutine only if the dummy argument appears in the
dummy argument list of the procedure name referenced.
Note that the association of dummy arguments with
actual arguments is not retained between references to
a function or subroutine.
15.8 RETURN_Statement
A RETURN statement causes return of control to the
referencing program unit and may appear only in a
function subprogram or subroutine subprogram.
15.8.1 Form_of_a_RETURN_Statement. The form of a
RETURN statement in a function subprogram is:
RETURN
The form of a RETURN statement in a subroutine
subprogram is:
RETURN [e_]
where e_ is an integer expression.
15.8.2 Execution_of_a_RETURN_Statement. Execution of
a RETURN statement terminates the reference of a
function or subroutine subprogram. Such subprograms
may contain more than one RETURN statement; however, a
subprogram need not contain a RETURN statement.
Execution of an END statement in a function or
subroutine subprogram has the same effect as executing
a RETURN statement in the subprogram.
In the execution of an executable program, a function
or subroutine subprogram must not be referenced a
second time without the prior execution of a RETURN or
END statement in that procedure.
Execution of a RETURN statement in a function
subprogram causes return of control to the currently
referencing program unit. The value of the function
(15.5) must be defined and is available to the
referencing program unit.
Execution of a RETURN statement in a subroutine
subprogram causes return of control to the currently
referencing program unit. Return of control to the
referencing program unit completes execution of the
FORTRAN 77 Full Language Page 15-16
FUNCTIONS AND SUBROUTINES ANSI X3J3/90.4
CALL statement.
Execution of a RETURN statement terminates the
association between the dummy arguments of the external
procedure in the subprogram and the current actual
arguments.
15.8.3 Alternate_Return. If e_ is not specified in a
RETURN statement, or if the value of e_ is less than one
or greater than the number of asterisks in the
SUBROUTINE or subroutine ENTRY statement that specifies
the currently referenced name, control returns to the
CALL statement that initiated the subprogram reference
and this completes the execution of the CALL statement.
If 1 < e_ < n_, where n_ is the number of asterisks in the
SUBROUTINE or subroutine ENTRY statement that specifies
the currently referenced name, the value of e _
identifies the e_th asterisk in the dummy argument list.
Control is returned to the statement identified by the
alternate return specifier in the CALL statement that
is associated with the e_ th asterisk in the dummy
argument list of the currently referenced name. This
completes the execution of the CALL statement.
15.8.4 Definition_Status. Execution of a RETURN
statement (or END statement) within a subprogram causes
all entities within the subprogram to become undefined,
except for the following:
(1) Entities specified by SAVE statements
(2) Entities in blank common
(3) Initially defined entities that have neither
been redefined or become undefined
(4) Entities in a named common block that appears in
the subprogram and appears in at least one other
program unit that is referencing, either
directly or indirectly, the subprogram
Note that if a named common block appears in the main
program, the entities in the named common block do not
become undefined at the execution of any RETURN
statement in the executable program.
FORTRAN 77 Full Language Page 15-17
FUNCTIONS AND SUBROUTINES ANSI X3J3/90.4
15.9 Arguments_and_Common_Blocks
Arguments and common blocks provide means of
communication between the referencing program unit and
the referenced procedure.
Data may be communicated to a statement function or
intrinsic function by an argument list. Data may be
communicated to and from an external procedure by an
argument list or common blocks. Procedure names may be
communicated to an external procedure only by an
argument list.
A dummy argument appears in the argument list of a
procedure. An actual argument appears in the argument
list of a procedure reference.
The number of actual arguments must be the same as the
number of dummy arguments in the procedure referenced.
15.9.1 Dummy_Arguments. Statement functions, function
subprograms, and subroutine subprograms use dummy
arguments to indicate the types of actual arguments and
whether each argument is a single value, array of
values, procedure, or statement label. Note that a
statement function dummy argument may be only a
variable.
Each dummy argument is classified as a variable, array,
dummy procedure, or asterisk. Dummy argument names may
appear wherever an actual name of the same class
(Section 18) and type may appear, except where they are
explicitly prohibited.
Dummy argument names of type integer may appear in
adjustable dimensions in dummy array declarators
(5.5.1). Dummy argument names must not appear in
EQUIVALENCE, DATA, PARAMETER, SAVE, INTRINSIC, or
COMMON statements, except as common block names. A
dummy argument name must not be the same as the
procedure name appearing in a FUNCTION, SUBROUTINE,
ENTRY, or statement function statement in the same
program unit.
15.9.2 Actual_Arguments. Actual arguments specify the
entities that are to be associated with the dummy
arguments for a particular reference of a subroutine or
function. An actual argument must not be the name of a
statement function in the program unit containing the
reference. Actual arguments may be constants, symbolic
names of constants, function references, expressions
FORTRAN 77 Full Language Page 15-18
FUNCTIONS AND SUBROUTINES ANSI X3J3/90.4
involving operators, and expressions enclosed in
parentheses if and only if the associated dummy
argument is a variable that is not defined during
execution of the referenced external procedure.
The type of each actual argument must agree with the
type of its associated dummy argument, except when the
actual argument is a subroutine name (15.9.3.4) or an
alternate return specifier (15.6.2.3).
15.9.3 Association_of_Dummy_and_Actual_Arguments. At
the execution of a function or subroutine reference, an
association is established between the corresponding
dummy and actual arguments. The first dummy argument
becomes associated with the first actual argument, the
second dummy argument becomes associated with the
second actual argument, etc.
All appearances within a function or subroutine
subprogram of a dummy argument whose name appears in
the dummy argument list of the procedure name
referenced become associated with the actual argument
when a reference to the function or subroutine is
executed.
A valid association occurs only if the type of the
actual argument is the same as the type of the
corresponding dummy argument. A subroutine name has no
type and must be associated with a dummy procedure
name. An alternate return specifier has no type and
must be associated with an asterisk.
If an actual argument is an expression, it is evaluated
just before the association of arguments takes place.
If an actual argument is an array element name, its
subscript is evaluated just before the association of
arguments takes place. Note that the subscript value
remains constant as long as that association of
arguments persists, even if the subscript contains
variables that are redefined during the association.
If an actual argument is a character substring name,
its substring expressions are evaluated just before the
association of arguments takes place. Note that the
value of each of the substring expressions remains
constant as long as that association of arguments
persists, even if the substring expression contains
variables that are redefined during the association.
FORTRAN 77 Full Language Page 15-19
FUNCTIONS AND SUBROUTINES ANSI X3J3/90.4
If an actual argument is an external procedure name,
the procedure must be available at the time a reference
to it is executed.
If an actual argument becomes associated with a dummy
argument that appears in an adjustable dimension
(5.5.1), the actual argument must be defined with an
integer value at the time the procedure is referenced.
A dummy argument is undefined if it is not currently
associated with an actual argument. An adjustable
array is undefined if the dummy argument array is not
currently associated with an actual argument array or
if any variable appearing in the adjustable array
declarator is not currently associated with an actual
argument and is not in a common block.
Argument association may be carried through more than
one level of procedure reference. A valid association
exists at the last level only if a valid association
exists at all intermediate levels. Argument
association within a program unit terminates at the
execution of a RETURN or END statement in the program
unit. Note that there is no retention of argument
association between one reference of a subprogram and
the next reference of the subprogram.
15.9.3.1 Length of Character Dummy and Actual
Arguments. If a dummy argument is of type character,
the associated actual argument must be of type
character and the length of the dummy argument must be
less than or equal to the length of the actual
argument. If the length len___ of a dummy argument of
type character is less than the length of an associated
actual argument, the leftmost len___ characters of the
actual argument are associated with the dummy argument.
If a dummy argument of type character is an array name,
the restriction on length is for the entire array and
not for each array element. The length of an array
element in the dummy argument array may be different
from the length of an array element in an associated
actual argument array, array element, or array element
substring, but the dummy argument array must not extend
beyond the end of the associated actual argument array.
If an actual argument is a character substring, the
length of the actual argument is the length of the
substring. If an actual argument is the concatenation
of two or more operands, its length is the sum of the
lengths of the operands.
FORTRAN 77 Full Language Page 15-20
FUNCTIONS AND SUBROUTINES ANSI X3J3/90.4
15.9.3.2 Variables_as_Dummy_Arguments. A dummy
argument that is a variable may be associated with an
actual argument that is a variable, array element,
substring, or expression.
If the actual argument is a variable name, array
element name, or substring name, the associated dummy
argument may be defined or redefined within the
subprogram. If the actual argument is a constant, a
symbolic name of a constant, a function reference, an
expression involving operators, or an expression
enclosed in parentheses, the associated dummy argument
must not be redefined within the subprogram.
15.9.3.3 Arrays_as_Dummy_Arguments. Within a program
unit, the array declarator given for an array provides
all array declarator information needed for the array
in an execution of the program unit. The number and
size of dimensions in an actual argument array
declarator may be different from the number and size of
the dimensions in an associated dummy argument array
declarator.
A dummy argument that is an array may be associated
with an actual argument that is an array, array
element, or array element substring.
If the actual argument is a noncharacter array name,
the size of the dummy argument array must not exceed
the size of the actual argument array, and each actual
argument array element becomes associated with the
dummy argument array element that has the same
subscript value as the actual argument array element.
Note that association by array elements exists for
character arrays if there is agreement in length
between the actual argument and the dummy argument
array elements; if the lengths do not agree, the dummy
and actual argument array elements do not consist of
the same characters, but an association still exists.
If the actual argument is a noncharacter array element
name, the size of the dummy argument array must not
exceed the size of the actual argument array plus one
minus the subscript value of the array element. When
an actual argument is a noncharacter array element name
with a subscript value of as__, the dummy argument array
element with a subscript value of ds__ becomes associated
with the actual argument array element that has a
subscript value of as__ + ds__ - 1 (Table 1, 5.4.3).
FORTRAN 77 Full Language Page 15-21
FUNCTIONS AND SUBROUTINES ANSI X3J3/90.4
If the actual argument is a character array name,
character array element name, or character array
element substring name and begins at character storage
unit acu___ of an array, character storage unit dcu___ of an
associated dummy argument array becomes associated with
character storage unit acu_ __ + dcu___ - 1 of the actual
argument array.
15.9.3.4 Procedures_as_Dummy_Arguments. A dummy
argument that is a dummy procedure may be associated
only with an actual argument that is an intrinsic
function, external function, subroutine, or another
dummy procedure.
If a dummy argument is used as if it were an external
function, the associated actual argument must be an
intrinsic function, external function, or dummy
procedure. A dummy argument that becomes associated
with an intrinsic function never has any automatic
typing property, even if the dummy argument name
appears in Table 5 (15.10). Therefore, the type of the
dummy argument must agree with the type of the result
of all specific actual arguments that become associated
with the dummy argument. If a dummy argument name is
used as if it were an external function and that name
also appears in Table 5, the intrinsic function
corresponding to the dummy argument name is not
available for referencing within the subprogram.
A dummy argument that is used as a procedure name in a
function reference and is associated with an intrinsic
function must have arguments that agree in order,
number, and type with those specified in Table 5 for
the intrinsic function.
If a dummy argument appears in a type-statement and an
EXTERNAL statement, the actual argument must be the
name of an intrinsic function, external function, or
dummy procedure.
If the dummy argument is referenced as a subroutine,
the actual argument must be the name of a subroutine or
dummy procedure and must not appear in a type-statement
or be referenced as a function.
Note that it may not be possible to determine in a
given program unit whether a dummy procedure is
associated with a function or a subroutine. If a
procedure name appears only in a dummy argument list,
an EXTERNAL statement, and an actual argument list, it
is not possible to determine whether the symbolic name
FORTRAN 77 Full Language Page 15-22
FUNCTIONS AND SUBROUTINES ANSI X3J3/90.4
becomes associated with a function or subroutine by
examination of the subprogram alone.
15.9.3.5 Asterisks_as_Dummy_Arguments. A dummy
argument that is an asterisk may appear only in the
dummy argument list of a SUBROUTINE statement or an
ENTRY statement in a subroutine subprogram.
A dummy argument that is an asterisk may be associated
only with an actual argument that is an alternate
return specifier in the CALL statement that identifies
the current referencing name. If a dummy argument is
an asterisk, the corresponding actual argument must be
an alternate return specifier.
15.9.3.6 Restrictions_on_Association_of_Entities. If
a subprogram reference causes a dummy argument in the
referenced subprogram to become associated with another
dummy argument in the referenced subprogram, neither
dummy argument may become defined during execution of
that subprogram. For example, if a subroutine is
headed by
SUBROUTINE XYZ (A,B)
and is referenced by
CALL XYZ (C,C)
the[n the dummy arguments A and B each become
associated with the same actual argument C and
therefore with each other. Neither A nor B may become
defined during this execution of subroutine XYZ or by
any procedures referenced by XYZ.
If a subprogram reference causes a dummy argument to
become associated with an entity in a common block in
the referenced subprogram or in a subprogram referenced
by the referenced subprogram, neither the dummy
argument nor the entity in the common block may become
defined within the subprogram or within a subprogram
referenced by the referenced subprogram. For example,
if a subroutine contains the statements:
SUBROUTINE XYZ (A)
COMMON C
and is referenced by a program unit that contains the
statements:
COMMON B
FORTRAN 77 Full Language Page 15-23
FUNCTIONS AND SUBROUTINES ANSI X3J3/90.4
CALL XYZ (B)
then the dummy argument A becomes associated with the
actual argument B, which is associated with C, which is
in a common block. Neither A nor C may become defined
during execution of the subroutine XYZ or by any
procedures referenced by XYZ.
15.9.4 Common_Blocks. A common block provides a means
of communication between external procedures or between
a main program and an external procedure. The
variables and arrays in a common block may be defined
and referenced in all subprograms that contain a
declaration of that common block. Because association
is by storage rather than by name, the names of the
variables and arrays may be different in the different
subprograms. A reference to a datum in a common block
is proper if the datum is in a defined state of the
same type as the type of the name used to reference the
datum. However, an integer variable that has been
assigned a statement label must not be referenced in
any program unit other than the one in which it was
assigned (10.3).
No difference in data type is permitted between the
defined state and the type of the reference, except
that either part of a complex datum may be referenced
also as a real datum.
In a subprogram that has declared a named common block,
the entities in the block remain defined after the
execution of a RETURN or END statement if a common
block of the same name has been declared in any program
unit that is currently referencing the subprogram,
either directly or indirectly. Otherwise, such
entities become undefined at the execution of a RETURN
or END statement, except for those that are specified
by SAVE statements and those that were initially
defined by DATA statements and have neither been
redefined nor become undefined.
Execution of a RETURN or END statement does not cause
entities in blank common or in any named common block
that appears in the main program to become undefined.
Common blocks may be used also to reduce the total
number of storage units required for an executable
program by causing two or more subprograms to share
some of the same storage units. This sharing of
storage is permitted if the rules for defining and
referencing data are not violated.
FORTRAN 77 Full Language Page 15-24
FUNCTIONS AND SUBROUTINES ANSI X3J3/90.4
15.10 Table_of_Intrinsic_Functions
FORTRAN 77 Full Language Page 15-25
FUNCTIONS AND SUBROUTINES ANSI X3J3/90.4
FORTRAN 77 Full Language Page 15-26
FUNCTIONS AND SUBROUTINES ANSI X3J3/90.4
FORTRAN 77 Full Language Page 15-27
FUNCTIONS AND SUBROUTINES ANSI X3J3/90.4
FORTRAN 77 Full Language Page 15-28
FUNCTIONS AND SUBROUTINES ANSI X3J3/90.4
Notes for Table 5:
(1) For a_ of type integer, int(a_)=a_. For a_ of type
real or double precision, there are two cases:
if |a_| < 1, int(a_)=0; if |a_| > 1, int(a_) is the
integer whose magnitude is the largest integer
that does not exceed the magnitude of a_ and
whose sign is the same as the sign of a_. For
example,
int(-3.7) = -3
For a_ of type complex, int(a_ ) is the value
obtained by applying the above rule to the real
part of a_.
For a_ of type real, IFIX(a_) is the same as INT(a_
).
(2) For a_ of type real, REAL(a_) is a_. For a_ of type
integer or double precision, REAL(a_) is as much
precision of the significant part of a_ as a real
datum can contain. For a_ of type complex, REAL(a
_) is the real part of a_.
For a_ of type integer, FLOAT(a_) is the same as
REAL(a_).
(3) For a_ of type double precision, DBLE(a_) is a_ .
For a_ of type integer or real, DBLE(a_) is as
much precision of the significant part of a_ as a
double precision datum can contain. For a_ of
type complex, DBLE(a_) is as much precision of
the significant part of the real part of a_ as a
double precision datum can contain.
(4) CMPLX may have one or two arguments. If there
is one argument, it may be of type integer,
real, double precision, or complex. If there
are two arguments, they must both be of the same
type and may be of type integer, real, or double
precision.
For a_ of type complex, CMPLX(a_) is a_. For a_ of
type integer, real, or double precision, CMPLX(a_
) is the complex value whose real part is REAL(a_
) and whose imaginary part is zero.
CMPLX(a_918,a_928) is the complex value whose real
part is REAL(a_918) and whose imaginary part is
REAL(a_928).
FORTRAN 77 Full Language Page 15-29
FUNCTIONS AND SUBROUTINES ANSI X3J3/90.4
(5) ICHAR provides a means of converting from a
character to an integer, based on the position
of the character in the processor collating
sequence. The first character in the collating
sequence corresponds to position 0 and the last
to position n_ - 1, where n_ is the number of
characters in the collating sequence.
The value of ICHAR(a_ ) is an integer in the
range: 0 < ICHAR(a_ ) < n_-1, where a_ is an
argument of type character of length one. The
value of a_ must be a character capable of
representation in the processor. The position
of that character in the collating sequence is
the value of ICHAR.
For any characters c_918 and c_928 capable of
representation in the processor, (c_918 .LE c_928) is
true if and only if (ICHAR(c_918) .LE. ICHAR(c_928))
is true, and (c_918 .EQ. c_928) is true if and only if
(ICHAR(c_918) .EQ. ICHAR(c_928)) is true.
CHAR(i_) returns the character in the i_ th
position of the processor collating sequence.
The value is of type character of length one. i_
must be an integer expression whose value must
be in the range 0 < i_ < n_-1.
ICHAR(CHAR(i_)) = i_ for 0 < i_

_-1.
CHAR(ICHAR(c_)) = c_ for any character c_
capable of
representation in the
processor.
(6) A complex value is expressed as an ordered pair
of reals, (ar__,ai__), where ar__ is the real part and
ai__ is the imaginary part.
(7) All angles are expressed in radians.
(8) The result of a function of type complex is the
principal value.
(9) All arguments in an intrinsic function reference
must be of the same type.
(10) INDEX(a_918,a_928) returns an integer value indicating
the starting position within the character
string a_918 of a substring identical to string a_928.
If a_928 occurs more than once in a_918, the starting
FORTRAN 77 Full Language Page 15-30
FUNCTIONS AND SUBROUTINES ANSI X3J3/90.4
position of the first occurrence is returned.
If a_928 does not occur in a_918, the value zero is
returned. Note that zero is returned if LEN(a
_918) < LEN(a_928).
(11) The value of the argument of the LEN function
need not be defined at the time the function
reference is executed.
(12) LGE(a_918,a_928) returns the value true if a_918=a_928 or if
a _918 follows a_928 in the collating sequence
described in American National Standard Code for
Information Interchange, ANSI X3.4-1977 (ASCII),
and otherwise returns the value false.
LGT(a_918,a_928) returns the value true if a_918 follows a
_928 in the collating sequence described in ANSI
X3.4-1977 (ASCII), and otherwise returns the
value false.
LLE(a_918,a_928) returns the value true if a_918=a_928 or if
a_918 precedes a_928 in the collating sequence
described in ANSI X3.4-1977 (ASCII), and
otherwise returns the value false.
LLT(a_918,a_928) returns the value true if a_918 precedes
a_928 in the collating sequence described in ANSI
X3.4-1977 (ASCII), and otherwise returns the
value false.
If the operands for LGE, LGT, LLE, and LLT are
of unequal length, the shorter operand is
considered as if it were extended on the right
with blanks to the length of the longer operand.
If either of the character entities being
compared contains a character that is not in the
ASCII character set, the result is processor-
dependent.
15.10.1 Restrictions on Range of Arguments and
Results. Restrictions on the range of arguments and
results for intrinsic functions when referenced by
their specific names are as follows:
(1) Remaindering: The result for MOD, AMOD, and DMOD
is undefined when the value of the second
argument is zero.
FORTRAN 77 Full Language Page 15-31
FUNCTIONS AND SUBROUTINES ANSI X3J3/90.4
(2) Transfer of Sign: If the value of the first
argument of ISIGN, SIGN, or DSIGN is zero, the
result is zero, which is neither positive or
negative (4.1.3).
(3) Square Root: The value of the argument of SQRT
and DSQRT must be greater than or equal to zero.
The result of CSQRT is the principal value with
the real part greater than or equal to zero.
When the real part of the result is zero, the
imaginary part is greater than or equal to zero.
(4) Logarithms: The value of the argument of ALOG,
DLOG, ALOG10, and DLOG10 must be greater than
zero. The value of the argument of CLOG must
not be (0.,0.). The range of the imaginary part
of the result of CLOG is: -J < imaginary part <
J. The imaginary part of the result is J only
when the real part of the argument is less than
zero and the imaginary part of the argument is
zero.
(5) Sine, Cosine, and Tangent: The absolute value of
the argument of SIN, DSIN, COS, DCOS, TAN, and
DTAN is not restricted to be less than 2J.
(6) Arcsine: The absolute value of the argument of
ASIN and DASIN must be less than or equal to
one.
The range of the result is: -J/2 < result < J /
2.
(7) Arccosine: The absolute value of the argument of
ACOS and DACOS must be less than or equal to
one. The range of the result is: 0 < result J.
(8) Arctangent: The range of the result for ATAN and
DATAN is: -J/2 < result < J/2. If the value of
the first argument of ATAN2 or DATAN2 is
positive, the result is positive. If the value
of the first argument is zero, the result is
zero if the second argument is positive and J if
the second argument is negative. If the value of
the first argument is negative, the result is
negative. If the value of the second argument
is zero, the absolute value of the result is J/
2. The arguments must not both have the value
zero. The range of the result for ATAN2 and
DATAN2 is: -J < result < J.
FORTRAN 77 Full Language Page 15-32
FUNCTIONS AND SUBROUTINES ANSI X3J3/90.4
The above restrictions on arguments and results also
apply to the intrinsic functions when referenced by
their generic names.
FORTRAN 77 Full Language Page 15-33
FUNCTIONS AND SUBROUTINES ANSI X3J3/90.4
Table 5_______
Intrinsic Functions
8 ________________________________________________________________________________________________
Number of Generic Specific Type of
Intrinsic Function Definition Arguments Name Name Argument Function
8 ________________________________________________________________________________________________
Type Conversion Conversion 1 INT - Integer Integer
to Integer INT Real Integer
int(a_) IFIX Real Integer
See Note 1 IDINT Double Integer
- Complex Integer
8 ___________________________________________________________________________
Conversion 1 REAL REAL Integer Real
to Real FLOAT Integer Real
See Note 2 - Real Real
SNGL Double Real
- Complex Real
8 ___________________________________________________________________________
Conversion 1 DBLE - Integer Double
to Double - Real Double
See Note 3 - Double Double
- Complex Double
8 ___________________________________________________________________________
Conversion 1 or 2 CMPLX - Integer Complex
to Complex - Real Complex
See Note 4 - Double Complex
- Complex Complex
8 ___________________________________________________________________________
Conversion 1 ICHAR Character Integer
to Integer
See Note 5
8 ___________________________________________________________________________
Conversion 1 CHAR Integer Character
to Character
See Note 5
8 ________________________________________________________________________________________________
Truncation int(a_) 1 AINT AINT Real Real
See Note 1 DINT Double Double
8 ________________________________________________________________________________________________
Nearest Whole int(a_+.5) if a_>0 1 ANINT ANINT Real Real
Number int(a_-.5) if a_<0 DNINT Double Double
8 ________________________________________________________________________________________________
Nearest Integer int(a_+.5) if a_>0 1 NINT NINT Real Integer
int(a_-.5) if a_<0 IDNINT Double Integer
8 ________________________________________________________________________________________________
Absolute Value |a_| 1 ABS IABS Integer Integer
ABS Real Real
See Note 6 DABS Double Double
(a_r_829+a_i_829)81/29 CABS Complex Real
8 ________________________________________________________________________________________________
7 |8|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|
9 |8|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|
9 |8|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|
9 |8|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|
9 |8|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|
9 |8|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|
9 |7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|
|8|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|
9
FUNCTIONS AND SUBROUTINES ANSI X3J3/90.4
Table 5 (continued)
Intrinsic Functions
8 ________________________________________________________________________________________________
Number of Generic Specific Type of
Intrinsic Function Definition Arguments Name Name Argument Function
8 ________________________________________________________________________________________________
Remaindering a_918-int(a_918/a_928)*a_928 2 MOD MOD Integer Integer
See Note 1 AMOD Real Real
DMOD Double Double
8 ________________________________________________________________________________________________
Transfer of Sign |a_918| if a_928 > 0 2 SIGN ISIGN Integer Integer
-|a_918| if a_928 < 0 SIGN Real Real
DSIGN Double Double
8 ________________________________________________________________________________________________
Positive Difference a_918-a_928 if a_918>a_928 2 DIM IDIM Integer Integer
0 if a_918

_928 DIM Real Real
DDIM Double Double
8 ________________________________________________________________________________________________
Double Precision a_918*a_928 2 DPROD Real Double
Product
8 ________________________________________________________________________________________________
Choosing Largest max(a_918,a_928,...) >2 Max MAX0 Integer Integer
Value AMAX1 Real Real
DMAX1 Double Double
8 ___________________________________________
AMAX0 Integer Real
MAX1 Real Integer
8 ________________________________________________________________________________________________
Choosing Smallest min(a_918,a_928,...) >2 MIN MIN0 Integer Integer
Value AMIN1 Real Real
DMIN1 Double Double
8 ___________________________________________
AMIN0 Integer Real
MIN1 Real Integer
8 ________________________________________________________________________________________________
Length Length of 1 LEN Character Integer
Character Entity
8 ________________________________________________________________________________________________
Index of Location of 2 INDEX Character Integer
a Substring Substring a_92
8 in String a_91
8 See Note 10
8 ________________________________________________________________________________________________
Imaginary Part of ai__ 1 AIMAG Complex Real
Complex Argument See Note 6
8 ________________________________________________________________________________________________
Conjugate of a (ar__,-ai__) 1 CONJG Complex Complex
Complex Argument See Note 6
8 ________________________________________________________________________________________________
Square Root (a_)81/29 1 SQRT SQRT Real Real
DSQRT Double Double
CSQRT Complex Complex
8 ________________________________________________________________________________________________
7 |7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|
|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|
|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|
|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|
|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|
|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|
|8|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|
9 |7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|
FUNCTIONS AND SUBROUTINES ANSI X3J3/90.4
Table 5 (continued)
Intrinsic Functions
8 ___________________________________________________________________________________________
Number of Generic Specific Type of
Intrinsic Function Definition Arguments Name Name Argument Function
8 ___________________________________________________________________________________________
Exponential e**a_ 1 EXP EXP Real Real
DEXP Double Double
CEXP Complex Complex
8 ___________________________________________________________________________________________
Natural Logarithm log(a_) 1 LOG ALOG Real Real
DLOG Double Double
CLOG Complex Complex
8 ___________________________________________________________________________________________
Common Logarithm log10(a_) 1 LOG10 ALOG10 Real Real
DLOG10 Double Double
8 ___________________________________________________________________________________________
Sine sin(a_) 1 SIN SIN Real Real
DSIN Double Double
CSIN Complex Complex
8 ___________________________________________________________________________________________
Cosine cos(a_) 1 COS COS Real Real
DCOS Double Double
CCOS Complex Complex
8 ___________________________________________________________________________________________
Tangent tan(a_) 1 TAN TAN Real Real
DTAN Double Double
8 ___________________________________________________________________________________________
Arcsine arcsin(a_) 1 ASIN ASIN Real Real
DASIN Double Double
8 ___________________________________________________________________________________________
Arccosine arccos(a_) 1 ACOS ACOS Real Real
DACOS Double Double
8 ___________________________________________________________________________________________
Arctangent arctan(a_) 1 ATAN ATAN Real Real
DATAN Double Double
8 ______________________________________________________________________
arctan(a_918/a_928) 2 ATAN2 ATAN2 Real Real
DATAN2 Double Double
8 ___________________________________________________________________________________________
Hyperbolic Sine sinh(a_) 1 SINH SINH Real Real
DSINH Double Double
8 ___________________________________________________________________________________________
Hyperbolic Cosine cosh(a_) 1 COSH COSH Real Real
DCOSH Double Double
8 ___________________________________________________________________________________________
Hyperbolic Tangent tanh(a_) 1 TANH TANH Real Real
DTANH Double Double
8 ___________________________________________________________________________________________
7 |7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|
|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|
|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|
|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|
|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|
|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|
|8|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|
9 |7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|
9
FUNCTIONS AND SUBROUTINES ANSI X3J3/90.4
Table 5 (continued)
Intrinsic Functions
8 __________________________________________________________________________________________
Number of Generic Specific Type of
Intrinsic Function Definition Arguments Name Name Argument Function
8 __________________________________________________________________________________________
Lexically Greater a_918 > a_928 2 LGE Character Logical
Than or Equal See Note 12
8 __________________________________________________________________________________________
Lexically Greater a_918 > a_928 2 LGT Character Logical
Than See Note 12
8 __________________________________________________________________________________________
Lexically Less a_918 < a_928 2 LLE Character Logical
Than or Equal See Note 12
8 __________________________________________________________________________________________
Lexically Less a_918 < a_928 2 LLT Character Logical
Than See Note 12
8 __________________________________________________________________________________________
7 |8|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|
9 |8|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|
9 |8|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|
9 |8|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|
9 |8|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|
9 |8|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|
9 |7|7|7|7|7|7|7|7|7|7|7|7|7|7|
|8|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|
9
FORTRAN 77 Full Language Page 15-26
FUNCTIONS AND SUBROUTINES ANSI X3J3/90.4
FORTRAN 77 Full Language Page 15-27
CONTENTS
15. FUNCTIONS AND SUBROUTINES.................. 15-1
15.1 Categories of Functions and
Subroutines......................... 15-1
15.1.1 Procedures................. 15-1
15.1.2 External Functions......... 15-1
15.1.3 Subroutines................ 15-1
15.1.4 Dummy Procedure............ 15-1
15.2 Referencing a Function.............. 15-1
15.2.1 Form of a Function
Reference.................. 15-2
15.2.2 Execution of a Function
Reference.................. 15-2
15.3 Intrinsic Functions................. 15-3
15.3.1 Specific Names and Generic
Names...................... 15-3
15.3.2 Referencing an Intrinsic
Function................... 15-3
15.3.3 Intrinsic Function
Restrictions............... 15-4
15.4 Statement Function.................. 15-4
15.4.1 Form of a Statement
Function Statement......... 15-4
15.4.2 Referencing a Statement
Function................... 15-6
15.4.3 Statement Function
Restrictions............... 15-7
15.5 External Functions.................. 15-7
15.5.1 Function Subprogram and
FUNCTION Statement......... 15-7
15.5.2 Referencing an External
Function................... 15-8
15.5.3 Function Subprogram
Restrictions............... 15-9
15.6 Subroutines......................... 15-10
15.6.1 Subroutine Subprogram and
SUBROUTINE
Statement.................. 15-11
15.6.2 Subroutine
Reference.................. 15-11
15.6.3 Subroutine Subprogram
Restrictions............... 15-13
15.7 ENTRY Statement..................... 15-13
15.7.1 Form of an ENTRY
Statement.................. 15-13
15.7.2 Referencing External
Procedure by Entry
Name....................... 15-14
15.7.3 Entry Association.......... 15-15
- i -
15.7.4 ENTRY Statement
Restrictions............... 15-15
15.8 RETURN Statement.................... 15-16
15.8.1 Form of a RETURN
Statement.................. 15-16
15.8.2 Execution of a RETURN
Statement.................. 15-16
15.8.3 Alternate Return........... 15-17
15.8.4 Definition Status.......... 15-17
15.9 Arguments and Common Blocks......... 15-18
15.9.1 Dummy Arguments............ 15-18
15.9.2 Actual Arguments........... 15-18
15.9.3 Association of Dummy and
Actual Arguments........... 15-19
15.9.4 Common Blocks.............. 15-24
15.10 Table of Intrinsic Functions........ 15-25
15.10.1 Restrictions on Range of
Arguments and
Results.................... 15-31
- ii -
ANSI X3J3/90.4
16. BLOCK_DATA_SUBPROGRAM
Block data subprograms are used to provide initial
values for variables and array elements in named common
blocks.
A block data subprogram is a program unit that has a
BLOCK DATA statement as its first statement. A block
data subprogram is nonexecutable. There may be more
than one block data subprogram in an executable
program.
16.1 BLOCK_DATA_Statement
The form of a BLOCK DATA statement is:
BLOCK DATA [sub___]
where sub is the symbolic name of the block data
subprogram in which the BLOCK DATA statement appears.
The optional name sub is a global name (18.1.1) and
must not be the same as the name of an external
procedure, main program, common block, or other block
data subprogram in the same executable program. The
name sub must not be the same as any local name in the
subprogram.
16.2 Block_Data_Subprogram_Restrictions
The BLOCK DATA statement must appear only as the first
statement of a block data subprogram. The only other
statements that may appear in a block data subprogram
are IMPLICIT, PARAMETER, DIMENSION, COMMON, SAVE,
EQUIVALENCE, DATA, END, and type-statements. Note that
comment lines are permitted.
If an entity in a named common block is initially
defined, all entities having storage units in the
common block storage sequence must be specified even if
they are not all initially defined. More than one
named common block may have entities initially defined
in a single block data subprogram.
Only an entity in a named common block may be initially
defined in a block data subprogram. Note that entities
associated with an entity in a common block are
considered to be in that common block.
The same named common block may not be specified in
more than one block data subprogram in the same
FORTRAN 77 Full Language Page 16-1
BLOCK DATA SUBPROGRAM ANSI X3J3/90.4
executable program.
There must not be more than one unnamed block data
subprogram in an executable program.
FORTRAN 77 Full Language Page 16-2
CONTENTS
16. BLOCK DATA SUBPROGRAM....................... 16-1
16.1 BLOCK DATA Statement.................. 16-1
16.2 Block Data Subprogram
Restrictions.......................... 16-1
- i -
ANSI X3J3/90.4
17. ASSOCIATION_AND_DEFINITION
17.1 Storage_and_Association
Storage sequences are used to describe relationships
that exist among variables, array elements, substrings,
common blocks, and arguments.
17.1.1 Storage_Sequence. A storage sequence is a
sequence (2.1) of storage units. The size of a storage
sequence is the number of storage units in the storage
sequence. A storage unit is a character storage unit
or a numeric storage unit.
A variable or array element of type integer, real, or
logical has a storage sequence of one numeric storage
unit.
A variable or array element of type double precision or
complex has a storage sequence of two numeric storage
units. In a complex storage sequence, the real part
has the first storage unit and the imaginary part has
the second storage unit.
A variable, array element, or substring of type
character has a storage sequence of character storage
units. The number of character storage units in the
storage sequence is the length of the character entity.
The order of the sequence corresponds to the ordering
of character positions (4.8).
Each array and common block has a storage sequence
(5.2.5 and 8.3.2).
17.1.2 Association_of_Storage_Sequences. Two storage
sequences s_918 and s_928 are associated if the ith storage
unit of s_918 is the same as the jth storage unit of s_928.
This causes the (i+k)th storage unit of s_918 to be the
same as the (j+k)th storage unit of s_928, for each
integer k such that 1 < i+k < size of s_918 and 1 < j+k <
size of s_928.
17.1.3 Association_of_Entities. Two variables, array
elements, or substrings are associated if their storage
sequences are associated. Two entities are totally
associated if they have the same storage sequence. Two
entities are partially associated if they are
associated but not totally associated.
The definition status and value of an entity affects
the definition status and value of any associated
FORTRAN 77 Full Language Page 17-1
ASSOCIATION AND DEFINITION ANSI X3J3/90.4
entity. An EQUIVALENCE statement, a COMMON statement,
an ENTRY statement (15.7.3), or a procedure reference
(argument association) may cause association of storage
sequences.
An EQUIVALENCE statement causes association of entities
only within one program unit, unless one of the
equivalenced entities is also in a common block (8.3).
Arguments and COMMON statements cause entities in one
program unit to become associated with entities in
another program unit (8.3 and 15.9). Note that
association between actual and dummy arguments does not
imply association of storage sequences except when the
actual argument is the name of a variable, array
element, array, or substring.
In a function subprogram, an ENTRY statement causes the
entry name to become associated with the name of the
function subprogram which appears in the FUNCTION
statement.
Partial association may exist only between two
character entities or between a double precision or
complex entity and an entity of type integer, real,
logical, double precision, or complex.
Except for character entities, partial association may
occur only through the use of COMMON, EQUIVALENCE, or
ENTRY statements. Partial association must not occur
through argument association, except for arguments of
type character.
In the example:
REAL A(4)a,B
COMPLEX C(2)
DOUBLE PRECISION D
EQUIVALENCE (C(2),A(2),B), (A,D)
the third storage unit of C, the second storage unit of
A, the storage unit of B, and the second storage unit
of D are specified as the same. The storage sequences
may be illustrated as:
storage unit 1 | 2 3 | 4 5 |
|7|99 ----C(1)---- ----C(2)----
| A(1) A(2) A(3)|7|7|9999 A(4)|
|7|7|7|999999 --B--
-----D-----
7 |
7 |8|7|
9
FORTRAN 77 Full Language Page 17-2
ASSOCIATION AND DEFINITION ANSI X3J3/90.4
A(2) and B are totally associated. The following are
partially associated: A(1) and C(1), A(2) and C(2),
A(3) and C(2), B and C(2), A(1) and D, A(2) and D, B
and D, C(1) and D, and C(2) and D. Note that although
C(1) and C(2) are each associated with D, C(1) and C(2)
are not associated with each other.
Partial association of character entities occurs when
some, but not all, of the storage units of the entities
are the same. In the example:
CHARACTER A*4,B*4,C*3
EQUIVALENCE (A(2:3),B,C)
A, B, and C are partially associated.
17.2 Events_That_Cause_Entities_to_Become_Defined
Variables, array elements, and substrings become
defined as follows:
(1) Execution of an arithmetic, logical, or
character assignment statement causes the entity
that precedes the equals to become defined.
(2) As execution of an input statement proceeds,
each entity that is assigned a value of its
corresponding type from the input medium becomes
defined at the time of such assignment.
(3) Execution of a DO statement causes the DO-
variable to become defined.
(4) Beginning of execution of action specified by an
implied-DO list in an input/output statement
causes the implied-DO-variable to become
defined.
(5) A DATA statement causes entities to become
initially defined at the beginning of execution
of an executable program.
(6) Execution of an ASSIGN statement causes the
variable in the statement to become defined with
a statement label value.
(7) When an entity of a given type becomes defined,
all totally associated entities of the same type
become defined except that entities totally
associated with the variable in an ASSIGN
statement become undefined when the ASSIGN
FORTRAN 77 Full Language Page 17-3
ASSOCIATION AND DEFINITION ANSI X3J3/90.4
statement is executed.
(8) A reference to a subprogram causes a dummy
argument to become defined if the corresponding
actual argument is defined with a value that is
not a statement label value. Note that there
must be agreement between the actual argument
and the dummy argument (15.9.3).
(9) Execution of an input/output statement
containing an input/output status specifier
causes the specified integer variable or array
element to become defined.
(10) Execution of an INQUIRE statement causes any
entity that is assigned a value during the
execution of the statement to become defined if
no error condition exists.
(11) When a complex entity becomes defined, all
partially associated real entities become
defined.
(12) When both parts of a complex entity become
defined as a result of partially associated real
or complex entities becoming defined, the
complex entity becomes defined.
(13) When all characters of a character entity become
defined, the character entity becomes defined.
17.3 Events_That_Caused_Entities_to_Become_Undefined
Variables, array elements, and substrings become
undefined as follows:
(1) All entities are undefined at the beginning of
execution of an executable program except those
entities initially defined by DATA statements.
(2) When an entity of a given type becomes defined,
all totally associated entities of different
type become undefined.
(3) Execution of an ASSIGN statement causes the
variable in the statement to become undefined as
an integer. Entities that are associated with
the variable become undefined.
(4) When an entity of type other than character
becomes defined, all partially associated
FORTRAN 77 Full Language Page 17-4
ASSOCIATION AND DEFINITION ANSI X3J3/90.4
entities become undefined. However, when an
entity of type real is partially associated with
an entity of type complex, the complex entity
does not become undefined when the real entity
becomes defined and the real entity does not
become undefined when the complex entity becomes
defined. When an entity of type complex is
partially associated with another entity of type
complex, definition of one entity does not cause
the other to become undefined.
(5) When the evaluation of a function causes an
argument of the function or an entity in common
to become defined and if a reference to the
function appears in an expression in which the
value of the function is not needed to determine
the value of the expression, then the argument
or the entity in common becomes undefined when
the expression is evaluated (6.6.1).
(6) The execution of a RETURN statement or an END
statement within a subprogram causes all
entities within the subprogram to become
undefined except for the following:
(a) Entities in blank common
(b) Initially defined entities that have neither
been redefined nor become undefined
(c) Entities specified by SAVE statements
(d) Entities in a named common block that appears
in the subprogram and appears in at least one
other program unit that is either directly or
indirectly referencing the subprogram
(7) When an error condition or end-of-file condition
occurs during execution of an input statement,
all of the entities specified by the input list
of the statement become undefined.
(8) Execution of a direct access input statement
that specifies a record that has not been
previously written causes all of the entities
specified by the input list of the statement to
become undefined.
(9) Execution of an INQUIRE statement may cause
entities to become undefined (12.10.3).
FORTRAN 77 Full Language Page 17-5
ASSOCIATION AND DEFINITION ANSI X3J3/90.4
(10) When any character of a character entity becomes
undefined, the character entity becomes
undefined.
(11) When an entity becomes undefined as a result of
conditions described in (5) through (10), all
totally associated entities become undefined and
all partially associated entities of type other
than character become undefined.
FORTRAN 77 Full Language Page 17-6
CONTENTS
17. ASSOCIATION AND DEFINITION.................. 17-1
17.1 Storage and Association............... 17-1
17.1.1 Storage Sequence.............. 17-1
17.1.2 Association of Storage
Sequences..................... 17-1
17.1.3 Association of
Entities...................... 17-1
17.2 Events That Cause Entities to Become
Defined............................... 17-3
17.3 Events That Caused Entities to Become
Undefined............................. 17-4
- i -
ANSI X3J3/90.4
18. SCOPES_AND_CLASSES_OF_SYMBOLIC_NAMES
A symbolic name consists of one to six alphanumeric
characters, the first of which must be a letter. Some
sequences of characters, such as format edit
descriptors and keywords that uniquely identify certain
statements, for example, GO TO, READ, FORMAT, etc, are
not symbolic names in such occurrences nor do they form
the first characters of symbolic names in such
occurrences.
18.1 Scope_of_Symbolic_Names
The scope of a symbolic name is an executable program,
a program unit, a statement function statement, or an
implied-DO list in a DATA statement.
The name of the main program and the names of block
data subprograms, external functions, subroutines, and
common blocks have a scope of an executable program.
The names of variables, arrays, constants, statement
functions, intrinsic functions, and dummy procedures
have a scope of a program unit.
The names of variables that appear as dummy arguments
in a statement function statement have a scope of that
statement.
The names of variables that appear as the DO-variable
of an implied-DO in a DATA statement have a scope of
the implied-DO list.
18.1.1 Global_Entities. The main program, common
blocks, subprograms, and external procedures are global
entities of an executable program. A symbolic name
that identifies a global entity must not be used to
identify any other global entity in the same executable
program.
18.1.1.1 Classes_of_Global_Entities. A symbolic name
in one of the following classes is a global entity in
an executable program:
(1) Common block
(2) External function
(3) Subroutine
FORTRAN 77 Full Language Page 18-1
SCOPES AND CLASSES OF SYMBOLIC NAMES ANSI X3J3/90.4
(4) Main program
(5) Block data subprogram
18.1.2 Local_Entities. The symbolic name of a local
entity identifies that entity in a single program unit.
Within a program unit, a symbolic name that is in one
class of entities local to the program unit must not
also be in another class of entities local to the
program unit. However, a symbolic name that identifies
a local entity may, in a different program unit,
identify an entity of any class that is either local to
that program unit or global to the executable program.
A symbolic name that identifies a global entity in a
program unit must not be used to identify a local
entity in that program unit, except for a common block
name and an external function name (18.2.1 and 18.2.2).
18.1.2.1 Classes_of_Local_Entities. A symbolic name
in one of the following classes is a local entity in a
program unit.
(1) Array
(2) Variable
(3) Constant
(4) Statement function
(5) Intrinsic function
(6) Dummy procedure
A symbolic name that is a dummy argument of a procedure
is classified as a variable, array, or dummy procedure.
The specification and usage must not violate the
respective class rules.
18.2 Classes_of_Symbolic_Names
In a program unit, a symbolic name must not be in more
than one class except as noted in the following
paragraphs of this section. There are no restrictions
on the appearances of the same symbolic name in
different program units of an executable program other
than those noted in this section.
18.2.1 Common_block. A symbolic name is the name of a
common block if and only if it appears as a block name
in a COMMON statement (8.3).
FORTRAN 77 Full Language Page 18-2
SCOPES AND CLASSES OF SYMBOLIC NAMES ANSI X3J3/90.4
A common block name is global to the executable
program.
A common block name in a program unit may also be the
name of any local entity other than a constant,
intrinsic function, or a local variable that is also an
external function in a function subprogram. If a name
is used for both a common block and a local entity, the
appearance of that name in any context other than as a
common block name in a COMMON or SAVE statement
identifies only the local entity. Note that an
intrinsic function name may be a common block name in a
program unit that does not reference the intrinsic
function.
18.2.2 External_Function. A symbolic name is the name
of an external function if it meets either of the
following conditions:
(1) The name appears immediately following the word
FUNCTION in a FUNCTION statement or the word
ENTRY in an ENTRY statement within a function
subprogram.
(2) It is not an array name, character variable
name, statement function name, intrinsic
function name, dummy argument, or subroutine
name, and every appearance is immediately
followed by a left parenthesis except in a
type-statement, in an EXTERNAL statement, or as
an actual argument.
In a function subprogram, the name of a function that
appears immediately after the word FUNCTION in a
FUNCTION statement or immediately after the word ENTRY
in an ENTRY statement may also be the name of a
variable in that subprogram (15.5.1). At least one
such function name must be the name of a variable in a
function subprogram.
An external function name is global to the executable
program.
18.2.3 Subroutine. A symbolic name is the name of a
subroutine if it meets either of the following
conditions:
(1) The name appears immediately following the word
SUBROUTINE in a SUBROUTINE statement or the word
ENTRY in an ENTRY statement within a subroutine
subprogram.
FORTRAN 77 Full Language Page 18-3
SCOPES AND CLASSES OF SYMBOLIC NAMES ANSI X3J3/90.4
(2) The name appears immediately following the word
CALL in a CALL statement and is not a dummy
argument.
A subroutine name is global to the executable program.
18.2.4 Main_Program. A symbolic name is the name of a
main program if and only if it appears in a PROGRAM
statement in the main program.
A main program name is global to the executable
program.
18.2.5 Block_Data_Subprogram. A symbolic name is the
name of a block data subprogram if and only if it
appears in a BLOCK DATA statement.
A block data subprogram name is global to the
executable program.
18.2.6 Array. A symbolic name is the name of an array
if it appears as the array name in an array declarator
(5.1) in a DIMENSION, COMMON, or type-statement.
An array name is local to a program unit.
An array name may be the same as a common block name.
18.2.7 Variable. A symbolic name is the name of a
variable if it meets all of the following conditions:
(1) It does not appear in a PARAMETER, INTRINSIC, or
EXTERNAL statement.
(2) It is not the name of an array, subroutine, main
program, or block data subprogram.
(3) It appears other than as the name of a common
block, the name of an external function in a
FUNCTION statement, or an entry name in an ENTRY
statement in an external function.
(4) It is never immediately followed by a left
parenthesis unless it is immediately preceded by
the word FUNCTION in a FUNCTION statement, is
immediately preceded by the word ENTRY in an
ENTRY statement, or is at the beginning of a
character substring name (5.7.1).
A variable name in the dummy argument list of a
statement function statement is local to the statement
FORTRAN 77 Full Language Page 18-4
SCOPES AND CLASSES OF SYMBOLIC NAMES ANSI X3J3/90.4
function statement in which it occurs. Note that the
use of a name that appears in Table 5 as a dummy
argument of a statement function removes it from the
class of intrinsic functions. A variable name that
appears as an implied-DO-variable in a DATA statement
is local to the implied-DO list. All other variable
names are local to a program unit.
A statement function dummy argument name may also be
the name of a variable or common block in the program
unit. The appearance of the name in any context other
than as a dummy argument of the statement function
identifies the local variable or common block. The
statement function dummy argument name and local
variable name have the same type and, if of type
character, both have the same constant length.
The name of an implied-DO-variable in a DATA statement
may also be the name of a variable or common block in
the program unit. The appearance of the name in any
context other than as an implied-DO-variable in the
DATA statement identifies the local variable or common
block. The implied- DO-variable and the local variable
have the same type.
18.2.8 Constant. A symbolic name is the name of a
constant if it appears as a symbolic name in a
PARAMETER statement.
The symbolic name of a constant is local to a program
unit.
18.2.9 Statement_Function. A symbolic name is the
name of a statement function if a statement function
statement (15.4) is present for that symbolic name and
it is not an array name.
A statement function name is local to a program unit.
A statement function name may be the same as a common
block name.
18.2.10 Intrinsic_Function. A symbolic name is the
name of an intrinsic function if it meets all of the
following conditions:
(1) The name appears in the Specific Name column or
the Generic Name column of Table 5.
(2) It is not an array name, statement function
name, subroutine name, or dummy argument name.
FORTRAN 77 Full Language Page 18-5
SCOPES AND CLASSES OF SYMBOLIC NAMES ANSI X3J3/90.4
(3) Every appearance of the symbolic name, except in
an INTRINSIC statement, a type-statement, or as
an actual argument, is immediately followed by
an actual argument list enclosed in parentheses.
An intrinsic function name is local to a program unit.
18.2.11 Dummy_Procedure. A symbolic name is the name
of a dummy procedure if the name appears in the dummy
argument list of a FUNCTION, SUBROUTINE, or ENTRY
statement and meets one or more of the following
conditions:
(1) It appears in an EXTERNAL statement.
(2) It appears immediately following the word CALL
in a CALL statement.
(3) It is not an array name or character variable
name, and every appearance is immediately
followed by a left parenthesis except in a
type-statement, in an EXTERNAL statement, in a
CALL statement, as a dummy argument, as an
actual argument, or as a common block name in a
COMMON or SAVE statement.
A dummy procedure name is local to a program unit.
FORTRAN 77 Full Language Page 18-6
CONTENTS
18. SCOPES AND CLASSES OF SYMBOLIC NAMES........ 18-1
18.1 Scope of Symbolic Names............... 18-1
18.1.1 Global Entities.............. 18-1
18.1.2 Local Entities............... 18-2
18.2 Classes of Symbolic Names............. 18-2
18.2.1 Common block................. 18-2
18.2.2 External Function............ 18-3
18.2.3 Subroutine................... 18-3
18.2.4 Main Program................. 18-4
18.2.5 Block Data Subprogram........ 18-4
18.2.6 Array........................ 18-4
18.2.7 Variable..................... 18-4
18.2.8 Constant..................... 18-5
18.2.9 Statement Function........... 18-5
18.2.10 Intrinsic Function........... 18-5
18.2.11 Dummy Procedure.............. 18-6
- i -
ANSI X3J3/90.4
APPENDIX_A:_CRITERIA,_CONFLICTS,_AND_PORTABILITY
A1. Criteria
The principal criteria used in developing this FORTRAN
standard were:
(1) Interchangeability of FORTRAN programs between
processors
(2) Compatibility with ANSI X3.9-1966, allied
standards, and existing practices
(3) Consistency and simplicity to user
(4) Suitability for efficient processor operation
for a wide range of computing equipment of
varying structure and power
(5) Allowance for future growth in the language
(6) Achievement of capabilities not currently
available, but needed for processes
appropriately expressed in FORTRAN
(7) Acceptability by a significant portion of users
(8) Improved ability to use FORTRAN programs and
data in conjunction with other languages and
environments
A2. Conflicts_with_ANSI_X3.9-1966
An extremely important consideration in the preparation
of this standard was the minimization of conflicts with
the previous standard, ANSI X3.9-1966. This standard
includes changes that create conflicts with ANSI X3.9-
1966 only when such changes were necessary to correct
an error in the previous standard or to add to the
power of the FORTRAN language in a significant manner.
The following is a list of known conflicts:
(1) A line that contains only blank characters in
columns 1 through 72 is a comment line. ANSI
X3.9-1966 allowed such a line to be the initial
line of a statement.
(2) Columns 1 through 5 of a continuation line must
contain blanks. A published interpretation of
FORTRAN 77 Full Language Page A-1
APPENDIX A: CRITERIA, CONFLICTS, AND PORTABILITYANSI X3J3/90.4
ANSI X3.9-1966 specified that columns 1-5 of a
continuation line may contain any character from
the FORTRAN character set except that column 1
must not contain a C.
(3) Hollerith constants and Hollerith data are not
permitted in this standard. ANSI X3.9-1966
permitted the use of Hollerith constants in DATA
and CALL statements, the use of noncharacter
list items in formatted input/output statements
with A edit descriptors, and the referencing of
noncharacter arrays as formats. Note that the H
edit (field) descriptor is permitted; it is not
a Hollerith constant.
(4) The value of each comma-separated subscript
expression in a subscript must not exceed its
corresponding upper bound declared for the array
name in the program unit. In the example:
DIMENSION A(10,5)
Y=A(11,1)
The reference to A(11,1) is not permitted for
the array A(10,5). ANSI X3.9-1966 permitted a
subscript expression to exceed its corresponding
upper bound if the maximum subscript value for
the array was not exceeded.
(5) Only an array that is declared as a one-
dimensional array in the program unit may have a
one-dimensional subscript in an EQUIVALENCE
statement. In the example:
DIMENSION B(2,3,4), C(4,8)
EQUIVALENCE (B(23), C(1,1))
B(23) is not permitted. ANSI X3.9-1966
permitted arrays that were declared as two- or
three-dimensional arrays to appear in an
EQUIVALENCE statement with a one-dimensional
subscript.
(6) A name must not have its type explicitly
specified more than once in a program unit.
ANSI X3.9-1966 did not explicitly have such a
prohibition.
(7) This standard does not permit a transfer of
control into the range of a DO-loop from outside
the range. The range of a DO-loop may be
FORTRAN 77 Full Language Page A-2
APPENDIX A: CRITERIA, CONFLICTS, AND PORTABILITYANSI X3J3/90.4
entered only by the execution of a DO statement.
ANSI X3.9-1966 permitted transfer of control
into the range of a DO-loop under certain
conditions. This involved the concept referred
to as "extended range of a DO."
(8) A labeled END statement could conflict with the
initial line of a statement in an ANSI X3.9-1966
standard-conforming program.
(9) A record must not be written after an endfile
record in a sequential file. ANSI X3.9-1966 did
not prohibit this, but provided no
interpretation for the reading of an endfile
record.
(10) A sequential file may not contain both formatted
and unformatted records. A published
interpretation of ANSI X3.9-1966 specified that
this was permitted.
(11) Negative values for input/output unit
identifiers are prohibited in this standard.
ANSI X3.9-1966 did not explicitly prohibit them
for variable unit identifiers.
(12) A simple I/O list enclosed in parentheses is
prohibited from appearing in an I/O list.
This requires that parentheses enclosing more
than one I/O list item must mark an implied DO-
loop. The restriction was imposed to eliminate
potential syntactic ambiguities introduced by
complex constants in list-directed output lists.
As all the parentheses referred to are
redundant, a program can be made conforming with
this standard by deleting redundant parentheses
enclosing more than one list item in an I/O
list.
(13) The definition of an entity associated with an
entity in an input list occurs at the same time
as the definition of the list entity. ANSI
X3.9-1966 delayed the definition of such an
associated entity until the end of execution of
the input statement.
(14) Reading into an H edit (field) descriptor in a
FORMAT statement is prohibited in this standard.
FORTRAN 77 Full Language Page A-3
APPENDIX A: CRITERIA, CONFLICTS, AND PORTABILITYANSI X3J3/90.4
(15) The range of a scale factor for E, D, and G
output fields is restricted to reasonable
values. ANSI X3.9-1966 had no such restriction,
but did not provide a clear interpretation of
the meaning of the unreasonable values.
(16) A processor must not produce a numeric output
field containing a negative zero. ANSI X3.9-
1966 required this if the internal value of a
real or double precision datum was negative.
(17) On output, the I edit descriptor must not
produce unnecessary leading zeros.
(18) On output, the F edit descriptor must not
produce unnecessary leading zeros, other than
the optional leading zero for a value less than
one.
(19) Following the E or D in an E or D output field,
a + or - is required immediately prior to the
exponent field. This improves compatibility
with American National Standard for the
Representation of Numeric Values in Character
Strings for Information Interchange, ANSI
X3.42-1975. ANSI X3.9-1966 permitted a blank as
a replacement for + in the exponent sign.
(20) An intrinsic function name that is used as an
actual argument must appear in an INTRINSIC
statement rather than an EXTERNAL statement.
Note that the intrinsic function class includes
the basic external function class of ANSI X3.9-
1966.
(21) The appearance of an intrinsic function name in
a type-statement that conflicts with the type
specified in Table 5 is not sufficient to remove
the name from the intrinsic function class. In
ANSI X3.9-1966, this condition was sufficient to
remove the name from the intrinsic function
class.
(22) More intrinsic function names have been added
and could conflict with the names of
subprograms. These names are ACOS, ANINT, ASIN,
CHAR, COSH, DACOS, DASIN, DCOSH, DDIM, DINT,
DNINT, DPROD, DSINH, DTAN, DTANH, ICHAR, IDNINT,
INDEX, LEN, LGE, LGT, LLE, LLT, LOG, LOG10, MAX,
MIN, NINT, SINH, and TAN.
FORTRAN 77 Full Language Page A-4
APPENDIX A: CRITERIA, CONFLICTS, AND PORTABILITYANSI X3J3/90.4
(23) The units of the arguments and results of the
intrinsic functions (and basic external
functions) were not specified in ANSI X3.9-1966
and are specified in this standard. The range
of the arguments and results has also been
specified. These specifications may be
different from those used on some processors
conforming to ANSI X3.9-1966.
(24) An executable program must not contain more than
one unnamed block data subprogram. ANSI X3.9-
1966 did not have this prohibition and could be
interpreted to permit more than one.
A3. Standard_Items_That_Inhibit_Portability
Although the primary purpose of this standard is to
promote portability of FORTRAN programs, there are some
items in it that tend to inhibit portability.
(1) Procedures written in languages other than
FORTRAN may not be portable.
(2) Because the collating sequence has not been
completely specified, character relational
expressions do not necessarily have the same
value on all processors. However, the intrinsic
functions LGE, LGT, LLE, and LLT can be used to
provide a more portable comparison of character
entities.
(3) Character data, H edit descriptors, apostrophe
edit descriptors, and comment lines may include
characters that are acceptable to one processor
but unacceptable to another processor.
(4) No explicit requirements are specified for file
names. A file name that is acceptable to one
processor may be unacceptable to another
processor.
(5) Input/output unit numbers and unit capabilities
may vary among processors.
FORTRAN 77 Full Language Page A-5
APPENDIX A: CRITERIA, CONFLICTS, AND PORTABILITYANSI X3J3/90.4
A4. Recommendation_for_Enhancing_Portability
To enhance the development of portable FORTRAN
programs, a producer should provide some means of
identifying nonstandard syntax supported by his
processor. Alternatives for doing this include
appropriate documentation, features of the processor,
and other means.
FORTRAN 77 Full Language Page A-6
CONTENTS
APPENDIX A: CRITERIA, CONFLICTS, AND PORTABILITY.. A
-1
A1. Criteria.................................. A-1
A2. Conflicts with ANSI X3.9-1966............. A-1
A3. Standard Items That Inhibit
Portability....................................... A-5
A4. Recommendation for Enhancing
Portability....................................... A-6
- i -
ANSI X3J3/90.4
APPENDIX_B:_SECTION_NOTES
B1. Section_1_Notes
What this standard calls a "processor" is any mechanism
that can carry out the actions of a program. Commonly,
this may be any of these:
(1) The combined actions of a computer (hardware),
its operating system, a compiler, and a loader
(2) An interpreter
(3) The mind of a human, perhaps with the help of
paper and pencil
When you read this standard, it is important to keep
its point of view in mind. The standard is written
from the point of view of a programmer using the
language, and not from the point of view of the
implementation of a processor. This point of view
affects the way you should interpret the standard. For
example, in 3.3 the assertion is made:
"... a statement must contain no more than 1320
characters."
This means that if a programmer writes a longer
statement, his program is not standard conforming.
Therefore, it will get different treatment on different
processors. Some processors will accept the program,
and some will not. Some may even seemingly accept the
program but process it incorrectly. The assertion
means that all standard-conforming processors must
accept statements up to 1320 characters long. That is
the only inference about a standard-conforming
processor that can be made from the assertion.
The assertion does not mean that a standard-conforming
processor is prohibited from accepting longer
statements. Accepting longer statements would be an
extension.
The assertion does not mean that a standard-conforming
processor must diagnose statements longer than 1320
characters, although it may do so.
In general, a standard-conforming processor is one that
accepts all standard-conforming programs and processes
them according to the rules of this standard. Thus,
FORTRAN 77 Full Language Page B-1
APPENDIX B: SECTION NOTES ANSI X3J3/90.4
the specification of a standard-conforming processor
must be inferred from this document.
In some places, explicit prohibitions or restrictions
are stated, such as the above statement-length
restriction. Such assertions restrict what programmers
can write in standard-conforming programs and have no
more weight in the standard than an omitted feature.
For example, there is no mention anywhere in the
standard of double precision integers. Because it is
omitted, programmers must not use this feature in
standard-conforming programs. A standard-conforming
processor may or may not provide it or diagnose its
use. Thus, an explicit prohibition (such as statements
longer than 1320 characters) and an omission (such as
double precision integers) are equivalent in this
standard.
B2. Section_2_Notes
Some of the terminology used in this document is
different from that used to describe other programming
languages. The following indicates terms from other
languages that are approximately equivalent to some
FORTRAN terms.
FORTRAN_______ Other Languages_______________
Variable Simple Variable
Array Element Subscripted Variable
Subscript Expression Subscript
Subscript (none)
Dummy Argument Formal Argument, Formal
Parameter
Actual Argument Actual Parameter
In particular, the FORTRAN terms "subscript" and
"subscript expression" should be studied carefully by
readers who are unfamiliar with this standard (5.4).
The term "symbolic name" is frequently shortened to
"name" throughout the standard.
B3. Section_3_Notes
A partial collating sequence is specified. If
possible, a processor should use the American National
Standard Code for Information Interchange, ANSI X3.4-
1977 (ASCII), sequence for the complete FORTRAN
FORTRAN 77 Full Language Page B-2
APPENDIX B: SECTION NOTES ANSI X3J3/90.4
character set.
When a continuation line follows a comment line, the
continuation line is part of the current statement; it
is not a continuation of the comment line. A comment
line is not part of a statement.
The standard does not restrict the number of
consecutive comment lines. The limit of 19
continuation lines permitted for a statement should not
be construed as being a limitation on the number of
consecutive comment lines.
There are 99999 unique statement labels and a processor
must accept 99999 as a statement label. However, a
processor may have an implementation limit on the total
number of unique statement labels in one program unit
(3.4).
Blanks and leading zeros are not significant in
distinguishing between statement labels. For example,
123, 1 23, and 0123 are all forms of the same statement
label.
B4. Section_4_Notes
A processor must not consider a negative zero to be
different from a positive zero.
ANSI X3.9-1966 used the term "constant" to mean an
unsigned constant. This standard uses the term
"constant" to have its more normal meaning of an
optionally signed constant when describing arithmetic
constants. The term "unsigned constant" is used
wherever a leading sign is not permitted on an
arithmetic constant.
A character constant is a representation of a character
value. The delimiting apostrophes are part of the
representation but not part of the value; double
apostrophes are used to represent a single embedded
apostrophe. For example:
FORTRAN 77 Full Language Page B-3
APPENDIX B: SECTION NOTES ANSI X3J3/90.4
8 ____________________________
Character Character
Constant Value
8 ____________________________
'CAT' CAT
'ISN''T' ISN'T
'''ISN''''T''' 'ISN''T'
8 ____________________________
7 |7|7|7|7|7|7|7|
|7|7|7|7|7|7|7|
|7|7|7|7|7|7|7|
Note that the value of the character constant
'''ISN''''T''' is a representation of another character
constant.
Some programs that used an extension to ANSI X3.9-1966
that permitted a Hollerith constant delimited by
apostrophes instead of the n_H form do not conform to
this standard.
B5. Section_5_Notes
For the array declarator A(2,3), the use of the array
name A in the proper context, such as in an
input/output list, specifies the following order for
the array elements: A(1,1), A(2,1), A(1,2), A(2,2),
A(1,3), A(2,3).
B6. Section_6_Notes
If V is a variable name, the interpretation and value
of V, +V, and (V) are the same. However, the three
forms may not always be used interchangeably. For
example, the forms +V and (V) may not be used as list
items of a READ statement or as actual arguments of a
procedure reference if the procedure defines the
corresponding dummy argument.
B7. Section_7_Notes
Although DIMENSION statements, type-statements, and
statement function statements are classified as
nonexecutable statements, they may contain references
that are executed. Expressions containing variables in
DIMENSION statements and type-statements may be
evaluated whenever a reference to the program unit is
executed. The expression in a statement function
statement is evaluated whenever a function reference to
the statement function is executed.
9
FORTRAN 77 Full Language Page B-4
APPENDIX B: SECTION NOTES ANSI X3J3/90.4
B8. Section_8_Notes
If a processor allows a one-dimensional subscript for a
multidimensional array in an EQUIVALENCE statement, the
interpretation should be as though the subscript
expression were the leftmost one and the missing
subscript expressions each have their respective lower
dimension bound value.
ANSI X3.9-1966 permitted two- and three-dimensional
arrays to have a one-dimensional subscript in an
EQUIVALENCE statement. The following table can be used
to convert a one-dimensional subscript to the
corresponding multidimensional subscript:
8 ___________________________________________________
n_ Dimension Subscript Subscript
Value
8 ___________________________________________________
1 (d918) s (s)
8 ___________________________________________________
2 (d918,d928) s (1+MOD(s-1,d918),
1+(s-1)/d91
7 ___________________________________________________
3 (d918,d928,d938) s (1+MOD(s-1,d918),
1+MOD((s-1)/d918,d928),
1+(s-1)/(d918*d928))
8 ___________________________________________________
7 |7|7|7|7|7|7|7|7|7|7|7|7|7|
|7|7|7|7|7|7|7|7|7|7|7|7|7|
|7|7|7|7|7|7|7|7|7|7|7|7|7|
|7|7|7|7|7|7|7|7|7|7|7|7|7|
|7|7|7|7|7|7|7|7|7|7|7|7|7|
Each expression in the last column of the table is
evaluated according to the rules for integer
expressions.
A processor that allows additional intrinsic functions
should allow their names to appear in an INTRINSIC
statement.
As an extension to ANSI X3.9-1966, many processors
permitted the retention of certain values at the
completion of execution of a subprogram, such as local
variables and arrays, initially defined data that had
been changed, and named common blocks not specified in
the main program, whereas other processors prohibited
the retention of such values. In ANSI X3.9-1966 such
entities were undefined at the completion of execution
of the subprogram, and therefore a standard-conforming
program could not retain these values. The SAVE
statement provides a facility for data retention.
9
FORTRAN 77 Full Language Page B-5
APPENDIX B: SECTION NOTES ANSI X3J3/90.4
B9. Section_9_Notes
An entity is "initially defined" only by a DATA
statement. An assignment statement may define or
redefine an entity but it does not "initially define"
the entity.
Initially defined entities in a subprogram may become
undefined at the execution of a RETURN or END statement
if they are assigned any value, including their initial
value, during the execution of the executable program
(see 8.9 and 15.8.4).
B10. Section_10_Notes
All four types of implied arithmetic conversion are
permitted in an arithmetic assignment statement.
B11. Section_11_Notes
A logical IF statement must not contain another logical
IF statement or a block IF statement; however, it may
contain an arithmetic IF statement. The following is
allowed:
IF (logical expr.) IF (arithmetic expr.) s_918,s_928,s_93
9 A processor is not required to evaluate the iteration
count in a DO-loop if the same effect is achieved
without evaluation. However, the processor must allow
redefinition of variables and array elements that
appear after the equals in a DO statement during the
execution of the DO-loop without affecting the number
of times the DO-loop is executed and without affecting
the value by which the DO-variable is incremented.
If J1 > J2, ANSI X3.9-1966 does not allow execution of
the following DO statement:
DO 100 J=J1,J2
Some processors that allowed such a case executed the
range of the DO-loop once, whereas other processors did
not execute the range of the DO-loop. This standard
allows such a case and requires that the processor
execute the range of the DO-loop zero times. The
following change to the DO statement will require that
the processor execute the range at least once:
FORTRAN 77 Full Language Page B-6
APPENDIX B: SECTION NOTES ANSI X3J3/90.4
DO 100 J=J1,MAX(J1,J2)
References to function procedures and subroutine
procedures may appear within the range of a DO-loop or
within an IF-block, ELSE IF-block, or ELSE-block.
Execution of a function reference or a CALL statement
is not considered a transfer of control in the program
unit that contains the reference, except when control
is returned to a statement identified by an alternate
return specifier in a CALL statement. Execution of a
RETURN or END statement in a referenced procedure, or
execution of a transfer of control within a referenced
procedure, is not considered a transfer of control in
the program unit that contains the reference.
The CONTINUE statement is an executable statement that
has no effect of itself. It can serve as an executable
statement on which to place a statement label when no
effect of execution is desired. For example, it can
serve as the statement referred to by a GO TO statement
or as& the terminal statement of a DO-loop. Although
the CONTINUE statement has no effect of itself, it
causes execution to continue with incrementation
processing when it is the terminal statement of a DO-
loop.
The standard does not define the term "accessible" in
the STOP or PAUSE statement in order to allow a wide
latitude in adapting to a processor environment. Some
processors may use the n_ the PAUSE or STOP statement
for documentation only. Other processors may display
the n_ to the user or to the operator. In order not to
confine its use, the meaning of "accessible" is
purposely left vague.
B12. Section_12_Notes
What is called a "record" in FORTRAN is commonly called
a "logical record." There is no concept in FORTRAN of
a "physical record."
An endfile record does not necessarily have any
physical embodiment. The processor may use a record
count or other means to register the position of the
file at the time an ENDFILE statement is executed, so
that it can take appropriate action when that position
is again reached during a read operation. The endfile
record, however it is implemented, is considered to
exist for the BACKSPACE statement.
FORTRAN 77 Full Language Page B-7
APPENDIX B: SECTION NOTES ANSI X3J3/90.4
An internal file permits data to be transferred with
conversion between internal storage areas using the
READ and WRITE statements. This facility was
implemented as an extension to ANSI X3.9-1966 on many
processors as ENCODE and DECODE statements. Specifying
the READ and WRITE statements to perform this process
avoids such confusion as: "Is ENCODE like READ or is
it like WRITE?"
This standard accommodates, but it does not require,
file cataloging. To do this, several concepts are
introduced.
In ANSI X3.9-1966 many properties were given to a unit
that in this standard are given to the connection of a
file to a unit. Also, additional properties are
introduced.
Before any input/output can be performed on a file, it
must be connected to a unit. The unit then serves as a
designator for that file as long as it is connected.
To be connected does not imply that "buffers" have or
have not been allocated, that "file-control tables"
have or have not been filled out, or that any other
method of implementation has been used. Connection
means that (barring some other fault) a READ or WRITE
statement can be executed on the unit, hence on the
file. Without a connection, a READ or WRITE statement
cannot be executed.
Totally independent of the connection state is the
property of existence, this being a file property. The
processor "knows" of a set of files that exist at a
given time for a given executable program. This set
would include tapes ready to read, files in a catalog,
a keyboard, a printer, etc. The set may exclude files
inaccessible to the executable program because of
security, because they are already in use by another
executable program, etc. This standard does not
specify which files exist, hence wide latitude is
available to a processor to implement security, locks,
privilege techniques, etc. Existence is a convenient
concept to designate all of the files that an
executable program can potentially process.
All four combinations of connection and existence may
occur:
FORTRAN 77 Full Language Page B-8
APPENDIX B: SECTION NOTES ANSI X3J3/90.4
8 ______________________________________________
Connect Exist Examples
8 ______________________________________________
Yes Yes A card reader loaded and
ready to be read
8 ______________________________________________
Yes No A printer before the first
line is written
8 ______________________________________________
No Yes A file named 'JOE' in
the catalog
8 ______________________________________________
No No A reel of tape destroyed
in the fire last week
8 ______________________________________________
7 |8|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|
9 |8|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|
9 |8|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|
9 |8|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|
9 Means are provided to create, delete, connect, and
disconnect files.
A file may have a name. The form of a file name is not
specified. If a system does not have some form of
cataloging or tape labeling for at least some of its
files, all file names will disappear at the termination
of execution. This is a valid implementation. Nowhere
does this standard require names to survive for any
period of time longer than the execution time span of
an executable program. Therefore, this standard does
not impose cataloging as a prerequisite. The naming
feature is intended to allow use of a cataloging system
where one exists.
A file may become connected to a unit in either of two
ways: preconnection or execution of an OPEN statement.
Preconnection is performed prior to the beginning of
execution of an executable program by means external to
FORTRAN. For example, it may be done by job control
action or by processor established defaults. Execution
of an OPEN statement is not required to access
preconnected files.
The OPEN statement provides a means to access existing
files that are not preconnected. An OPEN statement may
be used in either of two ways: with a file name (open
by name) and without a file name (open by unit). A
unit is given in either case. Open by name connects
the specified file to the specified unit. Open by unit
connects a processor-determined default file to the
specified unit. (The default file may or may not have
a name.)
FORTRAN 77 Full Language Page B-9
APPENDIX B: SECTION NOTES ANSI X3J3/90.4
Therefore, there are three ways a file may become
connected and hence processed: preconnection, open by
name, and open by unit. Once a file is connected,
there is no means in standard FORTRAN to determine how
it became connected.
In subset FORTRAN, sequential access may be performed
only on preconnected files, and direct access only on
files that are opened by unit.
An OPEN statement may also be used to create a new
file. In fact, any of the foregoing three connection
methods may be performed on a file that does not exist.
When a unit is preconnected, writing the first record
creates the file. With the other two methods,
execution of the OPEN statement creates the file.
When a unit becomes connected to a file, either by
execution of an OPEN statement or by preconnection, the
following connection properties may be established:
(1) An access method, which is sequential or direct,
is established for the connection.
(2) A form, which is formatted or unformatted, is
established for a connection to a file that
exists or is created by the connection. For a
connection that results from execution of an
OPEN statement, a default form (which depends on
the access method, as described in 12.10.1) is
established if no form is specified. For a
preconnected file that exists, a form is
established by preconnection. For a
preconnected file that does not exist, a form
may be established, or the establishment of a
form may be delayed until the file is created
(for example, by execution of a formatted or
unformatted WRITE statement).
(3) A record length may be established. If the
access method is direct, the connection
establishes a record length, which specifies the
length of each record of the file. A connection
for sequential access does not have this
property.
(4) A blank significance property, which is ZERO or
NULL, is established for a connection for which
the form is formatted. This property has no
effect on output. For a connection that results
from execution of an OPEN statement, the blank
FORTRAN 77 Full Language Page B-10
APPENDIX B: SECTION NOTES ANSI X3J3/90.4
significance property is NULL by default if no
blank significance property is specified. For a
preconnected file, the property is established
by preconnection.
The blank significance property of the
connection is effective at the beginning of each
formatted input statement. During execution of
the statement, any BN or BZ edit descriptors
encountered may temporarily change the effect of
embedded and trailing blanks.
A processor has wide latitude in adapting these
concepts and actions to its own cataloging and job
control conventions. Some processors may require job
control action to specify the set of files that exist
or that will be created by an executable program. Some
processors may require no job control action prior to
execution. This standard enables processors to perform
a dynamic open, close, and file creation, but it does
not require such capabilities of the processor.
The meaning of "open" in contexts other than FORTRAN
may include such things as mounting a tape, console
messages, spooling, label checking, security checking,
etc. These actions may occur upon job control action
external to FORTRAN, upon execution of an OPEN
statement, or upon execution of the first read or write
of the file. The OPEN statement describes properties
of the connection to the file and may or may not cause
physical activities to take place. It is a place for
an implementation to define properties of a file beyond
those required in standard FORTRAN.
Similarly, the actions of dismounting a tape,
protection, etc. of a "close" may be implicit at the
end of a run. The CLOSE statement may or may not cause
such actions to occur. This is another place to extend
file properties beyond those of standard FORTRAN.
Note, however, that the execution of a CLOSE statement
on unit 10 followed by an OPEN statement on the same
unit to the same file or to a different file is a
permissible sequence of events. The processor may not
deny this sequence solely because the implementation
chooses to do the physical act of closing the file at
the termination of execution of the program.
This standard does not address problems of security,
protection, locking, and many other concepts that may
be part of the concept of "right of access." Such
concepts are considered to be in the province of an
FORTRAN 77 Full Language Page B-11
APPENDIX B: SECTION NOTES ANSI X3J3/90.4
operating system. The OPEN and INQUIRE statements can
be extended naturally to consider these things.
Possible access methods for a file are: sequential and
direct. The processor may implement two different
types of files, each with its own access method. It
may also implement one type of file with two different
access methods.
Direct access to files is of a simple and commonly
available type, that is, fixed-length records. The key
is a positive integer.
Keyword forms of specifiers are used because there are
many specifiers and a positional notation is difficult
to remember. The keyword form sets a style for
processor extensions. The UNIT= and FMT= keywords are
offered for completeness, but their use is optional.
Thus, compatibility with ANSI X3.9-1966 is achieved.
Format specifications may be included in READ and WRITE
statements, as in:
READ ( UNIT=10, FMT='(I3,A4,F10.2)' ) K,ALPH,X
ANSI X3.9-1966 allowed a standard-conforming program to
write an endfile record but did not allow the reading
of an endfile record. In this standard, the END=
specifier allows end-of-file detection and continuation
of execution of the program.
List-directed input/output allows data editing
according to the type of the list item instead of by a
format specifier. It also allows data to be free-
field, that is, separated by commas or blanks.
List-directed input/output is record oriented to or
from a formatted sequential file. Each read or write
begins with a new record. The form of list-directed
data on a sequential output file is not necessarily
suitable for list-directed input. However, there are
no mandatory errors specified for reading list-directed
data previously written. The results may not be
guaranteed because of the syntax using apostrophes for
character data or the r_*c_ form of a repeated constant.
All other applications should work, and attempting to
read previously written list-directed output is not
prohibited in a standard-conforming program.
If no list items are specified in a list-directed
input/output statement, one input record is skipped or
FORTRAN 77 Full Language Page B-12
APPENDIX B: SECTION NOTES ANSI X3J3/90.4
one empty output record is written.
An example of a restriction on input/output statements
(12.12) is that an input statement may not specify that
data are to be read from a printer.
B13. Section_13_Notes
The term "edit descriptor" in this standard was "field
descriptor" in ANSI X3.9-1966.
If a character constant is used as a format identifier
in an input/output statement, care must be taken that
the value of the character constant is a valid format
specification. In particular, if the format
specification contains an apostrophe edit descriptor,
two apostrophes must be written to delimit the
apostrophe edit descriptor and four apostrophes must be
written for each apostrophe that occurs within the
apostrophe edit descriptor. For example, the text:
2 ISN'T 3
may be written by various combinations of output
statements and format specifications:
WRITE(6,100) 2,3
100 FORMAT(1X,I1,1X,'ISN''T',1X,I1)
WRITE(6,'(1X,I1,1X,''ISN''''T'',1X,I1)' )
2,3
WRITE(6,200) 2,3
200 FORMAT(1X,I1,1X,5HISN'T,1X,I1)
WRITE(6,'(1X,I1,1X,5HISN''T,1X,I1)' ) 2,3
WRITE(6,'(A)') ' 2 ISN''T 3'
WRITE(6,'(1X,I1,A,I1)') 2, ' ISN''T ', 3
Note that two consecutive apostrophes in an H edit
descriptor within a character constant are counted as
only one Hollerith character.
The T edit descriptor includes the carriage control
character in lines that are to be printed. T1
specifies the carriage control character, and T2
specifies the first character that is printed.
FORTRAN 77 Full Language Page B-13
APPENDIX B: SECTION NOTES ANSI X3J3/90.4
The length of a record is not always specified exactly
and may be processor dependent.
The number of records read by a formatted input
statement can be determined from the following rule: A
record is read at the beginning of the format scan
(even if the input list is empty), at each slash edit
descriptor encountered in the format, and when a format
rescan occurs at the end of the format.
The number of records written by a formatted output
statement can be determined from the following rule: A
record is written when a slash edit descriptor is
encountered in the format, when a format rescan occurs
at the end of the format, and at completion of
execution of the output statement (even if the output
list is empty). Thus, the occurrence of n_ successive
slashes between two other edit descriptors causes n_ - 1
blank lines if the records are printed. The occurrence
of n_ slashes at the beginning or end of a complete
format specification causes n_ blank lines if the
records are printed. However, a complete format
specification containing n_ slashes (n_ > 0) and no other
edit descriptors causes n_ + 1 blank lines if the
records are printed. For example, the statements
PRINT 3
3 FORMAT(/)
will write two records that cause two blank lines if
the records are printed.
The following examples illustrate list-directed input.
A blank character is represented by b_.
Example 1:
Program: J=3
READ *,I
READ *,J
Sequential input file:
record 1: b_1b_,4bbbbb_____
record 2: ,2bbbbbbbb________
Result: I=1,
Explanation: The second READ statement reads the second
record. The initial comma in the record designates a
null value; therefore, J is not redefined.
Example 2:
FORTRAN 77 Full Language Page B-14
APPENDIX B: SECTION NOTES ANSI X3J3/90.4
Program: CHARACTER A*8, B*1
READ *, A, B
Sequential input file:
record 1: 'bbbbbbbb________'
record 2: 'QXY'b_'Z'
Result: A='bbbbbbbb________', B='Q'
Explanation: The end of a record cannot occur between
two apostrophes representing an embedded apostrophe in
a character constant; therefore, A is set to the
character constant ' bbbbbbbb________'. The end of a record
acts as a blank, which in this case is a value
separator because it occurs between two constants.
B14. Section_14_Notes
The name of a main program has no explicit use within
the FORTRAN language. It is available for
documentation and for possible use within a computer
environment.
B15. Section_15_Notes
A FUNCTION statement specifies the name of an external
function, and each ENTRY statement in a function
subprogram specifies an additional external function
name. A SUBROUTINE statement specifies the name of a
subroutine, and each ENTRY statement in a subroutine
subprogram specifies an additional subroutine name.
The intrinsic function names IFIX, IDINT, FLOAT, and
SNGL have been retained to support programs that
conform to ANSI X3.9-1966. However, future use of
these intrinsic function names is not recommended.
For the specific functions that define the maximum and
minimum values with a function type different from the
argument type (AMAX0, MAX1, AMIN0, and MIN1), it is
recommended that an expression containing the generic
name preceded by a type conversion function be used,
for example, REAL(MAX(a_918, a_928,...)) for AMAX0(a_918, a
_928,...), so that these specific function names may be
deleted in a future revision of this standard.
This standard provides that a standard-conforming
processor may supply intrinsic functions in addition to
FORTRAN 77 Full Language Page B-15
APPENDIX B: SECTION NOTES ANSI X3J3/90.4
those defined in Table 5 (15.10). Because of this,
care must be taken when a program is used on more than
one processor because a function name not in Table 5
may be classified as an external function name on one
processor and as an intrinsic function name on another
processor in the absence of a declaration for that name
in an EXTERNAL or INTRINSIC statement.
To guard against this possibility, it is suggested that
any external functions referenced in a program should
appear in an EXTERNAL statement in every program unit
in which a reference to that function appears. If a
program unit references a processor-supplied intrinsic
function that does not appear in Table 5, the name of
the function should appear in an INTRINSIC statement in
the program unit.
The distinction between external functions (user
defined) and intrinsic functions (processor defined)
may be clarified by the following table:
FORTRAN 77 Full Language Page B-16
APPENDIX B: SECTION NOTES ANSI X3J3/90.4
8 _________________________________________
Different Processor Definitions
(Table 5 extended)
8 _________________________________________
Processor 1 Processor 2 Processor 3
8 __________________________________________________________
Different Intrinsic Intrinsic
User Integer Complex (none)
Specifications FROG FROG
8 __________________________________________________________
8 __________________________________________________________
Y=FROG(A) Intrinsic Intrinsic External
Integer Complex Real
FROG FROG FROG
8 __________________________________________________________
INTRINSIC FROG Intrinsic Intrinsic
Y=FROG(A) Integer Complex Undefined
FROG FROG
8 __________________________________________________________
INTEGER FROG Intrinsic External
Y=FROG(A) Integer Undefined Integer
FROG FROG
8 __________________________________________________________
INTRINSIC FROG Intrinsic
INTEGER FROG Integer Undefined Undefined
Y-FROG(A) FROG
8 __________________________________________________________
EXTERNAL FROG External External External
Y=FROG(A) Real Real Real
FROG FROG FROG
8 __________________________________________________________
EXTERNAL FROG External External External
INTEGER FROG Integer Integer Integer
Y=FROG(A) FROG FROG FROG
8 __________________________________________________________
7 |7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|
|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|
|8|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|
9 |8|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|
9 |7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|
If a generic name is the same as the specific name of
an intrinsic function for a specified type of argument,
a reference to the function with an argument of that
type may be considered to be either a specific or
generic function reference.
The use of the concatenation operator with operands of
nonconstant length has been restricted to the
assignment statement so that a processor need not
implement dynamic storage allocation.
9
FORTRAN 77 Full Language Page B-17
APPENDIX B: SECTION NOTES ANSI X3J3/90.4
When a character array is an actual argument, the array
is considered to be one string of characters and there
need not be correspondence between the actual array
elements and the dummy array elements. Only subset
FORTRAN requires such correspondence.
The intrinsic functions ICHAR and CHAR provide a means
of converting between a character and an integer, based
on the position of the character in the processor
collating sequence. The first character in the
collating sequence corresponds to position 0 and the
last to position n_ - 1, where n_ is the number of
characters in the collating sequence.
Many processors provide a collating sequence that is
the same as the ordering of the internal representation
of the character (where the internal representation may
be regarded as either a representation of a character
or of some integer). For example, for a seven-bit
character, the internal representation of the first
character is '0000000' binary (0 decimal) and the last
character is '1111111' binary (127 decimal). For such
a processor, ICHAR returns the value of an internal
character representation, considered as an integer.
CHAR takes an appropriate small integer and returns the
character having the same internal representation.
B16. Section_16_Notes
The name of a block data subprogram has no explicit use
within the FORTRAN language. It is available for
documentation and for possible use within a computer
environment.
B17. Section_17_Notes
The size of an array is the number of elements (5.2.3),
but the storage sequence of the array also has a size,
which may be different from the number of elements
(17.1.1).
The definition of character entities occurs on a
character-by-character basis. The use of substrings or
partially associated entities permits individual
characters or groups of characters within an entity to
become defined or undefined.
FORTRAN 77 Full Language Page B-18
APPENDIX B: SECTION NOTES ANSI X3J3/90.4
B18. Section_18_Notes
There is no explicit means for declaring an entity to
be a variable. An entity becomes a variable if it is
used in a manner that does not cause it to be
exclusively something else. Note that the name of a
variable may also be the name of a common block, except
when the name of the variable is also the name of a
function.
FORTRAN 77 Full Language Page B-19
CONTENTS
APPENDIX B: SECTION NOTES........................ B-1
B1. Section 1 Notes.......................... B-1
B2. Section 2 Notes.......................... B-2
B3. Section 3 Notes.......................... B-2
B4. Section 4 Notes.......................... B-3
B5. Section 5 Notes.......................... B-4
B6. Section 6 Notes.......................... B-4
B7. Section 7 Notes.......................... B-4
B8. Section 8 Notes.......................... B-5
B9. Section 9 Notes.......................... B-6
B10. Section 10 Notes........................ B-6
B11. Section 11 Notes........................ B-6
B12. Section 12 Notes........................ B-7
B13. Section 13 Notes........................ B-13
B14. Section 14 Notes........................ B-15
B15. Section 15 Notes........................ B-15
B16. Section 16 Notes........................ B-18
B17. Section 17 Notes........................ B-18
B18. Section 18 Notes........................ B-19
- i -
ANSI X3J3/90.4
APPENDIX_C:_HOLLERITH
The character data type was added to provide a
character data processing capability that is superior
to the Hollerith data capability that existed in ANSI
X3.9-1966.
The Hollerith data type has been deleted. For
processors that extend the standard by allowing
Hollerith data, the following rules for programs are
recommended:
C1. Hollerith_Data_Type
Hollerith is a data type; however, a symbolic name must
not be of type Hollerith. Hollerith data, other than
constants, are identified under the guise of a name of
type integer, real, or logical. They must not be
identified under the guise of type character. No
recommendation is made regarding Hollerith under the
guise of double precision or complex.
A Hollerith datum is a string of characters. The
string may consist of any characters capable of
representation in the processor. The blank character
is significant in a Hollerith datum. Hollerith data
may have an internal representation that is different
from that of other data types.
An entity of type integer, real, or logical may be
defined with a Hollerith value by means of a DATA
statement (C4) or READ statement (C6). When an entity
is defined with a Hollerith value, its totally
associated entities are also defined with that
Hollerith value. When an entity of type integer, real,
or logical is defined with a Hollerith value, the
entity and its associates become undefined for use as
an integer, real, or logical datum.
C2. Hollerith_Constant
The form of a Hollerith constant is a nonzero,
unsigned, integer constant n_ followed by the letter H,
followed by a string of exactly n _ contiguous
characters. The string may consist of any characters
capable of representation in the processor. The string
of n_ characters is the Hollerith datum.
FORTRAN 77 Full Language Page C-1
APPENDIX C: HOLLERITH ANSI X3J3/90.4
In a Hollerith constant, blanks are significant only in
the n_ characters following the letter H.
C3. Restrictions_on_Hollerith_Constants
A Hollerith constant may appear only in a DATA
statement and in the argument list of a CALL statement.
C4. Hollerith_Constantin
An integer, real, or logical entity may be initially
defined with a Hollerith datum by a DATA statement.
A Hollerith constant may appear in the list clist_____, and
the corresponding entity in the list nlist_____ may be of
type integer, real, or logical.
For an entity of type integer, real, or logical, the
number of characters n_ in the corresponding Hollerith
constant must be less than or equal to g_, where g_ is
the maximum number of characters that can be stored in
a single numeric storage unit at one time. If n_ is
less than g_, the entity is initially defined with the n_
Hollerith characters extended on the right with g_ - n_
blank characters.
Note that each Hollerith constant initially defines
exactly one variable or array element. Also note that g
_ is processor dependent.
C5. Hollerith_Format_Specification
A format specification may be an array name of type
integer, real, or logical.
The leftmost characters of the specified entity must
contain Hollerith data that constitute a format
specification when the statement is executed.
The format specification must be of the form described
in 13.2. It must begin with a left parenthesis and
must end with a right parenthesis. Data may follow the
right parenthesis that ends the format specification
and have no effect. Blank characters may precede the
format specification.
A Hollerith format specification must not contain an
apostrophe edit descriptor or an H edit descriptor.
FORTRAN 77 Full Language Page C-2
APPENDIX C: HOLLERITH ANSI X3J3/90.4
C6. A_Editing_of_Hollerith_Data
The Aw_ edit descriptor may be used with Hollerith data
when the input/output list item is of type integer,
real, or logical. On input, the input list item will
become defined with Hollerith data. On output, the
list item must be defined with Hollerith data.
Editing is as described for Aw_ editing of character
data except that len_ _ _ is the maximum number of
characters that can be stored in a single numeric
storage unit.
C7. Hollerith_Constant_in_a_Subroutine_Reference
An actual argument in a subroutine reference may be a
Hollerith constant. The corresponding dummy argument
must be of type integer, real, or logical. Note that
this is an exception to the rule that requires that the
type of the actual and dummy argument must agree.
FORTRAN 77 Full Language Page C-3
CONTENTS
APPENDIX C: HOLLERITH............................. C-1
C1. Hollerith Data Type....................... C-1
C2. Hollerith Constant........................ C-1
C3. Restrictions on Hollerith Constants....... C-2
C4. Hollerith Constant........................ C-2
C5. Hollerith Format Specification............ C-2
C6. A Editing of Hollerith Data............... C-3
C7. Hollerith Constant in a Subroutine
Reference......................................... C-3
- i -
ANSI X3J3/90.4
APPENDIX_D:_SUBSET_OVERVIEW
This Appendix provides an overview of the two levels of
FORTRAN specified in this standard, including the
general criteria used for including or excluding a
feature at a given level, and a section-by-section
summary of the principal differences between the full
language and the subset.
D1. Background
The full FORTRAN language described in this document is
a superset of the FORTRAN language described in ANSI
X3.9-1966, with the exceptions previously noted. In
formulating a subset philosophy, the following existing
FORTRAN standards were considered:
(1) American National Standard FORTRAN, ANSI X3.9-
1966
(2) American National Standard Basic FORTRAN, ANSI
X3.10-1966
(3) International Standard Programming Language
FORTRAN, ISO R1539
The ISO R1539 document describes three levels: basic,
intermediate, and full. The ISO R1539 basic level
corresponds closely with ANSI X3.10-1966; the ISO R1539
full level corresponds closely with ANSI X3.9-1966; and
the ISO R1539 intermediate level is in between.
It was thought that the ISO R1539 basic level and the
ANSI X3.10-1966 had not been sufficiently used, even on
small computer systems, to warrant a subset
corresponding to that level.
The ISO R1539 intermediate level has been sufficiently
used to warrant a subset of similar capability.
However, it was also thought that some of the
capabilities in the full language described here, but
not part of any current standard or recommendation, are
so important for the general use of the language that
they should be present in the subset, at least to some
degree.
Furthermore, it was thought that the specification of
ANSI X3.10-1966 in such a manner that it is not a
subset of ANSI X3.9-1966 was inconsistent with the
FORTRAN 77 Full Language Page D-1
APPENDIX D: SUBSET OVERVIEW ANSI X3J3/90.4
primary goal of promoting program interchange.
Consequently, careful attention has been given to
ensuring that a program that conforms to the subset of
this standard will also conform to the full language.
D2. Criteria
The criteria in D2.1 and D2.2 were adopted for the two
levels of FORTRAN within this standard.
D2.1 Full_Language.
The most notable new elements of the full language that
have been included at both levels are: character data
type, mixed-type arithmetic, INTRINSIC statement, SAVE
statement, and direct access I/O statements.
D2.2 Subset_Language.
(1) The subset must be a proper subset of the full
language.
(2) The subset must be based on ISO R1539
intermediate level FORTRAN.
(3) The subset must include, at a fundamental level,
those features of the full language that
significantly increase the scope of the
language.
(4) The elements of the subset must make a minimum
demand on storage requirements, particularly
during execution.
(5) The subset must require a minimum of effort for
the development and maintenance of a viable
FORTRAN processor.
D3. Summary_of_Subset_Differences
This section summarizes the differences between the
full language and the subset in this standard. It is
organized primarily on the basis of the standard
itself. The differences are discussed under the
section where each language element is primarily
presented. Of course, a difference in one section may
cause changes in other sections. Such changes are not
noted here.
FORTRAN 77 Full Language Page D-2
APPENDIX D: SUBSET OVERVIEW ANSI X3J3/90.4
An exception to the above practice is the subsetting of
the character data type. The description of character
data type and its usage is so distributed throughout
the standard that a more meaningful summary is produced
by collecting the relevant items into a single
presentation.
D3.1 Section_1:_Introduction.
The subset is the same as the full language (see also
D4).
D3.2 Section_2:_FORTRAN_Terms_and_Concepts.
The subset is the same as the full language.
D3.3 Section 3: Characters, Lines, and Execution
Sequence.
The subset is the same as the full language except
that:
(1) The character set does not include the currency
symbol ($) or the colon (:).
(2) Statements may have up to nine continuation
lines.
(3) DATA statements must follow all specification
statements and precede all statement function
statements and executable statements.
(4) A comment line must not precede a continuation
line.
D3.4 Section_4:_Data_Types_and_Constants.
The subset is the same as the full language except that
double precision and complex data types are not
included. Note that each entity of type character must
have a constant length.
D3.5 Section_5:_Arrays_and_Substrings.
The subset is the same as the full language except
that:
(1) An array declarator must not have an explicit
lower bound.
FORTRAN 77 Full Language Page D-3
APPENDIX D: SUBSET OVERVIEW ANSI X3J3/90.4
(2) A dimension declarator must be either an integer
constant or an integer variable. (This excludes
integer expressions, but allows a variable in
common.)
(3) An array may have up to three dimensions.
(4) A subscript expression may be an expression
containing only integer variables and constants.
(This excludes function and array element
references.)
D3.6 Section_6:_Expressions.
The subset is the same as the full language except that
a constant expression is allowed only where a general
expression is allowed, the logical operators .EQV. and
.NEQV. are not included, and there are restrictions on
character expressions as described in D3.19.
D3.7 Section 7: Executable and Nonexecutable Statement
Classification.
The classification of a statement in the subset is the
same as in the full language. However, the subset does
not include PRINT, CLOSE, INQUIRE, ENTRY, BLOCK DATA,
PARAMETER, DOUBLE PRECISION, and COMPLEX statements.
D3.8 Section_8:_Specification_Statements.
The subset is the same as the full language except
that:
(1) The PARAMETER statement is not included.
(2) Only the names of common blocks (enclosed in
slashes) may appear in the list of a SAVE
statement. The form of the SAVE statement
without a list is not included.
D3.9 Section_9:_DATA_Statement.
The subset is the same as the full language except
that:
(1) Only names of variables, arrays, and array
elements are allowed in the list nlist_ _ ___.
Implied-DO lists are not included.
(2) Values in the list clist_____ must agree in type with
the corresponding item in the list nlist_____. Type
FORTRAN 77 Full Language Page D-4
APPENDIX D: SUBSET OVERVIEW ANSI X3J3/90.4
conversion is not included.
Note that DATA statements must follow all specification
statements and precede all statement function
statements and executable statements.
D3.10 Section_10:_Assignment_Statements.
The subset is the same as the full language except for
restrictions on character type presented in D3.19.
D3.11 Section_11:_Control_Statements.
The subset is the same as the full language except
that:
(1) A DO-variable must be an integer variable and DO
parameters must be integer constants or integer
variables.
(2) In a computed GOTO statement, the index
expression must be an integer variable.
D3.12 Section_12:_Input/Output_Statements.
The subset is the same as the full language except
that:
(1) The CLOSE statement is not included.
(2) The INQUIRE statement is not included.
(3) List-directed READ and WRITE statements are not
included.
(4) An internal file identifier must be a character
variable or character array element.
(5) Formatted direct access files and statements are
not included.
(6) External unit identifiers must be an integer
constant or integer variable.
(7) A format identifier must be the label of a
FORMAT statement, an integer variable that has
been assigned the label of a FORMAT statement,
or a character constant.
(8) The UNIT= and FMT= forms of unit and format
specifiers are not included.
FORTRAN 77 Full Language Page D-5
APPENDIX D: SUBSET OVERVIEW ANSI X3J3/90.4
(9) The ERR= specifier is not included.
(10) The forms READ f [,iolist______] and PRINT f [,iolist______]
are not included.
(11) In input/output lists, the implied-DO parameters
must be integer constants and variables.
Implied-DO-variables must be of type integer.
(12) Variable names, array element names, and array
names may appear as input/output list items;
constants, character substring references, and
general expressions are not included.
(13) A limited form of OPEN statement is included
with the following olist_____ specifiers required,
and no others are allowed:
(a) An integer constant unit identifier
(b) The keyword specifier ACCESS= 'DIRECT'
(c) The record length specifier RECL= rl__, where rl_
_ is an integer constant
The OPEN statement is included in the subset
only to the extent needed to connect a unit to a
direct access unformatted file. Once a unit has
been connected to a direct access file, it may
not be reconnected to any other file.
(14) Named files are not included.
D3.13 Section_13:_Format_Specification.
The subset is the same as the full language except
that:
(1) The following edit descriptors are not included:
Iw_.m_ Tc_ S
Dw_.d_ TLc_ SP
Gw_.d_ TRc_ SS
Gw_.d_Ee_
(2) At most three levels of parentheses are
permitted.
(3) The format scan terminator (colon) is not
included.
FORTRAN 77 Full Language Page D-6
APPENDIX D: SUBSET OVERVIEW ANSI X3J3/90.4
D3.14 Section_14:_Main_Program.
The subset is the same as the full language.
D3.15 Section_15:_Functions_and_Subroutines.
The subset is the same as the full language except that
the following are not included:
(1) The ENTRY statement
(2) Alternate return specifier
(3) Generic function references
(4) Intrinsic functions involving arguments or
results of type double precision or complex
Other exclusions are presented in D3.19, most notably
an asterisk character length specifier, character
functions, the intrinsic functions LEN, CHAR, and
INDEX, and partial association.
D3.16 Section_16:_Block_Data_Subprogram.
Block data subprograms are not included in the subset.
D3.17 Section_17:_Association_and_Definition.
The subset is the same as the full language except that
the concept of partial association does not apply to
the subset.
D3.18 Section_18:_Scope_and_Classes_of_Symbolic_Names.
The subset is the same as the full language.
D3.19 Section_1_to_18:_Character_Type.
The primary intent of the the subset character facility
is to provide a minimal character capability that is
functionally comparable to what is possible with most
extensions of Hollerith data.
D3.19.1 Character_Features_in_the_Subset. The subset
includes the following character data type features:
(1) Character constants, variables, and arrays, but
not character functions
FORTRAN 77 Full Language Page D-7
APPENDIX D: SUBSET OVERVIEW ANSI X3J3/90.4
(2) CHARACTER and IMPLICIT statements for declaring
character entities and their lengths; a length
specification must be an integer constant (not
an asterisk)
(3) Character assignment statements in which the
right-hand side is a variable, array element, or
constant
(4) Character relational expressions in which the
operands are variables, array elements, or
constants
(5) Initialization of character variables, arrays,
and array elements in a DATA statement
(6) Character variables, arrays, and array elements
in output lists
(7) Character variables, arrays, array elements, and
constants as arguments in subprogram references
(8) Character constants (but not variables or array
elements) as a format specification
(9) Total, but not partial, association of character
entities (that is, association of character
entities only of the same length by means of
COMMON and EQUIVALENCE statements or by argument
association)
(10) Input/output of character data, both formatted
(using character edit descriptors) and
unformatted
D3.19.2 Character_Features_Not_in_the_Subset. The
subset does not include the following character data
type features:
(1) Substring reference and definition
(2) Concatenation operator
(3) Use of character variables or array elements as
format specifications
(4) Partial association of character entities
(5) Character functions
FORTRAN 77 Full Language Page D-8
APPENDIX D: SUBSET OVERVIEW ANSI X3J3/90.4
(6) The intrinsic functions LEN, CHAR, and INDEX
(7) Character length specification consisting of an
asterisk or any expression other than a constant
D4. Subset_Conformance.
Conformance at the subset level of this standard
involves requirements that relate to the full language
for both processors and programs.
D4.1 Subset_Processor_Conformance.
A standard-conforming subset processor may include an
extension to the subset language that has an
interpretation in the full language only if the
processor provides the interpretation described for the
full language. That is, a standard-conforming subset
processor may not provide an extension that conflicts
with the full language. Extensions that do not have
forms and interpretations in the full language are not
precluded by this requirement.
As an example, a standard-conforming subset processor
may provide a double precision data type provided that
the requirements for double precision are fulfilled.
D4.2 Subset_Program_Performance.
A program that conforms to the subset level of this
standard must have the same interpretation at both the
subset level and the full language level. The
principal implication of this requirement concerns the
use of function names that are identified as specific
or generic intrinsic function names at the full
language level but which are not available at the
subset level. Examples of such names are DSIN, MIN,
and CABS.
A subset-conforming program may not use such names as
intrinsic functions because these names are not defined
as intrinsic functions in the subset language.
Moreover, a subset-conforming program may not use such
names as external function names unless such names are
identified as external function names by appearing in
an EXTERNAL statement. If such names are not
explicitly declared as external, the names would be
classified as external by a subset processor and as
intrinsic by a full language processor. Note that the
burden of avoiding this situation rests on the program.
FORTRAN 77 Full Language Page D-9
APPENDIX D: SUBSET OVERVIEW ANSI X3J3/90.4
A subset-conforming processor is not required to
recognize that a full language intrinsic name is being
used without being declared as external. In effect,
the full set of names described in Table 5 may be
considered as reserved intrinsic function names in the
subset even though only a subset of those names is
available for use.
FORTRAN 77 Full Language Page D-10
CONTENTS
APPENDIX D: SUBSET OVERVIEW....................... D-1
D1. Background................................ D-1
D2. Criteria.................................. D-2
D2.1 Full Language............................. D-2
D2.2 Subset Language........................... D-2
D3. Summary of Subset Differences............. D-2
D3.1 Section 1: Introduction................... D-3
D3.2 Section 2: FORTRAN Terms and Concepts..... D
-3
D3.3 Section 3: Characters, Lines, and
Execution Sequence................................ D-3
D3.4 Section 4: Data Types and Constants....... D-3
D3.5 Section 5: Arrays and Substrings.......... D-3
D3.6 Section 6: Expressions.................... D-4
D3.7 Section 7: Executable and Nonexecutable
Statement Classification.......................... D-4
D3.8 Section 8: Specification Statements....... D-4
D3.9 Section 9: DATA Statement................. D-4
D3.10 Section 10: Assignment Statements........ D-5
D3.11 Section 11: Control Statements........... D-5
D3.12 Section 12: Input/Output Statements...... D-
5
D3.13 Section 13: Format Specification......... D-6
D3.14 Section 14: Main Program................. D-7
D3.15 Section 15: Functions and
Subroutines....................................... D-7
D3.16 Section 16: Block Data Subprogram........ D-7
D3.17 Section 17: Association and
Definition........................................ D-7
D3.18 Section 18: Scope and Classes of
Symbolic Names.................................... D-7
D3.19 Section 1 to 18: Character Type.......... D-7
D4. Subset Conformance........................ D-9
D4.1 Subset Processor Conformance.............. D-9
D4.2 Subset Program Performance................ D-9
- i -
ANSI X3J3/90.4
APPENDIX_E:_FORTRAN_STATEMENTS
Form____ Descriptive Heading___________________
ASSIGN s TO i Statement Label
Assignment Statement
BACKSPACE u File Positioning
BACKSPACE (alist) Statements
BLOCK DATA [sub] BLOCK DATA Statement
CALL sub [([a [,a]...])] Subroutine Reference:
CALL Statement
CHARACTER [*len[,]] nam [,nam]... Character Type-
Statement
CLOSE (cllist) CLOSE Statement
COMMON [/[cb]/]nlist[[,]/[cb]/nlist]... COMMON Statement
COMPLEX v [,v]... Complex Type-
Statement
CONTINUE CONTINUE Statement
DATA nlist/clist/ [[,]nlist/clist/]... DATA Statement
DIMENSION a(d) [,a(d)]... DIMENSION Statement
DO s [,] i=e918,e928[,e938] DO Statement
DOUBLE PRECISION v [,v]... Double Precision
Type-Statement
ELSE ELSE Statement
ELSE IF (e) THEN ELSE IF Statement
END END Statement
END IF END IF Statement
ENDFILE u File Positioning
ENDFILE (alist) Statements
FORTRAN 77 Full Language Page E-1
APPENDIX E: FORTRAN STATEMENTS ANSI X3J3/90.4
ENTRY en [([d [,d]...])] ENTRY Statement
EQUIVALENCE (nlist) [,(nlist)]... EQUIVALENCE Statement
EXTERNAL proc [,proc]... EXTERNAL Statement
FORTRAN 77 Full Language Page E-2
APPENDIX E: FORTRAN STATEMENTS ANSI X3J3/90.4
Form____ Descriptive Heading___________________
FORMAT fs FORMAT Statement
fun ([d [,d]...]) = e Statement Function
Statement
[typ] FUNCTION fun ([d [,d]...]) FUNCTION Statement
GO TO i [[,](s [,s]...)] Assigned GO TO
Statement
GO TO s Unconditional GO TO
Statement
GO TO (s [,s]...)[,] i Computed GO TO
Statement
IF (e) st Logical IF Statement
IF (e) s918, s928, s938 Arithmetic IF
Statement
IF (e) THEN Block IF Statement
IMPLICIT typ (a [,s]...) IMPLICIT Statement
[,typ (a [,a]...)]...
INQUIRE (iflist) INQUIRE by File
Statement
INQUIRE (iulist) INQUIRE by Unit
Statement
INTEGER v [,v]... Integer Type-
Statement
INTRINSIC fun [,fun]... INTRINSIC Statement
LOGICAL v [,v]... Logical Type-
Statement
OPEN (olist) OPEN Statement
PARAMETER (p=e [,p=e]...) PARAMETER Statement
PAUSE [n] PAUSE Statement
PRINT f [,iolist] Data Transfer Output
FORTRAN 77 Full Language Page E-3
APPENDIX E: FORTRAN STATEMENTS ANSI X3J3/90.4
Statement
PROGRAM pgm PROGRAM Statement
FORTRAN 77 Full Language Page E-4
APPENDIX E: FORTRAN STATEMENTS ANSI X3J3/90.4
Form____ Descriptive Heading___________________
READ (cilist) [iolist] Data Transfer Input
Statement
READ f [,iolist] Data Transfer Input
Statement
REAL v [,v]... Real Type-Statement
RETURN [e] RETURN Statement
REWIND u File Positioning
REWIND (alist) Statements
SAVE [a [,a]...] SAVE Statement
STOP [n] STOP Statement
SUBROUTINE sub [([d [,d]...])] Subroutine Subprogram
and SUBROUTINE
Statement
v = e Arithmetic Assignment
Statement
v = e Logical Assignment
Statement
v = e Character Assignment
Statement
WRITE (cilist) [iolist] Data Transfer Output
Statement
FORTRAN 77 Full Language Page E-5
CONTENTS
APPENDIX E: FORTRAN STATEMENTS.................... E-1
- i -
ANSI X3J3/90.4
APPENDIX_F:_SYNTAX_CHARTS
Appendix F is temporarily unavailable.
FORTRAN 77 Full Language Page F-1
CONTENTS
APPENDIX F: SYNTAX CHARTS......................... F-1
- i -