2017-09-30 11 views
-2

プログラミングが初めてです。2D配列を関数に渡す

ユーザーは2D配列のサイズを入力し、この配列を機能に渡したいと思います。これどうやってするの?

+1

そのようにすることはできません。可変長配列はC++の機能ではありません。 'std :: vector >'を試してみてください。 – StoryTeller

+0

ポインタを使ってもこれを行うことはできませんか? – bubunny

+1

できます。しかし、おそらく数時間かけて、あなたのプログラムが持つすべての違法メモリアクセスをデバッグすることになるでしょう。 'std :: vector'はあなたや私がポインタで手でこれらのことをする必要がないように設計されています。 – StoryTeller

答えて

1

目的を達成するには2通りの方法があります。

最初の方法は、動的に割り当てられたCスタイルの配列を使用しています。既存のコードを強制的にサポートしない限り、C++でこれを行うべきではありません。しかし、この場合、おそらくリファクタリングを検討する方が良いでしょう。

第2の方法std::vectorを使用しています。このクラスは、低レベルの操作をメモリでカプセル化します。多くの潜在的なバグから解放されます。

私はstd::vectorの利点を示すために、2つのプログラムを書いています。彼らは2D配列のサイズを入力します(別の方法では行列と呼ばれます)。

Cスタイルの配列を使用して行列を作成すると、多くのコードとポインターによる操作が要求されます。 簡単にするために、次のコードは例外を処理しません。実際のコードでは、メモリリークを防ぐためにコードを実行する必要がありますが、コードはさらに難しくなります。

#include <iostream> 
#include <cstddef> 

using namespace std; 

void function(int** matrix, size_t nrows, size_t ncols) 
{ 

} 

int main() 
{ 
    size_t nrows; 
    size_t ncols; 

    cin >> nrows >> ncols; 

    // allocate memory for matrix 
    int** matrix = new int*[nrows]; 
    for (size_t i = 0; i < nrows; ++i) 
     matrix[i] = new int[ncols]; 

    function(matrix, nrows, ncols); 

    // release memory 
    for (size_t i = 0; i < nrows; ++i) 
     delete[] matrix[i]; 
    delete[] matrix; 
} 

したがって、C++では、std::vectorを使用すると非常に簡単になります。 std::vectorはクラスであるため、メモリの割り当てと解放をカプセル化するコンストラクタとデストラクタを持っています。

#include <iostream> 
#include <vector> 

using namespace std; 

void function(vector<vector<int>>& matrix) 
{ 

} 

int main() 
{ 
    size_t nrows; 
    size_t ncols; 

    cin >> nrows >> ncols; 

    // create matrix 
    vector<vector<int>> matrix(nrows); 
    for (size_t i = 0; i < nrows; ++i) 
     matrix[i] = vector<int>(ncols); 

    // you don't even need to pass sizes of matrix 
    function(matrix); 

    // automatically called destructor of matrix releases memory 
}