我有一个锯齿状的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?
答案 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
。
我希望这是有道理的。