这困扰了我一段时间。很多时候,我发现自己制作了一个大缓冲区来保存“最大”数量的数据。这有助于避免每次下一个数据集的大小更改时动态分配和取消分配缓冲区。
例如,说我有一个数组,其实际可用大小太大了,但我知道有用数据的长度。
int amountOfData = 9;
char data1D[100] = some data that is only 9 bytes long stored in a 100 byte array
可以说我有一个算法要在使用2D数组索引的数据集上运行。因此,我希望能够按以下方式访问数据:
cout << "I am accessing this data as a 2D array: " << data1D[0][1] << endl;
可以说,对于这种算法,我知道2D数组的xlength和ylength将是:
int xlength = 3;
int ylength = 3;
对于此迭代,因为amountOfData = 9
。但是,下一次迭代的长度可能不同。就是 他们可以xlength = 4
和ylength = 4
给予amountOfData = 16
。
我想进行某种类型的转换,使我可以使用2D数组索引来转换1D数组。我知道我最初的1D长度有多长,这告诉我我的2Dxlength
以及ylength
现在有多长,因此无需使用new
或malloc
只要初始100字节足以容纳任何对我有用的数据,这应该很容易做到。
我意识到:
char** data2d = (char**) data1D;
将不起作用,因为编译器不知道第二维的大小。但是我会在运行时知道它是什么!
造成这种状况的根本原因是什么?有什么解决方法吗?我有什么想念的吗?
一旦您只知道运行时数组的长度,我想最好不使用2D数组来解决此问题,而是使用函数来模拟它。例如,在C中:
char data1D[1000] = {0};
unsigned int getElement(unsigned int x, unsigned int y,
unsigned int xMax, unsigned int yMax)
{
// Do some error tests
return ((unsigned int *) data1D)[x*xMax + y];
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句