Fortran Guide
Fortran Guide
Fortran 77 4.2
SunSoft, Inc.
A Sun Microsystems, Inc. Business
2550 Garcia Avenue
Mountain View, CA 94043 USA
415 960-1300 fax 415 969-9131
Please
Recycle
Contents
Preface. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xvii
1. Elements of FORTRAN . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1
Standards . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1
Extensions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1
Basic Terms . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2
Character Set. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2
Symbolic Names. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4
Program. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
Statements. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
Executable or Nonexecutable Statements . . . . . . . . . . . . . . . 6
FORTRAN Statements. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
Source Line Formats . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
Standard Fixed Format . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
Tab-Format . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
Mixing Formats . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
iii
Continuation Lines . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
Extended Lines. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
Padding . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
Comments and Blank Lines . . . . . . . . . . . . . . . . . . . . . . . . . . 9
Directives . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
2. Data Types and Data Items . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
Types . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
Rules for Data Typing . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
Array Elements . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
Functions. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
Properties of Data Types . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
Constants . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24
Character Constants . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24
Complex Constants . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27
COMPLEX*16 Constants . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28
COMPLEX*32 (Quad Complex) Constants. . . . . . . . . . . . . . 28
Integer Constants . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29
Logical Constants. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30
Real Constants . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31
REAL*8 (Double-Precision Real) Constants . . . . . . . . . . . . . 32
REAL*16 (Quad Real) Constants . . . . . . . . . . . . . . . . . . . . . . 33
Typeless Constants (Binary, Octal, Hexadecimal) . . . . . . . . 34
Variables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38
Arrays . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39
Contents v
Arithmetic Assignment . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 69
Character Expressions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 71
Character String Assignment . . . . . . . . . . . . . . . . . . . . . . . . . 72
Rules of Assignment . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 74
Logical Expressions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 74
Relational Operator . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 76
Constant Expressions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 77
Record Assignment . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 78
Evaluation of Expressions. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 79
4. Statements . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 81
ACCEPT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 82
ASSIGN . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 82
Assignment . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 84
AUTOMATIC . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 90
BACKSPACE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 92
BLOCK DATA. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 94
BYTE. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 96
CALL. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 97
CHARACTER . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 101
CLOSE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 104
COMMON . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 106
COMPLEX . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 108
CONTINUE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 111
DATA. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 112
Contents vii
GO TO (Unconditional) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 161
IF (Arithmetic). . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 162
IF (Block) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 163
IF (Logical) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 166
IMPLICIT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 167
INCLUDE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 170
INQUIRE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 173
INTEGER . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 179
INTRINSIC . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 181
LOGICAL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 183
MAP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 185
NAMELIST . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 186
OPEN. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 188
OPTIONS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 195
PARAMETER . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 197
PAUSE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 200
POINTER . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 202
PRINT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 210
PROGRAM . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 213
READ. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 214
REAL. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 220
RECORD . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 222
RETURN . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 224
REWIND . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 226
Contents ix
Direct Access. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 263
Unformatted I/O . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 263
Formatted I/O . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 264
Internal Files . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 264
Sequential Formatted I/O. . . . . . . . . . . . . . . . . . . . . . . . . . . . 264
Direct Access I/O. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 265
Formatted I/O . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 265
Input Actions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 265
Output Actions. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 266
Format Specifiers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 267
Runtime Formats . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 300
Variable Format Expressions (<e>) . . . . . . . . . . . . . . . . . . . . 302
Unformatted I/O . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 303
Sequential Access I/O . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 304
Direct Access I/O. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 304
List-Directed I/O . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 306
Output Format . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 307
Unquoted Strings . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 310
Internal I/O . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 310
NAMELIST I/O . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 310
Syntax Rules . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 311
Restrictions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 311
Output Actions. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 312
Input Actions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 313
Contents xi
B. Sample Statements . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 349
C. Data Representations . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 359
Real, Double, and Quadruple Precision . . . . . . . . . . . . . . . . . . . 359
Extreme Exponents . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 360
Zero (signed) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 360
Subnormal Number . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 360
Signed Infinity . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 360
Not a Number (NaN) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 360
IEEE Representation of Selected Numbers . . . . . . . . . . . . . . . . . 361
Arithmetic Operations on Extreme Values . . . . . . . . . . . . . . . . . 361
Bits and Bytes by Architecture . . . . . . . . . . . . . . . . . . . . . . . . . . . 364
D. VMS Language Extensions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 365
Background. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 365
VMS Language Features You Get Automatically. . . . . . . . . . . . 365
VMS Features Requiring -xl or -vax=spec . . . . . . . . . . . . . . . 370
Summary of Features That Require -xl[d] . . . . . . . . . . . . 370
Details of Features That Require -xl[d]. . . . . . . . . . . . . . . 370
Unsupported VMS FORTRAN . . . . . . . . . . . . . . . . . . . . . . . . . . . 373
Index . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 377
xiii
Table 4-2 INQUIRE Options Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . 177
Table 6-14 VMS Functions That Are Translated into f77 Generic Names 344
Table C-8 Bits and Bytes for Intel and VAX Computers . . . . . . . . . . . . . . 364
Table C-9 Bits and Bytes for 680x0 and SPARC Computers . . . . . . . . . . . 364
Tables xv
xvi Fortran 77 Language Reference
Preface
Audience
This is a reference manual intended for programmers with a working
knowledge of the Fortran language and some understanding of the Solaris
system and UNIX commands.
Organization
This book is organized into the following chapters and appendixes:
• Chapter 1, "Elements of FORTRAN"
• Chapter 2, "Data Types and Data Items"
• Chapter 3, "Expressions"
• Chapter 4, "Statements"
• Chapter 5, "Input and Output"
• Chapter 6, "Intrinsic Functions"
• Appendix A, "ASCII Character Set"
• Appendix B, "Sample Statements"
• Appendix C, "Data Representations"
• Appendix D, "VMS Language Extensions"
xvii
Related Sun Documentation
The following Sun manuals and guides will provided additional useful
information:
• Fortran Library Reference. Details of the Fortran Library.
• Fortran 90 Handbook. Complete language reference to Fortran 90. (Only
available online with Answerbook.)
• Fortran User’s Guide. Complete information on command line options and
how to use the compiler.
• Fortran Programmer’s Guide. Issues relating to input/output, libraries,
program analysis, debugging, performance, and so on.
• Workshop: Command-Line Utilities. Information on using the dbx debugger.
• Workshop: Beyond the Basics. Using the interactive debugger.
• Numerical Computation Guide. Details floating-point computation numerical
accuracy issues.
• Linker and Libraries Guide. Complete information on linking and libraries.
• Incremental Link Editor. Using the incremental linker.
• Performance Profiling Tools. A guide to the use of performance profiling tools.
Conventions in Text
This manual uses the following conventions:
• Code listing examples appear in boxes:
• Italics indicate general arguments or parameters that you replace with the
appropriate input. Italics also indicate emphasis.
∆∆36.001
xix
xx Fortran 77 Language Reference
Elements of FORTRAN 1
Standards
The Sun FORTRAN 77 compiler f77 is an enhanced FORTRAN development
system. It conforms to the ANSI X3.9-1978 FORTRAN standard and the
corresponding International Standards Organization number is ISO 1539-1980.
NIST (formerly GSA and NBS) validates it at appropriate intervals.
This compiler also conforms to the standards FIPS 69-1, BS 6832, and MIL-STD-
1753. It provides an IEEE standard 754-1985 floating-point package.
Extensions
Extensions to the standard FORTRAN 77 language include recursion, pointers,
double-precision complex, quadruple-precision real, quadruple-precision
complex, and many VAX® and VMS® FORTRAN 5.0 extensions, including
NAMELIST, DO WHILE, structures, records, unions, maps, and variable formats.
Multiprocessor FORTRAN includes automatic and explicit loop parallelization.
1
1
Basic Terms
Some of the FORTRAN basic terms and concepts are:
• A program consists of one or more program units.
• A program unit is a sequence of statements, terminated by an END.
• A statement consists of zero or more key words, symbolic names, literal
constants, statement labels, operators, and special characters.
• Each key word, symbolic name, literal constant, and operator consists of one or
more characters from the FORTRAN character set.
• A character constant can include any valid ASCII character.
• A statement label consists of 1 to 5 digits, with at least one nonzero.
Character Set
The character set consists of the following:
• Uppercase and lowercase letters, A – Z and a – z
• Numerals 0 – 9
• Special characters—The following table shows the special characters that are
used for punctuation:
For the backslash (\) character, you may need to use an escape sequence or
use the –xl compiler option. The backslash (\) is also called a reverse
solidus, and the slash (/), a solidus. For the newline (\n) character, you
must use an escape sequence. See also Table 2-3.
Elements of FORTRAN 3
1
Symbolic Names
The items in the following table can have symbolic names:
ATAD = 1.0E-6
Atad = 1.0e-6
IF ( X .LT. ATAD ) GO TO 9
IF ( X .LT. A TAD ) GO TO 9
IF(X.LT.ATAD)GOTO9
• In general, for any single program unit, different entities cannot have the
same symbolic name. The exceptions are:
• A variable or array can have the same name as a common block.
• A field of a record can have the same name as a structure. ♦
• A field of a record can have the same name as a field at a different level of
the structure. ♦
• Throughout any program of more than one programming unit, no two of
the following can have the same name:
• Block data subprograms
• Common blocks
• Entry points
• Function subprograms
• Main program
• Subroutines
Program
A program unit is a sequence of statements, terminated by an END statement.
Every program unit is either a main program or a subprogram. If a program is
to be executable, it must have a main program.
There are three types of subprograms: subroutines, functions, and block data
subprograms. The subroutines and functions are called procedures, which are
invoked from other procedures or from the main program. The block data
subprograms are handled by the loader.
Elements of FORTRAN 5
1
Statements
A statement consists of one or more key words, symbolic names, literal
constants, and operators, with appropriate punctuation. In FORTRAN, no
keywords are reserved in all contexts. Most statements begin with a keyword;
the exceptions are the statement function and assignment statements.
FORTRAN Statements
Table 1-4 FORTRAN Statements
Elements of FORTRAN 7
1
• Short lines are padded to 72 characters.
• Long lines are truncated. See “Extended Lines,” below.
Tab-Format
The tab-format source lines are defined as follows: ♦
• A tab in any of columns 1 through 6, or an ampersand in column 1,
establishes the line as a tab-format source line.
• If the tab is the first nonblank character, the text following the tab is scanned
as if it started in column 7.
• A comment indicator or a statement number can precede the tab.
• Continuation lines are identified by an ampersand (&) in column 1, or a
nonzero digit after the first tab.
Mixing Formats
You can format lines both ways in one program unit, but not in the same line.
Continuation Lines
The default maximum number of continuation lines is 99 ♦ (1 initial and 99
continuation). To change this number of lines, use the -Nln option. ♦
Extended Lines
To extend the source line length to 132 characters, use the –e option.♦
Otherwise, by default, f77 ignores any characters after column 72.
Padding
Padding is significant in lines such as the two in the following DATA statement:
C 1 2 3 4 5 6 7
C23456789012345678901234567890123456789012345678901234567890123456789012
DATA SIXTYH/60H
1 /
If you put an exclamation mark (!) in any column of the statement field, except
within character literals, then everything after the ! on that line is a comment.
♦
Elements of FORTRAN 9
1
Directives
A directive passes information to a compiler in a special form of comment. ♦
Directives are also called compiler pragmas. There are two kinds of directives:
• General directives
• Parallel directives
General Directives
The form of a general directive is one of the following:
• C$PRAGMA id
• C$PRAGMA id ( a [ , a ] … ) [ , id ( a [ , a ] … ) ] ,…
• C$PRAGMA sun id=
Syntax
A directive has the following syntax:
• In column one, any of the comment-indicator characters c, C, !, or *
• In any column, the ! comment-indicator character
• The next 7 characters are $PRAGMA, no blanks, any uppercase or lowercase
The C() directive for a particular function must appear before the first
reference to that function in each subprogram that contains such a reference.
The recommended usage is:
The C$PRAGMA sun unroll=n directive allows the optimizer to unroll loops
n times, where n is a positive integer. The choices are:
• If n=1, this directive orders the optimizer not to unroll any loops.
• If n>1, this directive suggests to the optimizer that it unroll loops n times.
Loops are only unrolled if deemed profitable by the optimizer. If any loops are
actually unrolled, then the executable file becomes larger. For a discussion of
loop unrolling, see the Sun Fortran: Programmer’s Guide chapter Performance and
Optimization.
Elements of FORTRAN 11
1
WEAK (name1) defines name1 to be a weak symbol. The linker does not
produce an error message if it does not find a definition for name1.
See the Sun Fortran User’s Guide and the Solaris Linker and Libraries Guide for
more information.
Parallel Directives
A parallel directive is a special comment that directs the compiler to do
something about parallelization. The following are the parallel directives:
• DOALL
• DOSERIAL
• DOSERIAL*
For syntax and other information on parallel directives, see the chapter on
parallelization in the Fortran Programmer’s Guide.
This chapter describes the data types and data structures in Sun FORTRAN 77:
Types, Constants, Variables, Arrays, Substrings, Structures, and Pointers.
Types
Except for specifically typeless constants, any constant, constant expression,
variable, array, array element, substring, or function usually represents typed
data.
On the other hand, data types are not associated with the names of programs
or subroutines, block data routines, common blocks, namelist groups, or
structured records.
13
2
• The default implicit typing rule is that if the first letter of the name is I, J,
K, L, M, or N, then the data type is integer, otherwise it is real.
• You can change the default-implied types by using the IMPLICIT
statement, even to the extent of turning off all implicit typing with the
IMPLICIT NONE statement. You can also turn off all implicit typing by
specifying the –u compiler flag on the command line; this is equivalent to
beginning each program unit with the IMPLICIT NONE statement.
Array Elements
An array element has the same type as the array name.
Functions
Each intrinsic function has a specified type. An intrinsic function does not
require an explicit type statement, but that is allowed. A generic function does
not have a predetermined type; the type is determined by the type of the
arguments, as shown in Chapter 6, “Intrinsic Functions.”
An external function can have its type specified in any of the following ways:
• Explicitly by putting its name in a type statement
• Explicitly in its FUNCTION statement, by preceding the word FUNCTION
with the name of a data type
• Implicitly by its name, as with variables
FUNCTION F ( X )
INTEGER F, X
F = X + 1
RETURN
END
INTEGER FUNCTION F ( X )
INTEGER X
F = X + 1
RETURN
END
FUNCTION NXT ( X )
INTEGER X
NXT = X + 1
RETURN
END
Implicit typing can affect the type of a function, either by default implicit
typing or by an IMPLICIT statement. You must make the data type of the
function be the same within the function subprogram as it is in the calling
program unit. FORTRAN does no type checking between program units.
Default data alignment and sizes may be changed by compiling with special
options, such as -f, -dalign, -dbl_align_all, -dbl, -r8, -i2, and
-xtypemap. The descriptions in this manual in general assume that these
options are not in force.
Default data declarations, those that do not explicitly declare a data size, such
as REAL A, INTEGER B, COMPLEX C, LOGICAL D, DOUBLEPRECISION
E, have their meanings changed by these options, along with data not explicitly
declared. Data alignment is also platform dependent.
BYTE ♦
The BYTE data type provides a data type that uses only one byte of storage. It
is a logical data type, and has the synonym, LOGICAL*1.
f77 allows the BYTE type as an array index, just as it allows the REAL type,
but it does not allow BYTE as a DO loop index (where it allows only INTEGER,
REAL, and DOUBLE PRECISION). Wherever FORTRAN makes an explicit check
for INTEGER, it does not allow BYTE.
Examples:
CHARACTER
The character data type, CHARACTER, which has the synonym, CHARACTER*1,
holds one character.
CHARACTER*n
The character string data type, CHARACTER*n, where n > 0, holds a string of n
characters.
COMPLEX
A complex datum is an approximation of a complex number. The complex data
type, COMPLEX, which defaults to a synonym for COMPLEX*8, is a pair of
REAL*4 values that represent a complex number. The first element represents
the real part and the second represents the imaginary part.
The default size for a COMPLEX item (no size specified) is 8. The default
alignment is on 4-byte boundaries. However, these defaults can be changed by
compiling with certain special options.
COMPLEX*8 ♦
The complex data type COMPLEX*8 is a synonym for COMPLEX, except that it
always has a size of 8 bytes, independent of any compiler options.
DOUBLE COMPLEX ♦
The complex data type, DOUBLE COMPLEX, which usually has the synonym,
COMPLEX*16, is a pair of DOUBLE PRECISION (REAL*8) values that represents
a complex number. The first element represents the real part; the second
represents the imaginary part.
The default size for DOUBLE COMPLEX with no size specified is 16.
COMPLEX*16 is aligned on 4-byte boundaries. However, these defaults can be
changed by compiling with certain special options.
DOUBLE PRECISION
A double-precision datum is an approximation of a real number. The double-
precision data type, DOUBLE PRECISION, which has the synonym, REAL*8,
holds one double-precision datum.
The default size for DOUBLE PRECISION with no size specified is 8. DOUBLE
PRECISION is aligned on 4-byte boundaries. However, these defaults can be
changed by compiling with certain special options.
A DOUBLE PRECISION element has a sign bit, an 11-bit exponent, and a 52-bit
fraction. These DOUBLE PRECISION elements in f77 conform to the IEEE
standard for double-precision floating-point data. The layout is shown in
Appendix C, “Data Representations.”
INTEGER
The integer data type, INTEGER, holds a signed integer.
The default size for INTEGER with no size specified is 4, and is aligned on 4-
byte boundaries. However, these defaults can be changed by compiling with
certain special options.
INTEGER*2 ♦
The short integer data type, INTEGER*2, holds a signed integer. An expression
involving only objects of type INTEGER*2 is of that type. Using this feature
may have adverse performance implications, and we do not recommend it.
Ordinary integers follow the FORTRAN rules about occupying the same space
as a REAL variable. They are assumed to be equivalent to the C type long
int, and 1-byte integers are of C type short int. These short integer and
logical quantities do not obey the standard rules for storage association.
INTEGER*4 ♦
The integer data type, INTEGER*4, holds a signed integer.
INTEGER*8 ♦
The integer data type, INTEGER*8, holds a signed 64-bit integer.
LOGICAL
The logical data type, LOGICAL, holds a logical value .TRUE. or .FALSE. The
value 0 represents .FALSE.; any other value represents .TRUE.
The usual default size for an LOGICAL item with no size specified is 4, and is
aligned on 4-byte boundaries. However, these defaults can be changed by
compiling with certain special options.
LOGICAL*1 ♦
The one-byte logical data type, LOGICAL*1, which has the synonym, BYTE,
can hold any of the following:
• One character
• An integer between -128 and 127
• The logical values .TRUE. or .FALSE.
The value is as defined for LOGICAL, but it can hold a character or small
integer. An example:
LOGICAL*2 ♦
The data type, LOGICAL*2, holds logical value .TRUE. or .FALSE. The value
is defined as for LOGICAL.
LOGICAL*4 ♦
The logical data type, LOGICAL*4 holds a logical value .TRUE. or .FALSE.
The value is defined as for LOGICAL.
LOGICAL*8 ♦
The logical data type, LOGICAL*8, holds the logical value .TRUE. or .FALSE.
This data type is allowed only if the -dbl option is set. The value is defined
the same way as for the LOGICAL data type.
REAL
A real datum is an approximation of a real number. The real data type, REAL,
which usually has the synonym, REAL*4, holds one real datum.
The usual default size for a REAL item with no size specified is 4 bytes, and is
aligned on 4-byte boundaries. However, these defaults can be changed by
compiling with certain special options.
A REAL element has a sign bit, an 8-bit exponent, and a 23-bit fraction. These
REAL elements in f77 conform to the IEEE standard.
REAL*4 ♦
The REAL*4 data type is a synonym for REAL, except that it always has a size
of 4 bytes, independent of any compiler options.
Alignment in (Bytes)
Size SPARC &
Fortran 77 Data Type (Bytes) PowerPC Intel
BYTE X 1 1 1
CHARACTER X 1 1 1
CHARACTER*n X n 1 1
COMPLEX X =COMPLEX*8 8 4 4
COMPLEX*8 X 8 4 4
DOUBLE COMPLEX X =COMPLEX*16 16 8 4
COMPLEX*16 X 16 8 4
COMPLEX*32 X “Quad Complex” 32 8 —
DOUBLE PRECISION X =REAL*8 8 8 4
REAL X =REAL*4 4 4 4
REAL*4 X 4 4 4
REAL*8 X 8 8 4
REAL*16 X “Quad Real” 16 8 —
INTEGER X =INTEGER*4 4 4 4
INTEGER*2 X 2 2 2
INTEGER*4 X 4 4 4
INTEGER*8 X 8 8 4
LOGICAL X =LOGICAL*4 4 4 4
LOGICAL*1 X =BYTE 1 1 1
LOGICAL*2 X 2 2 2
LOGICAL*4 X 4 4 4
LOGICAL*8 X 8 8 4
Compiling with options -i2,-r8, or -dbl changes the defaults for certain
data declarations that appear without an explicit size:
Do not combine –i2 with –r8 as this can produce unexpected results.
REAL*16 and COMPLEX*32 are SPARC and PowerPC only.
With -dbl or -r8, INTEGER and LOGICAL are allocated the larger space
indicated above. This is done to maintain the FORTRAN requirement that an
integer item and a real item have the same amount of storage. However, with
-r8 8 bytes are allocated but only 4-byte arithmetic is done. With -dbl,
8 bytes are allocated and full 8-byte arithmetic is done. In all other ways, -dbl
and -r8 produce the same results.
Constants
A constant is a datum whose value cannot change throughout the program
unit. The form of the string representing a constant determines the value and
data type of the constant.
Blank characters within an arithmetic or logical constant do not affect the value
of the constant. Within character constants, they do affect the value.
For integer, real, and double-precision data, zero is neither positive nor
negative. The value of a signed zero is the same as that of an unsigned zero.
Compiling with any of the options -i2, -dbl, -r8, or -xtypemap alters the
default size of integer, real, complex, and double precision constants. These
options are described in Chapter 2, and in the Fortran User’s Guide.
Character Constants
A character-string constant is a string of characters enclosed in apostrophes or
quotes. The apostrophes are standard; the quotes are not. ♦
'abc' "abc"
'ain''t' "in vi type ""h9Y"
If a string begins with one kind of delimiter, the other kind can be embedded
within it without using the repeated quote or backslash escapes. See Table 2-3.
"abc" "abc"
"ain't" 'in vi type "h9Y'
Null Characters ♦
Each character string constant appearing outside a DATA statement is followed
by a null character to ease communication with C routines. You can make
character string constants consisting of no characters, but only as arguments
being passed to a subprogram. Such zero length character string constants are
not FORTRAN standard.
However, if you put such a null character constant into a character variable,
the variable will contain a blank, and have a length of at least 1 byte.
Escape Sequences ♦
For compatibility with C usage, the following backslash escapes are
recognized. If you include the escape sequence in a character string, then you
get the indicated character.
If you compile with the –xl option, then the backslash character (\) is treated
as an ordinary character. That is, with the –xl option, you cannot use these
escape sequences to get special characters.
Technically, the escape sequences are not nonstandard, but are implementation-
defined.
Complex Constants
A complex constant is an ordered pair of real or integer constants. The
constants are separated by a comma, and the pair is enclosed in parentheses.
The first constant is the real part, and the second is the imaginary part. A
complex constant, COMPLEX*8, uses 8 bytes of storage.
( 9.01, .603 )
( +1.0, -2.0 )
( +1.0, -2 )
( 1, 2 )
( 4.51, ) Invalid —need second part
COMPLEX*16 Constants
A double-complex constant, COMPLEX*16, is an ordered pair of real or integer
constants, where one of the constants is REAL*8, and the other is INTEGER,
REAL*4, or REAL*8. ♦
( 9.01D6, .603 )
( +1.0, -2.0D0 )
( 1D0, 2 )
( 4.51D6, ) Invalid—need second part
( +1.0, -2.0 ) Not DOUBLE COMPLEX—need a REAL*8
( 9.01Q6, .603 )
( +1.0, -2.0Q0 )
( 1Q0, 2 )
( 3.3Q-4932, 9 )
( 1, 1.1Q+4932 )
( 4.51Q6, ) Invalid—need second part
( +1.0, -2.0 ) Not quad complex —need a REAL*16
Integer Constants
An integer constant consists of an optional plus or minus sign, followed by a
string of decimal digits.
Restrictions
No other characters are allowed except, of course, a space.
Compiling with the -dbl or -r8 option alters the range to:
(-9223372036854775808,9223372036854775807).
-2147483648
-2147483649 Invalid—too small, error message
-10
0
+199
29002
2.71828 Not INTEGER—decimal point not allowed
1E6 Not INTEGER—E not allowed
29,002 Invalid—comma not allowed, error message
2147483647
2147483648 Invalid— too large, error message
Long Integers ♦
Compiling with the -dbl or -r8 option alters the range from
(-21474836, 21474836) to (-9223372036854775808, 9223372036854775807). The
integer constant is stored or passed as an 8-byte integer, data type INTEGER*8.
Short Integers ♦
If a constant argument is in the range (-32768, 32767), it is usually widened to a
4-byte integer, data type INTEGER*4; but compiling with the –i2 option will
cause it to be stored or passed as a 2-byte integer, data type INTEGER*2.
Logical Constants
A logical constant is either the logical value true or false. The only logical
constants are .TRUE. and .FALSE.; no others are possible. The period
delimiters are necessary.
Real Constants
A real constant is an approximation of a real number. It can be positive,
negative, or zero. It has a decimal point or an exponent. If no sign is present,
the constant is assumed to be nonnegative.
+82.
-32.
90.
98.5
Real Exponent
A real exponent consists of the letter E, followed by an optional plus or minus
sign, followed by an integer.
Example: Real exponents:
E+12
E-3
E6
Real Constant
A real constant has one of these forms:
• Basic real constant
• Basic real constant followed by a real exponent
• Integer constant followed by a real exponent
-32.
-32.18
1.6E-9
7E3
1.6E12
$1.0E2.0 Invalid— $ not allowed, error message
82 Not REAL—need decimal point or exponent
29,002.0 Invalid —comma not allowed, error message
1.6E39 Invalid—too large, machine infinity is used
1.6E-39 Invalid —too small, some precision is lost
Double-Precision Exponent
A double-precision exponent consists of the letter D, followed by an optional plus
or minus sign, followed by an integer.
1.6D-9
7D3
$1.0D2.0 Invalid —$ not allowed, error message
82 Not DOUBLE PRECISION—need decimal point or exponent
29,002.0D0 Invalid—comma not allowed, error message
1.8D308 Invalid—too large, machine infinity is used
1.0D-324 Invalid—too small, some precision is lost
1.6Q-9
7Q3
3.3Q-4932
1.1Q+4932
$1.0Q2.0 Invalid—$ not allowed, error message
82 Not quad—need exponent
29,002.0Q0 Invalid—comma not allowed, error message
1.6Q5000 Invalid—too large, machine infinity is used
1.6Q-5000 Invalid—too small, some precision is lost
These constants are not converted before use. However, in f77, they must be
distinguished from character strings.
PARAMETER ( P1 = Z'1F' )
INTEGER*2 N1, N2, N3, N4
DATA N1 /B'0011111'/, N2/O'37'/, N3/X'1f'/, N4/Z'1f'/
WRITE ( *, 1 ) N1, N2, N3, N4, P1
1 FORMAT ( 1X, O4, O4, Z4, Z4, Z4 )
END
Note the edit descriptors in FORMAT statements: O for octal, and Z for
hexadecimal. Each of the above integer constants has the value 31 decimal.
M = ICOUNT + 8
JCOUNT = ICOUNT + 511
TEMP = 2.35076E-38
Control Characters
You can enter control characters with typeless constants, although the CHAR
function is standard, and this way is not.
'37'O
37'O Invalid—missing initial apostrophe
'37' Not numeric— missing letter O
'397'O Invalid—invalid digit
For hexadecimals, enclose a string of hex digits in apostrophes and append the
letter X.
'ab'X
3fff'X
'1f'X
'1fX Invalid—missing trailing apostrophe
'3f' Not numeric— missing X
'3g7'X Invalid—invalid digit g
Here are the rules and restrictions for binary, octal, and hexadecimal constants:
• These constants are for use anywhere numeric constants are allowed.
• These constants are typeless. They are stored in the variables without any
conversion to match the type of the variable, but they are stored in the
appropriate part of the receiving field—low end, high end.
• If the receiving data type has more digits than are specified in the constant,
zeros are filled on the left.
• If the receiving data type has fewer digits than are specified in the constant,
digits are truncated on the left. If nonzero digits are lost, an error message is
displayed.
• Specified leading zeros are ignored.
• You can specify up to 8 bytes of data for any one constant—at least that's all
that are used.
• If a typeless constant is an actual argument, it has no data type, but it is
always 4 bytes that are passed.
• For binary constants, each digit must be 0 or 1.
Hollerith Constants ♦
A Hollerith constant consists of an unsigned, nonzero, integer constant,
followed by the letter H, followed by a string of printable characters where the
integer constant designates the number of characters in the string, including
any spaces and tabs.
The FORTRAN standard does not have this old Hollerith notation, although
the standard recommends implementing the Hollerith feature to improve
compatibility with old programs.
Hollerith data can be used in place of character-string constants. They can also
be used in IF tests, and to initialize noncharacter variables in DATA statements
and assignment statements, though none of these are recommended, and none
are standard. These are typeless constants.
Variables
A variable is a symbolic name paired with a storage location. A variable has a
name, a value, and a type. Whatever datum is stored in the location is the
value of the variable. This does not include arrays, array elements, records, or
record fields, so this definition is more restrictive than the usual usage of the
word “variable.”
You can specify the type of a variable in a type statement. If the type is not
explicitly specified in a type statement, it is implied by the first letter of the
variable name: either by the usual default implied typing, or by any implied
typing of IMPLICIT statements. See Section , “Types,” for more details on the
rules for data typing.
Two variables are associated if each is associated with the same storage
location. You can associate variables by use of EQUIVALENCE, COMMON, or MAP
statements. Actual and dummy arguments can also associate variables.
Arrays
An array is a named collection of elements of the same type. It is a nonempty
sequence of data and occupies a group of contiguous storage locations. An
array has a name, a set of elements, and a type.
An array element is one member of the sequence of data. Each storage location
holds one element of the array.
Array Declarators
An array declarator specifies the name and properties of an array.
a ( d [, d ] … )
where:
• a is the name of the array
• d is a dimension declarator
where:
• dl is the lower dimension bound
• du is the upper dimension bound
The lower bound indicates the first element of the dimension, and the upper
bound indicates the last element of the dimension. In a one-dimensional array,
these are the first and last elements of the array.
REAL V(-5:5)
REAL V(1000)
REAL TAO(2,2,3,4,5,6,10)
Adjustable Arrays
An adjustable array is an array which is a dummy argument, and which has one
or more of its dimensions or bounds as integer variables that are either
themselves dummy arguments, or are in a common block.
You can declare adjustable arrays in the usual DIMENSION, COMMON, or type
statements. In f77,you can also declare adjustable arrays in a RECORD
statement, if that RECORD statement is not inside a structure declaration block.
SUBROUTINE POPUP ( A, B, N )
COMMON / DEFS / M, L, K
REAL A(3:5, 7, M:N), B(N+1:2*N)
Assumed-Size Arrays
An assumed-size array is an array that is a dummy argument, and which has an
asterisk as the upper bound of the last dimension.
You can declare assumed-size arrays in the usual DIMENSION, COMMON, or type
statements.
SUBROUTINE PULLDOWN ( A, B, C )
INTEGER A(5, *), B(*), C(0:1, 2:*)
Array Subscripts
An array element name is an array name qualified by a subscript.
Form of a Subscript
A subscript is a parenthesized list of subscript expressions. There must be one
subscript expression for each dimension of the array.
REAL M(2,3)
With the above declaration, you can assign a value to a particular element, as
follows:
M(1,2) = 0.0
The above code assigns 0.0 to the element in row 1, column 2, of array M.
Subscript Expressions
Subscript expressions have the following properties and restrictions:
• A subscript expression is an integer, real, or byte expression. According to
the FORTRAN Standard, it must be an integer expression.
• A subscript expression can contain array element references and function
references.
• Evaluation of a function reference must not alter the value of any other
subscript expression within the same subscript.
REAL V(-1:8)
V(2) = 0.0
Array Ordering
Array elements are usually considered as being arranged with the first
subscript as the row number and the second subscript as the column number.
This corresponds to traditional mathematical nxm matrix notation:
a1,1 a1,2 a1,3 ... a1,m
a2,1 a2,2 ... a2,m
... ... ai,j ... ai,m
an,1 an,2 ... an,m
For example:
INTEGER*4 A(3,2)
A(1,1) A(1,2)
A(2,1) A(2,2)
A(3,1) A(3,2)
Substrings
A character datum is a sequence of one or more characters. A character
substring is a contiguous portion of a character variable or of a character array
element or of a character field of a structured record.
where:
Both e1 and e2 are integer expressions. They cannot exceed the range of
INTEGER*4. If the expression is not in the range (-2147483648, 2147483647),
then the results are unpredictable.
S(I:L)
The following string has an initial character from the Mth character of the
array element A(J,K), with the last character from the Nth character of that
element.
A(J,K)(M:N)
Structures
A structure is a generalization of an array. ♦
The structure declaration defines the form of a record by specifying the name,
type, size, and order of the fields that constitute the record. Once a structure is
defined and named, it can be used in RECORD statements, as explained in the
following subsections.
Syntax
The structure declaration has the following syntax:
Field Declaration
Each field declaration can be one of the following:
• A substructure—either another structure declaration, or a record that has
been previously defined
• A union declaration, which is described later
• A FORTRAN type declaration
STRUCTURE /PRODUCT/
INTEGER*4 ID
CHARACTER*16 NAME
CHARACTER*8 MODEL
REAL*4 COST
REAL*4 PRICE
END STRUCTURE
Record Declaration
The RECORD statement declares variables to be records with a specified
structure, or declares arrays to be arrays of such records.
record-name[.field-name] … [.field-name]
record-name Name of a previously defined record variable
field-name Name of a field in the record immediately to the left.
…
RECORD /PRODUCT/ CURRENT, PRIOR, NEXT, LINE(10)
…
CURRENT = NEXT
LINE(1) = CURRENT
WRITE ( 9 ) CURRENT
NEXT.ID = 82
Substructure Declaration
A structure can have a field that is also a structure. Such a field is called a
substructure. You can declare a substructure in one of two ways:
• A RECORD declaration within a structure declaration
• A structure declaration within a structure declaration (nesting)
STRUCTURE /SALE/
CHARACTER*32 BUYER
INTEGER*2 QUANTITY
RECORD /PRODUCT/ ITEM
END STRUCTURE
In the above example, the structure SALE contains three fields. BUYER,
QUANTITY, and ITEM, where ITEM is a record with the structure, /PRODUCT/.
STRUCTURE /SALE/
CHARACTER*32 BUYER
INTEGER*2 QUANTITY
STRUCTURE /PRODUCT/ ITEM
INTEGER*4 ID
CHARACTER*16 NAME
CHARACTER*8 MODEL
REAL*4 COST
REAL*4 PRICE
END STRUCTURE
END STRUCTURE
Here, the structure SALE still contains the same three fields as in the prior
example: BUYER, QUANTITY, and ITEM. The field ITEM is an example of a field-
list (in this case, a single-element list), as defined under “Structure
Declaration.”
The size and complexity of the various structures determine which style of
substructure declaration is best to use in a given situation.
…
RECORD /SALE/ JAPAN
…
N = JAPAN.QUANTITY
I = JAPAN.ITEM.ID
…
Syntaxes
The syntax of a union declaration is:
UNION
map-declaration
map-declaration
[map-declaration]
…
[map-declaration]
END UNION
MAP
field-declaration
[field-declaration]
…
[field-declaration]
END MAP
Fields in a Map
Each field-declaration in a map declaration can be one of the following:
• Structure declaration
• Record
• Union declaration
• Declaration of a typed data field
Example: Declare the structure /STUDENT/ to contain either NAME, CLASS, and
MAJOR—or NAME, CLASS, CREDITS, and GRAD_DATE:
STRUCTURE /STUDENT/
CHARACTER*32 NAME
INTEGER*2 CLASS
UNION
MAP
CHARACTER*16 MAJOR
END MAP
MAP
INTEGER*2 CREDITS
CHARACTER*8 GRAD_DATE
END MAP
END UNION
END STRUCTURE
If you define the variable PERSON to have the structure /STUDENT/ from the
above example, then PERSON.MAJOR references a field from the first map, and
PERSON.CREDITS references a field from the second map. If the variables of
the second map field are initialized, and then the program references the
variable PERSON.MAJOR, the first map becomes active, and the variables of the
second map become undefined.
Pointers
The POINTER statement establishes pairs of variables and pointers. ♦
Each pointer contains the address of its paired variable.
Syntax Rules
The POINTER statement has the following syntax:
where:
• v1, v2 are pointer-based variables.
• p1, p2 are the corresponding pointers.
POINTER ( P, V )
Usage of Pointers
Normal use of pointer-based variables involves the following steps. The first
two steps can be in either order.
COMPLEX Z
REAL X, Y
POINTER ( P1, X ), ( P2, Y ), ( P3, Z )
…
P1 = MALLOC ( 10000 )
…
In the above example, MALLOC() allocates 10,000 bytes of memory, which are
associated with pointer P1. FREE() later returns those same 10,000 bytes to the
memory manager.
Restrictions
The pointers are of type integer, and are automatically typed that way by the
compiler. You must not type them yourself.
General Guidelines
There are two alternatives for optimization with pointers.
• Do not use pointers with optimization level -O4.
• Use a pointer only to identify the location of the data for calculations and
pass the pointer to a subprogram. Almost anything else you do to the
pointer can yield incorrect results.
The second choice also has a suboption: localize pointers to one routine and do
not optimize it, but do optimize the routines that do the calculations. If you put
the calling the routines on different files, you can optimize one and not
optimize the other.
If you want to optimize only CALC at level -O4, then avoid using pointers in
CALC.
Example: One kind of code that could cause trouble with -O3 or -O4:
COMMON A, B, C
POINTER ( P, V )
P = LOC(A) + 4 ! ←Possible problems if optimized
…
The compiler assumes that a reference through P may change A, but not B;
this assumption could produce incorrect code.
This chapter discuses Fortran expressions and how they are evaluated.
The operands indicate what items to apply the action to. An operand can be any
of the following kinds of data items:
• Constant
• Variable
• Array element
• Function
• Substring
• Structured record field (if it evaluates to a scalar data item)
63
3
Arithmetic Expressions
An arithmetic expression evaluates to a single arithmetic value, and its operands
have the following types. ♦ indicates a nonstandard feature.
• BYTE ♦
• COMPLEX
• COMPLEX*32 (SPARC and PowerPC only) ♦
• DOUBLE COMPLEX ♦
• DOUBLE PRECISION
• INTEGER
• LOGICAL
• REAL
• REAL*16 (SPARC and PowerPC only) ♦
Operator Meaning
** Exponentiation
* Multiplication
/ Division
- Subtraction or Unary Minus
+ Addition or Unary Plus
If BYTE or LOGICAL operands are combined with arithmetic operators, they are
interpreted as integer data.
a ⊕b
where a and b are operands, and ⊕ is any one of the **, *, /, -, or + operators.
A-Z
X*B
⊕ b
-Z
+B
Expression Meaning
a ** z Raise a to the power z
a / z Divide a by z
a * z Multiply a by z
a - z Subtract z from a
-z Negate z
a + z Add z to a
+z Same as z
Operator Precedence
** First
* / Second
+ - Last
Expressions 65
3
For the left-to-right rule, the one exception is shown by the following example:
F ** S ** Z
F ** (S ** Z)
X ** -A * Z
X ** (-(A * Z))
In the above example, the compiler starts to evaluate the **, but it needs to
know what power to raise X to; so it looks at the rest of the expression and
must choose between - and *. It first does the *, then the -, then the **.
Mixed Mode
If both operands have the same type, then the resulting value has that type. If
operands have different types, then the weaker of two types is promoted to the
stronger type, where the weaker type is the one with less precision or fewer
storage units. The ranking is summarized in the following table:
Note – REAL*4, INTEGER*8, and LOGICAL*8 are of the same rank, but they
can be the results of different pairs of operands. For example, INTEGER*8
results if you combine INTEGER*8 and any of the types between 1-5. Likewise,
REAL*4 results if one of the operands is REAL*4, and the other is any of the
types between 1-5. LOGICAL*8 dictates only the 8-byte size of the result.
R * I
has the type real, because first I is promoted to real, and then the
multiplication is performed.
Expressions 67
3
Rules
Note these rules for the data type of an expression:
• If there is more than one operator in an expression, then the type of the last
operation performed becomes the type of the final value of the expression.
• Integer operators apply to only integer operands.
2/3 + 3/4
Resultant Type
For integer operands with a logical operator, the operation is done bit by bit.
The result is an integer.
If the operands are mixed integer and logical, then the logicals are converted to
integers, and the result is an integer.
Arithmetic Assignment
The arithmetic assignment statement assigns a value to a variable, array
element, or record field. The syntax is:
v = e
e Arithmetic expression, a character constant, or a logical expression
v Numeric variable, array element, or record field
Expressions 69
3
Character constants can be assigned to variables of type integer or real. Such a
constant can be a Hollerith constant or a string in apostrophes or quotes. The
characters are transferred to the variables without any conversion of data. This
practice is nonstandard and may not be portable. ♦
Type of v Type of e
INTEGER*2, INTEGER*4, or INTEGER*8 INT(e)
REAL REAL(e)
REAL*8 DBLE(e)
REAL*16 (SPARC and PowerPC only) QREAL(e) (SPARC and PowerPC only)
DOUBLE PRECISION DBLE(e)
COMPLEX*8 CMPLX(e)
COMPLEX*16 DCMPLX(e)
COMPLEX*32 (SPARC and PowerPC only) QCMPLX(e) (SPARC and PowerPC only)
Note – Compiling with any of the options -i2, -dbl, -r8, or -xtypemap will
have an effect on the assumed type of e. This is discussed in Chapter 2. See also
the Sun Fortran User’s Guide for a description of these options.
Character Expressions
A character expression is an expression whose operands have the character type.
It evaluates to a single value of type character, with a size of one or more
characters. The only character operator is the concatenation operator, //.
Expression Meaning
a // z Concatenate a with z.
The result of concatenating two strings is a third string that contains the
characters of the left operand followed immediately by the characters of the
right operand. The value of a concatenation operation a//z is a character
string whose value is the value of a concatenated on the right with the value of
z, and whose length is the sum of the lengths of a and z.
'wxy'
'AB' // 'wxy'
C
C // S
C(4:7)
R.C
Expressions 71
3
Example: A valid way to enter a Control-C:
CHARACTER etx
etx = CHAR(3)
v = e
e Expression giving the value to be assigned
v Variable, array element, substring, or character record field
The meaning of character assignment is to copy characters from the right to the
left side.
CHARACTER S*4
INTEGER I2*2, I4*4
REAL R
S = 4Hwxyz
I2 = 2Hyz
I4 = 4Hwxyz
R = 4Hwxyz
Expressions 73
3
Rules of Assignment
Here are the rules for character assignments:
• If the left side is longer than the right, it is padded with trailing blanks.
• If the left side is shorter than the right, trailing characters are discarded.
• The left and right sides of a character assignment can share storage. ♦
CHARACTER S*8
S = 'abcdefgh'
S(4:6) = S(5:7)
WRITE(*,*) S
END
Logical Expressions
A logical expression is a sequence of one or more logical operands and logical
operators. It evaluates to a single logical value. The operators can be any of the
following.
Two logical operators cannot appear consecutively, unless the second one is the
.NOT. operator.
Operator Precedence
.NOT. Highest
.AND.
.OR.
.NEQV.,.XOR., .EQV. Lowest
If the logical operators are of equal precedence, they are evaluated left to right.
If the logical operators appear along with the various other operators in a
logical expression, the precedence is as follows.
Operator Precedence
Arithmetic Highest
Character
Relational
Logical Lowest
Expression Meaning
X .AND. Y Both X and Y are true.
X .OR. Y Either X or Y, or both, are true.
X .NEQV. Y X and Y are not both true and not both false.
X .XOR. Y Either X or Y is true, but not both.
X .EQV. Y X and Y are both true or both false.
.NOT. X Logical negation.
This is the syntax for the assignment of the value of a logical expression to a
logical variable:
v = e
e A logical expression, an integer between –128 and 127, or a single character constant
v A logical variable, array element, or record field
Expressions 75
3
Execution of a logical assignment statement causes evaluation of the logical
expression e and assignment of the resulting value to v. If e is a logical
expression, rather than an integer between -128 and 127, or a single character
constant, then e must have a value of either true or false.
Logical expressions of any size can be assigned to logical variables of any size.
Relational Operator
A relational operator compares two arithmetic expressions, or two character
expressions, and evaluates to a single logical value. The operators can be any
of the following:
Operator Meaning
.LT. Less than
.LE. Less than or equal
.EQ. Equal
.NE. Not equal
.GT. Greater than
.GE. Greater than or equal
For a relational expression, first each of the two operands is evaluated, and
then the two values are compared. If the specified relationship holds, then the
value is true; otherwise, it is false.
NODE .GE. 0
X .LT. Y
U*V .GT. U-V
M+N .GT. U-V Mixed mode: integer M+N is promoted to real
STR1 .LT. STR2 where STR1 and STR2 are type character
S .EQ. 'a' where S is type character
Constant Expressions
A constant expression is made up of explicit constants and parameters and the
FORTRAN operators. Each operand is either itself another constant expression,
a constant, a symbolic name of a constant, or one of the intrinsic functions
called with constant arguments.
Expressions 77
3
Example: Exponentiation to a floating-point power is not allowed:
Record Assignment
The general form of record assignment is: ♦
v = e
e A record or record field
v A record or record field
Both e and v must have the same structure. That is, each must have the same
number of fields, and corresponding fields must be of the same type and size.
STRUCTURE /PRODUCT/
INTEGER*4 ID
CHARACTER*16 NAME
CHARACTER*8 MODEL
REAL*4 COST
REAL*4 PRICE
END STRUCTURE
RECORD /PRODUCT/ CURRENT, PRIOR, NEXT, LINE(10)
…
CURRENT = NEXT
LINE(1) = CURRENT
WRITE ( 9 ) CURRENT
NEXT.ID = 82
In the above example, the first assignment statement copies one whole record
(all five fields) to another record; the second assignment statement copies a
whole record into the first element of an array of records; the WRITE statement
writes a whole record; and the last statement sets the ID of one record to 82.
Evaluation of Expressions
The following restrictions apply to all arithmetic, character, relational, and
logical expressions:
• If you reference any one of these items in an expression, variable, array
element, character substring, record field, pointer, or function, then that item
must be defined at the time the reference is executed.
• An integer operand must be defined with an integer value, and not with a
statement label value by an ASSIGN statement.
• All the characters of a substring that are referenced must be defined at the
time the reference is executed.
• The execution of a function reference must not alter the value of any other
entity within the same statement.
• The execution of a function reference must not alter the value of any entity
in common that affects the value of any other function reference in the same
statement.
Expressions 79
3
This chapter describes the statements recognized by Sun FORTRAN 77. The
nonstandard statements are indicated with a small black diamond (♦). The
syntax and a description of each statement is given, along with possible
restrictions and examples. A table of sample statements appears in
Appendix B.
81
4
ACCEPT
The ACCEPT ♦ statement reads from standard input.
Syntax
ACCEPT f [, iolist ]
ACCEPT grname
f Format identifier
iolist List of variables, substrings, arrays, and records
grname Name of the namelist group
Description
ACCEPT f [,iolist] is equivalent to READ f [,iolist] and is for compatibility
with older versions of FORTRAN. An example of list-directed input:
REAL VECTOR(10)
ACCEPT *, NODE, VECTOR
ASSIGN
The ASSIGN statement assigns a statement label to a variable.
Syntax
ASSIGN s TO i
s Statement label
i Integer variable
Description
The label s is the label of an executable statement or a FORMAT statement.
The integer variable i, once assigned a statement label, can be reassigned the
same statement label, a different label, or an integer.
Restrictions
Define a variable with a statement label before you reference it as a label.
Examples
Example 1: Assign the statement number of an executable statement:
ASSIGN 9 TO K
GO TO K
…
9 WRITE (*,*) 'Assigned ', K, ' to K'
INTEGER PHORMAT
2 FORMAT ( A80 )
ASSIGN 2 TO PHORMAT
…
WRITE ( *, PHORMAT ) 'Assigned a FORMAT statement no.'
Statements 83
4
Assignment
The assignment statement assigns a value to a variable, substring, array
element, record, or record field.
Syntax
v=e
e Expression giving the value to be assigned
v Variable, substring, array element, record, or record field
Description
The value can be a constant or the result of an expression. The kinds of
assignment statements: are arithmetic, logical, character, and record
assignments.
Arithmetic Assignment
v is of numeric type and is the name of a variable, array element, or record
field.
Type of v Type of e
INTEGER*2, INTEGER*4, or INT(e)
INTEGER*8 REAL(e)
REAL REAL*8
REAL*8 QREAL(e) (SPARC, PowerPC only)
REAL*16 (SPARC, PowerPC only) DBLE(e)
DOUBLE PRECISION CMPLX(e)
COMPLEX*8 DCMPLX(e)
COMPLEX*16 QCMPLX(e) (SPARC, PowerPC only)
COMPLEX*32 (SPARC, PowerPC only)
Note – Compiling with any of the options -i2, -dbl, -r8, or -xtypemap can
alter the default data size of variables and expressions. This is discussed in
Chapter 2. See also the Sun Fortran User’s Guide for a description of these
options.
REAL A, B
DOUBLE PRECISION V
V = A * B
REAL A, B
DOUBLE PRECISION V
V = DBLE( A * B )
Logical Assignment
v is the name of a variable, array element, or record field of type logical.
Statements 85
4
e is a logical expression, or an integer between -128 and 127, or a single
character constant.
Logical expressions of any size can be assigned to logical variables of any size.
The section on the LOGICAL statement provides more details on the size of
logical variables.
Character Assignment
The constant can be a Hollerith constant or a string of characters delimited by
apostrophes (') or quotes ("). The character string cannot include the control
characters Control-A, Control-B, or Control-C; that is, you cannot hold down
the Control key and press the A, B, or C keys. If you need those control
characters, use the char() function.
If you use quotes to delimit a character constant, then you cannot compile with
the -xl option, because, in that case, a quote introduces an octal constant. The
characters are transferred to the variables without any conversion of data, and
may not be portable.
Record Assignment
v and e are each a record or record field. ♦
The e and v must have the same structure. They have the same structure if any
of the following occur:
• Both e and v are fields with the same elementary data type.
The sections on the RECORD and STRUCTURE statements have more details on
the structure of records.
Examples
Example 1: Arithmetic assignment:
Statements 87
4
Example 3: Hollerith assignment:
CHARACTER S*4
INTEGER I2*2, I4*4
REAL R
S = 4Hwxyz
I2 = 2Hyz
I4 = 4Hwxyz
R = 4Hwxyz
STRUCTURE /PRODUCT/
INTEGER*4 ID
CHARACTER*16 NAME
CHARACTER*8 MODEL
REAL*4 COST
REAL*4 PRICE
END STRUCTURE
RECORD /PRODUCT/ CURRENT, PRIOR, NEXT, LINE(10)
…
CURRENT = NEXT ! Record to record
LINE(1) = CURRENT ! Record to array element
WRITE ( 9 ) CURRENT ! Write whole record
NEXT.ID = 82 ! Assign a value to a field
Statements 89
4
AUTOMATIC
The AUTOMATIC ♦ statement makes each recursive invocation of the
subprogram have its own copy of the specified items. It also makes the
specified items become undefined outside the subprogram when the
subprogram exits through a RETURN statement.
Syntax
AUTOMATIC vlist
vlist List of variables and arrays
Description
For automatic variables, there is one copy for each invocation of the procedure.
To avoid local variables becoming undefined between invocations, f77
classifies every variable as either static or automatic with all local variables
being static by default. For other than the default, you can declare variables as
static or automatic in a STATIC ♦, AUTOMATIC ♦, or IMPLICIT statement. See
also the discussion of the -stackvar option in the Fortran User’s Guide.
Local variables and arrays are static by default, so in general, there is no need
to use SAVE. You should use SAVE to ensure portability. Also, SAVE is safer if
you leave a subprogram by some way other than a RETURN.
Restrictions
Automatic variables and arrays cannot appear in DATA or SAVE statements.
Examples
Example: Some other uses of AUTOMATIC:
AUTOMATIC A, B, C
REAL P, D, Q
AUTOMATIC P, D, Q
IMPLICIT AUTOMATIC (X-Z)
Restrictions
An AUTOMATIC statement and a type statement cannot be combined to make
an AUTOMATIC type statement. For example, AUTOMATIC REAL X does not
declare the variable X to be both AUTOMATIC and REAL; it declares the variable
REALX to be AUTOMATIC.
Statements 91
4
BACKSPACE
The BACKSPACE statement positions the specified file to just before the
preceding record.
Syntax
BACKSPACE u
BACKSPACE( [UNIT= ] u [, IOSTAT= ios ] [, ERR= s ] )
u Unit identifier of the external unit connected to the file
ios I/O status specifier, integer variable, or an integer array element
s Error specifier: s must be the label of an executable statement in the
same program unit in which the BACKSPACE statement occurs.
Program control is transferred to the label in case of an error during the
execution of the BACKSPACE statement.
Description
BACKSPACE in a terminal file has no effect.
Examples
Example 1: Simple backspace:
BACKSPACE 2
LUNIT = 2
BACKSPACE LUNIT
INTEGER CODE
BACKSPACE ( 2, IOSTAT=CODE, ERR=9 )
…
9 WRITE (*,*) 'Error during BACKSPACE'
STOP
Statements 93
4
BLOCK DATA
The BLOCK DATA statement identifies a subprogram that initializes variables
and arrays in labeled common blocks.
Syntax
Description
A block data subprogram can contain as many labeled common blocks and
data initializations as desired.
The BLOCK DATA statement must be the first statement in a block data
subprogram.
The only other statements that can appear in a block data subprogram are:
• COMMON
• DATA
• DIMENSION
• END
• EQUIVALENCE
• IMPLICIT
• PARAMETER
• RECORD
• SAVE
• STRUCTURE
• Type statements
Restrictions
Only one unnamed block data subprogram can appear in the executable
program.
The same labeled common block cannot be specified in more than one block
data subprogram in the same executable program.
The optional parameter name 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 must not be the same as any local
name in the subprogram.
Example
Statements 95
4
BYTE
The BYTE ♦ statement specifies the type to be 1-byte integer. It optionally
specifies array dimensions and initializes with values.
Syntax
BYTE v [/c/] …
v Name of a symbolic constant, variable, array, array declarator, function,
or dummy function
c List of constants for the immediately preceding name
Description
This is a synonym for LOGICAL*1. A BYTE type item can hold the logical
values .TRUE., .FALSE., one character, or an integer between –128 and 127.
Example
CALL
The CALL statement branches to the specified subroutine, executes the
subroutine, and returns to the calling program after finishing the subroutine.
Syntax
CALL sub [ ( [ ar [, ar ] … ] ) ]
sub Name of the subroutine to be called
ar Actual argument to be passed to the subroutine
Description
Arguments are separated by commas.
The simplest expressions, and most frequently used, include such constructs
as:
• Constant
• Variable name
Statements 97
4
• Array name
• Formal argument, if the CALL statement is inside a subroutine
• Record name
Examples
Example 1: Character string:
SUBROUTINE RANK ( N, *, * )
IF ( N .EQ. 0 ) RETURN
IF ( N .EQ. 1 ) RETURN 1
RETURN 2
END
In this example, the real array M matches the real array, A, and the real array
element Q(1,2) matches the real variable, D.
Statements 99
4
Example 5: A structured record and field; the record is nonstandard: ♦
STRUCTURE /PRODUCT/
INTEGER*4 ID
CHARACTER*16 NAME
CHARACTER*8 MODEL
REAL*4 COST
REAL*4 PRICE
END STRUCTURE
RECORD /PRODUCT/ CURRENT, PRIOR
CALL SBRX ( CURRENT, PRIOR.ID )
…
END
SUBROUTINE SBRX ( NEW, K )
STRUCTURE /PRODUCT/
INTEGER*4 ID
CHARACTER*16 NAME
CHARACTER*8 MODEL
REAL*4 COST
REAL*4 PRICE
END STRUCTURE
RECORD /PRODUCT/ NEW
…
RETURN
END
In the above example, the record NEW matches the record CURRENT, and the
integer variable, K, matches the record field, PRIOR.OLD.
CHARACTER
The CHARACTER statement specifies the type of a symbolic constant, variable,
array, function, or dummy function to be character.
Optionally, it initializes any of the items with values and specifies array
dimensions.
Syntax
Description
Each character occupies 8 bits of storage, aligned on a character boundary.
Character arrays and common blocks containing character variables are packed
in an array of character variables. The first character of one element follows the
last character of the preceding element, without holes.
The length, len must be greater than 0. If len is omitted, it is assumed equal to
1.
For dummy arguments or function names, len can have another form: a
parenthesized asterisk, that is, CHARACTER*(*), which denotes that the
function name length is defined in referencing the program unit, and the
dummy argument has the length of the actual argument.
Statements 101
4
The list c of constants can be used only for a variable, array, or array declarator.
There can be only one constant for the immediately preceding variable, and
one constant for each element of the immediately preceding array.
Examples
Example 1: Character strings and arrays of character strings:
Both of the above two examples are equivalent to the nonstandard variation: ♦
CHARACTER S*1
S = ''
SUBROUTINE SWAN( A )
CHARACTER A*32
SUBROUTINE SWAN( A )
CHARACTER A*(*)
…
CHARACTER A*17
A = "xyz"
PRINT *, LEN( A )
END
Statements 103
4
CLOSE
The CLOSE statement disconnects a file from a unit.
Syntax
Description
The options can be specified in any order.
The DISP= and DISPOSE= options are allowable alternates for STATUS=, with
a warning, if the -ansi flag is set.
Comments
All open files are closed with default sta at normal program termination.
Regardless of the specified sta, scratch files, when closed, are always deleted.
Execution of a CLOSE statement specifying a unit that does not exist, or a unit
that has no file connected to it, has no effect.
Examples
Example 1: Close and keep:
CLOSE ( 2, STATUS='KEEP')
Example 3: Close and keep a scratch file even though the status is SCRATCH:
OPEN ( 2, STATUS='SCRATCH')
…
CLOSE ( 2, STATUS='KEEP', IOSTAT=I )
Statements 105
4
COMMON
The COMMON statement defines a block of main memory storage so that
different program units can share the same data without using arguments.
Syntax
Description
If the common block name is omitted, then blank common block is assumed.
Any common block name including blank common can appear more than once
in COMMON statements in the same 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.
The size of a common block is the sum of the sizes of all the entities in the
common block, plus space for alignment.
Within a program, all common blocks in different program units that have the
same name must be of the same size. However, blank common blocks within a
program are not required to be of the same size.
Restrictions
Formal argument names and function names cannot appear in a COMMON
statement.
Examples
Example 1: Unlabeled common and labeled common:
DIMENSION V(100)
COMMON V, M
COMMON / LIMITS / I, J
…
In the above example, V and M are in the unlabeled common block; I and J are
defined in the named common block, LIMITS.
Example 2: You cannot associate storage of two different common blocks in the
same program unit:
COMMON /X/ A
COMMON /Y/ B
EQUIVALENCE ( A, B) ! ← Not allowed
DIMENSION A(5)
COMMON /X/ B
EQUIVALENCE ( B, A)
COMMON /X/ A
REAL B(2)
EQUIVALENCE ( A, B(2)) ! ← Not allowed
Statements 107
4
COMPLEX
The COMPLEX statement specifies the type of a symbolic constant, variable,
array, function, or dummy function to be complex, optionally specifies array
dimensions and size, and initializes with values.
Syntax
Description
The declarations can be: COMPLEX, COMPLEX*8, COMPLEX*16, or
COMPLEX*32. Specifying the size is nonstandard. ♦
COMPLEX
For a declaration such as COMPLEX W, the variable W is usually two REAL*4
elements contiguous in memory, interpreted as a complex number.
COMPLEX*8 ♦
COMPLEX*16 ♦
COMPLEX*32 ♦
Comments
There is a double-complex version of each complex built-in function. Generally,
the specific function names begin with Z or CD instead of C, except for the two
functions DIMAG and DREAL, which return a real value.
There are specific complex functions for quad precision (SPARC, PowerPC only).
In general, where there is a specific REAL a corresponding COMPLEX with a C
prefix, and a corresponding COMPLEX DOUBLE with a CD prefix, there is also a
quad-precision COMPLEX function with a CQ prefix. Examples are: SIN(),
CSIN(), CDSIN(), CQSIN().
Examples
Example 1: Complex variables. These statements are equivalent.
COMPLEX U, V or,
COMPLEX*8 U, V or,
COMPLEX U*8, V*8
Statements 109
4
Example 3: Double complex, with initialization:
CONTINUE
The CONTINUE statement is a “do-nothing” statement.
Syntax
[ label ] CONTINUE
label Executable statement number
Description
The CONTINUE statement is often used as a place to hang a statement label,
usually it is the end of a DO loop.
Example
DIMENSION U(100)
S = 0.0
DO 1 J = 1, 100
S = S + U(J)
IF ( S .GE. 1000000 ) GO TO 2
1 CONTINUE
STOP
2 CONTINUE
…
Statements 111
4
DATA
The DATA statement initializes variables, substrings, arrays, and array
elements.
Syntax
Description
All initially defined items are defined with the specified values when an
executable program begins running.
Taking into account the repeat factor, the number of constants in clist must be
equal to the number of items in the nlist. The appearance of an array in nlist is
equivalent to specifying a list of all elements in that array. Array elements can
be indexed by constant subscripts only.
If the length of a character item in nlist is less than that of the corresponding
constant in clist, the additional rightmost characters are ignored.
If the constant in clist is of integer type and the item of nlist is of character type,
they must conform to the following rules:
• The character item must have a length of one character.
• The constant must be of type integer and have a value in the range 0
through 255. For ^A, ^B, ^C, do not hold down the Control key and press A,
B, or C; use the CHAR intrinsic function.
Implied DO Lists
An nlist can specify an implied DO list for initialization of array elements.
Statements 113
4
The range of an implied DO loop is dlist. The iteration count for the implied DO
is computed from m1, m2, and m3, and it must be positive.
Variables
Variables can also be initialized in type statements. This is an extension of the
FORTRAN Standard. Examples are given under each of the individual type
statements and under the general type statement. ♦
Examples
Example 1: Character, integer, and real scalars. Real arrays:
CHARACTER TTL*16
REAL VEC(5), PAIR(2)
DATA TTL / 'Arbitrary Titles' /,
& M / 9 /, N / 0 /,
& PAIR(1) / 9.0 /,
& VEC / 3*9.0, 0.1, 0.9 /
…
CHARACTER CR*1
INTEGER I*2, N*4
DATA I / '00' /, N / 4Hs12t /, CR / 13 /
…
DECODE/ENCODE
ENCODE writes to a character variable, array, or array element. ♦ DECODE reads
from a character variable, array, or array element. ♦ Data is edited according to
the format identifier.
Syntax
Description
The entities in the I/O list can be: variables, substrings, arrays, array elements,
record fields. A simple unsubscripted array name specifies all of the elements
of the array in memory storage order, with the leftmost subscript increasing
more rapidly.
1. The ENCODE statement translates the list items to character form according
to the format identifier, and stores the characters in buf. A WRITE operation
on internal files does the same.
Statements 115
4
2. The DECODE statement translates the character data in buf to internal
(binary) form according to the format identifier, and stores the items in the
list. A READ statement does the same.
5. The interaction between the format identifier and the I/O list is the same as
for a formatted I/O statement.
Example
A program using DECODE/ENCODE:
98 76 54
547698
The DECODE reads the characters of S as 3 integers, and stores them into V(1),
V(2), and V(3).
The ENCODE statement writes the values V(3), V(2), and V(1) into T as
characters; T then contains '547698'.
DIMENSION
The DIMENSION statement specifies the number of dimensions for an array,
including the number of elements in each dimension.
Syntax
DIMENSION a ( d ) [,a ( d )] …
a Name of an array
d Specifies the dimensions of the array. It is a list of 1 to 7 declarators
separated by commas.
Description
This section contains descriptions for the dimension declarator and the arrays.
Dimension Declarator
The lower and upper limits of each dimension are designated by a dimension
declarator. The form of a dimension declarator is:
[ dd1 :] dd2
dd1 and dd2 are dimension bound expressions specifying the lower- and upper-
bound values. They can be arithmetic expressions of type integer or real. They
can be formed using constants, symbolic constants, formal arguments, or
variables defined in the COMMON statement. Array references and references to
user-defined functions cannot be used in the dimension bound expression. dd2
can also be an asterisk. If dd1 is not specified, a value of one is assumed. The
value of dd1 must be less than or equal to dd2.
Statements 117
4
Adjustable Array
If the dimension declarator is an arithmetic expression that contains formal
arguments or variables defined in the COMMON statement, then the array is
called an adjustable array. In such cases, the dimension is equal to the initial
value of the argument upon entry into the subprogram.
Assumed-Size Array
The array is called an assumed-size array when the dimension declarator
contains an asterisk. In such cases, the upper bound of that dimension is not
stipulated. An asterisk can only appear for formal arrays and as the upper
bound of the last dimension in an array declarator.
Examples
Example 1: Arrays in a main program:
SUBROUTINE INV( M, N )
DIMENSION M( N, N )
…
END
In the above example, the formal arguments are an array, M, and a variable N. M
is specified to be a square array of dimensions N× N.
PARAMETER ( LO = 1, HI = 9.3 )
DIMENSION A(HI, HI*3 + LO )
…
END
SUBROUTINE ENHANCE( A, X, Y )
DIMENSION A(X : Y)
…
END
SUBROUTINE RUN(A,B,N)
DIMENSION A(*), B(N,*)
...
Statements 119
4
DO
The DO statement repeatedly executes a set of statements.
Syntax
DO s [,] loop-control
or
DO loop-control ♦
s is a statement number.
variable = e1, e2 [, e3 ]
variable Variable of type integer, real, or double precision.
e1, e2, e3 Expressions of type integer, real or double precision, specifying
initial, limit, and increment values respectively.
Description
The DO statement contains the following constructs.
Labeled DO Loop
A labeled DO loop consists of the following:
• DO statement
• Set of executable statements called a block
• Terminal statement, usually a CONTINUE statement
Terminal Statement
The statement identified by s is called the terminal statement. It must follow the
DO statement in the sequence of statements within the same program unit as
the DO statement.
DO Loop Range
The range of a DO loop consists of all of the executable statements that appear
following the DO statement, up to and including the terminal statement.
If a DO statement appears within the range of another DO loop, its range must
be entirely contained within the range of the outer DO loop. More than one
labeled DO loop can have the same terminal statement.
If a DO statement appears within an IF, ELSE IF, or ELSE block, the range of
the associated DO loop must be contained entirely within that block.
Statements 121
4
Block DO Loop ♦
A block DO loop consists of:
• DO statement
• Set of executable statements called a block
• Terminal statement, an END DO statement
1. The expressions e1, e2, and e3 are evaluated. If e3 is not present, its value
is assumed to be one.
If the –onetrip compile time option is specified, then the iteration count is
never less than one.
4. The iteration count is tested, and, if it is greater than zero, the range of the
DO loop is executed.
3. The iteration count is tested, and if it is greater than zero, the statements
in the range of the DO loop are executed again.
Restrictions
The DO variable must not be modified in any way within the range of the DO
loop.
Control must not jump into the range of a DO loop from outside its range.
Comments
In some cases, the DO variable can overflow as a result of an increment that is
performed prior to testing it against the final value. When this happens, your
program has an error, and neither the compiler nor the runtime system detects
it. In this situation, though the DO variable wraps around, the loop can
terminate properly.
If there is a jump into the range of a DO loop from outside its range, a warning
is issued, but execution continues anyway.
When the jump is from outside to the terminal statement that is CONTINUE,
and this statement is the terminal statement of several nested DO loops, then
the most inner DO loop is always executed.
Examples
Example 1: Nested DO loops:
N = 0
DO 210 I = 1, 10
J = I
DO 200 K = 5, 1
L = K
N = N + 1
200 CONTINUE
210 CONTINUE
WRITE(*,*)'I =',I, ', J =',J, ', K =',K, ', N =',N, ', L =',L
END
demo% f77 -silent DoNest1.f
"DoNest1.f", line 4: Warning: DO range never executed
demo% a.out
I = 11, J = 10, K = 5, N = 0, L = 0
demo%
Statements 123
4
The inner loop is not executed, and at the WRITE, L is undefined. Here L is
shown as 0, but that is implementation-dependent; do not rely on it.
6 5 4 3 15
DO WHILE
The DO WHILE ♦ statement repeatedly executes a set of statements while the
specified condition is true.
Syntax
Description
Execution proceeds as follows:
2. If the value of the expression is true, the statements in the range of the DO
WHILE loop are executed.
Terminal Statement
If s is specified, the statement identified by it is called the terminal statement,
and it must follow the DO WHILE statement. The terminal statement must not
be one of the following statements:
• Unconditional GO TO
• Assigned GO TO
• Arithmetic IF
• Block IF / ELSE IF
• ELSE
• END IF
• RETURN
• STOP
• END
• DO / DO WHILE
Statements 125
4
If the terminal statement is a logical IF statement, it can contain any executable
statement, except:
• DO / DO WHILE
• Block IF / ELSE IF
• ELSE
• END IF
• END
• Logical IF
If s is not specified, the DO WHILE loop must end with an END DO statement.
If a DO WHILE statement appears within an IF, ELSE IF, or ELSE block, the
range of the associated DO WHILE loop must be entirely within that block.
Restrictions
Jumping into the range of a DO WHILE loop from outside its range can produce
unpredictable results.
Comments
The variables used in the e can be modified in any way within the range of the
DO WHILE loop.
Examples
Example 1: A DO WHILE without a statement number:
INTEGER A(4,4), C, R
…
C = 4
R = 1
DO WHILE ( C .GT. R )
A(C,R) = 1
C = C - 1
END DO
INTEGER A(4,4), C, R
…
DO 10 WHILE ( C .NE. R )
A(C,R) = A(C,R) + 1
C = C+1
10 CONTINUE
Statements 127
4
DOUBLE COMPLEX
The DOUBLE COMPLEX ♦ statement specifies the type to be double complex. It
optionally specifies array dimensions and size, and initializes with values.
Syntax
Description
The declaration can be: DOUBLE COMPLEX or COMPLEX*16.
DOUBLE COMPLEX ♦
For a declaration such as DOUBLE COMPLEX Z, the variable Z is two REAL*8
elements contiguous in memory, interpreted as one double-width complex
number.
The default size, for a declaration such as DOUBLE COMPLEX Z, can be altered
by compiling with any of the options -dbl, -r8, or -xtypemap. See the
discussion in Chapter 2 for details.
COMPLEX*16 ♦
For a declaration such as COMPLEX*16 Z, the variable Z is always two
REAL*8 elements contiguous in memory, interpreted as one double-width
complex number.
Comments
There is a double-complex version of each complex built-in function. Generally,
the specific function names begin with Z or CD instead of C, except for the two
functions, DIMAG and DREAL, which return a real value. Examples are: SIN(),
CSIN(), CDSIN().
DOUBLE COMPLEX U, V
DOUBLE COMPLEX W(3,6)
COMPLEX*16 X, Y(5,5)
COMPLEX U*16(5), V(5)*16
Statements 129
4
DOUBLE PRECISION
The DOUBLE PRECISION statement specifies the type to be double precision,
and optionally specifies array dimensions and initializes with values.
Syntax
Description
The declaration can be: DOUBLE PRECISION or REAL*8.
DOUBLE PRECISION
For a declaration such as DOUBLE PRECISION X, the variable X is a REAL*8
element in memory, interpreted as one double-width real number.
If you do not specify the size, a default size is used. The default size, for a
declaration such as DOUBLE PRECISION X, can be altered by compiling with
any of the options -dbl, -r8, or -xtypemap. See the discussion in Chapter 2
for details.
REAL*8 ♦
Example
For example:
ELSE
The ELSE statement indicates the beginning of an ELSE block.
Syntax
IF ( e ) THEN
...
ELSE
...
END IF
e Logical expression
Description
Execution of an ELSE statement has no effect on the program.
An ELSE block consists of all the executable statements following the ELSE
statements, up to but not including the next END IF statement at the same IF
level as the ELSE statement. See Section , “IF (Block),” for more details.
Restrictions
You cannot jump into an ELSE block from outside the ELSE block.
A matching END IF statement of the same IF level as the ELSE must appear
before any ELSE IF or ELSE statement at the same IF level.
Statements 131
4
Examples
Example 1: ELSE:
CHARACTER S
…
IF ( S .GE. '0' .AND. S .LE. '9' ) THEN
CALL PUSH
ELSE
CALL TOLOWER
END IF
…
IF ( K .GT. 5 ) THEN
N = 1
ELSE
N = 0
ELSE IF ( K .EQ. 5 ) THEN ←Incorrect
…
ELSE IF
The ELSE IF provides a multiple alternative decision structure.
Syntax
IF ( e1 ) THEN
ELSE IF ( e2 ) THEN
END IF…
e1 and e2 Logical expressions
Description
You can make a series of independent tests, and each test can have its own
sequence of statements.
An ELSE IF block consists of all the executable statements following the ELSE
IF statement up to, but not including, the next ELSE IF, ELSE, or END IF
statement at the same IF level as the ELSE IF statement.
1. e is evaluated.
Restrictions
You cannot jump into an ELSE IF block from outside the ELSE IF block.
Statements 133
4
The statement label, if any, of an ELSE IF statement cannot be referenced by
any statement.
Example
Example: ELSE IF:
READ (*,*) N
IF ( N .LT. 0 ) THEN
WRITE(*,*) 'N<0'
ELSE IF ( N .EQ. 0) THEN
WRITE(*,*) ’N=0’
ELSE
WRITE(*,*) ’N>0’
END IF
ENCODE/DECODE
The ENCODE ♦ statement writes data from a list to memory.
Syntax
Description
ENCODE is provided for compatibility with older versions of FORTRAN.
Similar functionality can be accomplished using internal files with a formatted
sequential WRITE statement. ENCODE is not in the FORTRAN Standard.
Example
The DECODE reads the characters of S as 3 integers, and stores them into V(1),
V(2), and V(3). The ENCODE statement writes the values V(3), V(2), and
V(1), into T as characters; T then contains '547698'.
Statements 135
4
END
The END statement indicates the end of a program unit.
Syntax
END
Description
The END statement:
• Must be the last statement in the program unit.
• Must be the only statement in a line.
• Can have a label.
In the FORTRAN Standard, the END statement cannot be continued, but f77
allows this practice. ♦
No other statement, such as an END IF statement, can have an initial line that
appears to be an END statement.
Example
Example: END:
PROGRAM MAIN
WRITE( *, * ) 'Very little'
END
END DO
The END DO statement terminates a DO loop. ♦
Syntax
END DO
Description
The END DO statement is the delimiting statement of a Block DO statement. If
the statement label is not specified in a DO statement, the corresponding
terminating statement must be an END DO statement. You can branch to an END
DO statement only from within the range of the DO loop that it terminates.
Examples
Example 1: A DO loop with a statement number:
DO 10 N = 1, 100
…
10 END DO
DO N = 1, 100
…
END DO
Statements 137
4
END FILE
The END FILE statement writes an end-of-file record as the next record of the
file connected to the specified unit.
Syntax
END FILE u
END FILE ( [ UNIT= ] u [, IOSTAT= ios ] [, ERR= s ])
u Unit identifier of an external unit connected to the file, The options can be
specified in any order, but if UNIT= is omitted, then u must be first.
ios I/O status specifier, an integer variable or an integer array element.
s Error specifier, s must be the label of an executable statement in the same
program in which the END FILE statement occurs. The program control is
transferred to the label in the event of an error during the execution of the
END FILE statement.
Description
If you are using the ENDFILE statement and other standard FORTRAN I/O for
tapes, we recommend that you use the TOPEN() routines instead, because they
are more reliable.
Two endfile records signify the end-of-tape mark. When writing to a tape file,
ENDFILE writes two endfile records, then the tape backspaces over the second
one. If the file is closed at this point, both end-of-file and end-of-tape are
marked. If more records are written at this point, either by continued write
statements or by another program if you are using no-rewind magnetic tape,
the first tape mark stands (endfile record), and is followed by another data file,
then by more tape marks, and so on.
Restrictions
u must be connected for sequential access. Execution of an END FILE statement
on a direct-access file is not defined in the FORTRAN Standard, and is
unpredictable. Do not use an END FILE statement on a direct-access file.
Examples
Example 1: Constants:
END FILE 2
END FILE ( 2 )
END FILE ( UNIT=2 )
Example 2: Variables:
LOGUNIT = 2
END FILE LOGUNIT
END FILE ( LOGUNIT )
END FILE ( UNIT=LOGUNIT )
NOUT = 2
END FILE ( UNIT=NOUT, IOSTAT=KODE, ERR=9)
…
9 WRITE(*,*) 'Error at END FILE, on unit', NOUT
STOP
Statements 139
4
END IF
The END IF statement ends the block IF that the IF began.
Syntax
END IF
Description
For each block IF statement there must be a corresponding END IF statement
in the same program unit. An END IF statement matches if it is at the same IF
level as the block IF statement.
Examples
Example 1: IF/END IF:
IF ( N .GT. 0 )THEN
N = N+1
END IF
IF ( N .EQ. 0 ) THEN
N = N+1
ELSE
N = N-1
END IF
END MAP
The END MAP ♦ statement terminates the MAP declaration.
Syntax
END MAP
Description
See Section , “UNION and MAP.”
Restrictions
The MAP statement must be within a UNION statement.
Example
…
MAP
CHARACTER *16 MAJOR
END MAP
…
Statements 141
4
END STRUCTURE
The END STRUCTURE ♦ statement terminates the STRUCTURE statement.
Syntax
END STRUCTURE
Description
See Section , “STRUCTURE.”
Example
STRUCTURE /PROD/
INTEGER*4 ID
CHARACTER*16 NAME
CHARACTER*8 MODEL
REAL*4 COST
REAL*4 PRICE
END STRUCTURE
END UNION
The END UNION ♦ statement terminates the UNION statement.
Syntax
END UNION
Description
See Section , “UNION and MAP.”
Example
UNION
MAP
CHARACTER*16
END MAP
MAP
INTEGER*2 CREDITS
CHARACTER *8 GRAD_DATE
END MAP
END UNION
Statements 143
4
ENTRY
The ENTRY statement defines an alternate entry point within a subprogram.
Syntax
ENTRY en [ ( [ fa [, fa ] … ] ) ]
en Symbolic name of an entry point in a function or subroutine subprogram
fa Formal argument—it can be a variable name, array name, formal procedure
name, or an asterisk specifying an alternate return label.
Description
Note these nuances for the ENTRY statement:
The entry name cannot be used in the executable statements that physically
precede the appearance of the entry name in an ENTRY statement.
Parameter Correspondence
The formal arguments of an ENTRY statement need not be the same in order,
number, type, and name as those for FUNCTION, SUBROUTINE, and other
ENTRY statements in the same subprogram. Each reference to a function,
Restrictions
An ENTRY statement cannot be used within a block IF construct or a DO loop.
Examples
Example 1: Multiple entry points in a subroutine:
SUBROUTINE FIN( A, B, C )
INTEGER A, B
CHARACTER C*4
…
RETURN
ENTRY HLEP( A, B, C )
…
RETURN
ENTRY MOOZ
…
RETURN
END
In the above example, the subroutine FIN has two alternate entries: the entry
HLEP has an argument list; the entry MOOZ has no argument list.
Statements 145
4
Example 2: In the calling routine, you can call the above subroutine and entries
as follows:
INTEGER A, B
CHARACTER C*4
…
CALL FIN( A, B, C )
…
CALL MOOZ
…
CALL HLEP( A, B, C )
…
In the above example, the order of the call statements need not match the order
of the entry statements.
REAL FUNCTION F2 ( X )
F2 = 2.0 * X
RETURN
ENTRY F3 ( X )
F3 = 3.0 * X
RETURN
ENTRY FHALF ( X )
FHALF = X / 2.0
RETURN
END
EQUIVALENCE
The EQUIVALENCE statement specifies that two or more variables or arrays in a
program unit share the same memory.
Syntax
Description
An EQUIVALENCE statement stipulates that the storage sequence of the entities
whose names appear in the list nlist must have the same first memory location.
Restrictions
In nlist, dummy arguments and functions are not permitted.
Subscripts of array elements must be integer constants greater than the lower
bound and less than or equal to the upper bound.
Statements 147
4
An EQUIVALENCE statement cannot specify that the same storage unit is to
occur more than once in a storage sequence. For example, the following
statement is not allowed:
DIMENSION A (2)
EQUIVALENCE (A(1),B), (A(2),B)
REAL A (2)
DOUBLE PRECISION D (2)
EQUIVALENCE (A(1), D(1)), (A(2), D(2))
Example
01 02 03 04 05 06 07
C C(1) C(2)
EXTERNAL
The EXTERNAL statement specifies procedures or dummy procedures as
external, and allows their symbolic names to be used as actual arguments.
Syntax
Description
If an external procedure or a dummy procedure is an actual argument, it must
be in an EXTERNAL statement in the same program unit.
Restrictions
A subroutine or function name can appear in only one of the EXTERNAL
statements of a program unit.
Examples
Example 1: Use your own version of TAN:
EXTERNAL TAN
T = TAN( 45.0 )
…
END
FUNCTION TAN( X )
…
RETURN
END
Statements 149
4
Example 2: Pass a user-defined function name as an argument:
FUNCTION FCN( X )
…
RETURN
END
FORMAT
The FORMAT statement specifies the layout of the input or output records.
Syntax
label FORMAT ( f )
label Statement number
f Format specification list
[ r ] d
[ r ] ( f )
r A repeat factor
d An edit descriptor (repeatable or nonrepeatable). If r is present, then d must
be repeatable.
I F E D G
Iw Fw Ew Dw Gw
Iw.m Fw.m Ew.m Dw.m Gw.m
O A Ew.m.e Dw.m.e Gw.m.e
Ow Aw Ew.mEe Dw.mEe Gw.mEe
Ow.m L
Z Lw
Zw
Zw.m
Here is a summary:
• I, O, Z are for integers (decimal, octal, hex)
• F, E, D, G are for reals (fixed-point, exponential, double, general)
• A is for characters
• L is for logicals
Statements 151
4
See the section,“Formatted I/O,” in Chapter , “Input and Output,” for full
details of these edit descriptors.
Description
The FORMAT statement includes the explicit editing directives to produce or
use the layout of the record. It is used with formatted input/output statements
and ENCODE/DECODE statements.
Repeat Factor
r must be a nonzero, unsigned, integer constant.
("), ($), ('), (/), (:), B, BN, BZ, H, P, R, Q, S, SU, SP, SS, T, TL, TR, X
These descriptors indicate the manner of editing and are not repeatable:
• Each ai is any ASCII character.
• n is a nonzero, unsigned integer constant.
• k is an optionally signed integer constant.
Item Separator
Items in the format specification list are separated by commas. A comma can
be omitted before or after the slash and colon edit descriptors, between a P edit
descriptor, and the immediately following F, E, D, or G edit descriptors.
In some sense, the comma can be omitted anywhere the meaning is clear
without it, but, other than those cases listed above, this is nonstandard. ◆
Restrictions
The FORMAT statement label cannot be used in a GO TO, IF-arithmetic, DO, or
alternate return.
Statements 153
4
Warnings
For constant formats, invalid format strings cause warnings or error messages
at compile time.
For variable format expressions, of the form <e>, invalid format strings cause
warnings or error messages at compile time or runtime.
See Chapter 5, “Input and Output,” for more details and more examples.
Examples
Example 1: Some A, I, and F formats:
DO 100 N = 1, 50
…
1 FORMAT( 2X, F<N+1>.2 )
FUNCTION (External)
The FUNCTION statement identifies a program unit as a function subprogram.
Syntax
Description
Note the type, value, and formal arguments for a FUNCTION statement.
Type of Function
The function statement involves type, name, and formal arguments.
Statements 155
4
If type is not present in the FUNCTION statement, then the type of the function
is determined by default and by any subsequent IMPLICIT or type statement.
If type is present, then the function name cannot appear in other type
statements.
Note – Compiling with any of the options -dbl, -r8, -i2, or -xtypemap can
alter the default data size assumed in the call to or definition of functions
unless the data type size is explicitly declared. See Chapter 2 and the Fortran
User Guide for details on these options.
Value of Function
The symbolic name of the function must appear as a variable name in the
subprogram. The value of this variable, at the time of execution of the RETURN
or END statement in the function subprogram, is the value of the function.
Formal Arguments
The list of arguments defines the number of formal arguments. The type of
these formal arguments is defined by some combination of default, type
statements, IMPLICIT statements, and DIMENSION statements.
The number of formal arguments must be the same as the number of actual
arguments at the invocation of this function subprogram.
A function can assign values to formal arguments. These values are returned to
the calling program when the RETURN or END statements are executed in the
function subprogram.
Restrictions
Alternate return specifiers are not allowed in FUNCTION statements.
Examples
Example 1: Character function:
In the above example, the function SQR is defined as function of type REAL by
default, and returns the square of the number passed to it.
Statements 157
4
GO TO (Assigned)
The assigned GO TO statement branches to a statement label identified by the
assigned label value of a variable.
Syntax
GO TO i [ [,] ( s [, s ] … ) ]
i Integer variable name
s Statement label of an executable statement
Description
Execution proceeds as follows:
Restrictions
i must be assigned by an ASSIGN statement in the same program unit as the
GO TO statement.
The same statement label can appear more than once in a GO TO statement.
The statement control jumps to must be executable, not DATA, ENTRY, FORMAT,
or INCLUDE.
Control cannot jump into a DO, IF, ELSE IF, or ELSE block from outside the
block.
Example
Example: Assigned GO TO:
ASSIGN 10 TO N
…
GO TO N ( 10, 20, 30, 40 )
…
10 CONTINUE
…
40 STOP
GO TO (Computed)
The computed GO TO statement selects one statement label from a list,
depending on the value of an integer or real expression, and transfers control
to the selected one.
Syntax
GO TO ( s [, s ] … ) [,] e
s Statement label of an executable statement
e Expression of type integer or real
Description
Execution proceeds as follows:
3. If the value of e is outside the range, that is, e < 1 or e > n, then the
computed GO TO statement serves as a CONTINUE statement.
Statements 159
4
Restrictions
s must be in the same program unit as the GO TO statement.
The same statement label can appear more than once in a GO TO statement.
The statement control jumps to must be executable, not DATA, ENTRY, FORMAT,
or INCLUDE.
Control cannot jump into a DO, IF, ELSE IF, or ELSE block from outside the
block.
Example
Example: Computed GO TO:
…
GO TO ( 10, 20, 30, 40 ), N
…
10 CONTINUE
…
20 CONTINUE
…
40 CONTINUE
GO TO (Unconditional)
The unconditional GO TO statement transfers control to a specified statement.
Syntax
GO TO s
s Statement label of an executable statement
Description
Execution of the GO TO statement transfers control to the statement labeled s.
Restrictions
s must be in the same program unit as the GO TO statement.
Control cannot jump into a DO, IF, ELSE IF, or ELSE block from outside the
block.
Example
A = 100.0
B = 0.01
GO TO 90
…
90 CONTINUE
Statements 161
4
IF (Arithmetic)
The arithmetic IF statement branches to one of three specified statements,
depending on the value of an arithmetic expression.
Syntax
IF ( e ) s1, s2, s3
e Arithmetic expression: integer, real, double precision, or quadruple precision
s1, s2, s3 Labels of executable statements
Description
The IF statement transfers control to the first, second, or third label if the value
of the arithmetic expression is less than zero, equal to zero, or greater than
zero, respectively.
Example
N = 0
IF ( N ) 10, 20, 30
IF (Block)
The block IF statement executes one of two or more sequences of statements,
depending on the value of a logical expression.
Syntax
IF ( e ) THEN
…
END IF
e A logical expression
Description
The block IF statement evaluates a logical expression and, if the logical
expression is true, it executes a set of statements called the IF block. If the
logical expression is false, control transfers to the next ELSE, ELSE IF, or END
IF statement at the same IF-level.
IF Level
The IF level of a statement S is the value n1–n2, where n1 is the number of
block IF statements from the beginning of the program unit up to the end,
including S; n2 is the number of END IF statements in the program unit up to,
but not including, S.
Statements 163
4
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.
IF Block
An IF block consists of all the executable statements following the block IF
statement, up to, but not including, the next ELSE, ELSE IF, or END IF
statement that has the same if level as the block IF statement. An IF block
can be empty. In the following example, the two assignment statements form
an IF block:
IF ( X .LT. Y ) THEN
M = 0
N = N+1
END IF
2. If e is true and the IF block is empty, control is transferred to the next END
IF statement with the same IF level as the block IF statement.
4. If the last statement of the IF block does not result in a branch to a label,
control is transferred to the next END IF statement that has the same IF
level as the block IF statement preceding the IF block.
Restrictions
Control cannot jump into an IF block from outside the IF block.
Examples
Example 1: IF-THEN-ELSE:
IF ( L ) THEN
N=N+1
CALL CALC
ELSE
K=K+1
CALL DISP
END IF
Statements 165
4
IF (Logical)
The logical IF statement executes one single statement, or does not execute it,
depending on the value of a logical expression.
Syntax
IF ( e ) st
e Logical expression
st Executable statement
Description
The logical IF statement evaluates a logical expression and executes the
specified statement if the value of the logical expression is true. The specified
statement is not executed if the value of the logical expression is false, and
execution continues as though a CONTINUE statement had been executed.
st can be any executable statement, except a DO block, IF, ELSE IF, ELSE,
END IF, END, or another logical IF statement.
Example
IMPLICIT
The IMPLICIT statement confirms or changes the default type of names.
Syntax
Description
The different uses for implicit typing and no implicit typing are described here.
Statements 167
4
Implicit Typing
The IMPLICIT statement can also indicate that no implicit typing rules apply
in a program unit.
An IMPLICIT statement specifies a type and size for all user-defined names
that begin with any letter, either a single letter or in a range of letters,
appearing in the specification.
An IMPLICIT statement does not change the type of the intrinsic functions.
An IMPLICIT statement applies only to the program unit that contains it.
IMPLICIT types for particular user names are overridden by a type statement.
Note – Compiling with any of the options -dbl, -i2, -r8, or -xtypemap can
alter the assumed size of names typed with an IMPLICIT statement that does
not specify a size: IMPLICIT REAL (A-Z). See Chapter 2 and the Fortran
User’s Guide for details.
No Implicit Typing
The second form of IMPLICIT specifies that no implicit typing should be done
for user-defined names, and all user-defined names shall have their types
declared explicitly.
Restrictions
IMPLICIT statements must precede all other specification statements.
The same letter can appear more than once as a single letter, or in a range of
letters in all IMPLICIT statements of a program unit. ♦
The FORTRAN Standard restricts this usage to only once. For f77, if a letter is
used twice, each usage is declared in order. See Example 4.
Examples
Example 1: IMPLICIT: everything is integer:
IMPLICIT NONE
CHARACTER STR*8
INTEGER N
REAL Y
N = 100
Y = 1.0E5
STR = 'Length'
In the above example, once IMPLICIT NONE is specified in the beginning. All
the variables must be declared explicitly.
Statements 169
4
INCLUDE
The INCLUDE ♦ statement inserts a file into the source program.
Syntax
INCLUDE 'file'
or:
INCLUDE "file"
file Name of the file to be inserted
Description
The contents of the named file replace the INCLUDE statement.
Search Path
If the name referred to by the INCLUDE statement begins with the character /,
then it is taken by f77 to mean the absolute path name of the INCLUDE file.
Otherwise, f77 looks for the file in the following directories, in this order:
1. The directory that contains the source file with the INCLUDE statement
4. The directories in the default list. For a standard install, the default list is:
/opt/SUNWspro/SC4.2/include/f77 /usr/include
The release number, SC4.2, varies with the release of the set of compilers.
Preprocessor #include
The paths and order searched for the INCLUDE statement are not the same as
those searched for the preprocessor #include directive, described under -I in
the Fortran User’s Guide. Files included by the preprocessor #include
directive can contain #defines and the like; files included with the compiler
INCLUDE statement must contain only FORTRAN statements.
where each lname is a logical name and each path1, path2, and so forth is
the path name of a directory (without a trailing /).
• All blanks are ignored when parsing this string. It strips any trailing
/[no]list from the file name in the INCLUDE statement.
• Logical names in a file name are delimited by the first : in the VMS file
name, so f77 converts file names of the lname1:file form to the path1/file
form.
• For logical names, uppercase and lowercase are significant. If a logical
name is encountered on the INCLUDE statement which is not specified in
the LOGICALNAMEMAPPING, the file name is used, unchanged.
Examples
Example 1: INCLUDE, simple case:
INCLUDE 'stuff'
Statements 171
4
The above line is replaced by the contents of the file stuff.
INCLUDE 'ver1/const.h'
In this example, f77 seeks const.h in these directories, in the order shown.
INQUIRE
The INQUIRE statement returns information about a unit or file.
Syntax
An inquire by unit has the general form:
The INQUIRE slist can include one or more of the following, in any order:
• ERR = s
• EXIST = ex
• OPENED = od
• NAMED = nmd
• ACCESS = acc
• SEQUENTIAL = seq
• DIRECT = dir
• FORM = fm
• FORMATTED = fmt
• UNFORMATTED = unf
• NAME = fn
• BLANK = blnk
• IOSTAT = ios
• NUMBER = num
• RECL = rcl
• NEXTREC = nr
Statements 173
4
Description
You can determine such things about a file as whether it exists, is opened, or is
connected for sequential I/O. That is, files have such attributes as name,
existence (or nonexistence), and the ability to be connected in certain ways
(FORMATTED, UNFORMATTED, SEQUENTIAL, or DIRECT).
Inquire either by unit or by file, but not by both in the same statement.
In this system environment, the only way to discover what permissions you
have for a file is to use the ACCESS(3F) function. The INQUIRE statement does
not determine permissions.
Statements 175
4
returned by INQUIRE. The OPEN statement does such an adjustment if the -
xl[d] option is set. For an explanation of -xl[d], see the section, “Details
of Features That Require -xl[d]” on page 370.
• NEXTREC = nr
nr is an integer variable that is assigned one more than the number of the
last record read from a file connected for direct access.
• BLANK = blnk
blnk is a character variable that is assigned the value 'NULL' if null blank
control is in effect for the file connected for formatted I/O, and 'ZERO' if
blanks are being converted to zeros and the file is connected for formatted
I/O.
OPEN( 1, FILE='/dev/console' )
For f77, this statement opens the console for formatted sequential I/O. An
INQUIRE for either unit 1 or the file, /dev/console, reveals that the file:
• Exists
• Is connected to unit 1
• Has the name /dev/console
• Is opened for sequential I/O
• Could be connected for sequential I/O
• Cannot be connected for direct I/O, that is cannot seek
• Is connected for formatted I/O
• Can be connected for formatted I/O
• Cannot be connected for unformatted I/O, that is, cannot seek
• Has neither a record length nor a next record number
• Is ignoring blanks in numeric fields
Statements 177
4
Also:
• If a file is scratch, then NAMED and NUMBER are not returned.
• If there is no file with the specified name, then these variables are not
returned: DIRECT, FORMATTED, NAME, NAMED, SEQUENTIAL, and
UNFORMATTED.
• If OPENED=.FALSE., then these variables are not returned: ACCESS, BLANK,
FORM, NEXTREC, and RECL.
• If no file is connected to the specified unit, then these variables are not
returned: ACCESS, BLANK, DIRECT, FORM, FORMATTED, NAME, NAMED,
NEXTREC, NUMBER, RECL, SEQUENTIAL, and UNFORMATTED.
• If ACCESS='SEQUENTIAL', then these variables are not returned: RECL and
NEXTREC.
• If FORM='UNFORMATTED’, then BLANK is not returned.
Examples
Example 1: Inquire by unit:
LOGICAL OK
INQUIRE( UNIT=3, OPENED=OK )
IF ( OK ) CALL GETSTD ( 3, STDS )
LOGICAL THERE
INQUIRE( FILE='.profile', EXIST=THERE )
IF ( THERE ) CALL GETPROFILE( FC, PROFILE )
CHARACTER FN*32
LOGICAL HASNAME, OK
INQUIRE ( 3, OPENED=OK, NAMED=HASNAME, NAME=FN )
IF ( OK .AND. HASNAME ) PRINT *, 'Filename="', FN, '"'
INTEGER
The INTEGER statement specifies the type to be integer for a symbolic constant,
variable, array, function, or dummy function.
Optionally, it specifies array dimensions and size and initializes with values.
Syntax
Description
The declarations can be: INTEGER, INTEGER*2, INTEGER*4, INTEGER*8.
INTEGER
For a declaration such as INTEGER H, the variable H is usually one INTEGER*4
element in memory, interpreted as a single integer number. Specifying the size
is nonstandard. ♦
If you do not specify the size, a default size is used. The default size, for a
declaration such as INTEGER H, can be altered by compiling with any of the
options -dbl, -i2, -r8, or -xtypemap. See the discussion in Chapter 2 for
details.
INTEGER*2 ♦
Statements 179
4
INTEGER*4 ♦
INTEGER*8 ♦
Restrictions
Do not use INTEGER*8 variables or 8-byte constants or expressions when
indexing arrays, otherwise, only 4 low-order bytes are taken into account. This
action can cause unpredictable results in your program if the index value
exceeds the range for 4-byte integers.
Examples
Example 1: Each of these integer declarations are equivalent:
INTEGER U, V(9) or
INTEGER*4 U, V(9) or
INTEGER U*4, V(9)*4
Example 2: Initialize:
INTRINSIC
The INTRINSIC statement lists intrinsic functions that can be passed as actual
arguments.
Syntax
Description
If the name of an intrinsic function is used as an actual argument, it must
appear in an INTRINSIC statement in the same program unit.
Restrictions
A symbolic name must not appear in both an EXTERNAL and an INTRINSIC
statement in the same program unit.
The actual argument must be a specific name. Most generic names are also
specific, but a few are not: IMAG, LOG, and LOG10.
A symbolic name can appear more than once in an INTRINSIC statement.In the
FORTRAN Standard, a symbolic name can appear only once in an INTRINSIC
statement. ♦
Statements 181
4
Because they are in-line or generic, the following intrinsics cannot be passed as
actual arguments:
LOGICAL
The LOGICAL statement specifies the type to be logical for a symbolic constant,
variable, array, function, or dummy function.
Syntax
Description
The declarations can be: LOGICAL, LOGICAL*1, LOGICAL*2, LOGICAL*4,
LOGICAL*8.
LOGICAL
For a declaration such as LOGICAL H, the variable H is usually one INTEGER*4
element in memory, interpreted as a single logical value. Specifying the size is
nonstandard. ♦
If you do not specify the size, a default size is used. The default size, for a
declaration such as LOGICAL Z, can be altered by compiling with any of the
options -dbl, -i2,-r8, or -xtypemap. See the discussion in Chapter 2 for
details.
LOGICAL*1 ♦
Statements 183
4
LOGICAL*2 ♦
LOGICAL*4 ♦
LOGICAL*8 ♦
Examples
Example 1: Each of these declarations are equivalent:
LOGICAL U, V(9) or
LOGICAL*4 U, V(9) or
LOGICAL U*4, V(9)*4
Example 2: Initialize:
MAP
The MAP ♦ declaration defines alternate groups of fields in a union.
Syntax
MAP
field-declaration
…
[field-declaration]
END MAP
Description
Each field declaration can be one of the following:
• Type declaration, which can include initial values
• Substructure—either another structure declaration, or a record that has been
previously defined
• Union declaration—see Section , “UNION and MAP,” for more details
Example
Example: MAP:
STRUCTURE /STUDENT/
CHARACTER*32 NAME
INTEGER*2 CLASS
UNION
MAP
CHARACTER*16 MAJOR
END MAP
MAP
INTEGER*2 CREDITS
CHARACTER*8 GRAD_DATE
END MAP
END UNION
END STRUCTURE
Statements 185
4
NAMELIST
The NAMELIST ♦ statement defines a list of variables or array names, and
associates it with a unique group name.
Syntax
Description
The NAMELIST statement contains a group name and other items.
Group Name
The group name is used in the namelist-directed I/O statement to identify the
list of variables or arrays that are to be read or written. This name is used by
namelist-directed I/O statements instead of an input/output list. The group
name must be unique, and identifies a list whose items can be read or written.
Namelist Items
The namelist items can be of any data type. The items in the namelist can be
variables or arrays, and can appear in more than one namelist. Only the items
specified in the namelist can be read or written in namelist-directed I/O, but it
is not necessary to specify data in the input record for every item of the
namelist.
The order of the items in the namelist controls the order in which the values
are written in namelist-directed output. The items in the input record can be in
any order.
Restrictions
Input data can assign values to the elements of arrays or to substrings of
strings that appear in a namelist.
Example
Example: The NAMELIST statement:
CHARACTER*16 SAMPLE
LOGICAL*4 NEW
REAL*4 DELTA
NAMELIST /CASE/ SAMPLE, NEW, DELTA
In this example, the group CASE has three variables: SAMPLE, NEW, and DELTA.
Statements 187
4
OPEN
The OPEN statement connects an existing external file to a unit, or creates a file
and connects it to a unit, or changes some specifiers of the connection.
Syntax
Description
The OPEN statement determines the type of file named, whether the connection
specified is legal for the file type (for instance, DIRECT access is illegal for tape
and tty devices), and allocates buffers for the connection if the file is on tape
or if the subparameter FILEOPT='BUFFER=n' is specified. Existing files are
never truncated on opening. The options can be specified in any order.
Details of the OPEN keyword specifier are listed in the following table.
[UNIT=] u
u is an integer expression or an asterisk (*) that specifies the unit number. u is required. If u is first in the parameter
list, then UNIT= can be omitted.
FILE=fin
fin is a character expression or * naming the file to open. An OPEN statement need not specify a file name. If the file
name is not specified, a default name is created.
Reopen—If you open a unit that is already open without specifying a file name (or with the previous file name),
FORTRAN thinks you are reopening the file to change parameters. The file position is not changed. The only
parameters you are allowed to change are BLANK (NULL or ZERO) and FORM (FORMATTED or PRINT). To change any
other parameters, you must close, then reopen the file.
Switch Files—If you open a unit that is already open, but you specify a different file name, it is as if you closed
with the old file name before the open.
Switch Units—If you open a file that is already open, but you specify a different unit, that is an error. This error is
not detected by the ERR= option, however, and the program does not terminate abnormally.
Scratch—If a file is opened with STATUS='SCRATCH', a temporary file is created and opened. See STATUS=sta.
Statements 189
4
Table 4-5 OPEN Keyword Specifier Details (Continued)
ACCESS=acc
The ACCESS=acc clause is optional. acc is a character expression. Possible values are: APPEND, DIRECT, or
SEQUENTIAL. The default is SEQUENTIAL.
If ACCESS='APPEND': SEQUENTIAL and FILEOPT='EOF' are assumed. This is for opening a file to append
records to an existing sequential-access file. Only WRITE operations are allowed. This is an extension and can be
applied only to disk files. ♦
If ACCESS='DIRECT': RECL must also be given, since all I/O transfers are done in multiples of fixed-size records.
Only directly accessible files are allowed; thus, tty, pipes, and magnetic tape are not allowed. If you build a file as
sequential, then you cannot access it as direct.
If FORM is not specified, unformatted transfer is assumed.
If FORM='UNFORMATTED', the size of each transfer depends upon the data transferred.
If ACCESS='SEQUENTIAL', RECL is ignored. ♦ The FORTRAN Standard prohibits RECL for sequential access.
No padding of records is done.
If you build a file as direct, then you cannot access it as sequential.
Files do not have to be randomly accessible, in the sense that tty, pipes, and tapes can be used. For tapes, we
recommend the TOPEN() routines because they are more reliable.
If FORM is not specified, formatted transfer is assumed.
If FORM='FORMATTED', each record is terminated with a newline (\n) character; that is, each record actually has
one extra character.
If FORM='PRINT', the file acts like a FORM='FORMATTED' file, except for interpretation of the column-1 characters
on the output (blank = single space, 0 = double space, 1 = form feed, and + = no advance).
If FORM='UNFORMATTED', each record is preceded and terminated with an INTEGER*4 count, making each record
8 characters longer than normal. This convention is not shared with other languages, so it is useful only for
communicating between FORTRAN programs.
FORM=fm
The FORM=fm clause is optional. fm is a character expression. Possible values are 'FORMATTED', 'UNFORMATTED',
or 'PRINT'. ♦ The default is 'FORMATTED'.
This option interacts with ACCESS.
'PRINT' makes it a print file. See Chapter 5, “Input and Output,” for details.
RECL=rl
The RECL=rl clause is required if ACCESS='DIRECT' and ignored otherwise.
rl is an integer expression for the length in characters of each record of a file. rl must be positive.
If the record length is unknown, you can use RECL=1; see “Direct Access I/O” on page 265.
If -xl[d] is not set, rl is number of characters, and record length is rl.
If -xl[d] is set, rl is number of words, and record length is rl*4. ♦
There are more details in the ACCESS='SEQUENTIAL' section, above.
Each WRITE defines one record and each READ reads one record (unread characters are flushed).
The default buffer size for tape is 64K characters. For tapes, we recommend the TOPEN() routines because they are
more reliable.
ERR=s
The ERR=s clause is optional. s is a statement label of a statement to branch to if an error occurs during execution
of the OPEN statement.
IOSTAT=ios
The IOSTAT=ios clause is optional. ios is an integer variable that receives the error status from an OPEN. After the
execution of the OPEN, if no error condition exists, then ios is zero; otherwise, it is some positive number.
If you want to avoid aborting the program when an error occurs on an OPEN, include ERR=s or IOSTAT=ios.
BLANK=blnk
The BLANK=blnk clause is optional, and is for formatted input only. The blnk is a character expression that indicates
how blanks are treated. Possible values are 'ZERO' and 'NULL'.
'ZERO'—Blanks are treated as zeroes.
'NULL'—Blanks are ignored during numeric conversion. This is the default.
STATUS=sta
The STATUS=sta clause is optional. sta is a character expression. Possible values are: 'OLD', 'NEW', 'UNKNOWN', or
'SCRATCH'.
'OLD'— The file already exists (nonexistence is an error). For example: STATUS='OLD'.
'NEW' — The file doesn't exist (existence is an error). If 'FILE=name' is not specified, then a file named
'fort.n' is opened, where n is the specified logical unit.
'UNKNOWN' — Existence is unknown. This is the default.
Statements 191
4
Table 4-5 OPEN Keyword Specifier Details (Continued)
STATUS=sta (Continued)
'SCRATCH' — For a file opened with STATUS='SCRATCH', a temporary file with a name of the form
tmp.FAAAxnnnnn is opened. Any other STATUS specifier without an associated file name results in opening a file
named 'fort.n', where n is the specified logical unit number. By default, a scratch file is deleted when closed or
during normal termination. If the program aborts, then the file may not be deleted. To prevent deletion, CLOSE
with STATUS='KEEP'.
The FORTRAN Standard prohibits opening a named file as scratch: if OPEN has a FILE=name option, then it cannot
have a STATUS='SCRATCH' option. This FORTRAN extends the standard by allowing opening named files as
scratch. ♦ Such files are normally deleted when closed or at normal termination.
TMPDIR: FORTRAN programs normally put scratch files in the current working directory. If the TMPDIR
environment variable is set to a writable directory, then the program puts scratch files there. ♦
FILEOPT=fopt ♦
The FILEOPT=fopt clause is optional. fopt is a character expression. Possible values are 'NOPAD', 'BUFFER=n', and
'EOF'.
'NOPAD'—Do not extend records with blanks if you read past the end-of-record (formatted input only). That is, a
short record causes an abort with an error message, rather than just filling with trailing blanks and continuing.
'BUFFER=n'— This suboption is for disks. For tapes, we recommend the TOPEN() routines because they are more
reliable. It sets the size in bytes of the I/O buffer to use. For writes, larger buffers yield faster I/O. For good
performance, make the buffer a multiple of the largest record size. This size can be larger than the actual physical
memory, and probably the best performance is obtained by making the record size equal to the entire file size.
Larger buffer sizes can cause extra paging.
'EOF'—Opens a file at end-of-file rather than at the beginning (useful for appending data to file), for example,
FILEOPT='EOF'. Unlike ACCESS='APPEND', in this case, both READ and BACKSPACE are allowed.
READONLY ♦
The file is opened read-only.
ACTION = act
This specifier denotes file permissions. Possible values are: READ, WRITE, and READWRITE.
If act is READ, it specifies that the file is opened read-only.
If act is WRITE, it specifies that the file is opened write-only. You cannot execute a BACKSPACE statement on a
write-only file.
If act is READWRITE, it specifies that the file is opened with both read and write permissions.
Examples
Here are six examples.
Example 1: Open a file and connect it to unit 8—either of the following forms
of the OPEN statement opens the file, projectA/data.test, and connects it
to FORTRAN unit 8:
OPEN( UNIT=8 )
OPEN( 8 )
In the above example, you get sequential access, formatted file, and no
allowance for error during file open. If the file, fort.8 does not exist before
execution, it is created. The file remains after termination.
Statements 193
4
For more information on variable-length records, see “Direct Access I/O” on
page 265.
OPEN( 1, STATUS='SCRATCH' )
OPTIONS
The OPTIONS ♦ statement overrides compiler command-line options.
Syntax
Description
The following table shows the OPTIONS statement qualifiers:
Restrictions
The OPTIONS statement must be the first statement in a program unit; it must
be before the BLOCK DATA, FUNCTION, PROGRAM, and SUBROUTINE
statements.
Options set by the OPTIONS statement override those of the command line.
Options set by the OPTIONS statement endure for that program unit only.
Statements 195
4
A qualifier can be abbreviated to four or more characters.
Example
For the following source, integer variables declared with no explicit size
occupy 4 bytes rather than 2, with or without the –i2 option on the command
line. This rule does not change the size of integer constants, only variables.
OPTIONS /I4
PROGRAM FFT
…
END
By way of contrast, if you use /NOI4, then all integer variables declared with
no explicit size occupy 2 bytes rather than 4, with or without the –i2 option on
the command line. However, integer constants occupy 2 bytes with –i2, and 4
bytes otherwise.
PARAMETER
The PARAMETER statement assigns a symbolic name to a constant.
Syntax
In this alternate form, the type of the constant expression determines the type
of the name; no conversion is done.
Description
e can be of any type and the type of symbolic name and the corresponding
expression must match.
A symbolic name can be used to represent the real part, imaginary part, or
both parts of a complex constant.
If the type of the data expression does not match the type of the symbolic
name, then the type of the name must be specified by a type statement or
IMPLICIT statement prior to its first appearance in a PARAMETER statement,
otherwise conversion will be performed.
Statements 197
4
If a CHARACTER statement explicitly specifies the length for a symbolic name,
then the constant in the PARAMETER statement can be no longer than that
length. Longer constants are truncated, and a warning is issued. The
CHARACTER statement must appear before the PARAMETER statement.
Restrictions
A symbolic constant must not be defined more than once in a program unit.
If you pass a parameter as an argument, and the subprogram tries to change it,
you may get a runtime error.
Examples
Example 1: Some real, character, and logical parameters:
CHARACTER HEADING*10
LOGICAL T
PARAMETER ( EPSILON=1.0E-6, PI=3.141593,
& HEADING=’IO Error #’,
& T=.TRUE. )
…
CHARACTER HEADING*(*)
PARAMETER ( HEADING='I/O Error Number' )
…
LOGICAL FLAG1
PARAMETER (FLAG1 = .TRUE.)
PARAMETER S = .TRUE.
With -xl, the above statement is a PARAMETER statement about the variable S.
PARAMETER S = .TRUE.
PARAMETERS = .TRUE.
Statements 199
4
PAUSE
The PAUSE statement suspends execution, and waits for you to type: go.
Syntax
PAUSE [str ]
str String of not more than 5 digits or a character constant
Description
The PAUSE statement suspends program execution temporarily, and waits for
acknowledgment. On acknowledgment, execution continues.
For the above example, type the following command line at a shell prompt in
some other window. The window displaying the message cannot accept
command input.
Statements 201
4
POINTER
The POINTER ♦ statement establishes pairs of variables and pointers.
Syntax
Description
Each pointer contains the address of its paired variable.
Usage
Normal use of pointer-based variables involves the following steps. The first
two steps can be in either order.
3. Set the pointer to the address of an area of memory that has the
appropriate size and type.
You do not normally do anything else with the pointer explicitly.
Subroutine FREE()
The subroutine FREE() deallocates a region of memory previously allocated
by MALLOC(). The argument given to FREE() must be a pointer previously
returned by MALLOC(), but not already given to FREE(). The memory is
returned to the memory manager, making it unavailable to the programmer.
Function MALLOC()
The function MALLOC() allocates an area of memory and returns the address
of the start of that area. The argument to the function is an integer specifying
the amount of memory to be allocated, in bytes. If successful, it returns a
pointer to the first item of the region; otherwise, it returns an integer 0. The
region of memory is not initialized in any way—do not assume it is initiallized
to zero.
Compare:
Statements 203
4
• Without pointers, if you call a subroutine or function, the optimizer knows
that the call will change only variables in common or those passed as
arguments to that call.
• With pointers, this is no longer valid, since a routine can take the address of
an argument and save it in a pointer in common for use in a subsequent call
to itself or to another routine.
Restrictions
The pointers are of type integer and are automatically typed that way by the
compiler. You must not type them yourself.
This implementation of POINTER follows more along the line of Cray, not
Fortran 90, although it does not follow Cray exactly.
The address cannot exceed the range of INTEGER*4. If the address expression
is not in the range (-2147483648, 2147483647), then the results are
unpredictable.
If you use an optimization level greater than -O2, you must write your
programs with the following restrictions on the use of pointers:
Example: One kind of code that could cause problems if you optimize at a level
greater than -O2:
COMMON A, B, C
POINTER ( P, V )
P = LOC(A) + 4 ! ←Possible problems if optimized
…
The compiler assumes that a reference through P can change A, but not B; this
assumption could produce incorrect code.
Examples
Example 1: A simple POINTER statement:
POINTER ( P, V )
Statements 205
4
In the above example, the CHARACTER statement allocates 12 bytes of storage
for A, but no storage for V; it merely specifies the type of V because V is a
pointer-based variable. You then assign the address of A to P, so now any use of
V refers to A by the pointer P. The program prints an E.
In the above example, you get 36 bytes of memory from MALLOC() and then,
after some other instructions, probably using that chunk of memory, tell
FREE() to return those same 36 bytes to the memory manager.
POINTER ( P, V )
CHARACTER V*12, Z*1
P = MALLOC( 12 )
…
END
In the above example, you obtain 12 bytes of memory from the function
MALLOC() and assign the address of that block of memory to the pointer P.
PROGRAM UsePointers
REAL X
POINTER ( P, X )
…
READ ( *,* ) Nsize ! Get the size.
P = MALLOC( Nsize )! Allocate the memory.
…
CALL CALC ( X, Nsize )
…
END
SUBROUTINE CALC ( A, N )
REAL A(N)
… ! Use the array of whatever size.
RETURN
END
This is a slightly more realistic example. The size might well be some large
number, say, 10,000. Once that’s allocated, the subroutines perform their tasks,
not knowing that the array was dynamically allocated.
Statements 207
4
Example 6: One way to use pointers to make a linked list in f77:
RECORD /NodeType/ r
POINTER (pr,r), (pb,b)
CHARACTER v*3(4)/'aaa', 'bbb', 'ccc', 'ddd'/
Remember:
• Do not optimize programs using pointers like this with -O3, -O4, or -O5.
• The warnings can be ignored.
• This is not the normal usage of pointers described at the start of this section.
Statements 209
4
PRINT
The PRINT statement writes from a list to stdout.
Syntax
PRINT f [, iolist ]
PRINT grname
f Format identifier
iolist List of variables, substrings, arrays, records, …
grname Name of the namelist group
Description
The PRINT statement accepts the following arguments.
Format Identifier
f is a format identifier and can be:
• An asterisk (*), which indicates list-directed I/O. See Section , “List-
Directed I/O,” for details.
• The label of a FORMAT statement that appears in the same program unit.
• An integer variable name that has been assigned the label of a FORMAT
statement that appears in the same program unit.
• A character expression or integer array that specifies the format string. The
integer array is nonstandard. ♦
Output List
iolist can be empty or can contain output items or implied DO lists. The output
items must be one of the following:
• Variables
• Substrings
• Arrays
A simple unsubscripted array name specifies all of the elements of the array in
memory storage order, with the leftmost subscript increasing more rapidly.
Namelist-Directed PRINT
The second form of the PRINT statement is used to print the items of the
specified namelist group. Here, grname is the name of a group previously
defined by a NAMELIST statement.
2. If the output list is not empty, data is transferred from the list to standard
output.
If a format is specified, data is edited accordingly.
3. In the second form of the PRINT statement, data is transferred from the
items of the specified namelist group to standard output.
Restrictions
Output from an exception handler is unpredictable. If you make your own
exception handler, do not do any FORTRAN output from it. If you must do
some, then call abort right after the output. Doing so reduces the relative risk
of a program freeze. FORTRAN I/O from an exception handler amounts to
recursive I/O. See the next point.
Recursive I/O does not work reliably. If you list a function in an I/O list, and
if that function does I/O, then during runtime, the execution may freeze, or
some other unpredictable problem may occur. This risk exists independent of
parallelization.
Statements 211
4
Example: Recursive I/O fails intermittently:
Examples
Example 1: Formatted scalars:
CHARACTER TEXT*16
PRINT 1, NODE, TEXT
1 FORMAT ( I2, A16 )
PRINT *, I, J, ( VECTOR(I), I = 1, 5 )
INTEGER VECTOR(10)
PRINT '( 12 I2 )', I, J, VECTOR
Example 4: Namelist:
CHARACTER LABEL*16
REAL QUANTITY
INTEGER NODE
NAMELIST /SUMMARY/ LABEL, QUANTITY, NODE
PRINT SUMMARY
PROGRAM
The PROGRAM statement identifies the program unit as a main program.
Syntax
PROGRAM pgm
pgm Symbolic name of the main program
Description
For the loader, the main program is always named MAIN. The PROGRAM
statement serves only the person who reads the program.
Restrictions
The PROGRAM statement can appear only as the first statement of the main
program.
The name of the program can be the same as a local name in the main
program.♦ The FORTRAN Standard does not allow this practice.
Example
Example: A PROGRAM statement:
PROGRAM US_ECONOMY
NVARS = 2
NEQS = 2
…
Statements 213
4
READ
The READ statement reads data from a file or the keyboard to items in the list.
Syntax
Description
The READ statement accepts the following arguments.
Unit Identifier
u is either an external unit identifier or an internal file identifier.
If the optional characters UNIT= are omitted from the unit specifier, then u
must be the first item in the list of specifiers.
Format Identifier
f is a format identifier and can be:
• An asterisk (*), indicating list-directed I/O. See Section , “List-Directed
I/O,” for details.
• A label of a FORMAT statement that appears in the same program unit
• An integer variable name that has been assigned the label of a FORMAT
statement that appears in the same program unit
• A character expression or integer array specifying the format string. This is
called a runtime format or a variable format. The integer array is
nonstandard. ♦
If the optional characters, FMT=, are omitted from the format specifier, then f
must appear as the second argument for a formatted read; otherwise, it must
not appear at all.
Unformatted data transfer from internal files and terminal files is not allowed,
hence, f must be present for such files.
Statements 215
4
Record Number
rn must be a positive integer expression, and can be used for direct-access files
only. rn can be specified for internal files. ♦
End-of-File Specifier
s must be the label of an executable statement in the same program unit in
which the READ statement occurs.
The END=s and REC=rn specifiers can be present in the same READ statement. ♦
Error Specifier
s must be the label of an executable statement in the same program unit in
which the READ statement occurs.
Input List
iolist can be empty or can contain input items or implied DO lists. The input
items can be any of the following:
• Variables
• Substrings
• Arrays
• Array elements
• Record fields
A simple unsubscripted array name specifies all of the elements of the array in
memory storage order, with the leftmost subscript increasing more rapidly.
Namelist-Directed READ
The third and fourth forms of the READ statement are used to read the items of
the specified namelist group, and grname is the name of the group of variables
previously defined in a NAMELIST statement.
Execution
Execution proceeds as follows:
2. If the input list is not empty, data is transferred from the file to the
corresponding items in the list.
The items are processed in order as long as the input list is not exhausted.
The next specified item is determined and the value read is transmitted to it.
Data editing in formatted READ is done according to the specified format.
3. In the third and fourth forms of namelist-directed READ, the items of the
specified namelist group are processed according to the rules of
namelist-directed input.
READ f [, iolist ]
READ ( [ NML= ] grname )
The above two forms operate the same way as the others, except that reading
from the keyboard is implied.
Statements 217
4
If u specifies an external unit that is not connected to a file, an implicit OPEN
operation is performed equivalent to opening the file with the options in the
following example:
Note also:
• The value of fmt is 'FORMATTED' or 'UNFORMATTED' accordingly, as the
read is formatted or unformatted.
• A simple unsubscripted array name specifies all of the elements of the array
in memory storage order, with the leftmost subscript increasing more
rapidly.
• An attempt to read the record of a direct-access file that has not been
written, causes all items in the input list to become undefined.
• The record number count starts from one.
• Namelist-directed input is permitted on sequential access files only.
Examples
Example 1: Formatted read, trap I/O errors, EOF, and I/O status:
Example 2: Direct, unformatted read, trap I/O errors, and I/O status:
READ( *, * ) A, V
or
READ *, A, V
DIMENSION V(5)
READ( 3, '(5F4.1)') V
CHARACTER SAMPLE*16
LOGICAL NEW*4
REAL DELTA*4
NAMELIST /G/ SAMPLE, NEW, DELTA
…
READ( 1, G )
or
READ( UNIT=1, NML=G )
or
READ( 1, NML=G )
Statements 219
4
REAL
The REAL statement specifies the type of a symbolic constant, variable, array,
function, or dummy function to be real, and optionally specifies array
dimensions and size, and initializes with values.
Syntax
Description
Following are descriptions for REAL, REAL*4, REAL*8, and REAL*16.
REAL
For a declaration such as REAL W, the variable W is usually a REAL*4 element
in memory, interpreted as a real number. Specifying the size is nonstandard. ♦
The default size, for a declaration such as REAL H, can be altered by compiling
with any of the options -dbl, -r8, or -xtypemap. See the discussion in
Chapter 2 for details.
REAL*4 ♦
For a declaration such as REAL*4 W, the variable W is always a REAL*4 element
in memory, interpreted as a single-width real number.
REAL*8 ♦
For a declaration such as REAL*8 W, the variable W is always a REAL*8
element in memory, interpreted as a double-width real number.
REAL*16 ♦
Examples
Example 1: Simple real variables—these declarations are equivalent:
REAL U, V(9) or
REAL*4 U, V(9) or
REAL U*4, V(9)*4
REAL*8 R
REAL*16 Q
DOUBLE PRECISION D
Statements 221
4
RECORD
The RECORD ♦ statement defines variables to have a specified structure, or
arrays to be arrays of variables with such structures.
Syntax
Description
A structure is a template for a record. The name of the structure is included in
the STRUCTURE statement, and once a structure is thus defined and named, it
can be used in a RECORD statement.
Restrictions
• Each record is allocated separately in memory.
• Initially, records have undefined values.
• Records, record fields, record arrays, and record-array elements are allowed
as arguments and dummy arguments. When you pass records as arguments,
their fields must match in type, order, and dimension. The record
declarations in the calling and called procedures must match.
• Within a union declaration, the order of the map fields is not relevant.
• Record fields are not allowed in COMMON statements.
• Records and record fields are not allowed in DATA, EQUIVALENCE,
NAMELIST, PARAMETER, AUTOMATIC, STATIC, or SAVE statements. To
initialize records and record fields, use the STRUCTURE statement. See
Section , “STRUCTURE.”
Example
Example 1: Declare some items to be records of a specified structure:
STRUCTURE /PRODUCT/
INTEGER*4 ID
CHARACTER*16 NAME
CHARACTER*8 MODEL
REAL*4 COST
REAL*4 PRICE
END STRUCTURE
RECORD /PRODUCT/ CURRENT, PRIOR, NEXT, LINE(10)
…
Each of the three variables CURRENT, PRIOR, and NEXT is a record which has
the PRODUCT structure, and LINE is an array of 10 such records.
STRUCTURE /PRODUCT/
INTEGER*4 ID
CHARACTER*16 NAME
CHARACTER*8 MODEL
REAL*4 COST
REAL*4 PRICE
END STRUCTURE
RECORD /PRODUCT/ CURRENT, PRIOR, NEXT, LINE(10)
CURRENT.ID = 82
PRIOR.NAME = "CacheBoard"
NEXT.PRICE = 1000.00
LINE(2).MODEL = "96K"
PRINT 1, CURRENT.ID, PRIOR.NAME, NEXT.PRICE, LINE(2).MODEL
1 FORMAT(1X I5/1X A16/1X F8.2/1X A8)
END
82
CacheBoard
1000.00
96K
Statements 223
4
RETURN
A RETURN statement returns control to the calling program unit.
Syntax
RETURN [ e ]
e Expression of type INTEGER or REAL
Description
Execution of a RETURN statement terminates the reference of a function or
subroutine.
If e is not specified, or the value of e is less than one or greater than the number
of asterisks or ampersands in the SUBROUTINE statement that contains the
RETURN statement, control is returned normally to the statement following the
CALL statement that invoked the subroutine.
If the value of e is between one and the number of asterisks (or ampersands) in
the SUBROUTINE statement, control is returned to the statement identified by
the eth alternate. A RETURN statement can appear only in a function
subprogram or subroutine.
Examples
Example 1: Standard return:
CHARACTER*25 TEXT
TEXT = "Some kind of minor catastrophe"
…
CALL OOPS ( TEXT )
STOP
END
SUBROUTINE OOPS ( S )
CHARACTER S* 32
WRITE (*,*) S
RETURN
END
Statements 225
4
REWIND
REWIND positions the file associated with the specified unit to its initial point.
If you use this statement for tapes, we recommend the TOPEN() routines
instead, because they are more reliable.
Syntax
REWIND u
REWIND ( [ UNIT=] u [, IOSTAT=ios ] [, ERR= s ])
u Unit identifier of an external unit connected to the file
u must be connected for sequential access, or append access.
ios I/O specifier, an integer variable or an integer array element
s Error specifier: s must be the label of an executable statement in the same
program in which this REWIND statement occurs. The program control is
transferred to this label in case of an error during the execution of the
REWIND statement.
Description
The options can be specified in any order.
Rewinding a unit not associated with any file has no effect. Likewise, REWIND
in a terminal file has no effect either.
Examples
Example 1: Simple form of unit specifier:
ENDFILE 3
REWIND 3
READ (3,'(I2)') I
REWIND 3
READ (3,'(I2)')I
INTEGER CODE
…
REWIND (UNIT = 3)
REWIND (UNIT = 3, IOSTAT = CODE, ERR = 100)
…
100 WRITE (*,*) 'error in rewinding'
STOP
Statements 227
4
SAVE
The SAVE statement preserves items in a subprogram after the RETURN or END
statements are executed, preventing them from becoming undefined.
Syntax
SAVE [ v [, v ] … ]
v Name of an array, variable, or common block (enclosed in slashes), occurring
in a subprogram
Description
SAVE variables are placed in an internal static area. All common blocks are
already preserved because they have been allocated to a static area. Therefore,
common block names specified in SAVE statements are allowed but ignored.
A SAVE with no list preserves all local variables and arrays in the routine.
Local variables and arrays are already static by default, predisposing the need
for SAVE. However, using SAVE can ensure portability, especially with routines
that leave a subprogram by some way other than a RETURN.
Restrictions
The following constructs must not appear in a SAVE statement:
• Variables or arrays in a common block
• Dummy argument names
• Record names
• Procedure names
• Automatic variables or arrays
Example
Example: A SAVE statement:
SUBROUTINE FFA(N)
DIMENSION A(1000,1000), V(1000)
SAVE A
…
RETURN
END
Statements 229
4
Statement Function
A statement function statement is a function-like declaration, made in a single
statement.
Syntax
fun ( [ d [, d ] … ] ) = e
fun Name of statement function being defined
d Statement function dummy argument
e Expression. e can be any of the types arithmetic, logical, or character.
Description
If a statement function is referenced, the defined calculations are inserted.
The statement function argument list indicates the order, number, and type of
arguments for the statement function.
A statement function is referenced by using its name, along with its arguments,
as an operand in an expression.
4. If the type of the above result is different from the type of the function
name, then the result is converted.
Restrictions
Note these restrictions:
• A statement function must appear only after the specification statements
and before the first executable statement of the program unit in which it is
referenced.
• A statement function is not executed at the point where it is specified. It is
executed, as any other, by the execution of a function reference in an
expression.
• The type conformance between fun and e are the same as those for the
assignment statement. The type of fun and e can be different, in which case e
is converted to the type of fun.
• The actual arguments must agree in order, number, and type with
corresponding dummy arguments.
• If a dummy argument is defined as a structure, the corresponding actual
argument must be similarly defined as the same structure.
• A dummy argument cannot be an array or function name, or have the same
name as the function.
• The same argument cannot be specified more than once in the argument list.
• The statement function may be referenced only in the program unit that
contains it.
• The name of a statement function cannot be an actual argument. Nor can it
appear in an EXTERNAL statement.
• The type of the argument is determined as if the statement function were a
whole program unit in itself.
• Even if the name of a statement function argument is the same as that of
another local variable, the reference is considered a dummy argument of the
statement function, not the local variable of the same name.
• The length specification of a character statement function or its dummy
argument of type CHARACTER must be an integer constant expression.
• A statement function cannot be invoked recursively.
Statements 231
4
Examples
Example 1: Arithmetic statement function:
PARAMETER ( PI=3.14159 )
REAL RADIUS, VOLUME
SPHERE ( R ) = 4.0 * PI * (R**3) / 3.0
READ *, RADIUS
VOLUME = SPHERE( RADIUS )
…
LOGICAL OKFILE
INTEGER STATUS
OKFILE ( I ) = I .LT. 1
READ( *, *, IOSTAT=STATUS ) X, Y
IF ( OK FILE(STATUS) ) CALL CALC ( X, Y, A )
…
STATIC
The STATIC ♦ statement ensures that the specified items are stored in static
memory.
Syntax
STATIC list
list List of variables and arrays
Description
All local variables and arrays are classifed static by default: there is exactly one
copy of each datum, and its value is retained between calls. You can also
explicitly define variables as static or automatic in a STATIC or AUTOMATIC
statement, or in any type statement or IMPLICIT statement.
However, you can still use STATIC to ensure portability, especially with
routines that leave a subprogram by some way other than a RETURN.
Example
STATIC A, B, C
REAL P, D, Q
STATIC P, D, Q
IMPLICIT STATIC (X-Z)
Statements 233
4
STOP
The STOP statement terminates execution of the program.
Syntax
STOP [ [ str ]
str String of no more that 5 digits or a character constant
Description
The argument str is displayed when the program stops.
Examples
Example 1: Integer:
stop 9
STOP: 9
Example 2: Character:
stop 'error'
STOP: error
STRUCTURE
The STRUCTURE ♦ statement organizes data into structures.
Syntax
Description
A STRUCTURE statement defines a form for a record by specifying the name,
type, size, and order of the fields that constitute the record. Optionally, it can
specify the initial values.
Statements 235
4
Restrictions
The name is enclosed in slashes and is optional in nested structures only.
Each structure-name must be unique among structures, although you can use
structure names for fields in other structures or as variable names.
The only statements allowed between the STRUCTURE statement and the END
STRUCTURE statement are field-declaration statements and PARAMETER
statements. A PARAMETER statement inside a structure declaration block is
equivalent to one outside.
Examples
Example 1: A structure of five fields:
STRUCTURE /PRODUCT/
INTEGER*4 ID/ 99 /
CHARACTER*16 NAME
CHARACTER*8 MODEL/ 'Z' /
REAL*4 COST
REAL*4 PRICE
END STRUCTURE
RECORD /PRODUCT/ CURRENT, PRIOR, NEXT, LINE(10)
STRUCTURE /VARLENSTR/
INTEGER*4 NBYTES
CHARACTER A*25
END STRUCTURE
RECORD /VARLENSTR/ VLS
VLS.NBYTES = 0
The above structure matches the one used by the Sun Pascal compiler, pc, for
varying length strings. The 25 is arbitrary.
Statements 237
4
SUBROUTINE
The SUBROUTINE statement identifies a named program unit as a subroutine,
and specifies arguments for it.
Syntax
Description
A subroutine subprogram must have a SUBROUTINE statement as the first
statement. A subroutine can have any other statements, except a BLOCK DATA,
FUNCTION, PROGRAM, or another SUBROUTINE statement.
sub is the name of a subroutine and is a global name, and must not be the same
as any other global name such as a common block name or a function name.
Nor can it be the same as any local name in the same subroutine.
The dummy arguments are local to the subroutine and must not appear in any
of the following statements, except as a common block name:
• EQUIVALENCE
• PARAMETER
• SAVE
• STATIC
• AUTOMATIC
• INTRINSIC
The actual arguments in the CALL statement that references a subroutine must
agree with the corresponding formal arguments in the SUBROUTINE statement,
in order, number, and type. An asterisk (or an ampersand) in the formal
argument list denotes an alternate return label. A RETURN statement in this
procedure can specify the ordinal number of the alternate return to be taken.
Examples
Example 1: A variable and array as parameters:
SUBROUTINE SHR ( A, B )
CHARACTER A*8
REAL B(10,10)
…
RETURN
END
Statements 239
4
TYPE
The TYPE ♦ statement writes to stdout.
Syntax
TYPE f [, iolist ]
or:
TYPE grname
f Format identifier
iolist List of output variables
grname Name of the namelist group
Description
The TYPE statement is provided for compatibility and is equivalent to:
• PRINT f [, iolist ]
• PRINT grname
• WRITE(*, f ) [ iolist ]
• WRITE(*,grname )
Example
Example: Formatted and namelist output:
INTEGER V(5)
REAL X(9), Y
NAMELIST /GNAM/ X, Y
....
TYPE 1, V
1 FORMAT( 5 I3 )
....
TYPE GNAM
....
Syntax
Description
A type statement can be used to:
• Confirm or to override the type established by default or by the IMPLICIT
statement
• Specify dimension information for an array, or confirm the type of an
intrinsic function
• Override the length by one of the acceptable lengths for that data type
Statements 241
4
A type statement can assign initial values to variables, arrays, or record fields
by specifying a list of constants (clist) as in a DATA statement. ♦
INTEGER Z / 4 /
POINTER ( x, Z )
In this case, the compiler issues a warning message, and Z is not initialized.
Note – Compiling with any of the options -dbl, -r8, -i2, or -xtypemap can
alter the default size of names typed without an explicit size. See the
discussion in Chapter 2.
Restrictions
A symbolic name can appear only once in type statements in a program unit.
Example
Example: The type statement:
INTEGER*2 I, J/0/
REAL*4 PI/3.141592654/,ARRAY(10)/5*0.0,5*1.0/
CHARACTER*10 NAME
CHARACTER*10 TITLE/'Heading'/
Statements 243
4
Syntax
The syntax of a UNION declaration is as follows:
UNION
map-declaration
map-declaration
[map-declaration]
...
END UNION
MAP
field-declaration
[field-declaration]
...
[field-declaration]
END MAP
Description
A MAP statement defines alternate groups of fields in a union. During
execution, one map at a time is associated with a shared storage location.
When you reference a field in a map, the fields in any previous map become
undefined, and are succeeded by the fields in the map of the newly referenced
field. Also:
• A UNION declaration can appear only within a STRUCTURE declaration.
• The amount of memory used by a union is that of its biggest map.
• Within a UNION declaration, the order of the MAP statements is not relevant.
Example
Declare the structure /STUDENT/ to contain either NAME, CLASS, and MAJOR,
or NAME, CLASS, CREDITS, and GRAD_DATE:
STRUCTURE /STUDENT/
CHARACTER*32 NAME
INTEGER*2 CLASS
UNION
MAP
CHARACTER*16 MAJOR
END MAP
MAP
INTEGER*2 CREDITS
CHARACTER*8 GRAD_DATE
END MAP
END UNION
END STRUCTURE
RECORD /STUDENT/ PERSON
In the above example, the variable PERSON has the structure /STUDENT/, so:
• PERSON.MAJOR references a field from the first map; PERSON.CREDITS
references a field from the second map.
• If the variables of the second map field are initialized, and then the program
references the variable PERSON.MAJOR, the first map becomes active, and
the variables of the second map become undefined.
Statements 245
4
VIRTUAL
The VIRTUAL ♦ statement is treated the same as the DIMENSION statement.
Syntax
VIRTUAL a ( d ) [, a ( d ) ] …
a Name of an array
a(d) Specifies the dimension of the array. It is a list of 1 to 7 declarators
separated by commas
Description
The VIRTUAL statement has the same form and effect as the DIMENSION
statement. It is included for compatibility with older versions of FORTRAN.
Example
VOLATILE
The VOLATILE ♦ statement prevents optimization on the specified items.
Syntax
VOLATILE nlist
nlist List of variables, arrays, or common blocks
Description
The VOLATILE statement prevents optimization on the items in the list.
Programs relying on it are usually nonportable.
Example
Example: VOLATILE: ♦
PROGRAM FFT
INTEGER NODE*2, NSTEPS*2
REAL DELTA, MAT(10,10), V(1000), X, Z
COMMON /INI/ NODE, DELTA, V
…
VOLATILE V, Z, MAT, /INI/
…
EQUIVALENCE ( X, V )
…
In the above example, the array V, the variable Z, and the common block /INI/
are explicitly specified as VOLATILE. The variable X is VOLATILE through an
equivalence.
Statements 247
4
WRITE
The WRITE statement writes data from the list to a file.
Syntax
Description
Unit Identifier
u is either an external unit identifier or an internal file identifier.
An external unit identifier must be one of the following:
If the optional characters UNIT= are omitted from the unit specifier, then u
must be the first item in the list of specifiers.
Format Identifier
f is a format identifier and can be:
• An asterisk (*), indicating list-directed I/O. See “List-Directed I/O” on page
306 for details.
• The label of a FORMAT statement that appears in the same program unit
• An integer variable name that has been assigned the label of a FORMAT
statement that appears in the same program unit
• A character expression or integer array that specifies the format string. This
is called a runtime format or a variable format. The integer array is
nonstandard. ♦
If the optional characters, FMT=, are omitted from the format specifier, then f
must appear as the second argument for a formatted write; otherwise, it must
not appear at all.
Record Number
rn must be a positive integer expression. This argument can appear only for
direct-access files. rn can be specified for internal files. ♦
Statements 249
4
Error Specifier
s must be the label of an executable statement in the same program unit in
which this WRITE statement occurs.
Output List
iolist can be empty, or it can contain output items or implied DO lists. The
output items must be one of the following:
• Variables
• Substrings
• Arrays
• Array elements
• Record fields
• Any other expression
A simple unsubscripted array name specifies all of the elements of the array in
memory storage order, with the leftmost subscript increasing more rapidly.
If a function appears in the output list, that function must not cause an
input/output statement to be executed.
Namelist-Directed WRITE
The second form of WRITE is used to output the items of the specified namelist
group. Here, grname is the name of the list previously defined in a NAMELIST
statement.
Execution
Execution proceeds as follows:
Restrictions
Note these restrictions:
• Output from an exception handler is unpredictable.
If you make your own exception handler, do not do any FORTRAN output
from it. If you must do some, then call abort right after the output. Doing so
reduces the relative risk of a system freeze. FORTRAN I/O from an
exception handler amounts to recursive I/O. See the next paragraph.
• Recursive I/O does not work reliably.
If you list a function in an I/O list, and if that function does I/O, then
during runtime, the execution may freeze, or some other unpredictable
problem results. This risk exists independent of using parallelization.
Statements 251
4
Comments
If u specifies an external unit that is not connected to a file, an implicit OPEN
operation is performed that is equivalent to opening the file with the following
options:
A simple unsubscripted array name specifies all of the elements of the array in
memory storage order, with the leftmost subscript increasing more rapidly.
The record number for direct-access files starts from one onwards.
Examples
Example 1: Formatted write with trap I/O errors and I/O status:
Example 2: Direct, unformatted write, trap I/O errors, and I/O status:
…
WRITE( 1, REC=3, IOSTAT=N, ERR=8 ) V
…
4 CONTINUE
RETURN
8 WRITE( *, * ) 'I/O error # ', N, ', on 1'
END
…
WRITE( 1 ' 3, IOSTAT=N, ERR=8 ) V
…
4 CONTINUE
RETURN
8 WRITE( *, * ) 'I/O error # ', N, ', on 1'
END
WRITE( *, * ) A, V
or
PRINT *, A, V
DIMENSION V(5)
WRITE( 3, '(5F4.1)') V
CHARACTER SAMPLE*16
LOGICAL NEW*4
REAL DELTA*4
NAMELIST /G/ SAMPLE, NEW, DELTA
…
WRITE( 1, G )
or
WRITE( UNIT=1, NML=G )
or
WRITE( 1, NML=G )
Statements 253
4
This chapter describes the general concepts of FORTRAN input and output,
and provides details on the different kinds of I/O. See also the Input/Output
chapter in the Sun Fortran Programmer’s Guide.
Logical Units
The FORTRAN default value for the maximum number of logical units that a
program can have open at one time is 64. For current Solaris releases, this limit
is 256. A FORTRAN program can increase this limit beyond 64 by calling the
setrlim() function. See the man page setrlim(2). If you are running csh,
you can also do this with the limit or unlimit command; see csh(1).
255
5
The standard logical units 0, 5, and 6 are preconnected to Solaris as stderr,
stdin, and stdout, respectively. These are not actual file names, and cannot
be used for opening these units. INQUIRE does not return these names, and
indicates that the above units are not named unless they have been opened to
real files. However, these units can be redefined with an OPEN statement.
The names, stderr, stdin, and stdout, are meant to make error reporting
more meaningful. To preserve error reporting, the system makes it is an error
to close logical unit 0, although it can be reopened to another file.
If you want to open a file with the default file name for any preconnected
logical unit, remember to close the unit first. Redefining the standard units can
impair normal console I/O. An alternative is to use shell redirection to
externally redefine the above units.
To redefine default blank control or the format of the standard input or output
files, use the OPEN statement, specifying the unit number and no file name, and
use the options for the kind of blank control you want.
I/O Errors
Any error detected during I/O processing causes the program to abort, unless
alternative action has been provided specifically in the program. Any I/O
statement can include an ERR= clause (and IOSTAT= clause) to specify an
alternative branch to be taken on errors and return the specific error code.
Read statements can include END=n to branch on end-of-file. File position and
the value of I/O list items are undefined following an error. END= catches both
EOF and error conditions; ERR= catches only error conditions.
If your program does not trap I/O errors, then before aborting, an error
message is written to stderr with an error number in square brackets, [ ],
and the logical unit and I/O state. The signal that causes the abort is IOT.
Error numbers less than 1000 refer to operating system errors; see intro(2).
Error numbers greater than or equal to 1000 come from the I/O library.
For external I/O, part of the current record is displayed if the error was caused
during reading from a file that can backspace. For internal I/O, part of the
string is printed with a vertical bar (|) at the current position in the string.
General Restriction
Do not reference a function in an I/O list if executing that function causes an
I/O statement to be executed. Example:
Kinds of I/O
The four kinds of I/O are: formatted, unformatted, list-directed, and
NAMELIST.
The two modes of access to files are sequential and direct. When you open a file,
the access mode is set to either sequential or direct. If you do not set it
explicitly, you get sequential by default.
The two types of files are: external files and internal files. An external file
resides on a physical peripheral device, such as disk or tape. An internal file is
a location in main memory, is of character type, and is either a variable,
substring, array, array element, or a field of a structured record.
Combinations of I/O
I/O combinations on external files are:
Avoid list-directed internal writes. The number of lines and items per line
varies with the values of items.
Printing Files
You get a print file by using the nonstandard FORM='PRINT' in OPEN. ♦
Definition
A print file has the following features:
• With formatted output, you get vertical format control for that logical unit:
• Column one is not printed.
• If column one is blank, 0, or 1, then vertical spacing is one line, two lines,
or top of page, respectively.
• If column 1 is +, it is replaced by a control sequence that causes a return to
the beginning of the previous line.
• With list-directed output, you get for that logical unit, column one is not
printed.
In general, if you open a file with FORM='PRINT', then for that file list-
directed output does not provide the FORTRAN Standard blank in column one;
otherwise, it does provide that blank. FORM='PRINT' is for one file per call.
If you open a file with FORM='PRINT', then that file has the same content as if
it was opened with FORM='FORMATTED', and filtered with the output filter,
asa.
If you compile with the -oldldo option (old list-directed output), then all the
files written by the program do list-directed output without that blank in
column one; otherwise, they all get that blank. The -oldldo option is global.
These forms of the OPEN statement need not include the file name, and must
not include a file name if UNIT refers to standard input, output, or standard
error.
If you connect a unit with OPEN and do not use the file name parameter, then
you get the default file name, fort.nn, where nn is the unit number.
Therefore, to redefine the standard output as a print file, use:
Scratch Files
Scratch files are temporary files that normally disappears after execution is
completed.
Remember to get the real name of the scratch file. Use INQUIRE if you want to
reopen it later.
For the above call, the FORTRAN runtime system looks in the environment for
names of the form FORTnn, and then opens the corresponding logical unit for
sequential formatted I/O.
With the above example, suppose your program opened unit 7, as follows:
The FORTRAN runtime system looks in the environment for the FORT07 file,
and connects it to unit 7.
In general, names must be of the form PREFIXnn, where the particular PREFIX
is specified in the call to IOINIT, and nn is the logical unit to be opened. Unit
numbers less than 10 must include the leading 0. For details, see IOINIT(3F)
and the Sun Fortran Library Reference.
In sh:
demo$ TST01=ini1.inp
demo$ TST02=ini1.out
demo$ export TST01 TST02
demo% cp /opt/SUNWspro/SC4.2/src/ioinit.f .
Direct Access
A direct-access file contains a number of records that are written to or read
from by referring to the record number. Direct access is also called random
access.
In direct access:
• Records must be all the same length.
• Records are usually all the same type.
• A logical record in a direct access, external file is a string of bytes of a length
specified when the file is opened.
• Read and write statements must not specify logical records longer than the
original record size definition.
• Shorter logical records are allowed.
• Unformatted direct writes leave the unfilled part of the record undefined.
• Formatted direct writes pass the unfilled record with blanks.
• Each READ operation acts on exactly one record.
• In using direct unformatted I/O, be careful with the number of values your
program expects to read.
• Direct access READ and WRITE statements have an argument, REC=n, which
gives the record number to be read or written. An alternate, nonstandard
form is 'n.
Unformatted I/O
Example: Direct access, unformatted:
This code opens a file for direct-access, unformatted I/O, with a record length
of 20 characters, then reads the thirteenth record as is.
Formatted I/O
Example: Direct access, formatted:
This code opens a file for direct-access, formatted I/O, with a record length of
20 characters, then reads the thirteenth record and converts it according to the
(I10,F10.3) format.
Internal Files
An internal file is a character-string object, such as a constant, variable,
substring, array, element of an array, or field of a structured record—all of type
character. For a variable or substring, there is only a single record in the file but
for an array; each array element is a record.
CHARACTER X*80
READ( 5, '(A)' ) X
READ( X, '(I3,I4)' ) N1, N2
The above code reads a print-line image into X, and then reads two integers
from X.
This is like direct I/O on external files, except that the number of records in the
file cannot be changed. In this case, a record is a single element of an array of
character strings.
Example: Direct access read of the third record of the internal file, LINE:
Formatted I/O
In formatted I/O:
• The list items are processed in the order they appear in the list.
• Any list item is completely processed before the next item is started.
• Each sequential access reads or writes one or more logical records.
Input Actions
In general, a formatted read statement does the following:
• Reads character data from the external record or from an internal file.
• Converts the items of the list from character to binary form according to the
instructions in the associated format.
• Puts converted data into internal storage for each list item of the list.
READ( 6, 10 ) A, B
10 FORMAT( F8.3, F6.2 )
Output Actions
In general, a formatted write statement does the following:
• Gets data from internal storage for each list item specified by the list.
• Converts the items from binary to character form according to the
instructions in the associated format.
• Transfers the items to the external record or to an internal file.
• Terminates formatted output records with newline characters.
For formatted write statements, the logical record length is determined by the
format statement that interacts with the list of input or output variables (I/O
list) at execution time.
For formatted read statements, if there are fewer items in the list than there are
data fields, the extra fields are ignored.
Format Specifiers
Table 5-2 Format Specifiers
Example: With the default w=7 for INTEGER*2, and since 161 decimal = A1
hex:
INTEGER*2 M
M = 161
WRITE ( *, 8 ) M
8 FORMAT ( Z )
END
For complex items, the value for w is for each real component. The default for
the A descriptor with character data is the declared length of the corresponding
I/O list element. REAL*16 and COMPLEX*32 are SPARC and PowerPC only.
WRITE( *, 1 )
1 FORMAT( 'This is an apostrophe ''.')
WRITE( *, 2 )
2 FORMAT( "This is an apostrophe '.")
END
The above program writes this message twice: This is an apostrophe '.
Dollar $
The special edit descriptor $ suppresses the carriage return. ♦
The action does not depend on the first character of the format. It is used
typically for console prompts. For instance, you can use this descriptor to make
a typed response follow the output prompt on the same line. This edit
descriptor is constrained by the same rules as the colon (:).
The above code produces a displayed prompt and user input response, such as:
The first character of the format is printed out, in this case, a blank. For an
input statement, the $ descriptor is ignored.
Space,0, 1,and +
The following first-character slew controls and actions are provided:
The behavior of the slew control character + is: if the character in the first
column is +, it is replaced by a control sequence that causes printing to return
to the first column of the previous line, where the rest of the input line is
printed.
bcd
efg
hij
klmnop ← This starts on a new page. The + of +nop is obeyed.
hij
nop ← This starts on a new page. The + of +nop is obeyed.
demo%
See asa(1).
The program, slew2.f, produces the file, slew2.out, that is equal to the file,
slew1.out, in the example above.
Slew control codes '0', '1', and '+' in column one are in the output file as
'\n', '\f', and '\r', respectively.
A [ w ]
If w is omitted, then:
• For character data type variables, it assumes the size of the variable.
• For noncharacter data type variables, it assumes the maximum number of
characters that fit in a variable of that data type. This is nonstandard
behavior. ♦
CHARACTER C*9
READ '( A7 )', C
Size n 9 7 4 1
Data Node∆Id Node∆Id Node∆Id Node∆Id
Format A7 A7 A7 A7
Memory Node∆Id∆∆ Node∆Id e∆Id d
∆∆The
whole
sheba
In f77, you can use Hollerith constants wherever a character constant can be
used in FORMAT statements, assignment statements, and DATA statements.♦
These constants are not recommended. FORTRAN does not have these old
Hollerith (n H) notations, although the FORTRAN Standard recommends
implementing the Hollerith feature to improve compatibility with old
programs. But such constants cannot be used as input data elements in list-
directed or NAMELIST input.
10 FORMAT( 8H Code = , A6 )
20 FORMAT( ' Code = ', A6 )
Example: Read into hollerith edit descriptor—no list in the READ statement:
In the above code, if the format is a runtime format (variable format), then the
reading into the actual format does not work, and the format remains
unchanged. Hence, the following program fails:
Obviously, there are better ways to read into the actual format.
I [w [ . m ] ]
The I w and I w.m edit specifiers 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 becomes defined with an integer datum. On
output, the specified list item must be defined as an integer datum.
The output field for the I w.m edit specifier is the same as for the I w edit
specifier, 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 item is zero, the output field consists of
only blank characters, regardless of the sign control in effect.
12 345 67
N = 1234
PRINT 1, N, N, N, N
1 FORMAT( I6 / I4 / I2 / I6.5 )
END
1234
1234
**
01234
L w
The L w edit specifier indicates that the field occupies w positions. The
specified input/output list item must be of type LOGICAL. On input, the list
item becomes defined with a logical datum. On output, the specified list item
must be defined as a logical datum.
T
∆T
∆∆∆F
LOGICAL*4 A
1 READ '(L8)', A
PRINT *, A
GO TO 1
END
The program above accepts any of the following as valid input data:
Ow[.m]
Zw[.m]
654321
↑ column 1
READ ( *, 2 ) M
2 FORMAT ( O6 )
The above data and program result in the octal value 654321 being loaded into
the variable M. Further examples are included in the following table.
M = 161
WRITE ( *, 8 ) M
8 FORMAT ( Z3 )
END
∆A1
↑ column 2
Further examples are included in the following table.
where n is a strictly positive integer. The format specifier T can appear by itself,
or be preceded or followed by a positive nonzero number.
Tn—Absolute Columns
This tab reads from the nth column or writes to the nth column.
TLn—Relative Columns
This tab reads from the nth column to the left or writes to the nth column to the
left.
TRn—Relative Columns
This tab reads from the nth column to the right or writes to the nth column to
the right.
nX—Positions
The nX edit specifier 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.
The n defaults to 1.
demo% a.out
uvde
5612
demo%
The above example first reads columns 5 and 6, then columns 1 and 2.
The above example writes 20 characters, then changes columns 10 and 20.
demo% a.out
dwg
174
demo%
The above example reads column 1, then tabs right 5 to column 7, then tabs left
4 to column 4.
The run shows nothing, but you can list the mytab.rep output file:
The above program writes 20 characters, tabs left 11 to column 10, then tabs
right 9 to column 20.
The width of the field is the number of characters contained in, but not
including, the delimiting quotes. Within the field, two consecutive quotes with
no intervening blanks are counted as a single quote. You can use apostrophes
in a similar way.
WRITE( *, 1 )
1 FORMAT( 'This is a quote ".' )
WRITE( *, 2 )
2 FORMAT( "This is a quote ""." )
END
You can specify radixes other than 10 for formatted integer I/O conversion.
The specifier is patterned after P, the scale factor for floating-point conversion.
It remains in effect until another radix is specified or format interpretation is
complete. The I/O item is treated as a 32-bit integer.
Example: Radix 16—the format for an unsigned, hex, integer, 10 places wide,
zero-filled to 8 digits, is (su, 16r, I10.8), as in:
D Editing
The D specifier is for the exponential form of decimal double-precision items.
The general form is:
D [ w [ .d ] ]
On input, the specified list item becomes defined with a real datum. On
output, the specified list item must be defined as a real datum.
In an output statement, the D edit descriptor does the same thing as the E edit
descriptor, except that a D is used in place of an E. The output field for the D
w.d edit specifier has the width w. The value is right-justified in that field. The
field consists of zero or more leading blanks followed by either a minus if the
value is negative, or an optional plus, followed by the magnitude of the value
of the list item rounded to d decimal digits.
w must allow for a minus sign, at least one digit to the left of the decimal point,
the decimal point, and d digits to the right of the decimal point. Therefore, it
must be the case that w ≥ w+3.
In the above example, the first input data item has no decimal point, so D8.3
determines the decimal point. The other input data items have decimal points,
so those decimal points override the D edit descriptor as far as decimal points
are concerned.
R = 1234.678
PRINT 1, R, R, R
1 FORMAT( D9.3 / D8.4 / D13.4 )
END
0.123D+04
********
∆∆∆0.1235D+04
In the above example, the second printed line is asterisks because the D8.4
does not allow for the sign; in the third printed line the D13.4 results in three
leading blanks.
E Editing
The E specifier is for the exponential form of decimal real data items. The
general form is:
E [ w [ .d ] [ Ee ] ]
d indicates that the fractional part of the number (the part to the right of the
decimal point) has d digits. However, if the input datum contains a decimal
point, that decimal point overrides the d value.
The specified input/output list item must be of type real. On input, the
specified list item becomes defined with a real datum. On output, the specified
list item must be defined as a real datum.
For the form Ew.dEe, if | exponent | ≤ ( 10e ) - 1, then the exponent has the
form ±nnn.
n is any digit.
w need not allow for a minus sign, but must allow for a zero, the decimal
point, and d digits to the right of the decimal point, and an exponent.
Therefore, for nonnegative numbers, w ≥ d+6; if e is present, then w ≥ d+e+4.
For negative numbers, w ≥ d+7; if e is present, then w ≥ d+e+5.
∆∆∆0.123457E+06∆∆∆0.123467E+01∆∆0.1245670E+02
R = 1234.678
PRINT 1, R, R, R
1 FORMAT( E9.3 / E8.4 / E13.4 )
END
0.123E+04
********
∆∆∆0.1235E+04
In the above example, E8.4 does not allow for the sign, so we get asterisks.
Also, the extra wide field of the E13.4 results in three leading blanks.
REAL X / 0.000789 /
WRITE(*,'( E13.3)') X
WRITE(*,'( E13.3E4)') X
WRITE(*,'( E13.3E5)') X
END
∆∆∆∆0.789E-03
∆∆0.789E-0003
∆0.789E-00003
F [ w [ .d ] ]
The Fw and Fw.d edit specifiers indicate that the field to be edited occupies w
positions.
d indicates that the fractional part of the number (the part to the right of the
decimal point) has d digits. However, if the input datum contains a decimal
point, that decimal point overrides the d value.
The specified input/output list item must be of type real. On input, the
specified list item becomes defined with a real datum. On output, the specified
list item must be defined as a real datum.
The output field for the F w.d edit specifier has the width w. The value is right-
justified in that field. The field consists of zero or more leading blanks followed
by either a minus if the value is negative, or an optional plus, followed by the
magnitude of the value of the list item rounded to d decimal digits.
w must allow for a minus sign, at least one digit to the left of the decimal point,
the decimal point, and d digits to the right of the decimal point. Therefore, it
must be the case that w ≥ d+3.
12345.678DD23.5678D0.345678
R = 1234.678
PRINT 1, R, R, R
1 FORMAT( F9.3 / F8.4 / F13.4 )
END
∆1234.678
********
∆∆∆∆1234.6780
In the above example, F8.4 does not allow for the sign; F13.4 results in four
leading blanks and one trailing zero.
G Editing
The G specifier is for decimal real data items. The general form is:
G [ w [ .d ] ]
or:
G w.d E e
Range Form
0.1 ≤ N < 1.0 F(w-4).d, n(∆)
1.0 ≤ N < 10.0 F(w-4).(d-1), n(∆)
… …
10(d-2) ≤ N ≤ 10(d-1) F(w-4).1, n(∆)
10(d-1) ≤ N < 10d F(w-4).0, n(∆)
Example: Format:
–345,.05e–3,12
The I/O system is just being more lenient than described in the FORTRAN
Standard. In general, when doing a formatted read of noncharacter variables,
commas override field lengths. More precisely, for the Iw, Fw.d, Ew.d[Ee], and
Gw.d input fields, the field ends when w characters have been scanned, or a
comma has been scanned, whichever occurs first. If it is a comma, the field
consists of the characters up to, but not including, the comma; the next field
begins with the character following the comma.
The above program reads a field into the variable R, then reads the number of
characters remaining after that field into L, then reads L characters into CVECT.
Q as the nth edit descriptor matches with L as the nth element in the READ list.
[ k ]P
k Integer constant, with an optional sign
P by itself is equivalent to 0P. It resets the scale factor to the default value 0P.
This P by itself is nonstandard.
Scope
The scale factor is reset to zero at the start of execution of each I/O statement.
The scale factor can have an effect on D, E, F, and G edit descriptors.
Input examples: Showing data, scale factors, and resulting value stored:
Output
On output, with D, and E descriptors, and with G descriptors if the E editing is
required, the internal item gets its basic real constant part multiplied by 10k,
and the exponent is reduced by k before it is written out.
Output Examples: Showing value stored, scale factors, and resulting output:
For example, the unsigned specifier can be used with the radix specifier to
format a hexadecimal dump, as follows:
Sequential Access
On input, any remaining portion of the current record is skipped, and the file is
positioned at the beginning of the next record. Two successive slashes (//) skip
a whole record.
Direct Access
Each slash increases the record number by one, and the file is positioned at the
start of the record with that record number.
INIT = 3
INIT = 3 LAST = 8
INIT = 3 LAST =
INIT = 3 LAST = 8
Runtime Formats
You can put the format specifier into an object that you can change during
execution. Doing so improves flexibility. There is some increase in execution
time because this kind of format specifier is parsed every time the I/O
statement is executed. These are also called variable formats.
You must provide the delimiting left and right parentheses, but not the word
FORMAT, and not a statement number.
You must declare the object so that it is big enough to hold the entire format.
For instance, '(8X,12I)' does not fit in an INTEGER*4 or a CHARACTER*4
object.
1 FORMAT( 3F6.1 )
1 FORMAT( 3F<N>.1 )
1 FORMAT( 3F<2*N+M>.1 )
Unformatted I/O
Unformatted I/O is used to transfer binary information to or from memory
locations without changing its internal representation. Each execution of an
unformatted I/O statement causes a single logical record to be read or written.
Since internal representation varies with different architectures, unformatted
I/O is limited in its portability.
You can use unformatted I/O to write data out temporarily, or to write data
out quickly for subsequent input to another FORTRAN program running on a
machine with the same architecture.
Example:
WRITE( 8 ) A, B
The FORTRAN runtime system embeds the record boundaries in the data by
inserting an INTEGER*4 byte count at the beginning and end of each
unformatted sequential record during an unformatted sequential WRITE. The
trailing byte count enables BACKSPACE to operate on records. The result is that
FORTRAN programs can use an unformatted sequential READ only on data
that was written by an unformatted sequential WRITE operation. Any attempt
to read such a record as formatted would have unpredictable results.
For each read, you still must tell it the initial record to start at, in this case
which byte, so you must know the size of each item. ♦
Here we knew beforehand the size of the records on the file. In this case we can
read the file just as it was written.
However, if we only know the size of each item but not the size of the records
on a file we can use recl=1 on the OPEN statement to have the I/O list itself
determine how many items to read:
In the above example, after reading 3 integers (12 bytes), you start the next
read at record 13.
List-Directed I/O
List-directed I/O is a free-form I/O for sequential access devices. To get it, use
an asterisk as the format identifier, as in:
READ( 6, * ) A, B, C
The above input stands for 4 complex constants, 2 null input fields, and 4
string constants.
• A slash (/) in the input list terminates assignment of values to the input list
during list-directed input, and the remainder of the current input line is
skipped. Any text that follows the slash is ignored and can be used to
comment the data line.
Output Format
List-directed output provides a quick and easy way to print output without
fussing with format details. If you need exact formats, use formatted I/O. A
suitable format is chosen for each item, and where a conflict exists between
complete accuracy and simple output form, the simple form is chosen.
Also note:
• Output lines longer than 80 characters are avoided where possible.
• Complex and double complex values include an appropriate comma.
• Real, double, and quadruple precision values are formatted differently.
• A backslash-n (\n) in a character string is output as a carriage return, unless
the –xl option is on, and then it is output as a backslash-n(\n).
Type Format
BYTE Two blanks followed by the number
CHARACTER*n An {n = length of character expression}
COMPLEX '∆∆(', 1PE14.5E2, ',', 1PE14.5E2, ')'
COMPLEX*16 '∆∆(', 1PE22.13.E2, ',', 1PE22.13.E2, ')'
COMPLEX*32 '∆∆(', 1PE44.34E3, ',', 1PE44.34E3, ')'
INTEGER*2 Two blanks followed by the number
INTEGER*4 Two blanks followed by the number
INTEGER*8 Two blanks followed by the number
LOGICAL*1 Two blanks followed by the number
LOGICAL*2 L3
LOGICAL*4 L3
LOGICAL*8 L3
REAL 1PE14.5E2
REAL*8 1PE22.13.E2
REAL*16 1PE44.34E4
Unquoted Strings
f77 list-directed I/O allows reading of a string not enclosed in quotes. ♦
The string must not start with a digit, and cannot contain separators (commas
or slashes (/)) or whitespace (spaces or tabs). A newline terminates the string
unless escaped with a backslash (\). Any string not meeting the above
restrictions must be enclosed in single or double quotes.
demo% a.out
23 label 82 locked
23label 82locked
demo%
Internal I/O
f77 extends list-directed I/O to allow internal I/O. ♦
During internal, list-directed reads, characters are consumed until the input list
is satisfied or the end-of-file is reached. During internal, list-directed writes,
records are filled until the output list is satisfied. The length of an internal
array element should be at least 20 characters to avoid logical record overflow
when writing double-precision values. Internal, list-directed read was
implemented to make command line decoding easier. Internal, list-directed
output should be avoided.
NAMELIST I/O
NAMELIST I/O produces format-free input or output of whole groups of
variables, or input of selected items in a group of variables. ♦
Syntax Rules
The syntax of the NAMELIST statement is:
NAMELIST /group-name/namelist[[,]/group-name/namelist]…
group-name Identifier
namelist List of variables or arrays, separated by commas
CHARACTER*18 SAMPLE
LOGICAL*4 NEW
REAL*4 DELTA
NAMELIST /CASE/ SAMPLE, NEW, DELTA
The input data can include array elements and strings. It can include
substrings in the sense that the input constant data string can be shorter than
the declared size of the variable.
Restrictions
group name can appear in only the NAMELIST, READ, or WRITE statements, and
must be unique for the program.
REAL ARRAY(4,4)
CHARACTER*18 SAMPLE
LOGICAL*4 NEW
REAL*4 DELTA
NAMELIST /CASE/ SAMPLE, NEW, DELTA
NAMELIST /GRID/ ARRAY, DELTA
In the above example, DELTA is in the group CASE and in the group GRID.
Output Actions
NAMELIST output uses a special form of WRITE statement, which makes a
report that shows the group name. For each variable of the group, it shows the
name and current value in memory. It formats each value according to the type
of each variable, and writes the report so that NAMELIST input can read it.
[NML=]group-name
The NAMELIST WRITE statement writes values of all variables in the group, in
the same order as in the NAMELIST statement.
Note that if you do omit the keyword NML then the unit parameter must be
first, namelist-specifier must be second, and there must not be a format specifier.
Input Actions
The NAMELIST input statement reads the next external record, skipping over
column one, and looking for the symbol $ in column two or beyond, followed
by the group name specified in the READ statement.
If the $group-name is not found, the input records are read until end of file.
The records are input and values assigned by matching names in the data with
names in the group, using the data types of the variables in the group.
Variables in the group that are not found in the input data are unaltered.
[NML=]group-name
CHARACTER*14 SAMPLE
LOGICAL*4 NEW
REAL*4 DELTA, MAT(2,2)
NAMELIST /CASE/ SAMPLE, NEW, DELTA, MAT
READ ( 1, CASE )
In this example, the group CASE consists of the variables, SAMPLE, NEW, DELTA,
and MAT. If you do omit the keyword NML, then you must also omit the
keyword UNIT. The unit parameter must be first, namelist-specifier must be
second, and there must not be a format specifier.
Data Syntax
The first record of NAMELIST input data has the special symbol $ (dollar sign)
in column two or beyond, followed by the NAMELIST group name. This is
followed by a series of assignment statements, starting in or after column two,
You can alternatively use an ampersand (&) in place of each dollar sign, but the
beginning and ending delimiters must match. END is an optional part of the
last delimiter.
The input data assignment statements must be in one of the following forms:
variable=value
array=value1[, value2,]…
array(subscript)=value1[, value2,]…
array(subscript,subscript)=value1[, value2,]…
variable=character constant
variable(index:index)=character constant
Use quotes (either " or ') to delimit character constants. For more on character
constants, see the next section.
The data could be on several records. Here NEW was not input, and the order is
not the same as in the example NAMELIST statement:
∆$case
∆delta=0.05
∆mat( 2, 2 ) = 2.2
∆sample='Demo'
∆$
There must be at least one comma, space, or tab between constants. Zero or
more spaces or tabs are the same as a single space. You can enter:
1,2,3, or 1 2 3, or 1, 2, 3, and so forth.
A null data item is denoted by two consecutive commas, and it means the
corresponding array element or complex variable value is not to be changed.
Null data item can be used with array elements or complex variables only. One
null data item represents an entire complex constant; you cannot use it for
either part of a complex constant.
This code loads 9s into row 1, skips 4 elements, and loads 8s into row 3 of
ARRAY.
The form r*c stores r copies of the constant c into an array, where r is a nonzero,
unsigned integer constant, and c is any constant.
The program, nam3.f, reads the above input and loads 980.0 into the first 5
elements of the array PSI.
• The form r* skips r elements of an array (that is, does not change them),
where r is an unsigned integer constant.
The program, nam3.f, with the above input, skips the first 3 elements and
loads 980.0 into elements 4,5,6,7,8 of PSI.
Name Requests
If your program is doing NAMELIST input from the terminal, you can request
the group name and NAMELIST names that it accepts.
This chapter tabulates and explains the set of intrinsic functions that are part of
Sun FORTRAN 77. (For information about Fortran library routines, see the Sun
Fortran Library Reference.)
Intrinsic functions that are Sun extensions of the ANSI FORTRAN 77 standard
are marked with ♦.
Intrinsic functions have generic and specific names when they accept arguments
of more than one data type. In general, the generic name returns a value with
the same data type as its argument. The function may also be called by one of
its specific names to handle a specific argument data type.
With functions that work on more than one data item (e.g. sign(a1,a2) ), all
the data arguments must be the same type.
In the following tables, the FORTRAN 77 intrinsic functions are listed by:
321
6
Note – Compiler options -dbl, -i2, -r8, and -xtypemap change the default
sizes of variables and have an effect on intrinsic references. See the Remarks
section on page 333.
Note that REAL*16 and COMPLEX*32 are SPARC and PowerPC only.
Arithmetic
Table 6-1 Arithmetic Functions
Type Conversion
Table 6-2 Type Conversion Functions
Trigonometric Functions
Table 6-3 Trigonometric Functions
Character Functions
Table 6-5 Character Functions
Miscellaneous Functions
Other miscellaneous functions include bitwise functions, environmental
inquiry functions, and memory allocation and deallocation functions.
Bit Manipulation
Table 6-6 Bitwise Functions
No. of Argument
Bitwise Operations Args. Specific Name Type Function Type
Complement 1 NOT ♦ INTEGER INTEGER
And 2 AND ♦ INTEGER INTEGER
2 IAND ♦ INTEGER INTEGER
Inclusive or 2 OR ♦ INTEGER INTEGER
2 IOR ♦ INTEGER INTEGER
Exclusive or 2 XOR ♦ INTEGER INTEGER
2 IEOR ♦ INTEGER INTEGER
Shift 2 ISHFT ♦ INTEGER INTEGER
See Note (14).
Left shift 2 LSHIFT ♦ INTEGER INTEGER
See Note (14).
Right shift 2 RSHIFT ♦ INTEGER INTEGER
See Note (14).
Logical right shift 2 LRSHFT ♦ INTEGER INTEGER
See Note (14).
Circular shift 3 ISHFTC ♦ INTEGER INTEGER
Bit extraction 3 IBITS ♦ INTEGER INTEGER
Bit set 2 IBSET ♦ INTEGER INTEGER
Bit test 2 BTEST ♦ INTEGER LOGICAL
Bit clear 2 IBCLR ♦ INTEGER INTEGER
The above functions are available as intrinsic or extrinsic functions. See also
the discussion of the library bit manipulation routines in the Fortran Library
Reference manual.
No. of
Definition Args. Generic Name Specific Name Argument Type Function Type
Base of Number System 1 EPBASE ♦ - INTEGER INTEGER
REAL INTEGER
DOUBLE INTEGER
REAL*16 INTEGER
Number of Significant Bits 1 EPPREC ♦ - INTEGER INTEGER
REAL INTEGER
DOUBLE INTEGER
REAL*16 INTEGER
Minimum Exponent 1 EPEMIN ♦ - REAL INTEGER
DOUBLE INTEGER
REAL*16 INTEGER
Maximum Exponent 1 EPEMAX ♦ - REAL INTEGER
DOUBLE INTEGER
REAL*16 INTEGER
Least Nonzero Number 1 EPTINY ♦ - REAL REAL
DOUBLE DOUBLE
REAL*16 REAL*16
Largest Number Representable 1 EPHUGE ♦ - INTEGER INTEGER
REAL REAL
DOUBLE DOUBLE
REAL*16 REAL*16
Epsilon 1 EPMRSP ♦ - REAL REAL
See Note (16). DOUBLE DOUBLE
REAL*16 REAL*16
Memory
Table 6-8 Memory Functions
Although malloc and free are not, strictly speaking, intrinsics, they are listed
here and in the Sun Fortran Library Reference.
Remarks
The following remarks apply to all of the intrinsic function tables in this
chapter.
• The abbreviation DOUBLE stands for DOUBLE PRECISION.
• An intrinsic that takes INTEGER arguments accepts INTEGER*2,
INTEGER*4, or INTEGER*8.
• INTEGER intrinsics that take INTEGER arguments return vaules of INTEGER
type determined as follows – note that options -i2, -dbl, and -xtypemap
may alter the default sizes of actual arguments:
• mod sign dim max min and iand or ior xor ieor — size of the
value returned is the largest of the sizes of the arguments.
• abs ishft lshift rshift lrshft ibset btest ivclr ishftc
ibits — size of the value returned is the size of the first argument.
• int epbase epprec malloc — size of the value returned is the size of
default INTEGER.
• ephuge — size of the value returned is the size of the default INTEGER, or
the size of the argument, whichever is largest.
Notes on Functions
Tables and notes 1 through 12 are based on the “Table of Intrinsic Functions,”
from ANSI X3.9-1978 Programming Language FORTRAN, with the FORTRAN
extensions added.
(1) INT
If A is type complex or double complex, then apply the above rule to the real
part of A.
(2) REAL
(3) DBLE
(3’) QREAL
(4) CMPLX
If CMPLX has two arguments, then they must be of the same type, and they
may be one of integer, real, or double precision.
If CMPLX has one argument, then it may be one of integer, real, double
precision, complex, COMPLEX*16, or COMPLEX*32.
(4’) DCMPLX
If DCMPLX has two arguments, then they must be of the same type, and they
may be one of integer, real, or double precision.
If DCMPLX has one argument, then it may be one of integer, real, double
precision, complex, COMPLEX*16, or COMPLEX*32.
(5) ICHAR
(6) COMPLEX
(7) Radians
All angles are expressed in radians, unless the “Intrinsic Function” column
includes the “(degrees)” remark.
(8’) CBRT
(10) INDEX
The value of the argument of the LEN function need not be defined at the
time the function reference is executed.
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.
(14) Shift
The LSHIFT and RSHIFT functions are the FORTRAN analogs of the C <<
and >> operators. As in C, the semantics depend on the hardware.
The behavior of the shift functions with an out of range shift count is
hardware dependent and generally unpredictable. In this release, shift
counts larger than 31 result in hardware dependent behavior.
(16) Epsilon
(18) SIZEOF
Double-Precision Complex
Table 6-9 Double-Precision Complex Functions
Degree-Based Trigonometric
Table 6-10 Degree-Based Trigonometric Functions
Bit-Manipulation
Table 6-11 Bit-Manipulation Functions
VMS FORTRAN takes a similar approach, but makes the specific names
available.
Table 6-14 VMS Functions That Are Translated into f77 Generic Names
Zero Extend
The following zero-extend functions are recognized by f77. The first unused
high-order bit is set to zero and extended toward the higher-order end to the
width indicated in the table
This appendix contains two tables: ASCII character sets and control characters.
345
A
Dec Oct Hex Name Dec Oct Hex Name Dec Oct Hex Name Dec Oct Hex Name
0 000 00 NUL 32 040 20 SP 64 100 40 @ 96 140 60 ‘
1 001 01 SOH 33 041 21 ! 65 101 41 A 97 141 61 a
2 002 02 STX 34 042 22 " 66 102 42 B 98 142 62 b
3 003 03 ETX 35 043 23 # 67 103 43 C 99 143 63 c
4 004 04 EOT 36 044 24 $ 68 104 44 D 100 144 64 d
5 005 05 ENQ 37 045 25 % 69 105 45 E 101 145 65 e
6 006 06 ACK 38 046 26 & 70 106 46 F 102 146 66 f
7 007 07 BEL 39 047 27 ’ 71 107 47 G 103 147 67 g
8 010 08 BS 40 050 28 ( 72 110 48 H 104 150 68 h
9 011 09 HT 41 051 29 ) 73 111 49 I 105 151 69 i
10 012 0A LF 42 052 2A * 74 112 4A J 106 152 6A j
11 013 0B VT 43 053 2B + 75 113 4B K 107 153 6B k
12 014 0C FF 44 054 2C , 76 114 4C L 108 154 6C l
13 015 0D CR 45 055 2D – 77 115 4D M 109 155 6D m
14 016 0E SO 46 056 2E . 78 116 4E N 110 156 6E n
15 017 0F SI 47 057 2F / 79 117 4F O 111 157 6F o
16 020 10 DLE 48 060 30 0 80 120 50 P 112 160 70 p
17 021 11 DC1 49 061 31 1 81 121 51 Q 113 161 71 q
18 022 12 DC2 50 062 32 2 82 122 52 R 114 162 72 r
19 023 13 DC3 51 063 33 3 83 123 53 S 115 163 73 s
20 024 14 DC4 52 064 34 4 84 124 54 T 116 164 74 t
21 025 15 NAK 53 065 35 5 85 125 55 U 117 165 75 u
22 026 16 SYN 54 066 36 6 86 126 56 V 118 166 76 v
23 027 17 ETB 55 067 37 7 87 127 57 W 119 167 77 w
24 030 18 CAN 56 070 38 8 88 130 58 X 120 170 78 x
25 031 19 EM 57 071 39 9 89 131 59 Y 121 171 79 y
26 032 1A SUB 58 072 3A : 90 132 5A Z 122 172 7A z
27 033 1B ESC 59 073 3B ; 91 133 5B [ 123 173 7B {
28 034 1C FS 60 074 3C < 92 134 5C \ 124 174 7C |
29 035 1D GS 61 075 3D = 93 135 5D ] 125 175 7D }
30 036 1E RS 62 076 3E > 94 136 5E ^ 126 176 7E ~
31 037 1F US 63 077 3F ? 95 137 5F _ 127 177 7F DEL
This appendix shows a table that contains selected samples of the f77
statement types. The purpose is to provide a quick reference for syntax details
of the more common variations of each statement type.
349
B
Whatever the size of the data element in question, the most significant bit of
the data element is always stored in the lowest-numbered byte of the byte
sequence required to represent that object.
359
C
Extreme Exponents
The representations of extreme exponents are as follows.
Zero (signed)
Zero (signed) is represented by an exponent of zero and a fraction of zero.
Subnormal Number
The form of a subnormal number is:
sign 1-bias
(-1) *2 *0.f
Signed Infinity
Signed infinity—that is, affine infinity—is represented by the largest value that
the exponent can assume (all ones), and a zero fraction.
Abbreviation Meaning
Sub Subnormal number
Num Normalized number
Inf Infinity (positive or negative)
NaN Not a Number
Uno Unordered
Right Operand
Left Operand 0 Sub Num Inf NaN
0 0 Sub Num Inf NaN
Sub Sub Sub Num Inf NaN
Num Num Num Num Inf NaN
Inf Inf Inf Inf Read Note NaN
NaN NaN NaN NaN NaN NaN
In the above table, for Inf ± Inf: Inf + Inf = Inf, and Inf - Inf = NaN.
Right Operand
Left Operand 0 Sub Num Inf NaN
0 0 0 0 NaN NaN
Sub 0 0 NS Inf NaN
Num 0 NS Num Inf NaN
Inf NaN Inf Inf Inf NaN
NaN NaN NaN NaN NaN NaN
Right Operand
Left Operand 0 Sub Num Inf NaN
0 NaN 0 0 0 NaN
Sub Inf Num Num 0 NaN
Num Inf Num Num 0 NaN
Inf Inf Inf Inf NaN NaN
NaN NaN NaN NaN NaN NaN
Right Operand
Left Operand 0 Sub Num Inf NaN
0 = < < < Uno
Sub > < < Uno
Num > > < Uno
Inf > > > = Uno
NaN Uno Uno Uno Uno Uno
Note:
• If either X or Y is NaN, then X.NE.Y is .TRUE., and the others (.EQ., .GT.,
.GE., .LT., .LE.) are .FALSE.
• +0 compares equal to -0.
• If any argument is NaN, then the results of MAX or MIN are undefined.
The bytes in a 32-bit integer, when read from address n, end up in the register
as shown in the following tables.
Table C-8 Bits and Bytes for Intel and VAX Computers
Table C-9 Bits and Bytes for 680x0 and SPARC Computers
The bits are numbered the same on these systems, even though the bytes are
numbered differently.
This chapter describes the VMS language extensions that Sun Fortran 77
supports. These extensions are all, of course, nonstandard. ♦
Background
This FORTRAN compiler includes the VMS extensions to make it as easy as
possible to port FORTRAN programs from VMS environments to Solaris
environments. The compiler provides almost complete compatibility with VMS
FORTRAN. These extensions are included in dbx as well as f77:
365
D
• Octal (O)
• Hexadecimal (X)
• Hexadecimal (Z)
• Default field indicators for w, d, and e fields in FORMAT statements
• Reading into Hollerith edit descriptors
• APPEND option for OPEN
• Long names (32 characters)
• _ and $ in names
• Long source lines (132-character), if the -e option is on
• Records, structures, unions, and maps
• Getting addresses by the %LOC function
• Passing arguments by the %VAL function
• End-of-line comments
• OPTIONS statement
• VMS Tab-format source lines are valid.
• Initialize in common
The compiler accepts omitted actual argument in a subroutine call, that is,
two consecutive commas compile to a null pointer. Reference to that dummy
argument gives a segmentation fault.
• REAL*16
The FORTRAN Standard requires the FILE= specifier for OPEN and
INQUIRE to be an expression of type CHARACTER. f77 accepts a numeric
variable or array element reference.
• Consecutive operators
f77 allows two consecutive arithmetic operators when the second operator
is a unary + or -. Here are two consecutive operators:
X = A ** -B
X = A ** (-B)
Examples: Contexts for illegal real expressions that f77 converts to integer:
• Alternate RETURN
1 FORMAT( 3F6.1 )
1 FORMAT( 3F<N>.1 )
In general, you need this -xl option if a source statement can be interpreted
for either a VMS way of behavior or an f77 way of behavior, and you want the
VMS way of behavior. The -xl option forces the compiler to interpret it as
VMS FORTRAN.
Note also the -vax=spec option, which allows specification of these VMS
extensions individually. See the Sun Fortran User’s Guide for details.
If the –xl[d] option is not set, then the argument n in the OPEN option
RECL=n is assumed to be the number of bytes to use for the record size.
If the –xl[d] option is set, then the argument n in the OPEN option RECL=n
is assumed to be the number of words, so the compiler uses n*4 as the
number of bytes for the record size.
If the –xl[d] option is set, and if the compiler cannot determine if the file is
formatted or unformatted, then it issues a warning message that the record
size may need to be adjusted. This result could happen if the information is
passed in variable character strings.
If the –xl[d] option is set, then the compiler interprets VMS logical file
names on the INCLUDE statement if it finds the environment variable,
LOGICALNAMEMAPPING, to define the mapping between the logical names
and the UNIX path name.
With –xl[d], the VMS FORTRAN notation "703 signals f77 to convert
from the integer octal constant to its integer decimal equivalent, 451 in this
case. In VMS FORTRAN, "703 cannot be the start of a character constant,
because VMS FORTRAN character constants are delimited by apostrophes,
not quotes.
• Backslash (\) as ordinary character within character constants
With -xld, this code prints I and X. Without -xld, it does not print them.
• Align structures as in VMS FORTRAN
Use this feature if your program has some detailed knowledge of how VMS
structures are implemented. If you need to share structures with C, you
should use the default: no -xl
then formatted numeric input ignores imbedded and trailing blanks. The
corresponding VMS defaults treat them as zeros.
Index-377
alignment elements
structures, as in VMS, 370, 373 data types, 14
summary of, 22 not OK in NAMELIST list, 311
variables, 15 input by NAMELIST, 318
allocation of storage, 15 names with no subscripts, 42
allowed I/O combinations, 257 ordering, 44
real, 221
alternate
subscripts, 43
octal notation, 30
return, 224, 368 ASCII character set, 345
ampersand, alternate return, 97, 99, 368 ask for namelist names, 319
anonymous field, 50, 236 ASSIGN, 82
ANSI X3.9-1978 FORTRAN 77 standard, 1 assignment
arithmetic, 69, 87
apostrophe
character, 72, 73
character constants, 25, 27
logical, 75
direct-access record, 214, 263, 369
statement, 84
format specifier, 269
assumed size array, 42
append on open
open, 190 asterisk
alternate return, 97, 368
arguments
hex and octal output, 282
dummy, not allowed in NAMELIST
list, 311 AUTOMATIC, 90
fields, 51, 222 automatic structure not allowed, 91
omitted, 367
records, 51, 222 B
arithmetic
B
assignment, 69
constant indicator, 34
assignment statement, 87
format specifier, 270
expression, 64, 65
IF, 162 backslash, 3, 25, 370, 372
intrinsic functions, 322 BACKSPACE, 92
operations on extreme values, 361 backspace character, 27
operator, 64 basic terms, 2
array binary
adjustable bounds, 41 constants, 34
assumed size, 42 initialization, 34
bounds, 40 operator, 64
character, 41, 102 bit
complex numbers, 110 manipulation functions, 331, 340
declarators, 39 bit and byte order, 364
definition, 39
bitwise
dimensions, 40
operators, 69
double-complex, 129
Index-379
statement, 108 copy
COMPLEX*16, 17, 18, 28 NAMELIST, 318
COMPLEX*32, 17, 28 Courier font, xviii
COMPLEX*8, 17
computed GO TO, 159 D
concatenate strings, 71 d comments, 9
concatenation operator, 71 D format specifier, 288
conditional termination control, 300 DATA, 112
consecutive data
commas, NAMELIST, 317 namelist syntax, 315, 318
operators, 367 representation
constant double precision, 359
expression, 77 real number, 359
names (symbolic constants), 4 signed infinity, 360
null character constants, 26 type
octal, 368 BYTE, 16
radix-50, 366 CHARACTER, 16
typeless numeric, 368 COMPLEX, 17
values in NAMELIST, 316 COMPLEX*16, 17
constants, 24 COMPLEX*32, 17
binary, 34 COMPLEX*8, 17
characters, 24 DOUBLE COMPLEX, 17, 18
complex, 27 DOUBLE PRECISION, 18
COMPLEX*16, 28 INTEGER, 18
COMPLEX*32, 28 INTEGER*4, 19
double complex, 28 LOGICAL, 20
double-precision real, 32 LOGICAL*1, 16, 20
hex, 34 LOGICAL*2, 20
integer, 29 LOGICAL*4, 20, 21
logical, 30 of an expression, 68
octal, 34 properties, 15
quad complex, 28 quad real, 22
quad real, 33 REAL, 21
real, 31 REAL*16, 22
REAL*16, 33 REAL*4, 21
REAL*4, 31 REAL*8, 21
REAL*8, 32 short integer, 19
typeless, 34 DBLE, 324
continuation lines, 7, 8 DBLEQ, 324
CONTINUE, 111 DCMPLX, 325
control characters, 3, 35, 71 deallocate memory by free, 59, 203
in assignment, 73, 88 debug statement, 373
meanings, 347
Index-381
END, 136 external C functions, 11
END DO, 137 extract substring, 45
END FILE, 138 extreme
END IF, 140 exponent data representation, 360
END MAP, 141 values for arithmetic operations, 361
end of text, 71
END STRUCTURE, 142 F
END UNION, 143 F format specifier, 293
end-of-line comments, 9, 366 field, 48
ENTRY, 144 argument that is a field, 51, 222
environmental inquiry functions, 332 COMMON with a field, 51, 222
epbase, 332 declaration, 48, 185, 235
DIMENSION with a field, 51, 222
ephuge, 332
dimensioning in type statements, 49,
epmax, 332
236
epmin, 332 EQUIVALENCE, not allowed in, 51,
epmrsp, 332 222
epprec, 332 list, 49
eptiny, 332 list of a structure, 48, 235, 236
equals statement, 84 map with a field, 56, 245
EQUIVALENCE, 147 name, %FILL, 50, 236
NAMELIST, not allowed in, 51, 222
ERR
offset, 50, 236
INQUIRE, 174
reference, 51
OPEN specifier, 191
SAVE, not allowed in, 51, 222
READ, 216
type, 50, 236
WRITE, 250
file, 192
error
carriage control on all files, 261
I/O, 256
INQUIRE, 173
escape sequences, 27 internal, 264
evaluation of expressions, 79 names, VMS logical, 370, 371
executable statements, 6 preattached, 261
exponential editing, 290 properties, 173
exponents not allowed in octal or hex query, 173
input, 281 scratch, 260
expression FILE, OPEN specifier, 189
arithmetic, 64, 65 FILE= specifier, 367
character, 71 files open, 255
constant, 77 filling with asterisks or spaces, hex and
evaluation, 79 octal output, 282
logical, 74 FIPS 69-1 standard, 1
variable format, 152
first character carriage control, 272
extended source lines, 8
FLOAT, 324
EXTERNAL, 149
Index-383
output, 282 inquire option
hexadecimal ACCESS, 175
constants, 34 BLANK, 176
initialization, 34 defaults, 176
hollerith, 88, 277 ERR, 174
EXIST, 174
horizontal positioning, 283
FILE, 174
FORM, 175
I FORMATTED, 175
I format specifier, 278 IOSTAT, 174
I/O, 257 NAMED, 175
direct, 263 NEXTREC, 176
errors, 256 none for permissions, 174
forms, 257 NUMBER, 174
random, 263 OPENED, 174
summary, 258 RECL, 175
SEQUENTIAL, 175
-i2, 19
UNFORMATTED, 175
IACHAR, 325 UNIT, 174
ICHAR, 325 INT, 324
IDINT, 324 INTEGER, 18, 179
IEEE, 361 integer
754, 1 and logical, 69
IF, 162, 163, 166 editing, 278
IFIX, 324 functions, 342
illegal REAL expressions, 367 logical, mixed expressions, 68
IMPLICIT, 167 long, 30
implicit operand with logical operator, 69
none data typing, 366 short, 30
statement, 13 integer constants, 29
typing, 13 INTEGER*2, 19
INCLUDE, 170, 371 INTEGER*4, 19
initial line, 7 INTEGER*8, 19
initialize internal files, 264
in BLOCK DATA, 366 INTRINSIC, 181
in COMMON, 366 intrinsic functions, 339
in declaration, 366 arithmetic, 322
input commas, 295 character, 330
INQUIRE, 173, 178 environmental inquiry, 332
inquire mathematical, 328
by file, 178 memory allocation and
by unit, 173, 178 deallocation, 333
options summary, 177 special VMS, 369
trigonometric, 326
Index-385
mode, 67 data item, NAMELIST, 317
mixed mode, 68 number of
mixing format of source lines, 8 continuation lines, 8
modifying open files, 255
carriage control, 271 numeric constant, typeless, 368
N O
name O
of scratch file, 192 constant indicator, 34
NAME option for OPEN, 369 edit descriptor, 280
NAMELIST, 186, 312, 315, 316 octal
$, 313 alternate notation, 30
&, 315 constant, 368
ask for names, 318 constants, 34
namelist-specifier, 312 initialization, 34
NML=, 312 octal and hex
prompt for names, 318 format, 280
restrictions, 311 format samples, 281
WRITE, 312 input, 281
namelist output, 282
data, 314, 318 off the underscores, 11
data syntax, 316 offset of fields, 50, 236
END, 315 omitted arguments, 367
I/O, 310 OPEN
names, 4 options, 369
NBS validation, 1 print file, 259
negative values, hex and octal output, 282 specifier
nested substructure, 53 ACCESS, 190
BLANK, 191
newline character, 27, 71
ERR, 191
NIST validation, 1
FILE, 189
NML=, 313 FORM, 190
noncharacter runtime format IOSTAT, 191
specifier, 367 RECL, 191
none, implicit data typing, 366 STATUS, 191
nonexecutable statements, 6 UNIT, 189
nonstandard statement, 188, 192
features, indicated by diamond, xix open files, limit of, 255
PARAMETER, 370, 372 operand, 63
notation octal alternate, 30 operator, 63
null **, 64
character, 27 // concatenate string, 71
character constants, 26 : substring, 45
Index-387
radix-50 constant, 366 relational operator, 76
random release memory by free, 59, 203
I/O, 263 repeat NAMELIST, 318
READ, 214 representation of data, 359
read requesting namelist names, 318
into hollerith edit descriptor, 277 restrictions
REAL, 21, 220 fields, 50, 236
expressions, illegal, 367 hex and octal output, 282
intrinsic, 324 NAMELIST, 311
real names, 4
arrays, 221 pointers, 60, 204
constants, 31 Q edit descriptor, 297
data representation of reals, 359 records, 51, 222
editing, 288, 293 structures, 49, 236
REAL*16, 22, 33, 367 substructures, 55
REAL*4, 21, 31 RETURN, 224
REAL*8, 21, 32 return alternate, 224, 225, 368
RECL specifier in OPEN, 191 reverse solidus, 3
recl=1, variable length records, 191 REWIND, 226
RECORD, 222 rshift, 338
record, 48 runtime formats, 210, 215, 249, 277, 300,
argument that is a record, 51, 222 303
assignment, 89
AUTOMATIC, not allowed in, 222 S
COMMON with a record, 51, 222
DATA, not allowed in, 51, 222 S edit descriptor, 298
DIMENSION with a record, 51 same line response, 272
EQUIVALENCE, not allowed in, 51, sample statements, 349
222 SAVE, 228
NAMELIST, not allowed in, 51, 222 scale
not allowed in NAMELIST list, 311 control, 297
PARAMETER, not allowed in, 222 factor, 297
reference, 51 scratch files, 192, 260
SAVE, not allowed in, 51, 222
SCRATCH option for OPEN, 192
size, unformatted, 370
specifier, direct-access, 214, 263, 369 SEQUENTIAL option for ACCESS in
statement, 50 OPEN, 190
STATIC, not allowed in, 222 short
variable length, 191 integer data type, 19
recursive, 90, 156, 231 integers, 30
reference sign control, 298
field, 51 signed infinity data representation, 360
record, 51 signs not allowed in octal or hex
input, 281
Index-389
NAMELIST U
input, 314
unary + or -, 367
input data, 315, 318
output, 312 unary operator, 65
statement, 311 unconditional GO TO, 161
OPEN statement, 188 underscore
record reference, 51 do not append to external names, 11
records, 50, 222 external names with, 11
structure, 48, 235 names with, 4
unions, 55, 244 unformatted
I/O, 303
record size, 370
T
UNION, 244
T edit descriptor, 283
union declaration, 55, 244
tab, 3
unit, logical unit preattached, 261
character, 27
control, 283 UNIT, OPEN specifier, 189
format source, 8, 366
temporary files, 192 V
terminal valid
I/O, 272 characters for data, 3
termination control edit descriptor, 300 characters in character set, 3
terms, 2 characters in names, 4
TMPDIR environment variable, 192 values, extreme for arithmetic
top of page, 259 operations, 361
triangle as blank space, xviii variable
two consecutive operators, 367 alignment, 15
boundary, 15
TYPE, 240, 368, 369
name, 4
type
variable formats, 152, 154, 210, 215, 249,
coercing functions, 343
267, 277, 300, 302, 303
field names, 50, 236
REAL*16, 367 variable-length records, 191
type, 241 variables, 38
typeless vertical format control, 259
constants, 34 $, 271
numeric constant, 368 space,0, 1, +, 272
types vertical tab character, 27
array elements, 14 VIRTUAL, 246, 366
files, 257 VMS FORTRAN
functions, 14 align structures, 370
summary of, 22 features with -xl
backslash, 3, 27, 308, 372
D or d debug lines, 9
debugging lines, 373
W
width defaults for field descriptors, 269
word boundary, 15
WRITE, 248
X
X
constant indicator, 34
edit descriptor, 283
-xl, 9, 16, 25, 27, 30, 86, 197, 369, 372
-xld, 373
Z
Z
constant indicator, 34
edit descriptor, 280
zero, leading, in hex and octal output, 282
zero-extend functions, 344
Index-391
Copyright 1996 Sun Microsystems Inc., 2550 Garcia Avenue, Mountain View, Californie 94043-1100, U.S.A. Tous droits
réservés.
Ce produit ou document est protégé par un copyright et distribué avec des licences qui en restreignent l’utilisation, la copie,
la distribution, et la décompilation. Aucune partie de ce produit ou de sa documentation associée ne peut être reproduite sous
aucune forme, par quelque moyen que ce soit, sans l’autorisation préalable et écrite de Sun et de ses bailleurs de licence, s’il
y en a.
Des parties de ce produit pourront être dérivées du système UNIX® licencié par Novell, Inc. et du système Berkeley 4.3 BSD
licencié par l’Université de Californie. UNIX est une marque enregistrée aux Etats-Unis et dans d’autres pays et licenciée
exclusivement par X/Open Company Ltd. Le logiciel détenu par des tiers, et qui comprend la technologie relative aux polices
de caractères, est protégé par un copyright et licencié par des fournisseurs de Sun.
Sun, Sun Microsystems, le logo Sun, SunSoft, Sun WorkShop, Sun Performance WorkShop et Sun Performance Library sont des
marques déposées ou enregistrées de Sun Microsystems, Inc. aux Etats-Unis et dans d’autres pays. Toutes les marques SPARC,
utilisées sous licence, sont des marques déposées ou enregistrées de SPARC International, Inc. aux Etats-Unis et dans d’autres
pays. Les produits portant les marques SPARC sont basés sur une architecture développée par Sun Microsystems, Inc.
Les interfaces d’utilisation graphique OPEN LOOK® et Sun™ ont été développées par Sun Microsystems, Inc. pour ses
utilisateurs et licenciés. Sun reconnaît les efforts de pionniers de Xerox pour la recherche et le développement du concept des
interfaces d’utilisation visuelle ou graphique pour l’industrie de l’informatique. Sun détient une licence non exclusive de
Xerox sur l’interface d’utilisation graphique Xerox, cette licence couvrant aussi les licenciés de Sun qui mettent en place
l’interface d’utilisation graphique OPEN LOOK et qui en outre se conforment aux licences écrites de Sun.
CETTE PUBLICATION EST FOURNIE “EN L’ETAT” SANS GARANTIE D’AUCUNE SORTE, NI EXPRESSE NI IMPLICITE,
Y COMPRIS, ET SANS QUE CETTE LISTE NE SOIT LIMITATIVE, DES GARANTIES CONCERNANT LA VALEUR
MARCHANDE, L’APTITUDE DES PRODUITS A RÉPONDRE A UNE UTILISATION PARTICULIERE, OU LE FAIT QU’ILS
NE SOIENT PAS CONTREFAISANTS DE PRODUITS DE TIERS.