gpt4 book ai didi

c - 指向 3D 数组数据切片的 2D 指针数组

转载 作者:太空宇宙 更新时间:2023-11-04 03:33:36 25 4
gpt4 key购买 nike

我目前正在用 C 实现计算流体动力学算法。它已经适用于二维系统,现在我正在研究它来解决轴对称系统。

在模拟过程中,所有数据都存储在几个二维数组(对于二维模拟)和三维数组(对于轴对称模拟)中。

目前我有一个求解器函数来求解几个方程。

void solver(double ** data, Coefficients *coeff, Grid *grid)

地点:

数据

包含我想存储解方程的数组

这适用于二维系统。在做轴对称系统时,我想重新使用这个函数,而不必重写或更改它以采用 3d 数组,因为我只需要解决沿轴的一个切片。

为此,我正在考虑创建一个新的二维数组,其中包含指向 3 维数组的二维切片的所有指针。

我一直在尝试一些测试代码来尝试这个概念,但我无法让它产生有意义的输出。这是我到目前为止想出的:

#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

etc.

相反,我得到了这样的输出:

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

我不确定我的代码哪里出了问题,如果有任何帮助,我将不胜感激。

编辑:

添加了其余的功能。

最佳答案

在C语言中,多维数组在概念上是一个数组,其元素也是数组。所以如果你这样做:

整数数组[2][3];从概念上讲,您最终会得到:

array[0] => [0, 1, 2]
array[1] => [0, 1, 2]

整数数组[2][3][2];...会给你一个像这样的结构:

array[0] => [0] => [0, 1]
[1] => [0, 1]
[2] => [0, 1]
array[1] => [0] => [0, 1]
[1] => [0, 1]
[2] => [0, 1]

所以试试这个 d2[i][j] = &d3[0][i][j];而不是 d2[i][j] = &d3[i][j][0];

编辑----尝试 d2[i][j]=&d3[i][j][j];

关于c - 指向 3D 数组数据切片的 2D 指针数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34219692/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com