din*_*elk 17 c c++ arrays casting multidimensional-array
这困扰了我一段时间.很多时候,我发现自己制作了一个大缓冲区来保存"最大"的数据量.这有助于避免每次下一个数据集的大小发生变化时动态分配和释放缓冲区.
例如,假设我的数组对于实际有用的大小来说太大了,但我知道有用数据的长度.
int amountOfData = 9;
char data1D[100] = some data that is only 9 bytes long stored in a 100 byte array
Run Code Online (Sandbox Code Playgroud)
假设我有一个算法,我想在这个使用2D数组索引的数据集上运行.所以我希望能够按如下方式访问数据:
cout << "I am accessing this data as a 2D array: " << data1D[0][1] << endl;
Run Code Online (Sandbox Code Playgroud)
让我们说这个算法我知道2D数组的xlength和ylength将是:
int xlength = 3;
int ylength = 3;
Run Code Online (Sandbox Code Playgroud)
对于这个迭代,因为amountOfData = 9.但是,下一次迭代的长度可能不同.IE浏览器.他们可以xlength = 4和ylength = 4给予amountOfData = 16.
我想做某种类型的转换,允许我使用2D数组索引来转换1D数组.我知道我的初始1D长度有多长,它告诉我我的2D xlength和它有多长ylength,所以这应该很容易做到而不使用new或malloc只要最初的100个字节足够长以容纳任何有用的数据集给我.
我意识到:
char** data2d = (char**) data1D;
Run Code Online (Sandbox Code Playgroud)
将无法工作,因为编译器不知道第二个维度的大小.但我会在运行时知道它是什么!
这种情况的根本原因是什么?有没有解决方法?我错过了什么吗?
一旦您仅在运行时知道数组的长度,我想最好不使用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];
}
Run Code Online (Sandbox Code Playgroud)