将2D阵列模拟为1D

时间:2013-12-24 03:01:43

标签: c++

我有一个锯齿状的2D数组,行的长度不一样:

int sizes[100];
//init sizes

unsigned char *p = [100];

for(unsigned int i = 0; i < 10; i++)
{
    p[i] = (unsigned char*)malloc(sizeof(char)*sizes[i]);
    for(unsigned int j = 0; j < sizes[i]; j++)
        p[i] = j;
}

我使用这样的数组:

p[x][y]

如何将此数组模拟为1D?

3 个答案:

答案 0 :(得分:1)

如果您正在寻找将二维数组映射到一维空间的方法,请尝试...

int sizes[width*height];
void setPoint(int x, int y, int val) {
  sizes[x*width + y] = val;
}

值得注意的是,x*width + y索引将为您提供一维数组中的相应元素。

答案 1 :(得分:1)

除非是家庭作业,否则只需下载提升并使用Boost.Matrix

答案 2 :(得分:1)

我假设如果你想要将“2D数组”作为一个D矩阵访问,你希望当你将索引递增1时,你可以访问数组中的下一个元素(并将自动转到下一行)当你跑掉边缘时)。正确的方法是更改​​分配数组的方式。我将尝试展示如何完成 - 这只是C,而不是C ++。因为你使用malloc,这可能更合适。我也在想你的代码中有一个非常严重的错误,因为你正在创建一个char *指针p,但期望在

中使用它
p[x][y];
显然你需要char **

。让我们尝试制作能够满足您需求的代码:

int sizes[100];
//init sizes

unsigned char *p[100];  // without the == sign we create an array of 100 pointers
unsigned char *bigP;   // the master pointer

int totalLength = 0;

int ii;
for(ii=0; ii<100; ii++) totalLength += sizes[ii];

bigP = malloc(sizeof(char) * totalLength);

int offset = 0;

// make pointers p point to places along this big memory block:
for(ii = 0; ii < 100; ii++) {
  p[ii] = bigP + offset;
  offset += sizes[ii];
}

现在您可以使用

来寻址数组
p[x][y];

bigP[z];

其中z可以从0到最大元素数。当然,在你不知道的过程中(当你使用“1D”范例时)你在锯齿状阵列的哪一行/列中 - 你不知道如果你真的在一个维度。

这里的关键是内存被分配为单个连续块,而指针p指向该块中的位置。这意味着你不能免费p。您必须永远免费bigP

我希望这是有道理的。