2017-07-20 13 views
-3

私は、arrayTest [r] [c]のように、ユーザーが関数に入力した寸法の2D行列を渡そうとしています。私は私の研究を行ったし、動作する答えを見つけることができません。私は窓にコードブロックを使用しています。2次元配列を関数に送る方法は?

マイコード:コールprintMatrixに該当する機能:

#include <iostream> 

using namespace std; 
int r, c; 

template <size_t r, size_t c> 
void printMatrix(double (&matrix)[r][c]) 
{ 
    for(int i=0;i<r;i++) 
    { 
     for(int j=0;j<c;j++) 
     { 
      cout<<matrix[i][j]<<" "; 
     } 
     cout<<endl; 
    } 
} 

int main() 
{ 
    r = 1; 
    c = 1; 
    double matrix[r][c] = { { } }; 
    printMatrix(matrix); 
    return 0; 
} 

は、私は現在、エラーを取得します。

+3

'std :: vector >'は生の配列ではありません。 – user0042

+0

'std :: array'はCスタイルの配列(動的なサイズ変更が必要な場合は' std :: vector')よりはるかに優れたオプションです。 –

+0

std :: vector を使い、オフセットを手で計算する方がよいでしょう。さもなければ、不揃いな配列を得ることができますし、オーバーヘッドも大きくなります。 –

答えて

0

with dimensions entered by the user

double matrix[r][c] 

配列変数のサイズは、コンパイル時に知っていなければならないため、ユーザーは入力できません。

ただし、動的に配列を割り当てることができます。動的メモリ管理は正しく行うには非常に難しいので、コンテナオブジェクト内で抽象化することをお勧めします。

すでに標準ライブラリに動的配列コンテナの実装があります:std::vector。ベクトルの要素の型はテンプレート引数です。したがって、ベクトルのベクトルを使用して配列の配列、つまり2D配列を表すことができます。

0

C++では、Cスタイルのアレイの代わりにstd::vectorを使用する必要があります。あなたの現在の問題のために、ここでpassing 2-d array to a functionを訪問することができます。それが役に立てば幸い。また、変数rcの値を(&matrix)[r][c]に渡してから、関数printMatrix()に渡す必要があります。

0

@ user0042が正しいです。 最も良い方法は、作成したテンプレートの必要性を排除するベクターや別のコンテナを使用することです。

using namespace std; 
typedef std::vector<std::vector<double>> Double2D; 
void printMatrix(Double2D& matrix) 
{ 
    for(int i=0;i<matrix.size();i++) 
    { 
     for(int j=0;j<matrix[i].size();j++) 
     { 
      cout<<matrix[i][j]<<" "; 
     } 
     cout<<endl; 
    } 
} 

int main() 
{ 
    Double2D matrix = { { } }; // fill the matrix here. depending on the compiler you use, you have to use different methods 
    printMatrix(matrix); 
    return 0; 
} 
+0

コードを使用すると、2つのエラーが発生します。 名前空間 'std'に 'vector'がテンプレートタイプの名前を付けていません 'printMatrix'はこのスコープで宣言されていません – LampPost

+0

@LampPost申し訳ありませんが、 'printMatrix'の定義の' typedef'には、最後のセミコロンがありません。私はそれを修正するために投稿を編集しました。 – Sam

関連する問題