2012-02-28 61 views
0

我有一個現在是靜態的數組。這是我用它做的操作。 首先我創建一個二維數組。然後我用循環填充它。然後,我發送它的功能,也有使用週期。 在這裏,我想發佈一些示例代碼,這與我的類似。發送動態數組到函數C++

bool picture[20][20]; //here's my array right now. Pretty ugly. Just for testing. 
for (int y=0;y<Height;y++) 
{ 
    for (int x=0;x<Width;x++) 
    { 
     if (treshold<middle) 
     { 
      picture[x][y]=1; 
     } 
     else 
     { 
      picture[x][y]=0; 
     } 
    } 
} 
//Here's an example of filling an array 

leftk = left(picture,widthk, heightk); //That's how I use a function 

int left(int picture[200][200],int row,int col) 
{ 
    for (int x = 0; x <=row-1; x++) 
    { 
     for (int y = 0; y <=col-1 ;y++) 
     { 
      if (picture1[x][y]==1) 
      { 
       return x; 
      } 
     } 
    } 
} 
//And that's the function itself 

所以在這裏,我需要將我的數組切換到動態。這就是我聲明我的動態陣列

bool** picture=new bool*[size]; 
    for(int i = 0; i < size; ++i) 
     picture[i] = new bool[size]; 

//size is just a variable. 

至於靜態聲明的週期,一切都非常簡單。發送這個數組作爲參數來運行。

我已經設法創建了一個動態數組,這很簡單。然後我用數字填寫它。這裏也沒有問題。但我不明白,如何發送一個數組來運行,而且如何在那裏使用它。 你能否給我一個修改函數中二維數組的例子。 對不起,這樣一個新手問題。希望有人會幫助。

順便說一下,我認爲在這裏類包裝會有點混亂。

回答

4

的函數,例如:

Process2DArray(int **pArray, int rowCount, int colCount) 

應該足夠的需要假設其正被操作的2D陣列。另外,請考慮使用std::vector<std::vector<int>>而不是手動分配的多維數組。這種方法將有助於防止泄漏。第二種方法也可以讓你有鋸齒陣列。

+0

這取決於如何定義數組。我通常寧願將它包裝在課堂上,因爲沒有其他簡單的解決方案。 – 2012-02-28 13:55:38

+0

@JamesKanze:就個人而言,如果它需要在多個地方或在程序中經常使用,我會將它包裝在類或結構中。否則,對於一個地方使用'矢量>'會很好,你不覺得嗎? – 2012-02-28 14:08:07

+0

恩,非常感謝,但我已經提到在課堂上包裝它會很不方便。更重要的是,這個數組只用了一次,所以我希望我能逃脫課程。你展示的第一種方式似乎很簡單,但需要一些解釋。首先,我現在會發布我的靜態C代碼以更好地描述問題。然後我會發布我的數組的聲明。希望,這也會有所幫助。但不幸的是,那麼我需要你的幫助。發送數組並在函數中接收數據的操作仍然不夠明亮。 – user1131662 2012-02-28 15:10:34

1

您有幾種選擇:

  1. 數組的數組。例如,對於intint **a它應該能夠保持n陣列new int *[n],然後用for通過他們去並初始化它們a[i] = new int[elems_per_line]
  2. 一個「壓縮的」一維數組int *a = new int[n * elems_per_line],其中元件(I,J) - 0-實際上是a[i * elems_per_line + j]
  3. 您可以細化點1,並讓2D矩陣「捲曲」 - 用不同長度的線條,但您需要一個數組來保存每個長度。

希望這會有所幫助。

+0

非常感謝。我對第一種方式瞭解甚少。對我來說似乎相當複雜,對不起。第二個很簡單。我甚至嘗試過使用它。但功能還是一樣的問題。我從來沒有爲最後一個而哭泣。所以,如果我找不到完美的解決方案,我會閱讀關於這一個更多 – user1131662 2012-02-28 15:15:21

2

通常的解決方案是將數組包裝在一個類中; C不能很好地處理 數組,並且C++也沒有對其庫中的二維數組提供任何實際支持。所以,你要麼定義:

class Array2D 
{ 
    std::vector<double> myData; 
    int myColumnCount; 
    int myRowCound; 
    // ... 
}; 

與轉換使用i * myColumnCount + j,或這兩個指標來完成:

class Array2D 
{ 
    std::vector<std::vector<double> > myData; 
    // ... 
}; 

與初始化邏輯保證所有行具有相同的 長度。第一個通常更簡單,更容易理解;如果 想要增加列數,但是,第二個是 明顯更容易。

+0

不幸的是,我有五個數組來管理,所以這些方法可能會相當「大」。所以我希望找到一個更簡單,更小的解決方案。但是,儘管如此,感謝您的支持,我會牢記這一方法。 – user1131662 2012-02-28 15:07:50

+0

我不確定你的意思是「更大」。使用'std :: vector'而不是'double *'將會增加一點點,但通常只有大約相當於2或3個指針。無論數組的大小如何。 – 2012-02-28 15:44:25

+0

對不起,但我是新來的C++。所以std :: vector對我來說毫無意義。當然,我可以閱讀它,但如果還有其他方法(除了類封裝),它會很棒 – user1131662 2012-02-28 15:48:52