将三维数组传递给C中的函数?

时间:2009-11-17 12:32:51

标签: c arrays

将三维数组传递给C中的函数的最佳方法是什么?

4 个答案:

答案 0 :(得分:5)

要求您在编译时定义除最左侧维度以外的所有维度。

#define DIM 5

void do_something(float array[][DIM][DIM])
{
    array[0][0][0] = 0;
    ...
}

答案 1 :(得分:5)

typedef是你的朋友。

#include <stdio.h>
typedef int dimension1[20]; /* define dimension1 as array of 20
                               elements of type int */
typedef dimension1 dimension2[10]; /* define dimension2 as array of 10
                                      elements of type dimension1 */

int foo(dimension2 arr[], size_t siz);

int main(void) {
  dimension2 dimension3[7] = {0}; /* declare dimension3 as an array of 7
                                     elements of type dimension2 */
  dimension3[4][3][2] = 9999;
  dimension3[4][0][12] = 1;
  dimension3[3][8][18] = 42;

  printf("%d\n", foo(dimension3, 7));

  return 0;
}

int foo(dimension2 arr[], size_t siz) {
  int d1, d2, d3;
  int retval = 0;
  for (d3=0; d3<siz; d3++) {
    for (d2=0; d2<sizeof *arr / sizeof **arr; d2++) {
      for (d1=0; d1<sizeof **arr / sizeof ***arr; d1++) {
        retval += arr[d3][d2][d1];
      }
    }
    /* edit: previous answer used definite types for the sizeof argument */
    //for (d2=0; d2<sizeof (dimension2) / sizeof (dimension1); d2++) {
    //  for (d1=0; d1<sizeof (dimension1) / sizeof (int); d1++) {
    //    retval += arr[d3][d2][d1];
    //  }
    //}
  }
  return retval;
}

修改

我不喜欢使用明确的类型作为sizeof的参数 我添加了获取(子)数组大小而不直接指定其类型的方法,而是让编译器从对象定义中推断出正确的类型。


第二次编辑

由于Per Eckman notes typedefing“裸”阵列可能很危险。请注意,在上面的代码中,我没有将数组本身传递给函数foo。我正在传递指向“低级”数组的指针。

foo(),在上面的代码中,接受指向dimension2类型的对象的指针。 dimension3对象是dimension2类型的元素数组,而不是dimension3类型的对象(甚至没有定义)。

但请记住Per Eckman的说明。

答案 2 :(得分:4)

将它们作为指针传递。

示例

int a[N][M][P];

foo( &a[0][0][0]);

foo在哪里

void foo( int*)

您可能还需要传递尺寸,因此在这种情况下您可能需要:

void foo( int*, int D1, int D2, int D3)

并致电

foo( &a[0][0][0], N, M, P);

答案 3 :(得分:3)

typedefing“bare”数组可能很危险。

试试这个

#include <stdio.h>

typedef char t1[10];

void foo(t1 a) {
        t1 b;

        printf("%d %d\n", sizeof a, sizeof b);
}

int main(void) {
        t1 a;
        foo(a);
        return 0;
}

可以认为相同类型的两个变量的sizeof将返回相同的大小 但不是在这种情况下。因此,包装typedef-ed数组是一个很好的做法 在结构中。

typedef struct {
        char x[10];
} t1;