srand (time (null)) verursacht eine compiler-Warnung: implizite Konvertierung verliert integer-Präzision
Entschuldigt, wenn diese Frage bereits beantwortet wurde.
#include <iostream>
#include <cstdlib>
#include <ctime>
using namespace std;
int main () {
srand( time(NULL) );
cout << rand();
}
"implizite Konvertierung verliert integer-Präzision: 'time_t' (aka 'lange') zu 'unsigned int'"
Ist die Fehlermeldung Im immer, wenn ich den code auszuführen oben. Ich bin mit xcode 4.6.1. Nun, wenn ich eine andere complier wie die von codepad.org es führt völlig in Ordnung generieren, was scheint wie Zufallszahlen, so bin ich der Annahme, dass es ein xcode Problem, dass ich zu umgehen?
Ich haben GERADE angefangen zu Programmieren, und ich bin ein absoluter Anfänger, wenn es dazu kommt. Gibt es da ein problem mit meinem code oder ist es mein complier?
Jede mögliche Hilfe würde geschätzt!
InformationsquelleAutor der Frage user2576878 | 2013-07-12
Du musst angemeldet sein, um einen Kommentar abzugeben.
Sie verlieren Präzision implizit, weil
time()
gibt einelong
was größer ist als einunsigned int
auf Ihr Ziel. Um um dieses problem zu umgehen, sollten Sie explizit umgewandelt werden, das Ergebnis (also das entfernen des "impliziten Präzision Verlust"):Gegeben, dass es jetzt 2017, ich bin die Bearbeitung dieser Frage vorschlagen, dass Sie erwägen, die Funktionen von
std::chrono::*
definiert in<chrono>
als ein Teil von C++11. Hat Ihr Lieblings-compiler C++11? Wenn nicht, sollte es wirklich!Um die aktuelle Zeit, die Sie verwenden sollten:
Warum sollte ich mir die Mühe mit dieser, wenn
time()
funktioniert?IMO nur ein Grund genug ist: klar, explizite Typen. Wenn Sie den Umgang mit großen Programme unter, die groß genug teams, zu wissen, ob die übergebenen Werte um stellen Zeit-Intervalle oder "absolute" Zeit, und was Größen ist von entscheidender Bedeutung. Mit
std::chrono
können Sie entwerfen Schnittstellen und Datenstrukturen, die tragbar sind und überspringen heraus auf die ist-das-timeout-Frist-oder-Millisekunden-aus-jetzt-oder-warten Sie-war-es-Sekunden-blues.InformationsquelleAutor der Antwort Brian Cain
Wie erwähnt von "nio", eine saubere Abhilfe wäre explizit Typumwandlung.
Tiefere Erklärung:
Den srand() erfordert eine unsigned int als parameter (
srand(unsigned int)
), aber time() gibt einen long int (long int time()
) und diese nicht angenommen wird von den srand (), so, um dieses Problem zu beheben, hat der compiler die einfach typecast (konvertieren), die "long int" , "unsigned int".ABER in deinem Fall wird der compiler warnt Sie über es, anstatt (wie die Designer, die der compiler dachte, Sie sollten sich bewusst sein, dass ist alles).
Also ein einfaches
srand( (unsigned int) time(NULL) );
wird den trick tun!
(verzeihen Sie mir, wenn ich etwas falsch gemacht haben, dies ist meine erste Antwort auf stackoverflow)
InformationsquelleAutor der Antwort reubenjohn
Die srand-Funktion ein unsigned int als eine Art von argument, time_t ist lang. die oberen 4 bytes lang entfernt, aber es gibt kein problem.
srand wird randomize die rand-Algorithmus mit 4 unteren bytes der Zeit, so dass Sie liefern mehr Daten als benötigt wird.
wenn Sie eine Fehlermeldung erhalten, versuchen Sie nur explizit Besetzung der time_t-Typ unsigned int:
Eine weitere interessante Sache ist, dass wenn Sie führen Sie Ihr Programm zweimal in der gleichen Sekunde, erhalten Sie die gleiche Zufallszahl, die manchmal nicht erwünscht, denn wenn Sie Samen der rand-Algorithmus mit den gleichen Daten, erzeugt es die gleiche Zufallsfolge. Oder es kann wünschenswert sein, wenn Sie einige debug-code und testen müssen, die das gleiche Verhalten wieder... dann verwenden Sie einfach so etwas wie
srand(123456)
InformationsquelleAutor der Antwort nio
Dies ist nicht ein Fehler. Der code gültig ist, und seine Bedeutung ist klar definiert; wenn ein compiler sich weigert, um es zu kompilieren, wird der compiler nicht entsprechen, die Sprache, die definition. Eher, es ist ein Warnungund es sagt Ihnen, dass der compiler Schriftsteller denkt, dass Sie vielleicht einen Fehler gemacht haben. Wenn Sie darauf bestehen, auf die Beseitigung Warnung-Nachrichten, die Sie hinzufügen könnte, eine Besetzung, wie andere vorgeschlagen haben. Ich bin kein großer fan von umschreiben, aussagekräftige code, um einige compiler writer ' s Vorstellung von einem guten Stil; ich würde schalten Sie die Warnung. Wenn Sie das tun, obwohl, Sie vielleicht übersehen, andere Orte, an denen eine Umwandlung verliert die Daten, die Sie gar nicht wollen.
InformationsquelleAutor der Antwort Pete Becker
InformationsquelleAutor der Antwort BlueBit