2013-07-18 142 views
-1

我有這個多維動態數組,我可以打印出六行零六列,但是我不能像它一樣返回它。該函數應該初始化一個可以傳遞給其他函數的數組。我在這裏做錯了什麼?我評論了「cout」部分,因爲那不是我需要做的。謝謝!在結束返回一個多維動態數組?

return m;

,如果你一定要這樣來做:

long initializeArray (void) 
{ 
    int i = 0, j = 0; 
    typedef int* rollarray; 
    rollarray *m = new rollarray[6]; 
    for (int i = 0; i < 6; i++) m[i] = new int[6]; 
    while (j < 6) 
    { 
     while (i < 6) 
     { 
      m[i][j] = 0; 
      //cout << m[i][j] << " "; 
      i++; 
     } 
     //cout << endl; 
     i = 0; 
     j++; 
    } 
} 
+0

這是C++不使用指針,使用STL容器 – aaronman

+0

你可以只傳遞一個指針;在你當前的情況下,你使用局部變量'* m'並返回它是無意義的。 – ludesign

+3

你的'return'語句或你的out參數在哪裏?沒有一個或另一個就很難返回任何東西。 – jxh

回答

4

你應該聲明你的函數:

int** initializeArray(void)

,然後。不要忘記,你必須手動告訴其他使用這個指針的東西,它是一個6×6的數組,當你完成這些數組時,不要忘記delete[]

+0

+1,因爲這是實際回答問題的唯一答案。不過,我同意使用動態數組的動態數組可能並不是正確的方法,除非您真的需要處理不同大小的行。 – Boris

+0

這也是唯一的答案,因爲原始指針的使用,它不回答與原始指針,內存泄漏,未定義行爲,分段錯誤等問題有關的以下5個問題。如果OP的興趣具有學術性質,從錯誤中吸取教訓當然是可取的。毫無疑問,如果他繼續前進,他會學到一些關於指針的知識,但也可能是直接沿着正確的路徑導致對「C++的做事方式」更好的感覺。正如Stroustrup所說:「不要黑客,專注於算法!」 (或類似的我不記得確切。) – Pixelchemist

+0

我同意的程度,我不認爲有必要花大量的時間在做C++方式之前瞭解'糟糕的過去的日子'。然而,不管喜歡與否,指針都是C++的一部分,任何全面的C++程序員都必須學習如何最終正確地使用它們。例如,'std :: vector'對於那些想要訪問硬件的人或者編寫他們自己的高效容器不會有多大幫助。 –

2

我不會重複我的完整答案,爲什麼動態二維矩陣(這顯然是一個)不是在C++中的方式。

Answer on: 1D or 2D array, what's faster?(開始閱讀@長的答案,或爲什麼動態二維數據存儲(指針到指針或載體矢量的-)可以簡單/小矩陣「壞」。

你會發現:

  • 作一個比較詳細的解釋,爲什麼你不希望使用指針到指針的動態數組
  • 簡單矩陣的一個示例類對象

您甚至不需要將數據初始化爲零的函數。 只要寫

matrices::simple<int> matrix_object(6, 6); 

獲得尺寸的6x6的初始化爲零的矩陣。

現在,你可以通過

matrix_object(0,1) = 2; // sets 2nd element of first row to 2 

矩陣寫入流的「C++辦法」訪問內容將包括定義operator<<該類像:

template<typename T> 
std::ostream & operator<< (std::ostream &stream, matrices::simple<T> const & matrix) 
{ 
    typedef typename matrices::simple<T>::size_type size_type; 
    for (size_type i(0u); i<matrix.rows(); ++i) 
    { 
    for (size_type j(0u); j<matrix.cols(); ++j) 
     stream << std::setw(4) << std::right << matrix(i,j); 
    stream << std::endl; 
    } 
    return stream; 
} 

您可以輕鬆地輸出您的矩陣通過這種方式寫作:

std::cout << matrix_object << std::endl; 

加上以前的snip PTES這將輸出:

 0 2 0 0 0 0 
    0 0 0 0 0 0 
    0 0 0 0 0 0 
    0 0 0 0 0 0 
    0 0 0 0 0 0 
    0 0 0 0 0 0

如果你想繼續走你就必須解決在代碼中幾個問題的指針。 我已經添加了兩個參數來啓用其他尺寸,但如果需要可以再次替換爲6。

int** new_initialized_array (size_t const rows, size_t const cols) 
{ 
    typedef int* rollarray; 
    rollarray *m = new rollarray[rows]; 
    size_t allocated_arrays(0u); 
    try 
    { 
     for (size_t i(0u); i < rows; ++i) 
     { 
     m[i] = new int[cols]; 
     ++allocated_arrays; 
     for (size_t j(0u); j<cols; ++j) m[i][j] = 0; 
     } 
    } 
    catch (std::bad_alloc & e) 
    { 
     for (size_t i(0u); i < allocated_arrays; ++i) delete[] m[i]; 
     delete[] m; 
     throw; 
    } 
    return m; 
} 

的問題我解決:

  1. 要返回一個指針,該函數必須有一個返回類型,實際上是一個指針(長是一個無符號值)。
  2. 你需要跟蹤你的分配。如果其中一個失敗,則需要將其餘部分回滾以避免內存泄漏。
  3. 你不需要double-while循環。你的外部循環已經存在了(你配置的那個),所以你只需要一個內部循環來爲你的數組設置初始值。
  4. 最後但並非最不重要我重命名的功能。它實際上不是「初始化」現有的數組,而是創建一個新的初始化數組。

我只能推薦閱讀上面的鏈接(或任何其他關於如何根據RAII處理2D數據的資源)。

2

C++ :)

#include <vector> 
#include <iostream> 

std::vector<std::vector<int> > initializeVector() { 
    std::vector<std::vector<int> > vec(6, std::vector<int>(6)); 

    int i = 0, j = 0; 
    while (i < 6) { 
     while (j < 6) { 
      vec[i][j] = i+j; 
      j++; 
     } 

     j = 0; 
     i++; 
    } 

    return vec; 
} 

int main(int argc, char* argv[]) { 
    std::vector<std::vector<int> > g_vec = initializeVector(); 

    int i = 0, j = 0; 
    while (i < 6) { 
     while (j < 6) { 
      std::cout << g_vec[i][j] << std::endl; 
      j++; 
     } 

     std::cout << "-----------------" << std::endl; 
     j = 0; 
     i++; 
    } 

    return 0; 
} 
1

它是一個家庭作業?還是你想在C++中做矩陣代數?

如果它不是家庭作業,那麼首先檢查是否存在對您來說更容易使用並且性能更高的事物。 Pixelchemist提出了很好的觀點,所以你應該能夠使用別人的代碼爲你做你的工作。

看看到本徵庫:http://eigen.tuxfamily.org/dox/TutorialAdvancedInitialization.html

// Initializing a 6x6 dynamic size matrix with zeros, adapted from documentation 
using namespace Eigen; 
ArrayXXf a3 = ArrayXXf::Zero(6, 6); 
std::cout << a3 << "\n"; 
+0

Eigen +1,這個庫很簡單 – Boris