Извинения, я понял после того, как опубликовал это ваше отвращение к чрезмерным выражениям malloc (или calloc). Код использует чрезмерные числа этого оператора, что потребует чрезмерной очистки (свободный оператор). Я оставлю пост на случай, если вы сможете использовать какую-то его часть.
Ryk
Вот некоторый код, который иллюстрирует динамическое создание и выделение пространства для матриц. Они также показывают шаблон для последовательных матриц большего размера. Обратите внимание, что список аргументов включает только желаемый размер (порядок) каждого индекса; то есть строка (r), затем c, r (столбец, строка), затем p, c, r (страница, столбец, строка) и так далее. Обратите внимание, что эти функции также заменяют malloc на calloc, просто предпочтение.
С Уважением,
Ryk
double * Create1D(int r)
{
double *space;
double *arr;
space = calloc(r*sizeof(double), sizeof(double));
arr = calloc(sizeof(double), sizeof(double));
arr = (double *)space;
return arr;
}
double ** Create2D(int c, int r)
{
double *space;
double **arr;
int y;
space = calloc(c*r*sizeof(double), sizeof(double));
arr = calloc(c * sizeof(double *), sizeof(double));
for(y=0;y<c;y++)
{
arr[y] = (double *)space + (y*r);
}
return arr;
}
double *** Create3D(int p, int c, int r)
{
double *space;
double ***arr;
int x,y;
space = calloc (p*c*r*sizeof(double),sizeof(double));
arr = calloc(p * sizeof(double **), sizeof(double));
for(x = 0; x < p; x++)
{
arr[x] = calloc(c * sizeof(double *),sizeof(double));
for(y = 0; y < c; y++)
{
arr[x][y] = ((double *)space + (x*(c*r) + y*r));
}
}
return arr;
}
double **** Create4D(int hR, int p, int c, int r)
{
double *space;
double ****arr;
int w,x,y;
space = calloc(hR*p*c*r*sizeof(double), sizeof(double));
arr = calloc(hR * sizeof(double ***), sizeof(double));
for(w=0;w<hR;w++)
{
arr[w] = calloc(p * sizeof(double **), sizeof(double));
for(x=0;x<p;x++)
{
arr[w][x] = calloc(c * sizeof(double *), sizeof(double));
for(y=0;y<c;y++)
{
arr[w][x][y] = ((double *)space + (w*(p*c*r) + x*(c*r) + y*r));
}
}
}
return arr;
}
double ***** Create5D(int hC, int hR, int p, int c, int r)
{
double *space;
double *****arr;
int v,w,x,y;
space = calloc(hC*hR*p*c*r*sizeof(double),sizeof(double));
arr = calloc(hC * sizeof(double ****),sizeof(double));
for(v=0;v<hC;v++)
{
arr[v] = calloc(hR * sizeof(double ***),sizeof(double));
for(w=0;w<hR;w++)
{
arr[v][w] = calloc(p * sizeof(double **),sizeof(double));
for(x=0;x<p;x++)
{
arr[v][w][x] = calloc(c * sizeof(double *),sizeof(double));
for(y=0;y<c;y++)
{
arr[v][w][x][y] = ((double *)space + (v*(hR*p*c*r) + w*(p*c*r) + x*(c*r) + y*r));
}
}
}
}
return arr;
}
double ****** Create6D(int hP, int hC, int hR, int p, int c, int r)
{
double *space;
double ******arr;
int u,v,w,x,y;
space = calloc(hP*hC*hR*p*c*r*sizeof(double),sizeof(double));
arr = calloc(hP * sizeof(double *****),sizeof(double));
for(u=0;u<hP;u++)
{
arr[u] = calloc(hC * sizeof(double ****),sizeof(double));
for(v=0;v<hC;v++)
{
arr[u][v] = calloc(hR * sizeof(double ***),sizeof(double));
for(w=0;w<hR;w++)
{
arr[u][v][w] = calloc(p * sizeof(double **),sizeof(double));
for(x=0;x<p;x++)
{
arr[u][v][w][x] = calloc(c * sizeof(double *),sizeof(double));
for(y=0;y<c;y++)
{
arr[u][v][w][x][y] = ((double *)space + (u*(hC*hR*p*c*r) + v*(hR*p*c*r) + w*(p*c*r) + x*(c*r) + y*r));
}
}
}
}
}
return arr;
}