Note
Access to this page requires authorization. You can try signing in or changing directories.
Access to this page requires authorization. You can try changing directories.
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;
}