C ++ Передача динамически размещенного двумерного массива по ссылке - PullRequest
3 голосов
/ 09 февраля 2009

Этот вопрос основан на ранее заданном вопросе: Передача по эталонному многомерному массиву с известным размером

Я пытался выяснить, как заставить мои функции хорошо работать с 2d ссылками на массивы. Упрощенная версия моего кода:

    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 в виде пустого целого без знака int ** по ссылке, чтобы я мог выделить пространство для массива в одной функции, и установите значения в другом.

Ответы [ 4 ]

3 голосов
/ 10 февраля 2009

Используйте класс, чтобы обернуть его, затем передайте объекты по ссылке

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
};
3 голосов
/ 10 февраля 2009
typedef array_type unsigned int **;
initialize_BMP_array(array_type& bmparray, int height, int width)
2 голосов
/ 10 февраля 2009

Ммм ... возможно я не очень хорошо понимаю ваш вопрос, но в 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 зарезервирована внутри функции (а затем передана по ссылке).

Надеюсь, это поможет.

1 голос
/ 10 февраля 2009

Чтобы использовать более безопасный и современный язык C ++, вы должны использовать векторы, а не динамически размещаемые массивы.

void initialize_BMP_array(vector<vector<unsigned int> > &bmparray, int height, int width);
...