1

我必须将几兆字节的数据放在 C++ 代码中的二维数组中(将其嵌入到 DLL 中),每个子类都有不同的数据集。我定义了虚拟访问器方法来访问指定子类的常量,但它仅适用于基元和一维数组,不适用于二维数组:

#include <stdio.h>

class SubClassHoldingData { // inheritance removed for short,compilable example
public:
    static int const notWorkingData[2][2];

    virtual int const** getNotWorkingData() { return (int const**)notWorkingData; } 
};

// simplified data set, about 200x200 in real application
const int SubClassHoldingData::notWorkingData[2][2] =  { { 1 , 2 } , { 3, 4 } };

int main( int argc , char** argv ) {
    SubClassHoldingData* holder = new SubClassHoldingData();
    const int** data = holder->getNotWorkingData();
    printf("data: %d" , data[1][1]); // !!! CRASHES APPLICATION !!!
}

我想访问动态数据(虚拟),但使用编译时常量数组,如下所示:

DataHolder* holder = new FirstDataSetHolder();
const int** data = holder->get2DArray();

DataHolder* holder = new SecondDataSetHolder();
const int** data = holder->get2DArray(); 
// "data" contents DIFFERENT now, but compile-time constants!

如何做到这一点?

4

2 回答 2

1

如果我正确理解了这个问题,那么您的问题实际上是“如何返回指向二维数组中某些数据的指针的指针”。

两层指针和二维数组的问题在于二维数组不会自动生成指向指针的指针——它们是两个不同的东西。二维数组T arr[Y][X];是 Y * X 元素的内存块,其中的偏移量arr[a][b]计算为a * X + b.

如果我们arr[Y][X]在动态分配的场景中使用相同的,我们将分配一块Y长内存,并用指向TX长内存块的指针填充它。因此,当我们要查找 时arr[a][b],我们首先挖掘出指针arr[a],然后使用该指针b向其中添加元素。

为了使您的代码正常工作,您必须构建指向数组中每一行的第一个指针数组。或者返回一个指向具有固定尺寸的数组的指针[X],例如

编辑:

 typedef int arr[X];
 ...
 class SomethingHolder 
 {
    ...
    arr* get2DArray();
    ...
 };

 const arr* data = holder->get2DArray(); 

[我认为在技术上可以将函数声明为返回指向整数数组的指针,但我显然没有从我的“明显”类型中得到正确的语法,当试图弄清楚时,我仍然无法做对了,所以我放弃并使用了arr的typedef]。

请注意,X 必须是对于整个范围都相同的编译时常量。

另一种选择当然是有一个holder->getData(x, y)返回实际数据的方法[y][x](或[x][y]取决于哪种方式最有意义)。

于 2013-05-07T07:56:17.630 回答
0

Mats Petersson 的解析是非常正确的。但是如果你想使用数组形式。它也有一个方法:

class SubClassHoldingData { // inheritance removed for short,compilable example
public:
    static int const notWorkingData[2][2];

    virtual int const** getNotWorkingData() { return (int const**)notWorkingData; } 
};

typedef int  (*SecondDemPtr)[2][2] ;  //this type is a pointer to your array

和:

SubClassHoldingData* holder = new SubClassHoldingData();
SecondDemPtr data = (SecondDemPtr)(holder->getNotWorkingData());
printf("data: %d" , (*data)[1][1]); // !!! CRASHES APPLICATION !!!

这种方法不是一个好主意,但可以在数组和数组指针之间进行转换。

于 2013-05-07T09:54:37.783 回答