Declaring and Indexing Arrays
Each language varies in the way that arrays are declared and indexed. Array indexing is a source-level consideration and involves no difference in the underlying data. There are two differences in the way elements are indexed by each language:
The value of the lower array bound is different.
By default, Fortran indexes the first element of an array as 1. C and C++ index it as 0. Fortran subscripts should therefore be 1 higher. (Fortran also provides the option of specifying another integer lower bound.)
C varies subscripts in row-major order, Fortran in column-major order.
The differences in how subscripts are varied only affect arrays with more than one dimension. With row-major order (C and C++), the rightmost dimension changes fastest. With column-major order (Fortran), the leftmost dimension changes fastest. Thus, in C, the first four elements of an array declared as X[3][3]
are
X[0][0] X[0][1] X[0][2] X[1][0]
In Fortran, the four elements are
X(1,1) X(2,1) X(3,1) X(1,2)
The preceding C and Fortran arrays illustrate the difference between row-major and column-major order, and also the difference in the assumed lower bound between C and Fortran. The following table shows equivalencies for array declarations in each language. In this table, r is the number of elements of the row dimension (which changes the slowest), and c is the number of elements of the column dimension (which changes the fastest).
Equivalent Array Declarations
Language | Array declaration | Array reference |
C/C++ | type x[r][c], or struct { typex[r][c]; } x1 | x[r][c] |
Fortran | type x(c, r) | x(c+1, r+1) |
1. Use a structure to pass an array by value in C and C++.
The order of indexing extends to any number of dimensions you declare. For example, the C declaration
int arr1[2][10][15][20];
is equivalent to the Fortran declaration
INTEGER*2 ARR1( 20, 15, 10, 2 )
The constants used in a C array declaration represent dimensions, not upper bounds as they do in other languages. Therefore, the last element in the C array declared as int arr[5][5]
is arr[4][4]
, not arr[5][5]
.
The following code provides a complete example, showing how arrays are passed as arguments to a routine.
C File FORARRS.FOR
C
INTERFACE TO SUBROUTINE Pass_Arr [C,ALIAS:'_Pass_Arr'] ( Array )
INTEGER*4 Array( 10, 10 )
END
INTEGER*4 Arr( 10, 10 )
CALL Pass_Arr( Arr )
write (*,*) 'Array values: ', Arr(1, 10), Arr(2, 10)
END
/* File CF.C */
#include <stdio.h>
void Pass_Arr ( int arr[10][10] )
{
arr[9][0] = 10;
arr[9][1] = 20;
}