HP Fortran Programmer Guide (766160-001, March 2014)

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$ ALIAS directive 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
%VAL built-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$ ALIAS directive 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$ ALIAS directive 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 115