Лучшее, что я нашел
Сохраняет атрибуты размера массива матриц (но не из списка * матриц *) и позволяет использовать нотацию индексирования
int n=5, T=2;
float (*a)[n][n] = calloc(T,sizeof(float[n][n])); // <== initializes to 0!
for (size_t t=0; t<T; ++t)
for (size_t i=0; i<n; ++i)
a[t][i][i] = 1.0; // <== only set the 1's
Объявление указателя на двумерные массивы является сложной задачей, но calloc
(см. Ниже) позаботится о инициализации нуля за вас, поэтому вы устанавливаете только ненулевые элементы.
Конечно, самое интересное происходит, когда вы пытаетесь обойти эти вещи ... но если вы осторожны со своим заявлением и используете c99, вы можете сделать любой из
void foo(int n, float (*a)[n][n]) {
// ...
}
void bar(int t, int n, float a[t][n][n]) {
// ...
}
работа. (На самом деле gcc
позволит вам избежать неприятностей, если вы не используете -std=c89 -pendantic
...)
Второй лучший вариант, но он будет работать с ansi-c
Конечно, вы можете сделать традиционную версию (с уродливым индексированием рук) более легкой для чтения.
int n = compute_size_of_matrices();
int T = compute_number_of_matrices();
float* matrices = calloc(T, sizeof(float) * n*n); // <== initializes to 0!
for( int t = 0; t < T; t++ )
for( int i = 0; i < n; i++ )
matrices[t*n*n + i*n + i] = 1; // <== only set the 1's
Ну, это казалось хорошей идеей ...
Увы, c не позволит вам сделать
int n=5, T=2;
float matrices[T][n][n] = {}; // <== ***ERROR!!!***
, который позволил бы вам сохранить "массивность" матриц и быть еще яснее.
Это медленно?
Поскольку calloc
будет использовать какой-либо сильно оптимизированный модуль записи системной памяти, чтобы установить в 0, вы не получите большой скорости удара.