将二维阵列模拟为一维阵列
Simulate 2D array to 1D
我有一个锯齿状的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?
我假设,如果您想将"2D数组"作为一个一维矩阵访问,那么当您将索引增加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];
其中CCD_ 5可以从0到元素的最大数量。当然,在这个过程中,你不知道(当你使用"1D"范式时)你在锯齿状阵列的哪一行/哪一列——如果你真的在一维,你就不知道。
这里的关键是,内存被分配为单个连续块,指针p
指向该块中的位置。这意味着您不得释放p
。您必须只释放bigP
。
我希望这是有道理的。
如果您正在寻找将二维数组映射到一维空间的方法,请尝试。。。
int sizes[width*height];
void setPoint(int x, int y, int val) {
sizes[x*width + y] = val;
}
值得注意的是,x*width + y
索引将在一维数组中为您提供适当的元素。
除非是家庭作业,否则只需下载boost并使用boost.Matry.
相关文章:
- 如何使用Google Mock来模拟gettimeofday()
- OpenMP阵列性能较差
- G锁定铸造到基础上会释放模拟行为
- 如何将三维尺寸不固定的三维阵列展平为一维阵列
- 当我的阵列太大时出现分段错误
- 有什么好的方法可以让系统调用代理允许在单元测试中进行模拟
- 落砂模拟碰撞检测C++和SFML
- 在gtest.中使用fff.h模拟系统API
- 位阵列上的快速AND运算
- 谷歌模拟和覆盖关键字
- 用C#中的并集模拟C++嵌套结构
- 在同一模拟中使用静脉和静脉_ inet内容时出现运行时错误
- 在模拟器中使用并集来模拟CPU寄存器有多合适
- 阵列必须使用大括号封闭的初始器进行初始化
- 我写了一个C++程序来模拟Enigma机器.我没有得到输出
- 没有从阵列<float>到阵列<int>的可行转换
- C++动态安全 2D 交错阵列
- 将平面阵列重塑为复杂的特征类型
- 将二维阵列模拟为一维阵列
- 将矢量模拟为2D阵列