2016-11-26 5 views
-1

に2Dベクトルを渡します。 機能は次のとおりです。 は、私は整数の2Dベクトルを持っている機能

int coverTransactions(int k, const std::vector<std::vector<int> > matrix) { //k nombre de clusters 
    int compteur = 0; 
    for(int t = 0; t != 11; t++) { 
     compteur = 0; 
     for(int i = 0; i != k; i++) { 
      if(matrix[t][i] == 1) 
       compteur++; 
     } 
     if(compteur != 1) 
      return -1; //on retourne -1 si la transaction n'appartient pas à un et un seul cluster 
    } 
    return 0;//si tout se passe correctement, cad t appartient à un et un seul cluster on retourne 0 
} 

はフランスのコメントに注意を払ってはいけない、それだけだ返す値は私が解決したい問題にリンクされているが、それは、コードの理解に影響を与えることはありませんどのように説明します。何らかの理由で...

、このよう関数を呼び出すとき:

coderror: cannot convert ‘std::vector<std::vector<int> >*’ to ‘int (*)[3]’ for argument ‘2’ to ‘int coverTransactions(int, int (*)[3])’ 

std::cout << coverTransactions(3, &matrix) << std::endl; 

私は次のエラーを取得します

彼らは同じタイプですので、私はあなたが代わりに参照のmatrixポインタを渡そうとする...なぜ

+0

'&'から '&'を削除してみてください。引数はポインタではなく参照渡しに渡されます。 –

+0

あなたのコメントをお寄せいただきありがとうございますが、残念ながら、私は同じエラーを受け取ります... –

+0

@GuillaumeLeseur:いいえ、あなたはありません。私はちょうどそれを試して、それを修正します。そうでない場合は、実際のコードを表示していません。 –

答えて

2

ここで起こって事は(それを呼び出すとき)と関数の定義は、ポインタを受け取り、あなたが関数に変数のアドレスを渡すpass by pointer、異なるpass by reference、です。ここでは、基本的に引数としてベクトルへのポインタを渡すので、pass by pointerをやっている:

coverTransactions(3, &matrix) 

、あなたの関数の定義によれば、pass by referenceがここに起こっているのに対し、それがあるとして、したがって、単純にベクトルを渡します関数の中で:

coverTransactions(3, matrix) 

上記の2つの方法の違いは、pointerNULLすることができますが、referencesNULLされることはありません、ので、我々は有効な変数を参照していることを確認しているということです。そのため、可能であればreferencesを使用し、必要な場合にのみpointersを使用することをお勧めします。

+0

* "参照をコピーする" *は、参照渡しの説明方法ではありません。特に、参照は全くコピーすることとは関係がありません。実装はフードの中のアドレスをコピーするかもしれませんが、C++言語の観点からは関係ありません。 –

+0

私の答えは@ChristianHacklに更​​新されました。 :) – Jarvis

+0

私はdownvoteしなかった。もし私が*推測*しなければならなかった、それはあなた自身と私の両方を下落させたOP自身でした(コメントを参照)。 –

1

を理解していません。削除&

std::cout << coverTransactions(3, matrix) << std::endl; 
関連する問題