2012-02-12 93 views
16

私はユーザーがいくつかのダイスを選んで結果を推測できる簡単なプログラムを作った。私は間違った質問の前にこのコードを投稿しましたので、削除されました...このコードでは何のエラーも警告を出すことはできませんが、何らかの理由でこの警告がポップアップしてしまい、修正方法がわかりません... 「の警告C4244: 『引数』:変換 『unsigned int型』から 『のtime_t』、データの損失の可能性からは」警告C4244: '引数': 'time_t'から 'unsigned int'への変換、データの損失の可能性あり - C++

#include <iostream> 
#include <string> 
#include <cstdlib> 
#include <time.h> 

using namespace std; 

int choice, dice, random; 

int main(){ 
    string decision; 
    srand (time(NULL)); 
    while(decision != "no" || decision != "No") 
    { 
     std::cout << "how many dice would you like to use? "; 
     std::cin >> dice; 
     std::cout << "guess what number was thrown: "; 
     std::cin >> choice; 
     for(int i=0; i<dice;i++){ 
      random = rand() % 6 + 1; 
     } 
     if(choice == random){ 
      std::cout << "Congratulations, you got it right! \n"; 
      std::cout << "Want to try again?(Yes/No) "; 
      std::cin >> decision; 
     } else{ 
      std::cout << "Sorry, the number was " << random << "... better luck next time \n" ; 
      std::cout << "Want to try again?(Yes/No) "; 
      std::cin >> decision; 
     } 

    } 
    std::cout << "Press ENTER to continue..."; 
    std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); 
    return 0; 
} 

これは、私は、なぜ私はこの警告を取得しています、把握しようとしていますものです: arning C4244: '引数': 'unsigned int型' から 'のtime_t'、データ

+0

。 –

+3

そして、あなたが信じる神々の愛のために、CかC++を選んでそれに固執してください。 'cstdlib'と' time.h'を含めて私は来て、あなたの周りを叩きたいと思う:-) – paxdiablo

+0

LOL! Paxidiablo私はC++に固執するのが大好きですが、このクラスではC/C++から始めて、C++にもっと移行し、Cをできるだけ離してください。 –

答えて

52

これは、システムでtime_tunsigned intより大きい整数型であるためです。

  • time()は、おそらく64ビットの整数であるtime_tを返します。
  • srand()は、おそらく32ビット整数であるunsigned intが必要です。

警告が表示されます。あなたはキャストでそれを黙らせることができます。この場合

srand ((unsigned int)time(NULL)); 

あなただけのRNGをシードするためにそれを使用していることから、意気消沈(および潜在的なデータ損失)は重要ではありません。

+1

+1これは、正解(および言い回し)だけです。 – Nawaz

+2

CスタイルのキャストはC++プログラムには属していません。 – aib

+2

@aib短いです。そして彼らは数値キャストには最適です。](http://stackoverflow.com/a/1255015/922184) – Mysticial

1

time()の損失の可能性からの変換はtime_tcan be 32 or 64 bits返します。 srand()は、unsigned intをとります。これは32ビットです。公正であるためには、それはランダム化のための種として使用されているだけなので、おそらく気にしません。

+3

32/64ビットであることは保証されていません。 – Pubby

7

この行はtimesrandがかかるunsigned intに戻りtime_tからの暗黙的なキャストが含まれます。この行は暗黙のキャストを必要とする

srand (static_cast<unsigned int>(time(NULL))); 
1

:あなたはそれの代わりに明示的なキャストすることができます

srand (time(NULL)); 

time_tから、srandが取るunsigned intに戻ります。

srand (time(NULL)); 

あなたはそれの代わりに明示的なキャストすることができます: `int`は32ビットでありながら` time_t`は、64ビットのタイプかもしれません

srand (static_cast<unsigned int>(time(NULL))); 
関連する問題