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 :

petit soucis d aleatoir


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2016
    Messages
    216
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Ardèche (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2016
    Messages : 216
    Par défaut petit soucis d aleatoir
    bonjour,
    comme dit dans le titre j ai un petit soucis avec un rand

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    int * RandomArray(int n)
    {
        srand(time(NULL));
        int tab[n];
        int i=0;
        while (i<n)
        {
          tab[i]=(rand()%n);
          i++;
        }
      return tab;
    }
    via ce code je cree un tableau de n valeur remplis de valeur aléatoire entre 0 et n
    le soucis est que quand j'affiche mon tableau les valeurs sont supérieur a n
    ce que je ne comprend pas vu que j ai écrit si quelqu un pouvais me renseigner je lui en serais grès merci

  2. #2
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 147
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 147
    Billets dans le blog
    4
    Par défaut
    Es-tu vraiment en C++ ? Parce que ce code a tout d'un code C et int tab[n]; est un VLA qui n'est pas du tout permis en C++ et à peine dans certaines normes C.
    Sans compter le retour d'une variable interne et donc temporaire.
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  3. #3
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2016
    Messages
    216
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Ardèche (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2016
    Messages : 216
    Par défaut
    heuuu oui je suis en C++ vu que c'est moi qui est crée le code ^^"
    VLA ? (explique )

    et si je fait un int x = 4 ;
    je peut bien faire un tab[x] ; meme en c++
    non ? car j ai jamais eu de soucis la dessus moi ^^"
    ensuite c est une fonction or si je ne m abuse tt les retour des fonction sont temporaire ..... vu qu'il ne sont propre qu au moment et au valeur fournis a l appel de la fonction dans le main
    le mien etant

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
        int n=0;
        while (n<=5 || n>=500000 )
        {
            cout<<"entrer une valeur entre 5 et  500000 : "<<endl;
            cin >>n;
        }
        int *arrays = RandomArray(n);
        affiche (arrays, n);

  4. #4
    Expert éminent

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 202
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 202
    Par défaut
    VLA pour Variable Length Array: tableau à taille variable (par opposé à une taille connue à la compilation).
    Ce n'est pas standard.

    Il est probable que tu compiles avec des extensions au langage, que tu devrais désactiver autant que possible.
    Avec gcc, recoure à --std=c++14 (ou variante comme c++17, c++1y, c++1z, voire c++2a)

    De plus, tu devrais activer un maximum de warning de compilation.

    Ta fonction retourne l'adresse d'un tableau qui est une variable locale.

    À la fin de la fonction, ce tableau est rendu à la mémoire, et l'adresse retournée n'est plus utilisable. On parle de "dangling reference".
    La prochaine variable locale déclarée se trouvera probablement au même endroit.

    Ce qui est temporaire, c'est la valeur retournée. Pour les pointeurs et les références, cela pose problème, car ce qui est désigné n'existe plus.



    Utilise un std::vector, et tout ira mieux.
    De même, tu pourrais (et devrais) utiliser les fonctions d'aléatoire moderne, qui ont moins de défauts que rand et srand.

    Typiquement, tu pourrais utiliser
    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
    #include <vector>
    #include <random>
     
    std::vector<int> RandomArray(std::mt19937 & gen, std::vector<int>::size_type n, int min, int max) {
        std::uniform_int_distribution<> dis(min, max);
     
        std::vector<int> valeurs;
        valeurs.reserve(n);
        while (valeurs.size() < n) valeurs.push_back( dis(gen) );
        return valeurs;
    }
     
    int main() {
        std::random_device rd;  //Will be used to obtain a seed for the random number engine
        std::mt19937 gen(rd()); //Standard mersenne_twister_engine seeded with rd()
     
        int n = 0;
        while (n<=5 || n>=500000 ) {
            cout<<"entrer une valeur entre 5 et  500000 : "<<endl;
            cin >>n;
        }
        auto array = RandomArray(gen, n, 0, 1000); //pour générer des nombres entre 0 et 1000.
        affiche (array, n);
    }
    Idéalement, tu pourrais rendre la fonction template pour qu'elle accepte n'importe quel type de générateur.

  5. #5
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2016
    Messages
    216
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Ardèche (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2016
    Messages : 216
    Par défaut
    je n'est malheureusement pas le choix car il s'agit d un sujet de fac

    2.1 Creation aletoire de tableaux
    Ecrire une fonction
    int ∗ RandomArray(int n)
    renvoyant un tableau de n entiers dont les ´elements sont choisis aleatoirement
    entre 0 et n.
    Indication : vous vous aiderez de la fonction predefinie C + +, rand()

  6. #6
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Dans ce cas pas le choix, il faudra que tu utilises new[].
    La consigne ne te laisse même pas le choix de retourner un pointeur intelligent...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

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

Discussions similaires

  1. Petit soucis pour se connecter à l'adsl
    Par Blowih dans le forum Réseau
    Réponses: 4
    Dernier message: 28/07/2004, 00h16
  2. petit soucy de fenetre cmd
    Par FeetloveR666 dans le forum Windows
    Réponses: 5
    Dernier message: 03/07/2004, 14h24
  3. petit soucis lors d'un LOAD DATA INFILE
    Par Jovial dans le forum SQL Procédural
    Réponses: 9
    Dernier message: 04/06/2004, 11h58
  4. Réponses: 6
    Dernier message: 21/01/2004, 13h25
  5. [DEBUTANT] petits soucis avec un prgm de chat
    Par LechucK dans le forum MFC
    Réponses: 8
    Dernier message: 19/01/2004, 16h52

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