Passing arguments by reference or by value
To call subprograms written in languages other than Fortran (for example, user-written C programs, or operating system routines), the actual arguments may need to be passed by a method different from the default method used by Fortran. C routines, including those in system libraries, such as libc.so, require you to pass arguments by value instead of by reference. (Although C passes individual scalar array elements by value, it passes arrays by reference.)
- %REF
- Passes an argument by reference (that is, the called subprogram receives the address of the argument). It is the same as the default calling method for Fortran except that it also suppresses the extra length argument for character strings.
- %VAL
- Passes an argument by value (that is, the called subprogram receives
an argument that has the same value as the actual argument, but any
change to this argument does not affect the actual argument).
You can use this built-in function with actual arguments that are CHARACTER(1), BYTE, logical, integer, real, or complex expressions or that are sequence-derived type. Objects of derived type cannot contain pointers, arrays, or character structure components whose lengths are greater than one byte.
You cannot use %VAL with actual arguments that are array entities, procedure names, or character expressions of length greater than one byte.
%VAL causes XL Fortran to pass the actual argument as 32-bit or 64-bit intermediate values.
- 32-bit intermediate values
- If the actual argument is one of the following:
- An integer or a logical that is shorter than 32 bits, it is sign-extended to a 32-bit value.
- An integer or a logical that is longer than 32 bits, it is passed as two 32-bit intermediate values.
- Of type real or complex, it is passed as multiple 32-bit intermediate values.
- Of sequence-derived type, it is passed as multiple 32-bit intermediate values.
Byte-named constants and variables are passed as if they were INTEGER(1). If the actual argument is a CHARACTER(1), the compiler pads it on the left with zeros to a 32-bit value, regardless of whether you specified the -qctyplss compiler option.
- 64-bit intermediate values
- If the actual argument is one of the following:
- An integer or a logical that is shorter than 64 bits, it is sign-extended to a 64-bit value.
- Of type real or complex, it is passed as multiple 64-bit intermediate values.
- Of sequence-derived type, it is passed as multiple 64-bit intermediate values.
- VALUE attribute
- Specifies an argument association between a dummy and an actual
argument that allows you to pass the dummy argument with the value
of the actual argument. Changes to the value or definition status
of the dummy argument do not affect the actual argument.
You must specify the VALUE attribute for dummy arguments only.
You must not use the %VAL or %REF built-in functions to reference a dummy argument with the VALUE attribute, or the associated actual argument.
A referenced procedure that has a dummy argument with the VALUE attribute must have an explicit interface.
You must not specify the VALUE attribute with the following:- Arrays
- Derived types with ALLOCATABLE components
- Dummy procedures
EXTERNAL FUNC
COMPLEX XVAR
IVARB=6
CALL RIGHT2(%REF(FUNC)) ! procedure name passed by reference
CALL RIGHT3(%VAL(XVAR)) ! complex argument passed by value
CALL TPROG(%VAL(IVARB)) ! integer argument passed by value
END


