C ++ 17では、Fortran 90以降、Fortranにあった通常の多次元配列はまだありません。

. restrict, C Fortran C. , , . .

. . , C++ (, ). runtime. ?

double a[n][n] std::array<std::array<double, n>, n> , . . (n) runtime. new double[n][n] ( , new, runtime-). :

double **a = new double *[n]; //   n   double
for (int i = 0; i != n; ++i)
  {
    a[i] = new double[n];
  }
. i- j- a[i][j]. . a — . , . , i- j- , , . ( . .) . std::vector<std::vector<double>>.

UPD 2016-12-11 0:00. . , .

:

double *a = new double[n * n];

, i- j- : a[i * n + j]. .

, (a[i][j]), ? , . .

. C99 variable length arrays (VLA), , . . gcc VLA , ( ) . ( , . UPD.)

Fortran . i- j- .

, , Fortran . Fortran', 1957- . Fortran' (FORmula TRANslation), (C 1969- ). Fortran' . . . Fortran 90.

Fortran 90 . 26 . 26 Fortran'. C++ .

:

REAL, ALLOCATABLE :: A (:,:)
...
ALLOCATE (A (N,N))

i- j- : A(I, J) (, , Fortran C C++).

, - C++. Boost.MultiArray. Boost, , .

restrict. restrict. Fortran' (, ). , , . . . a b, , a[2] ( C) b[3]. , a[2], b[3], a[2] , b[3] . . aliasing.

, C . , , , , . :

void f (int a[2])

:

void f (int a[])

:

void f (int *a)

. , «» a «» b, . , , , , / , , ( C89, ). , , a[2] — b[3]. , a[2], b[3], commit . , Fortran'.

C99 - restrict, , « », , . , C Fortran.

Fortran . , Fortran , : C. , , Fortran C.

. aso. , . Fortran'. , , restrict. Fortran . :) , , , . , C. Fortran', , - - , restrict C Fortran. . :)

UPD 2016-12-10 14:03. selgjos, , C99 VLA - . , : double a[n][n] , . . . :

double (*a)[n] = malloc (n * n * sizeof (double));

a — , . n n, . i- j- a[i][j]. - , :

void f (int n, double a[n][n])

, , C . Fortran. C++ - .

UPD 2016-12-12 19:12. :
, . . , , , , . , , , . .


UPD 2016-12-12 22:49. :
C++ Fortran C. , , , . Fortran «» , C++ — . .


Source: https://habr.com/ru/post/J317300/


All Articles