avertissement C4244: 'argument' : conversion time_t " à "unsigned int", possible perte de données, C++
J'ai fait un programme simple qui permet à l'utilisateur de choisir un nombre de dés puis deviner le résultat... j'ai posté ce code avant, mais avec la mauvaise question, de sorte qu'il a été supprimé... maintenant, je ne peut pas avoir des erreurs ou même des mises en garde sur ce code, mais pour une raison que cet avertissement ne cesse d'apparaître et je n'ai aucune idée de comment le résoudre...
"avertissement C4244: 'argument' : conversion time_t " à "unsigned int", la perte possible de données"
#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;
}
C'est ce que je suis à essayer de comprendre, pourquoi suis-je cet avertissement:
avertissement C4244: 'argument' : conversion time_t " à "unsigned int", la perte possible de données
time_t
peut-être une version 64 bits de type, tandis que int
est de 32 bits.Et, s'il vous plaît, pour l'amour de ce que les dieux vous croyez, choisissez C ou C++ et le bâton avec elle. Y compris
cstdlib
et time.h
me donne envie de venir et de te gifler autour de vous 🙂LOL! Paxidiablo j'aimerais rester avec C++, mais cette classe exige de moi de commencer avec le C/C++ puis de migrer plus en C++ et abandonner le C, autant que possible,
Non, il ne fonctionne pas. Vous pouvez inclure
ctime
au lieu de time.h
.OriginalL'auteur Gal Appelbaum | 2012-02-12
Vous devez vous connecter pour publier un commentaire.
C'est parce que sur votre système,
time_t
est un entier de grande taille de type deunsigned int
.time()
renvoie unetime_t
qui est probablement un entier de 64 bits.srand()
veut ununsigned int
qui est probablement un entier de 32 bits.Par conséquent, vous obtenez le message d'avertissement. Vous pouvez la couper avec un cast:
Dans ce cas, les humbles (et le potentiel de perte de données) n'a pas d'importance puisque vous êtes seulement en utilisant à la graine du générateur de nombres aléatoires.
Pouah, C-style jette n'ont pas leur place dans les programmes C++.
Ils sont plus courts. Et ils sont bien pour le numérique jette.
Travaillé comme un charme pour moi. Et je suppose que vous pourriez utiliser size_t au lieu de unsigned int, n'est-ce pas? Merci!
Vous . Mais garder à l'esprit qu'
srand()
prendunsigned int
en tant que paramètre. Siunsigned int
etsize_t
arriver à être de tailles différentes sur votre machine (comme c'est généralement le cas sur x64), alors vous obtiendrez un avertissement similaire à propos de la perte potentielle de données. Il est donc préférable de s'en tenir àunsigned int
.OriginalL'auteur Mysticial
Cette ligne implique un cast implicite de
time_t
quitime
renvoie àunsigned int
quisrand
:Vous pouvez faire un cast explicite à la place:
OriginalL'auteur Pubby
time()
renvoie unetime_t
, qui peut-être 32 bits ou 64 bits.srand()
prend ununsigned int
, qui est de 32 bits. Pour être juste, vous n'aurez probablement pas de soins, car il est uniquement utilisé comme une graine pour la randomisation.OriginalL'auteur Ignacio Vazquez-Abrams
Cette ligne implique un cast implicite de time_t qui revient unsigned int qui srand:
Vous pouvez faire un cast explicite à la place:
OriginalL'auteur user3481361