1

C++ コード (DLL に埋め込む) の 2 次元配列に数メガバイトのデータを配置する必要があり、サブクラスごとに異なるデータセットを使用する必要があります。指定したサブクラスの定数にアクセスするための仮想アクセサー メソッドを定義しましたが、2D 配列ではなく、プリミティブと 1D 配列に対してのみ機能します。

#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

問題を正しく理解している場合、実際の問題は「2D配列にあるデータへのポインターへのポインターを返す方法」です。

2 つのレイヤー ポインターと 2D 配列の問題は、2D 配列がポインターへのポインターを自動的に作成しないことです。これらは 2 つの異なるものです。2D 配列T arr[Y][X];は Y * X 要素のメモリの塊であり、 へのオフセットarr[a][b]は として計算されa * X + bます。

arr[Y][X]動的に割り当てられたシナリオで同じものを使用する場合、Y長いメモリの塊を割り当て、それへのポインタをそれぞれTのメモリの塊へのポインタで設定しXます。したがって、 を見つけたいときはarr[a][b]、最初に pointer を掘り出し、そのポインターを使用してそれに要素を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 に答える