2D指向3D阵列数据切片的指针数组

时间:2015-12-11 09:06:22

标签: c arrays multidimensional-array

我目前正在C中实现计算流体动力学算法。它已经在2d系统中工作,现在我正致力于解决轴对称系统。

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

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

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

其中:

data

包含我想在

中存储求解方程的数组

这适用于2D系统。在做轴对称系统时,我想重新使用这个函数而不必重新编写或更改它来获取一个3d数组,因为我只需要沿轴解一个切片。

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

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

#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

我不确定我的代码在哪里出错,并且不胜感激。

编辑:

添加了其余功能。

1 个答案:

答案 0 :(得分:1)

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

int array [2] [3]; 从概念上讲,你最终得到:

(__ \ "id").json.pick[JsString].map{
  case id if id.equals(JsString(accountId)) =>
    Json.obj("primary" -> true)
  case _ =>
    Json.obj()
}

int array [2] [3] [2]; ......会给你一个像这样的结构:

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

所以试试这个d2 [i] [j] =&amp; d3 [0] [i] [j];代替d2 [i] [j] =&amp; d3 [i] [j] [0];

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