HP OpenVMS Systems Documentation

Content starts here

HP Fortran for OpenVMS
User Manual


Previous Contents Index

9.5.4 OPTIONS Statement /CONVERT=keyword Method

You can only specify one numeric file format for all unit numbers using this method, unless you also use the logical name or OPEN statement CONVERT specifier method.

You specify the numeric format at compile time and must compile all routines under the same OPTIONS statement CONVERT=keyword qualifier. You could use one source program and compile it using different FORTRAN commands to create multiple executable programs that each read a certain format.

The logical name or OPEN CONVERT specifier methods take precedence over this method. For instance, you might use the logical name or OPEN CONVERT specifier method to specify each unit number that will use a format other than that specified using the FORTRAN command qualifier method. This method takes precedence over the FORTRAN command /CONVERT qualifier method.

You can use OPTIONS statements to specify the appropriate floating-point formats (in memory and in unformatted files) instead of using the corresponding FORTRAN command qualifiers. For example, to use G_float as both the memory format and as the unformatted file format, specify the following OPTIONS statements:


OPTIONS /FLOAT=G_FLOAT
OPTIONS /CONVERT=NATIVE

Because this method affects all unit numbers, you cannot read data in one format and write it in another format using the FORTRAN/CONVERT=keyword method alone, unless you use it in combination with the logical name method or the OPEN statement CONVERT keyword method to specify a different format for a particular unit number.

For More Information:

On the OPTIONS statement, see the HP Fortran for OpenVMS Language Reference Manual.

9.5.5 FORTRAN Command /CONVERT=keyword Qualifier Method

You can specify only one numeric format for all unit numbers by using the FORTRAN command qualifier method, unless you also use the logical name method or CONVERT specifier method. You specify the numeric format at compile time and must compile all routines under the same /CONVERT=keyword qualifier (or the equivalent OPTIONS statement). If needed, you can use one source program and compile it using different FORTRAN commands to create multiple executable programs that each read a certain format.

The other methods take precedence over this method. For instance, you might use the logical name or OPEN CONVERT specifier method to specify each unit number that will use a format other than that specified using the FORTRAN command qualifier method.

For example, the following DCL commands compile program FILE.F90 to use VAX D_float and F_float data. Data is converted between the file format and the little endian memory format (little endian integers, S_float and T_float little endian IEEE floating-point format). The created file, VAXD_CONVERT.EXE, is then run:


$ FORTRAN/FLOAT=IEEE_FLOAT /CONVERT=VAXD/OBJECT=VAXD_CONVERT.OBJ FILE.F90
$ LINK VAXD_CONVERT
$ RUN VAXD_CONVERT

Because this method affects all unit numbers, you cannot read or write data in different formats if you only use the FORTRAN /CONVERT=keyword method. To specify a different format for a particular unit number, use the FORTRAN /CONVERT=keyword method in combination with the logical name method or the OPEN statement CONVERT specifier method.

9.6 Additional Information on Nonnative Data

The following notes apply to porting nonnative data:

  • When porting source code along with the unformatted data, vendors might use different units for specifying the record length (RECL specifier, see Section 2.3.7) of unformatted files. While formatted files are specified in units of characters (bytes), unformatted files are specified in longword units (unless /ASSUME=BYTERECL is specified) for Compaq Fortran 77, HP Fortran, and some other vendors. The Fortran 90 standard, in Section 9.3.4.5, states: "If the file is being connected for unformatted input/output, the length is measured in processor-dependent units."1
  • Certain vendors apply different OPEN statement defaults to determine the record type. The default record type (RECORDTYPE) with HP Fortran depends on the values for the ACCESS and FORM specifiers for the OPEN statement, as described in the HP Fortran for OpenVMS Language Reference Manual.
  • Certain vendors use a different identifier for the logical data types, such as hex FF instead of 01 to denote "true."
  • Source code being ported might be coded specifically for big endian use.

For More Information:

  • On OPEN statement specifiers, see the HP Fortran for OpenVMS Language Reference Manual.
  • On HP Fortran file characteristics, see Section 6.5.
  • On HP Fortran record types, see Section 6.5.3.

