IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 C++ Discussion :

[debutant][console] erreur C4244 et C2668


Sujet :

C++

  1. #1
    Membre Expert
    Avatar de méphistopheles
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    1 551
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 1 551
    Par défaut [debutant][console] erreur C4244 et C2668
    Bonjour.

    j'ai cherché les erreurs dans la faq, mais je n'ais pas trouvé.

    j'ai le code suivant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    #include <stdio.h>
    #include <stdlib.h>
    #include <time.h>
    #include <math.h>//librairie fonctions math
    int numcoup_ordi(int num)
    {
    	int mynum=1;
    	int supose_num=50;
    	int min=0; 
    	int max=100;
    	while (supose_num!=num)
    	{
     
    		if (supose_num>num)
    		{
    			supose_num-=(supose_num-min)/2;
    			if (max>supose_num) max=supose_num;
    		}
    		else
    		{
    			supose_num+=(max-supose_num)/2;
    			if (min<supose_num) min=supose_num;
    		}
    		mynum++;
    	}
    	return mynum;
    }
     
    int main(int argc, char *argv[])
    {
    	srand(time(NULL));
    	long nbr=0;
    	nbr  = floor(rand()*100)+1;
    	printf("entrez un nombre entre 0 et 100\n\n");
    	int entered=100;
    	int numcoup=0;
    	while (entered!=nbr)
    	{
    		scanf("%d",&entered);
    		numcoup++;
    		if (entered>nbr)
    		{
    			printf("c'est moins\n");
    		}
    		else if (entered<nbr)
    		{
    			printf("c'est plus\n");
    		}
    		else
    		{
    			printf("trouve!\n");
    			system("PAUSE");
    			printf("tu a mis %d coups\n il m'en faudrais %d.", numcoup,numcoup_ordi(nbr));
    			system("PAUSE");
    		}
    	}
    	return 0;
    }
    Il marchais bien avant que j'ajoute la fonction numcoup_ordi, mais maintenant il m'affiche les erreurs suivantes que je n'ais pas réussi à regler, vu qu'il y en à trois qui concernent le module math.h:
    ------ Début de la génération : Projet : tutozero02, Configuration : Debug Win32 ------
    Compilation en cours...
    main.cpp
    d:\dossiers & prog\programation\c\c++\init\tutozero02\tutozero02\main.cpp(32) : warning C4244: 'argument' : conversion de 'time_t' en 'unsigned int', perte possible de données
    d:\dossiers & prog\programation\c\c++\init\tutozero02\tutozero02\main.cpp(34) : error C2668: 'floor' : appel ambigu à une fonction surchargée
    c:\program files\microsoft visual studio 8\vc\include\math.h(559): peut être 'long double floor(long double)'
    c:\program files\microsoft visual studio 8\vc\include\math.h(511): ou 'float floor(float)'
    c:\program files\microsoft visual studio 8\vc\include\math.h(137): ou 'double floor(double)'
    lors de la tentative de mise en correspondance de la liste des arguments '(int)'
    Le journal de génération a été enregistré à l'emplacement "file://d:\Dossiers & prog\programation\C\C++\init\tutozero02\tutozero02\Debug\BuildLog.htm"
    tutozero02 - 1 erreur(s), 1 avertissement(s)
    ========== Génération : 0 a réussi, 1 a échoué, 0 mis à jour, 0 a été ignoré ==========
    si vous aviez une idée de la manière pour régler ce problème ...

    merci.


    Ps: Questions subsidiaire: comment faire en sorte que le débogage ne lance pas l'executable (qu'il à alors généré la fois précédente) s'il ne l'a pas généré cette fois-ci à cause d'une erreur ?

    merci.

    Ps2: je suis sous visual C++ express

  2. #2
    Membre émérite

    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2005
    Messages
    634
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Suisse

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2005
    Messages : 634
    Par défaut
    Citation Envoyé par méphistopheles
    si vous aviez une idée de la manière pour régler ce problème
    Ton problème vient du fait que les paramètres de la fonction surchargée floor() sont float, double ou long double. Et toi tu passes à priori un nombre entier. Un simple cast résoudra le problème :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    nbr = floor(static_cast<double>(rand() * 100)) + 1;
    Sinon tu as d'autres warning sur d'autres lignes, qui sont aussi des conversions à rendre explicites en principe.

    Ce code est plus du C que du C++...

  3. #3
    Membre Expert
    Avatar de méphistopheles
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    1 551
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 1 551
    Par défaut
    je ne comprend pas pourquoi je suis censé passer un nombre entier, puisque rand est, à ma conaissance, un double...

    si je passe un entien, il est inutile dans ce cas d'apeller le floor non ?

    sinon, srand ne prend en paramètre que des unsigned (cf premier warning...) ?


    merci

  4. #4
    Membre émérite

    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2005
    Messages
    634
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Suisse

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2005
    Messages : 634
    Par défaut
    Citation Envoyé par méphistopheles
    je ne comprend pas pourquoi je suis censé passer un nombre entier, puisque rand est, à ma conaissance, un double...
    Non tu es justement censé passé un flottant, mais rand() renvoie un entier. Donc il est inutile d'appeler floor() ici (j'ai même pas tilté )

    sinon, srand ne prend en paramètre que des unsigned (cf premier warning...) ?
    Oui

  5. #5
    Membre Expert
    Avatar de méphistopheles
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    1 551
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 1 551
    Par défaut
    là, je comprend encore moins: si le rand renvoyais un entier: le multiplier par 100 me donnerais ou 1 ou 0, mais jamais des nombres intermédiaires non... ?

  6. #6
    Membre Expert
    Avatar de méphistopheles
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    1 551
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 1 551
    Par défaut
    c'est curieux, maintenant, rand me renvoie un entier (énorme) alors que ce n'étais pas le cas...
    bon, pas grave, je me contente d'un modulo, mais je me demande s'il n'y as pas plus économique en ressources ... (pas pour ce programme bien sur )

  7. #7
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    La gestion des nombres pseudo-aléatoires se trouve dans la FAQ C (si jamais tu veux plus de précisions).

  8. #8
    Membre Expert
    Avatar de méphistopheles
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    1 551
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 1 551
    Par défaut
    j'ai vu, mais la faq ne traite que le caractère aléatoire ou non de la methode utilisée. j'aimerais savoir combien de ressources cela prend-il et à la limite, si conaître le maximum de random et faire une simple division ne permetrais-il pas de ne pas tenir compte des bits de poid faible ?

    merci.

  9. #9
    Invité de passage
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1
    Par défaut Pour t erreurs de compilation
    Montre-moi où est comment tu déclare ta fonction « floor »

  10. #10
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    Citation Envoyé par 4u4m4us
    Montre-moi où est comment tu déclare ta fonction « floor »
    C'est une fonction standard de math.h. Mais bon le problème n'est plus là.

    j'ai vu, mais la faq ne traite que le caractère aléatoire ou non de la methode utilisée. j'aimerais savoir combien de ressources cela prend-il et à la limite, si conaître le maximum de random et faire une simple division ne permetrais-il pas de ne pas tenir compte des bits de poid faible ?
    Niveau ressources je ne pense pas que ça puisse poser problème, à moins d'une utilisation particulièrement intensive des nombres aléatoires. Pourquoi te poses-tu cette question ?

  11. #11
    Membre Expert
    Avatar de méphistopheles
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    1 551
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 1 551
    Par défaut
    c'est toujours bon à savoir

    sinon, sur quel intervale rand() génere-il ?

  12. #12
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    De 0 à RAND_MAX.

    Mais bon tout ça est dans la FAQ...

  13. #13
    Membre Expert
    Avatar de méphistopheles
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    1 551
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 1 551
    Par défaut
    heu... je ne trouve pas RAND_MAX dans la faq.

  14. #14
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651

  15. #15
    Membre Expert
    Avatar de méphistopheles
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    1 551
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 1 551
    Par défaut
    Merci.

    Cependant, je ne comprend vraiment pas l'interet du code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    int alea(int n)
    {
       int partSize   = (n == RAND_MAX) ?        1 : 1 + (RAND_MAX - n)/(n+1);
       int maxUsefull = partSize * n + (partSize-1);
       int draw;
     
       do
       {
          draw = rand();
       } while (draw > maxUsefull);
       return draw/partSize;
    }
    si on est dans le cas n= RAND_MAX, partSize=1, maxUsefull=1*n+0=n=RAND_MAX

    sinon, partSize=1 + (RAND_MAX - n)/(n+1)
    maxUsefull = partSize * n + (partSize-1)= partSize*(n+1) -1= n+1 +(RAND_MAX - n)-1=RAND_MAX

    donc, je vois pas trop l'interet d'effectuer tout ce calcul pour ça
    du coup, la boucle sert juste à éviter le cas ou n=RAND_MAX Non ? (je n'en vois pas trop l'interet quand on génere sur tout int. ça doit pas trop gêner les statistique de le remplacer par la moyenne ou par un autre nombre, vu qu'on est en pseudo-aléatoire.)

    la dernière ligne m'intrique un peu plus:
    il faut dire que je ne sait pas trop ce qu'indique n (un maximum ?)

    bref, je ne vois pas trop ce que fait cette fonction et ne comprend pas son utilité.

    d'autre part, dans le lien pdf qui étais en bas de l'article, il y avais écris que RAND_MAX étais une macro.
    dois-je en conclure que RAND_MAX est variable .... (enfin, il doit dépendre juste des paramètres de Srand Non ?)

    bref, je suis assez perdu dans toutes ces définitions de rand ...
    si vous pouviez m'éclairer

    merci.

  16. #16
    Membre Expert
    Avatar de méphistopheles
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    1 551
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 1 551
    Par défaut
    personne ne pourrais me renseigner ?

    heu sinon, peut-être serait-il opportun de diviser le sujet vu que le theme de la conversation à un peu changé...

    merci

  17. #17
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Par défaut
    Cette fonction a pour but de retourner un nombre entre 0 et N, et fait tous ces calculs compliqués afin d'éviter d'introduire un biais dans la distribution des nombres retournés (pour t'en convaincre, regarde quelles seraient les probabilités d'obtenir chaque nombre par une bête division si N=8 et RAND_MAX = 10).
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

  18. #18
    Membre Expert
    Avatar de méphistopheles
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    1 551
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 1 551
    Par défaut
    Certes, mais si tu à bien lu le post juste avant, cela me parait curieux que maxusefull soit basé sur un calcul puiqu'on pourrais simplement le remplacer par MAX_RAND.

    enfin, si N=8 et RAND_MAX = 10 il ne peut y avoir de bits de poid faible sur un max de 10 ou alors la fonction ne serais pas aléatoire !! (prend N=10 et tu pourra vérifier. et comme dans ce cas, ta fonction ne change rien...)
    par contre, si RAND_MAX = 100 000 si mon N=1000, alors mon arondi portera sur 7 bits ce qui permetra justement de ne pas tenir compte des bits de poid faible.

    enfin, c'est mon avis.

  19. #19
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Par défaut
    Tes calculs sont faux...

    En C++, a/n*n ne vaut pas a quand a et n sont entiers.

    10/8*8, par exemple, vaut 8 : 10/8*8 = (10/8) * 8 = (1)* 8 = 8.

    La division utilisée étant la division entière.
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

  20. #20
    Expert confirmé

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Par défaut
    Citation Envoyé par méphistopheles
    si vous pouviez m'éclairer
    Il y a un lien vers un PDF dans la FAQ apres le code. Ce PDF derive cette fonction pas a pas a partir d'une version simple en expliquant en detail chacun des pas. En gros, on tient compte de 3 problemes potentiels:
    - biais du a l'utilisation des bits de poids faibles (certains generateurs etant particulierement mauvais dans ce cas)
    - biais du au fait que RAND_MAX+1 n'est pas divisible par n+1
    - possibilite d'overflow

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Debutant(e)] Erreur de compilation
    Par gandalf_le_blanc dans le forum Applets
    Réponses: 9
    Dernier message: 27/02/2007, 10h30
  2. [ debutant ][ Tomcat ] Erreurs fichier web.xml
    Par zsoh dans le forum Tomcat et TomEE
    Réponses: 3
    Dernier message: 13/04/2005, 12h35
  3. [Debutant] Lieur Erreur
    Par Tanahjampea dans le forum Débuter
    Réponses: 6
    Dernier message: 17/08/2004, 12h26
  4. [Débutant][Conception] Erreur avec une classe interne
    Par Devil Redneck dans le forum Général Java
    Réponses: 5
    Dernier message: 11/06/2004, 16h45
  5. [debutant][servlet]erreur causée par une listBox
    Par omega dans le forum Servlets/JSP
    Réponses: 2
    Dernier message: 05/03/2004, 11h53

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo