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 :

template avec rand()


Sujet :

C++

  1. #1
    Nouveau membre du Club
    Inscrit en
    Décembre 2006
    Messages
    53
    Détails du profil
    Informations personnelles :
    Âge : 35

    Informations forums :
    Inscription : Décembre 2006
    Messages : 53
    Points : 36
    Points
    36
    Par défaut template avec rand()
    Bonjour, j'ai un souci de compilation avec ce code:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    template <class T>
    void initTab(T *t,int n){
    	srand(time(NULL));
    	for(int i=0;i<n;i++){
    		t[i]=rand()%101;
    	}
    }
    Quand j'essaye de le compiler en fichier .obj en tapant sur une console:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    g++ -c code.cpp -o code.obj
    sur windows ca marche sans problème mais sur linux j'ai un message d'erreur

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    algo1.cpp: In function ‘void initTab(T*, int)’:
    algo1.cpp:24: erreur: there are no arguments to ‘srand’ that depend on a template parameter, so a declaration of ‘srand’ must be available
    algo1.cpp:24: note: (if you use ‘-fpermissive’, G++ will accept your code, but allowing the use of an undeclared name is deprecated)
    algo1.cpp:26: erreur: there are no arguments to ‘rand’ that depend on a template parameter, so a declaration of ‘rand’ must be available
    Si quelqu'un pourrait m'éclaircir tout ça j'en serais reconnaissant.

  2. #2
    Expert éminent
    Avatar de PRomu@ld
    Homme Profil pro
    Ingénieur de Recherche
    Inscrit en
    Avril 2005
    Messages
    4 155
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Ingénieur de Recherche
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2005
    Messages : 4 155
    Points : 6 486
    Points
    6 486
    Par défaut
    As-tu bien inclue <cstdlib> ?

  3. #3
    Membre chevronné
    Avatar de Goten
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 580
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 580
    Points : 2 205
    Points
    2 205
    Par défaut
    On appelle srand qu'une seule fois. (généralement au début du main).
    Et on n'utilise pas le modulo avec le résultat de rand. (ça favorise les bit de poids faible).
    "Hardcoded types are to generic code what magic constants are to regular code." --A. Alexandrescu

  4. #4
    Nouveau membre du Club
    Inscrit en
    Décembre 2006
    Messages
    53
    Détails du profil
    Informations personnelles :
    Âge : 35

    Informations forums :
    Inscription : Décembre 2006
    Messages : 53
    Points : 36
    Points
    36
    Par défaut
    Merci PRomu@ld, j'ai pu résoudre le problème avec ton indication, mais je ne comprend toujours pas pour quoi sur windows ça passait sans inclure <cstdlib> et sur linux non.

    Merci Goten pour ta réponse, mais je me demande est ce que ça va créer des problèmes si j'appelle plusieurs fois ma fonction qui contient srand(), et pour le modulo avec le rand() y a-t-il une solution plus convenable?

  5. #5
    Membre chevronné
    Avatar de Goten
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 580
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 580
    Points : 2 205
    Points
    2 205
    Par défaut
    Oui, enfin pas des problèmes. Mais t'auras pas des nombres pseudos aléatoires.
    Quand a une meilleure solution cf la faq C :
    http://c.developpez.com/faq/index.ph...NDOM_runif_a_b

    explication de srand :
    http://c.developpez.com/faq/index.ph...NDOM_bad_srand

    et tu peux aussi lire :
    http://www.bourguet.org/v2/clang/random/
    "Hardcoded types are to generic code what magic constants are to regular code." --A. Alexandrescu

  6. #6
    Expert confirmé

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2007
    Messages
    1 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 895
    Points : 4 551
    Points
    4 551
    Par défaut
    [quote=sonorc;4740766]Merci PRomu@ld, j'ai pu résoudre le problème avec ton indication, mais je ne comprend toujours pas pour quoi sur windows ça passait sans inclure <cstdlib> et sur linux non.
    [quote]

    Parce que visual c++ "auto-inclus" une partie de stdlib.h si le fichier compilé ne contient pas l'include correspondant. C'est un comportement un poil abhérant selon moi mais bon... on ne va pas refaire le monde hein ?

    Citation Envoyé par sonorc Voir le message
    Merci Goten pour ta réponse, mais je me demande est ce que ça va créer des problèmes si j'appelle plusieurs fois ma fonction qui contient srand(), et pour le modulo avec le rand() y a-t-il une solution plus convenable?
    n * (float)(rand()) / (float)(RAND_MAX + 1)
    [FAQ des forums][FAQ Développement 2D, 3D et Jeux][Si vous ne savez pas ou vous en êtes...]
    Essayez d'écrire clairement (c'est à dire avec des mots français complets). SMS est votre ennemi.
    Evitez les arguments inutiles - DirectMachin vs. OpenTruc ou G++ vs. Café. C'est dépassé tout ça.
    Et si vous êtes sages, vous aurez peut être vous aussi la chance de passer à la télé. Ou pas.

    Ce site contient un forum d'entraide gratuit. Il ne s'use que si l'on ne s'en sert pas.

  7. #7
    Membre chevronné
    Avatar de Goten
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 580
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 580
    Points : 2 205
    Points
    2 205
    Par défaut
    voir :

    n * static_cast<float>(rand()) / static_cast<float>(RAND_MAX + 1)
    "Hardcoded types are to generic code what magic constants are to regular code." --A. Alexandrescu

  8. #8
    Nouveau membre du Club
    Inscrit en
    Décembre 2006
    Messages
    53
    Détails du profil
    Informations personnelles :
    Âge : 35

    Informations forums :
    Inscription : Décembre 2006
    Messages : 53
    Points : 36
    Points
    36
    Par défaut
    Sur Windows j'ai compilé mon code en passant par la console DOS et non par visual C++ !! Est-ce que les en-têtes sont inclus aussi automatiquement par cette voie ??

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

Discussions similaires

  1. [Valeur aléatoire] Problème avec rand()
    Par Machjaghjolu dans le forum C++
    Réponses: 4
    Dernier message: 06/12/2005, 17h10
  2. Selection aléatoire avec rand
    Par Ruddy16 dans le forum Requêtes
    Réponses: 4
    Dernier message: 06/12/2005, 10h01
  3. [xslt] For-each dans template avec format XML (row)
    Par Steff1985 dans le forum XSL/XSLT/XPATH
    Réponses: 2
    Dernier message: 17/11/2005, 11h14
  4. SELECT avec RAND() mais plus avancé
    Par Sebou San dans le forum Requêtes
    Réponses: 6
    Dernier message: 06/11/2005, 09h30
  5. Probleme de tirage avec rand ?
    Par sunshine33 dans le forum MFC
    Réponses: 5
    Dernier message: 14/01/2004, 15h57

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