Note

1 American National Standard Fortran 90, ANSI X3.198-1991, and International Standards Organization standard ISO/IEC 1539:1991


Chapter 10
Using HP Fortran in the Common Language Environment

This chapter describes:

10.1 Overview

HP Fortran provides you with a variety of mechanisms for gaining access to procedures and system services external to your HP Fortran programs. By including CALL statements or function references in your source program, you can use procedures such as mathematical functions, OpenVMS system services, and routines written in such languages as Compaq Fortran 77 and HP C.

The HP Fortran compiler operates within the OpenVMS common language environment, which defines certain calling procedures and guidelines. These guidelines allow you to use HP Fortran to call OpenVMS system or library routines and routines written in different languages (usually called mixed-language programming).

This chapter provides information on the OpenVMS procedure-calling standard and how to access OpenVMS system services.

For More Information:

About calling and using the RMS (Record Management Services) system services, see Chapter 11.

10.2 HP Fortran Procedures and Argument Passing

The bounds of the main program are usually defined by using PROGRAM and END or END PROGRAM statements. Within the main program, you can define entities related to calling a function or subroutine, including modules and interface blocks.

A function or subroutine is considered a subprogram. A subprogram can accept one or more data values passed from the calling routine; the values are called arguments.

There are two types of arguments:

  • Actual arguments are specified in the subprogram call.
  • Dummy arguments are variables within the function or subroutine that receive the values (from the actual arguments).

The following methods define the interface between procedures:

  • Declare and name a function with a FUNCTION statement and terminate the function definition with an END FUNCTION statement. Set the value of the data to be returned to the calling routine by using the function name as a variable in an assignment statement (or by specifying RESULT in a FUNCTION statement).
    Reference a function by using its name in an expression.
  • Declare and name a subroutine with a SUBROUTINE statement and terminate the subroutine definition with an END SUBROUTINE statement. No value is returned by a subroutine.
    Reference a subroutine by using its name in a CALL statement (or use a defined assignment statement).
  • For an external subprogram, depending on the type of arguments or function return values, you may need to declare an explicit interface to the arguments and function return value by using an interface block.
    Declare and name an interface block with an INTERFACE statement and terminate the interface block definition with an END INTERFACE statement. The interface body that appears between these two statements consists of function or subroutine specification statements.
  • You can make data, specifications, definitions, procedure interfaces, or procedures globally available to the appropriate parts of your program by using a module (use association).
    Declare a module with a MODULE statement and terminate the module definition with an END MODULE statement. Include the definitions and other information contained within the module in appropriate parts of your program with a USE statement. A module can contain interface blocks, function and subroutine declarations, data declarations, and other information.

For More Information:

On the HP Fortran language, including statement functions and defined assignment statements not described in this manual, see the HP Fortran for OpenVMS Language Reference Manual.

10.2.1 Explicit and Implicit Interfaces

An explicit interface occurs when the properties of the subprogram interface are known within the scope of the function or subroutine reference. For example, the function reference or CALL statement occurs at a point where the function or subroutine definition is known through host or use association. Intrinsic procedures also have an explicit interface.

An implicit interface occurs when the properties of the subprogram interface are not known within the scope of the function or subroutine reference. In this case, the procedure data interface is unknown to the compiler. For example, external routines (EXTERNAL statement) that have not been defined in an interface block have an implicit interface.

In most cases, you can use a procedure interface block to make an implicit interface an explicit one. An explicit interface provides the following advantages over an implicit interface:

  • Better compile-time argument checking and fewer run-time errors
  • In some cases, faster run-time performance
  • Ease of locating problems in source files since the features help to make the interface self-documenting
  • Allows use of some language features that require an explicit interface, such as array function return values.
  • When passing certain types of arguments between HP Fortran and non-Fortran languages, an explicit interface may be needed. For example, detailed information about an assumed-shape array argument can be obtained from the passed array descriptor. The array descriptor is generated when an appropriate explicit interface is used for certain types of array arguments.

For More Information:

On HP Fortran array descriptors, see Section 10.2.7.

