HP Fortran Programmer Guide HP-UX 11i v1, HP-UX 11i v2, and HP-UX 11i v3 (B3908-90032,December 2012)

Example 23 Example 8-3 sort_em.c
#include &ltstdio.h&gt
void BubbleSort(int a[], int size)
void BubbleSort(int a[], int size)
{
int i, j, temp;
for (i = 0; i < size - 1; i++)
for (j = i + 1; j < size; j++)
if (a[i] > a[j])
{
temp = a[i];
a[i] = a[j];
a[j] = temp;
}
}
Before a Fortran program can call this function correctly, it must resolve two issues:
1. The name of the C function contains both uppercase and lowercase letters.
2. The function expects its second argument (the size of the array) to be passed by value.
The following $HP$ ALIASdirective handles both issues:
!$HP$ ALIAS bubblesort = 'BubbleSort'(%REF,%VAL)
The name bubblesort is the alias that Fortran will use to refer to the C function, and the%REF and
%VALbuilt-in functions change Fortran’s argument-passing conventions to conform to how the C
function expects the arguments to be passed.
The following is an HP Fortran program that uses the $HP$ ALIASdirective to call the C function
correctly.
Example 24 Example 8-4 test_sort.f90
PROGRAM main
! This program is linked with an object file that contains
! a C function with the following prototype declaration:
!
! void BubbleSort(int a[], int size);
!
! The ALIAS directive takes care of the differences
! between C and Fortran regarding case sensitivity
! and argument-passing conventions.
!$HP$ ALIAS bubblesort = 'BubbleSort'(%REF, %VAL)
INTEGER, PARAMETER :: n = 10
INTEGER, DIMENSION(n) :: num=(/5,4,7,8,1,0,9,3,2,6/)
PRINT *, 'Before sorting: ', num
CALL bubblesort(num, n)
PRINT *, 'After sorting: ', num
END PROGRAM main
Here are the command lines to compile, link, and execute the program, followed by the output
from a sample run:
$ cc -Aa -c sort_em.c
$ f90 test_sort.f90 sort_em.o
$ a.out
Before sorting: 5 4 7 8 1 0 9 3 2 6
After sorting: 0 1 2 3 4 5 6 7 8 9
If you use the $HP$ ALIASdirective in many of the Fortran source files in your program, you may
find it convenient to define all of the directives in one file and include that file in all of the Fortran
source files with the +pre_include=fileoption. This option takes one argument, file, which is
Case sensitivity 113