2009-02-09 54 views
3

一個動態地分配二維數組,這個問題建立掀起了以前問的問題: Pass by reference multidimensional array with known sizeC++引用傳遞

我一直在試圖找出如何讓我的功能與二維數組引用發揮很好。我的代碼的簡化版本如下:

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類型**通過引用這樣我可以在一個函數中爲數組分配空間,並在另一個函數中設置值。

回答

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 
}; 
3
typedef array_type unsigned int **; 
initialize_BMP_array(array_type& bmparray, int height, int width) 
1

要使用更安全,更現代的C++習慣用法,您應該使用矢量而不是動態分配的數組。

void initialize_BMP_array(vector<vector<unsigned int> > &bmparray, int height, int width); 
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存儲器是在函數內部保留(然後,通過以引用的)。

希望這會有所幫助。

+0

如果我有一個功能,我使用malloc和指針分配一些內存傳遞對象,其實我延伸的陣列。現在,我必須使用return來傳遞相同的數組。現在,在我返回之前,我甚至無法釋放它。在這種情況下,我可以做什麼? – 2012-10-18 17:13:06

+0

您必須編寫這兩個函數,以便接收分配數組的函數在此之後釋放它。也就是說,接收分配值的函數必須知道它必須釋放它。 – 2012-10-18 20:31:33