10.2.2 Types of HP Fortran Subprograms

There are three major types of subprograms:

  • A subprogram might be local to a single program unit (known only within its host). Since the subprogram definition and all its references are contained within the same program unit, it is called an internal subprogram.
    An internal subprogram has an explicit interface.
  • A subprogram needed in multiple program units should be placed within a module. To create a module subprogram within a module, add a CONTAINS statement followed by the subprogram code. A module subprogram can also contain internal subprograms.
    A module subprogram has an explicit interface in those program units that reference the module with a USE statement (unless it is declared PRIVATE).
  • External subprograms are needed in multiple program units but cannot be placed in a module. This makes their procedure interface unknown in the program unit in which the reference occurs. Examples of external subprograms include general-purpose library routines in standard libraries and subprograms written in other languages, like C or Ada.
    Unless an external subprogram has an associated interface block, it has an implicit interface. To provide an explicit interface for an external subprogram, create a procedure interface block (see Section 10.2.3).
    For subprograms with no explicit interface, declare the subprogram name as external using the EXTERNAL statement within the program unit where the external subprogram reference occurs. This allows the linker to resolve the reference.
    An external subprogram must not contain PUBLIC or PRIVATE statements.

10.2.3 Using Procedure Interface Blocks

Procedure interface blocks allow you to specify an explicit interface for a subprogram as well as to define generic procedure names. This section limits discussion to those interface blocks used to provide an explicit subprogram interface. For complete information on interface blocks, see the HP Fortran for OpenVMS Language Reference Manual.

The components of a procedure interface block follow:

  • Begin a procedure interface block with an INTERFACE statement. Unless you are defining a generic procedure name, user-defined operator, or user-defined assignment, only the word INTERFACE is needed.
  • To provide the interface body, copy the procedure specification statements from the actual subprogram, including:
    • The FUNCTION or SUBROUTINE statements.
    • The interface body. For a procedure interface block, this includes specification (declaration) statements for the dummy arguments and a function return value (omit data assignment, FORMAT, ENTRY, DATA, and related statements).
      The interface body can include USE statements to obtain definitions.
    • The END FUNCTION or END SUBROUTINE statements.
  • Terminate the interface block with an END INTERFACE statement.
  • To make the procedure interface block available to multiple program units, you can do one of the following:
    • Place the procedure interface block in a module. Reference the module with a USE statement in each program unit that references the subprogram (use association).
    • Place the procedure interface block in each program unit that references the subprogram.

For an example of a module that contains a procedure interface block, see Section 1.4.

10.2.4 Passing Arguments and Function Return Values

HP Fortran uses the same argument-passing conventions as Compaq Fortran 77 on OpenVMS Alpha systems for non-pointer scalar variables and explicit-shape and assumed-size arrays.

When calling HP Fortran subprograms, be aware that HP Fortran expects to receive arguments the same way it passes them.

The main points about argument passing and function return values are as follows:

  • Arguments are generally passed by reference (arguments contain an address).
    An argument contains the address of the data being passed, not the data itself (unless explicitly specified otherwise, such as with the cDEC$ ATTRIBUTES directive or the %VAL built-in function).
    Assumed-shape arrays and deferred-shape arrays are passed by array descriptor.
    Character data is passed by character descriptor.1
    Arguments omitted by adding an extra comma (,) are passed as a zero by immediate value (see Section 10.8.4). Such arguments include OPTIONAL arguments that are not passed.
    Any argument specified using the %DESCR built-in function is also passed by descriptor (see Section 10.3).
  • Function return data is usually passed by immediate value (function return contains a value). Certain types of data (such as array-valued functions) are passed by other means.
    The value being returned from a function call usually contains the actual data, not the address of the data.
  • Character variables, explicit-shape character arrays, and assumed-size character arrays are passed by a character descriptor (except for character constant actual arguments when /BY_REF_CALL is used).
    Dummy arguments for character data can use an assumed length.
    When passing character arguments to a C routine as strings, the character argument is not automatically null-terminated by the compiler. To null-terminate a string from HP Fortran, use the CHAR intrinsic function (described in the HP Fortran for OpenVMS Language Reference Manual).

