【发布时间】:2016-03-17 03:20:37
【问题描述】:
我目前正在用 C 语言实现计算流体动力学算法。它已经适用于二维系统,现在我正致力于解决轴对称系统。
在模拟过程中,所有数据都存储在几个二维数组(用于二维模拟)和 3 维数组(用于轴对称数组)中。
目前我有一个求解器函数来求解几个方程。
void solver(double ** data, Coefficients *coeff, Grid *grid)
地点:
data
包含我想在其中存储求解方程的数组
这适用于 2d 系统。在做轴对称系统时,我想重新使用这个函数,而不必重新编写或更改它以获取 3d 数组,因为我只需要沿轴求解一个切片。
为此,我正在考虑创建一个新的二维数组,其中包含指向 3 维数组的 2 维切片的所有指针。
我一直在使用一些测试代码来尝试这个概念,但我无法让它产生有意义的输出。到目前为止,这是我想出的:
#include <stdlib.h>
#include <stdio.h>
double *** alloc_3d_matrix(int x_dim, int y_dim, int z_dim)
{
int i, j;
double *** m;
m = calloc(x_dim, sizeof(double**));
for (i = 0; i < x_dim; i++)
{
m[i] = calloc(y_dim, sizeof(double*));
for (j = 0; j < y_dim; j++)
{
m[i][j] = calloc(z_dim, sizeof(double));
}
}
return m;
}
double *** alloc_2d_matrix(int x_dim, int y_dim)
{
int i;
double *** m;
m = calloc(x_dim, sizeof(double*));
for (i = 0; i < y_dim; i++)
{
m[i] = calloc(y_dim, sizeof(double));
}
return m;
}
void free_3d_matrix(void *** m, int x_dim, int y_dim)
{
int i, j;
for (i = 0; i < x_dim; i++)
{
for (j = 0; j < y_dim; j++)
{
free(m[i][j]);
}
free(m[i]);
}
free(m);
}
void free_2d_matrix(void ***m, int x_dim)
{
int i;
for (i = 0; i < x_dim; i++)
{
free(m[i]);
}
free(m);
}
void increment(double ** slice)
{
int i, j;
int sum = 0;
for (i = 0; i < 5; i++)
{
for (j = 0; j < 5; j++)
{
sum++;
slice[i][j] = sum;
}
}
}
int main()
{
int i, j;
double *** d3, ***d2;
FILE *fp;
fp = fopen("test.txt", "w");
d2 = (double***)alloc_2d_matrix(5, 5);
d3 = alloc_3d_matrix(5, 5, 5);
for (i = 0; i < 5; i++)
{
for (j = 0; j < 5; j++)
{
d2[i][j] = &d3[i][j][0];
}
}
increment(*d2);
for (i = 0; i < 5; i++)
{
for (j = 0; j < 5; j++)
{
fprintf(fp,"%f, %p, %p\n", d3[i][j][0], &d3[i][j][0], d2[i][j]);
}
}
fclose(fp);
free_3d_matrix(d3, 5, 5);
return 0;
}
我觉得这应该产生如下所示的输出:
1.000000, 00E5A4B0, 00E5A4B0
2.000000, 00E5FCA8, 00E5FCA8
3.000000, 00E5FD00, 00E5FD00
4.000000, 00E5FBA0, 00E5FBA0
5.000000, 00E5F678, 00E5F678
等等
相反,我得到了这样的输出:
1.000000, 00E5A4B0, 00E5A4B0
6.000000, 00E5FCA8, 00E5FCA8
11.000000, 00E5FD00, 00E5FD00
16.000000, 00E5FBA0, 00E5FBA0
21.000000, 00E5F678, 00E5F678
0.000000, 00E5FB48, 00E5FB48
0.000000, 00E5F728, 00E5F728
0.000000, 00E5F620, 00E5F620
0.000000, 00E5FD58, 00E5FD58
我不确定我的代码哪里出了问题,如果有任何帮助,我将不胜感激。
编辑:
添加了其余的功能。
【问题讨论】:
-
你必须转换
alloc_2d_matrix的结果是一个很好的指标,表明你正在做你不应该做的事情。你能展示一下这个函数(或者至少是它的声明)吗? -
需要查看MCVE。
-
而不是这个 d2[i][j] = &d3[i][j][0];试试这个 d2[i][j] = &d3[0][i][j];
-
您的
alloc_2d_matrix函数不正确。它分配double的数组数组,而不是double的指针 数组数组。如果将它与alloc_3d_matrix函数进行比较,您无疑会看到它返回相同的类型,这意味着它需要做几乎相同的事情(除了最里面的分配)。您可以通过不使用sizeof表达式中的特定类型来避免此问题,而是使用例如sizeof(*m)用于外层,sizeof(*m[i])用于内层。 -
我添加了其余的功能
标签: c arrays multidimensional-array