3

この質問は、以前に尋ねられた質問に基づいています: 既知のサイズの多次元配列を参照渡しする

関数を 2 次元配列参照でうまく動作させる方法を見つけようとしています。私のコードの簡略版は次のとおりです。

    unsigned int ** initialize_BMP_array(int height, int width)
    {
       unsigned int ** bmparray;
       bmparray = (unsigned int **)malloc(height * sizeof(unsigned int *));
       for (int i = 0; i < height; i++)
       {
        bmparray[i] = (unsigned int *)malloc(width * sizeof(unsigned int));
       }
      for(int i = 0; i < height; i++)
        for(int j = 0; j < width; j++)
        {
             bmparray[i][j] = 0;
        }
    return bmparray;
    }

この関数を書き直して、参照によって bmparray を空の unsigned int ** として渡し、1 つの関数で配列のスペースを割り当て、値を設定できるようにする方法がわかりません。別の。

4

4 に答える 4

3
typedef array_type unsigned int **;
initialize_BMP_array(array_type& bmparray, int height, int width)
于 2009-02-09T21:03:11.410 に答える
3

クラスを使用してラップし、参照によってオブジェクトを渡します

class BMP_array
{
public:
    BMP_array(int height, int width)
    : buffer(NULL)
    {
       buffer = (unsigned int **)malloc(height * sizeof(unsigned int *));
       for (int i = 0; i < height; i++)
       {
        buffer[i] = (unsigned int *)malloc(width * sizeof(unsigned int));
       }

    }

    ~BMP_array()
    {
        // TODO: free() each buffer
    }

    unsigned int ** data()
    {
        return buffer;
    }

private:
// TODO: Hide or implement copy constructor and operator=
unsigned int ** buffer
};
于 2009-02-09T21:12:38.627 に答える
2

うーん...多分私はあなたの質問をよく理解していませんが、Cでは別のポインタ間接レベルを渡すことで「参照による」を渡すことができます。つまり、ダブルポインタbmparray自体へのポインタ:

unsigned int ** initialize_BMP_array(int height, int width, unsigned int *** bmparray)
{
   /* Note the first asterisk */
   *bmparray = (unsigned int **)malloc(height * sizeof(unsigned int *));

   ...

   the rest is the same but with a level of indirection


   return *bmparray;
}

したがって、bmparrayのメモリは関数内で予約されます(その後、参照によって渡されます)。

お役に立てれば。

于 2009-02-09T21:09:00.570 に答える
1

より安全で最新のC++イディオムを使用するには、動的に割り当てられた配列ではなく、ベクトルを使用する必要があります。

void initialize_BMP_array(vector<vector<unsigned int> > &bmparray, int height, int width);
于 2009-02-09T21:06:43.150 に答える