2012-04-28 11 views
0

mainメソッドで参照として宣言された配列を関数のパラメータとして渡すにはどうすればよいですか?また、コンパイラはdimentionsを望んでいるが、私は、変数とそれらを与えるとき、コンパイラは配列の無効な整数寸法の誤差を与え、ここでのコードは次のとおりです。C++の関数パラメータとして参照渡し配列を渡す

#include <iostream> 
#include <algorithm> 
#include <vector> 
using namespace std; 

int scanV(int Row, int value, int M, int (&tableValues)[]) 
{ 
for (int i = 0; i <= M; ++i) 
{ 
    if (tableValues[Row - 1][i] == 1) 
    { 
     if (i + value <= M) 
     { 
      tableValues[Row][i+value] == 1; 
     } 
     if (i - value >= 0) 
     { 
      tableValues[Row][i-value] = 1; 
     } 
    } 
} 
} 

int main() 
{ 
int C, B, M; 
cin>>C; 
int integers[C]; 

for (int i = 1; i < C; ++i) 
{ 
    cin>>integers[i]; 
} 
cin>>B; 
cin>>M; 
integers[0] = B; 
int tableValues[C][M + 1]; 
tableValues[0][B] = 1; 
for (int i = 1; i < C; ++i) 
{ 
    scanV(i, integers[i], M, tableValues); 
} 

return 0; 
} 
+1

'のstd ::で簡単vector':'ベクトル&tableValues'はあなたのパラメータになります。 – chris

+1

tableValuesパラメータは、intの配列への参照ではなく、intの配列の配列への参照であるため、tableValues [x] [y]を実行することはできず、intの配列の配列に渡すこともできません。コードには他にもさまざまな問題があります。たとえば、Cがコンパイル時定数(明らかにここにはありません)でない限り、 "int int [C]"を実行することはできません。 – abarnert

+0

OK、しかし、私はそれを使用すると、 "if(tableValues [Row - 1] [i] == 1)"というエラーが10行目に表示され、配列に "invalid types 'int [int]下付き文字| "他の行には多くのものがあります – user1113314

答えて

2

一つの簡単な解決策は、ベクトルを使用することです。

#include <iostream> 
#include <vector> 

void f (std::vector<std::vector<int> > &v) 
{ 
    for (int i = 0; i < 3; ++i) 
     for (int j = 0; j < 3; ++j) 
      v[i][j] = i * 3 + j; 
} 

int main() 
{ 
    std::vector<std::vector<int> > v (3, std::vector<int> (3, 0)); 
    f (v); 

    for (int i = 0; i < 3; ++i) 
     for (int j = 0; j < 3; ++j) 
      std::cout << v[i][j] << ' '; 
} 

intでは、2次元ベクトルint(3x3)が作成されます。コンストラクタは3つの要素を示し、すべてがintのベクトルで初期化され、3つの要素が0に初期化されて作成されます。

次に、関数fへの参照によってベクトルが渡されます。ベクトルがメインに印刷された場合、それは示しています

0 1 2 3 4 5 6 7 8 

あなたが見ることができるように、それらの使用は、通常の配列と非常によく似ていますが、それらは実際に含まれており、使用したプログラミングの新たなレベルへの容易なアクセスを提供しますSTL。

C++ 11では、その使用がさらに慣れています。次のようにベクトルを割り当てることができます。

std::vector<int> v0 = {2, 5}; 
std::vector<std::vector<int> > v1 { {1,2,3} , {4,5,6} , {7,8,9} }; 

注複数の次元のベクトルに対してではなく、基礎となる1次元ベクトル型である種の行列クラスでそれをカプセル化するために、良いアイデアだと。

編集:ここ

は、指定された要素に1Dおよび2Dベクトルを初期化する例を示します。上で見たように、これはC++ 11では簡単ですが、配列がすでに存在する場合でも、それはかなり速いです。一度に一つの要素を通過するため

int a [5] = {1,2,3,4,5}; //normal 
std::vector<int> v1 (a, a +5); //create using beginning and ending addresses of a 

int b[3][3] = { {1,2,3} , {4,5,6} , {7,8,9} }; //normal 
std::vector<std::vector<int> > v2; //empty vector 

for (int i = 0; i < 3; ++i) //3 in first dimension 
    v2.push_back (std::vector<int> (b [i], b [i] + 3)); //push a vector with the appropriate 3 elements of b onto the back of v2 

、あなたはこれを行うことができます。

std::vector<std::vector<int> > v (3, std::vector<int> (3)); 

for (int i = 0; i < v.size(); ++i) //v.size() == 3 
    for (int j = 0; j < v [i].size(); ++j) 
     adjustElement (v [i][j]); //replace with what you need 
+0

私はどのように変数をstd :: vector >に入れますか?(3、std :: vector (3,0)); ? – user1113314

+0

最後の文は、おそらく書き換えが必要です。確かに、複数の次元を1次元ベクトルとしてカプセル化する必要はありません。彼がおそらく望むのは、2Dマトリックスクラスです。 – abarnert

+0

@abarnert、入力いただきありがとうございます。私はそれを変更します。また、user1113314、例を追加します。 – chris

1

std::vector sが禁止されている可変長配列(例えばint integers[C];など)としてC++で移動するための方法です。

私は読み、あなたのコードを容易にするためにこれらをINGのtypedefをお勧めします。

#include <vector> 

typedef std::vector<int> row_t; 
typedef std::vector<row_t> table_t; 

次にあなたが宣言することができます。

void scanV(int Row, int value, int M, table_t& tableValues) 

それは何も返さないので、私はこのvoidを作りました。 int main()

あなたの変数は、その後になる:

row_t integers; 
table_t tableValues; 

は、この行には注意してください:

  tableValues[Row][i+value] == 1; 

おそらく割り当てることではなく、等価性をチェックするためのもの!

そしてCMBよりもいくつかのより意味のある変数名を選んでみてください...

関連する問題