如何在C中声明具有不同数据类型和不同大小的3D数组?

时间:2014-08-25 13:26:12

标签: c arrays multidimensional-array

我需要声明一个数组(在c中),它包含两个2D数组和一个不同大小和不同类型的一维数组。

不幸的是,谷歌搜索没有真正帮助......

int ram [128][64];

int chk_ram [128][64];

char arr_block[8];

是否可以将这些数组打包在一个大数组中?

@unwind: 这是我的函数,它最初是一个Python函数,但因为它现在要慢我正在尝试用C处理这些数组,因为我希望它更快。 函数应该像Blackbox一样放入3个阵列,然后出现3个阵列,它们将回归到Python。

这是C函数(我认为它有一些错误):

#include <stdlib.h>
#include <stdio.h>
#include <math.h>

int test(int **ram,int n_ram,int **chk_ram, int n_chk_ram,int **arr_block,int n_arr_block){
    int i,j,k;
    int yDog,p,x,d,y,z;
    int *args_arr = (int*)malloc(size*sizeOf(int));
    int *dog = (int*)malloc(size*sizeOf(int));

    for (yDog=0;yDog<=8;yDog++){
        p=yDog*8;
        line='' ?? /* ?? */
        for (x=0;x<=128;x++){
            d=0;

            if (chk_ram[(int)(x/16),yDog] == 1){
                if (x%16 == 0){
                    arr_block[(int)(x/16),yDog] = ''; /* ?? */
                }
                for (y=0;y<=8;y++){
                    z = pow(2,y)
                    d += ram[x,p+y]*z;
                }

                arr_block[(int)(x/16),yDog] += chr(d); /* ?? */
                if ((x+1)%16 == 0 && x){
                    chk_ram[(int)(x/16),yDog] = 0;
                    line += arr_block[(int)(x/16),yDog]; /* ?? */
                }
            }
            else{
                if ((x+1)%16 == 0 && x){
                    chk_ram[(int)(x/16),yDog] = 0;
                    line += arr_block[(int)(x/16),yDog];
                    x += 1;
                }
                else{
                    x+=15;
                }
            }

        }
    }
    dog[yDog] = line; /* ?? */

    args_arr = {ram, chk_ram, arr_block)
    return args_arr;
}

如果有人知道,我会与Ctypes合作:)

3 个答案:

答案 0 :(得分:3)

为什么在使用结构时使用数组?

struct foobar {
  int ram [128][64];
  int chk_ram [128][64];
  char arr_block[8];
}

或者,使用typedef:

typedef struct {
  int ram [128][64];
  int chk_ram [128][64];
  char arr_block[8];
} Foobar;

在我对你的问题的理解中,你试图混合不同类型和长度的数组,这是容易出错的(至少在C中)。

如果需要从函数返回该结构,可以执行以下操作:

struct foobar myFunction(int c) { /* or Foobar */
  struct foobar val;
  /* stuff with val */
  return val;
}

或者:

void myFunction(struct foobar *val, int c) { /* or Foobar */
  val->ram[0][0] = c;
}

int main(void) {
  struct foobar val;
  myFunction(&val, c);
}

我肯定会使用指针(带struct foobar*的第二个函数)因为否则你会复制整个结构,它会比指针版本慢。

如果您的功能需要初始化您的结构,并且如果您使用它进行更多工作,那么最好使用malloc / free来避免不需要的副本。

答案 1 :(得分:2)

通常,您不能在C中的数组中存储不同类型的对象。请注意,例如int数组是&#34;类型&#34;。

我建议您的案例和任何其他将事物分组在一起的情况是使用结构。

您还可以查看此question了解详情。

答案 2 :(得分:1)

  

是否可以将这些数组打包在一个大数组中?

不,你不能,因为数组的所有元素都具有相同的类型。