【问题标题】:2D Array of pointers pointing to slice of data from a 3D array指向 3D 数组中数据切片的 2D 指针数组
【发布时间】: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


【解决方案1】:

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

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

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

int 数组[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];

【讨论】:

  • 这使得输出的第一行正确,但其余均为0,内存地址不匹配。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-02-07
  • 1970-01-01
  • 2016-12-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多