2011-09-08 8 views
1

私は2つの質問があり、2番目はオプションです。私はこのエラーを受け取るのはなぜデキューインデックスのC++スワップ()

(29): error C2660: 'shuffle' : function does not take 1 arguments with the following code:

#include "stdafx.h" 
#include <iostream> 
#include <sstream> 
#include <deque> 
#include <algorithm> 
using namespace std; 

deque<int> cardDeck (51); 
void flip(); //Prototype flip() 
void shuffle(); //Prototype shuffle() 

int _tmain(int argc, _TCHAR* argv[]) 
{ 
    ostream& operator<<(ostream& os, deque<int> dq); //overload << operator to accept deque 
                 //arguments 
    for (int a=52; a>0; a--) { //initialize the 52 cards in a deck 
     cardDeck.push_front(a); 
    } 
    flip(); //prompt my input to check data 
    return 0; 
} 

void flip() { //flip over card in specified location in the deck 
    int input; 
    cin >> input; 
    cout<<cardDeck[input]<<endl; 
    shuffle(cardDeck); 
    flip(); 
} 

void shuffle(deque<int> dq) { //use Fisher-Yates algorithm to efficiently and accurately 
           //randomize card order 
    for(int i=dq.size()-1; i>-1; i--) { 
     int j = rand() % (i + 1); 
     if(i != j) { 
      swap(dq[j], dq[i]); 
     } 
    } 
} 

: まず、(簡単なカードプログラムのプロトタイプ)以下のプログラムでは、私は次のエラーを取得していますか?私はfisher-yatesアルゴリズムを正しく実行しているのかどうかは分かりません。なぜなら、C++のドキュメントは見つからないからです。 swap();)を利用しています(これに答えるためのブラウニーポイントまたはクラスの欠如を除いて、ひどくひどいコーディング実践を指摘するためのブラウニーポイント)

ありがとうございます!私はあなたがあなたの関数宣言で

void shuffle(); 

を引数を置くことを忘れてしまったと思います

+0

ひどくひどいコーディング方法を指摘してください。1) '_tmain'の代わりに' main'を使います。 '_tmain'はコードの移植性を不必要に制限します。 2) 'void shuffle(deque &dq)'を使用します。そうでない場合、プログラムは両端キューをコピーしてシャッフルします。 3)ファイルスコープで 'namespace std'を使わないでください。名前を完全に修飾するか、関数の範囲内で '使用する 'ことをお勧めします。 4)dequesを印刷する場合は、[this](http://stackoverflow.com/questions/4850473/pretty-print-c-stl-containers)をご覧ください。 5) 'shuffle'は正しいですが、' std :: random_shuffle'として実装できます。 – Mankarse

+0

あまりにも心配しないでください。これらの点は実際には特に恐ろしいものではありません。 ;) – Mankarse

+0

フィードバック用のThnx。アルゴリズムについて私が確信していなかった理由は、デッキに0をたくさん入れていたからですが、 'deque.erase'を呼び出すと、cardDeck [52]の上にある0が取り除かれました。私はそれを変更するのは迷惑なので、特に私が頻繁に行うようにプログラムすると、私は_tmainを使います。私はちょうど逆参照の条件に来て、それ以来、私はそれを実装しました。 '名前空間を使用する'に関しては、便宜的に使用するだけですが、公開するかもしれない大きなプログラムでは、私は 'std ::'を使用します。 5番目は将来私のために非常に役立つだろう。ありがとう^^ – Aarowaim

答えて

2

する必要があります任意の引数。

void shuffle(); 

別のノートでは、あなたはおそらく、そうでない場合は、ローカルコピーをシャッフルだろうし、所望の副作用を持っていないだろう、その関数に両端キューへ参照をしたいということです。

あなたはおそらく、それはこのよう洛たい:

void shuffle(deque<int>& dq); 

また、あなたは要素を交換するiter_swapの代わりswapを使用する場合があります。デキューでは差はありませんが、listまたはmapとなります。

+0

ありがとう、私はプログラマーになって忙しかったし、問題の最も曖昧な原因を探して、明白な// facepalm *を忘れてしまった。今はうまくいっていますし、参照を渡す際のヒントもありがとうございます。 – Aarowaim

0

はあなたが取っていない関数としてshuffleを宣言ので、あなたがそのエラーを取得する理由がある

void shuffle(deque<int> dq); 
0

私はこの問題は、プログラムの先頭にあなたは、これは引数を取らないことを

void shuffle(); 

お知らせとして `シャッフルを試作したことだと思います。 C++ではワンパスコンパイラが使用されているため、shuffleを呼び出す時点では、これはコンパイラが後で実装されていないために使用できるshuffleの唯一の宣言です。その結果、1つの引数で引数のない関数を呼び出すと考えられるため、上記のエラーが発生します。

これを修正するには、実際に定義した関数と一致するようにプロトタイプを更新します。

希望すると便利です。

関連する問題