The arguments passed from a calling routine must match the dummy arguments declared in the called function or subroutine (or other procedure), as follows:

  • Arguments must be in the same order, unless argument keywords are used.
    Arguments are kept in the same position as they are specified by the user. The exception to same position placement is the use of argument keywords to associate dummy and actual arguments.
  • Each corresponding argument or function return value must at least match in data type, kind, and rank, as follows:
    • The primary HP Fortran intrinsic data types are character, integer, logical, real, and complex.
      To convert data from one data type to another, use the appropriate intrinsic procedures described in the HP Fortran for OpenVMS Language Reference Manual.
      Also, certain attributes of a data item may have to match. For example, if a dummy argument has the POINTER attribute, its corresponding actual argument must also have the POINTER attribute (see Section 10.2.6).
    • You can use the kind parameter to specify the length of each numeric intrinsic type, such as INTEGER (KIND=8). For character lengths, use the LEN specifier, perhaps with an assumed length for dummy character arguments (LEN=*).
    • The rank (number of dimensions) of the actual argument is usually the same (or less than) the rank of the dummy argument, unless an assumed-size dummy array is used.
      When using an explicit interface, the rank of the actual argument must be the same as the rank of the dummy argument.
      For example, when passing a scalar actual argument to a scalar dummy argument (no more than one array element or a nonarray variable), the rank of both is 0.
      Other rules which apply to passing arrays and pointers are described in Section 10.2.5, Section 10.2.6, and in the HP Fortran for OpenVMS Language Reference Manual.
  • The means by which the argument is passed and received (passing mechanism) must match.
    By default, HP Fortran arguments are passed by reference. (See Table 10-1 for information about passing arguments with the C property.)
    When calling functions or other routines that are intended to be called from another language (such as C), be aware that these languages may require data to be passed by other means, such as by value.
    Most HP Fortran function return values are passed by value. Certain types of data (such as array-valued functions) are passed by other means.
    In most cases, you can change the passing mechanism of actual arguments by using the following HP extensions:
  • To explicitly specify the procedure (argument or function return) interface, provide an explicit interface.
    You can use interface blocks and modules to specify INTENT and other attributes of actual or dummy arguments.

For More Information:

  • On passing arguments, function return values, and the contents of registers on OpenVMS systems, see the HP OpenVMS Calling Standard.
  • On intrinsic data types, see Chapter 8 and the HP Fortran for OpenVMS Language Reference Manual.
  • On intrinsic procedures and attributes available for array use, see the HP Fortran for OpenVMS Language Reference Manual.
  • On explicit interfaces and when they are required, see the HP Fortran for OpenVMS Language Reference Manual.
  • On an HP Fortran example program that uses an external subprogram and a module that contains a procedure interface block, see Example 1-3.

10.2.5 Passing Arrays as Arguments

Certain arguments or function return values require the use of an explicit interface, including assumed-shape dummy arguments, pointer dummy arguments, and function return values that are arrays. This is discussed in the HP Fortran for OpenVMS Language Reference Manual.

When passing arrays as arguments, the rank and the extents (number of elements in a dimension) should agree, so the arrays have the same shape and are conformable. If you use an assumed-shape array, the rank is specified and extents of the dummy array argument are taken from the actual array argument.

If the rank and extent (shape) do not agree, the arrays are not conformable. The assignment of elements from the actual array to the noncomformable (assumed-size or explicit-shape) dummy array is done by using array element sequence association.

Certain combinations of actual and dummy array arguments are disallowed.

For More Information:

  • On the types of arrays and passing array arguments, see the HP Fortran for OpenVMS Language Reference Manual.
  • On explicit interfaces and when they are required, see the HP Fortran for OpenVMS Language Reference Manual.
  • On array descriptors, see Section 10.2.7.

Note

1 For compatibility with older Compaq Fortran 77 OpenVMS VAX programs, character constant actual arguments (string literals) can be passed by reference if the HP Fortran program was compiled with the /BY_REF_CALL qualifier (see Section 2.3.9).


Previous Next Contents Index