【问题标题】:How to declare an 3D array with different Datatypes and different sizes in C?如何在 C 中声明具有不同数据类型和不同大小的 3D 数组?
【发布时间】:2014-08-25 13:26:11
【问题描述】:

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

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

int ram [128][64];

int chk_ram [128][64];

char arr_block[8];

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

@unwind: 这是我的函数,它最初是一个 Python 函数,但因为它很慢,我现在尝试用 C 处理这些数组,因为我希望它快得多。 该函数应该像一个黑盒,我将 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 :)

【问题讨论】:

  • 结构数组?
  • typedef struct{int ram[128][64];int chk_ram [128][64];char arr_block[8];} MYARRAY;
  • 我不知道你所说的“结构”是什么意思,但我认为这个问题是数组应该保存不同的数据类型,所以对我来说这似乎是不可能的,因为哪个数据类型有大数组持有上面的3个数组?我需要这个来从函数返回所有数组(这个函数只能返回 1 个整数数组)......所以对我来说有点困惑^^
  • @user2127024 您应该显示您尝试使用的函数的声明。通常,您实际上不能在 C 中返回一个数组,因此看看该代码是什么样子有点有趣。也许它可以帮助我们了解您想要做得更好。
  • @user2127024 不能有不同类型的多维数组,也不能直接从函数返回数组。而是将您的 3 个数组放在一个结构中。这样,您也可以从函数中返回这样的结构。

标签: c arrays multidimensional-array


【解决方案1】:

既然可以使用结构,为什么还要使用数组?

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来避免不需要的副本。

【讨论】:

  • 我认为最好(在算法上,风格上)拥有一个结构数组,每个结构都有一个 ram 和 chk_ram,而不是数组结构。
  • @NoDataFound:好的,谢谢,我明白你的意思。是否也可以在 C 中创建一个类型为“结构”而不是 int 的函数?因为我也有不同的参数数据类型,我给这个函数。而且,如果我尝试上面的示例,我需要返回一个“结构”,那么是否有必要/可能有一个类型也是结构的函数?对不起我的英语不好..
  • 我是法国人,我的英语也很差。不用担心。我用两个函数的例子更新了我的答案。
  • 好的,非常感谢!我的 C 语言不是很好,但我现在明白我该怎么做。还要感谢所有其他回答的人,因为每个人都说正确:“使用结构而不是数组”。
【解决方案2】:

一般情况下,您不能在 C 中将不同类型的对象存储在数组中。请注意,例如 int 数组是“类型”。

对于您的情况以及任何其他将内容组合在一起的情况,我建议使用结构。

您也可以查看question了解更多详情。

【讨论】:

  • 谢谢,我现在就用一个结构。多个接受的答案是不可能的:/
【解决方案3】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-10
    • 2018-05-26
    • 2023-01-03
    相关资源
    最近更新 更多