Example 25 Example
PROGRAM main ! This program initializes a
!displays its contents, then passes it to a C function,
!which displays its contents. The C function has the
!following declaration prototype:
!
! void get_array(int a[4][2]); !
!Note that the dimensions are declared in reverse order
!in C from the way they are declared in Fortran. INTEGER, DIMENSION(2,4) :: my_array = &
RESHAPE(SOURCE = (/1,2,3,4,5,6,7,8/), SHAPE = (/2,4/)) PRINT *, 'Here is how Fortran stores the array:' DO i = 1, 4
DO j = 1, 2
PRINT 10, j, i, my_array(j,i)
END DO
END DO
!There’s no need to use the %VAL or %REF
!because both C and Fortran pass arrays by reference.
CALL get_array(my_array)
10 FORMAT(‘my_array(', I1, ',', I1, ') =', I2) END PROGRAM main
Below is the source file for a HP Fortran program that calls a C function, passing a
The following is the source file for the C function.
Example 26 Example
#include <stdio.h>
/* get_array: displays the contents of the array argument*/ void get_array(int a[4][2])
{
int i, j;
printf("\nHere is the same array as accessed from C:\n\n"); for (i = 0; i < 4; i++)
for (j = 0; j < 2; j++)
printf(“a[%d][%d] = %d\n”, i, j, a[i][j]);
}
Here are the command lines to compile, link, and execute the program, followed by the output from a sample run:
$ cc
$ f90 pass_array.f90 get_array.o
$ a.out
Here is how Fortran stores the array:
my_array(1,1) = 1 my_array(2,1) = 2 my_array(1,2) = 3 my_array(2,2) = 4 my_array(1,3) = 5 my_array(2,3) = 6 my_array(1,4) = 7 my_array(2,4) = 8
Here is the same array as accessed from C:
a[0][0] = 1 a[0][1] = 2 a[1][0] = 3 a[1][1] = 4 a[2][0] = 5 a[2][1] = 6 a[3][0] = 7 a[3][1] = 8
Arrays 117