2012-02-12 13 views
16

Ho fatto un semplice programma che permette all'utente di scegliere un numero di dadi quindi indovinare il risultato ... Ho postato questo codice prima ma con la domanda sbagliata, quindi è stato cancellato ... ora non posso avere errori o avvertimenti su questo codice ma per qualche motivo questo avviso continua a scoppiare e non ho idea di come aggiustarlo ... "C4244 avviso: 'argomento': conversione da 'time_t' a 'unsigned int', possibile perdita di dati"avviso C4244: 'argomento': conversione da 'time_t' a 'unsigned int', possibile perdita di dati - 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; 
} 

questo è quello che sto cercando di capire, perché mi appare questo avvertimento: w C4244: 'argomento': conversione da 'time_t' a 'unsigned int', possibile perdita di dati

+0

Il 'time_t' potrebbe essere un tipo a 64 bit, mentre' int' è di 32 bit. –

+3

E, per favore, per l'amore di qualunque divinità in cui credi, scegli C o C++ e mantienilo. Includere 'cstdlib' e' time.h' mi fa venir voglia di venire a darti uno schiaffo in giro :-) – paxdiablo

+0

LOL! Paxidiablo mi piacerebbe tanto attenermi al C++ ma questa classe mi impone di iniziare con C/C++ per poi migrare di più in C++ e abbandonare il C il più possibile –

risposta

52

Questo perché sul tuo sistema, time_t è un tipo intero più grande di unsigned int.

  • time() restituisce una time_t che è probabilmente un intero a 64 bit.
  • srand() vuole un unsigned int che è probabilmente un numero intero a 32 bit.

Quindi ottieni l'avviso. È possibile disattivare con un cast:

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

In questo caso, gli afflitti (e potenziale perdita di dati) non importa dal momento che si sta utilizzando solo per seminare il RNG.

+1

+1 questa è solo la risposta corretta nella sua interezza (e le parole). – Nawaz

+2

Ugh, i cast di stile C non appartengono ai programmi C++. – aib

+2

@aib Sono più brevi. E loro [stanno bene per i lanci numerici.] (http://stackoverflow.com/a/1255015/922184) – Mysticial

1

time() restituisce un time_t, che can be 32 or 64 bits. srand() prende uno unsigned int, che è 32 bit. Per essere onesti, probabilmente non ti interessa dato che viene usato solo come seme per la randomizzazione.

+3

Non è garantito che siano 32/64 bit. – Pubby

7

Questa linea comporta un cast implicito da time_t che time ritorna unsigned int che srand prende:

srand (time(NULL)); 

si può fare un cast esplicito, invece:

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

Questa linea prevede un cast implicita da time_t che ora ritorna a int unsigned che srand prende:

srand (time(NULL)); 

si può fare un cast esplicito, invece:

srand (static_cast<unsigned int>(time(NULL))); 
Problemi correlati