Partage
  • Partager sur Facebook
  • Partager sur Twitter

déterioration anormale d'un tableau après avoir été retourné par ma fonction

Sujet résolu
    5 septembre 2007 à 17:05:47

    Bonjour

    J'ai un problème : j'ai voulu voir quelques truc sûr les nombres premiers, et j'ai donc créé une fonction qui me liste les n premiers nombres premiers Le seul problème, c'est que lorsque j'essaie de lire le tableau retourné par ma fonction, celui-ci a été détérioré : la plupart de valeurs sont fausses. De plusse, ces détériorations n'ont rien d'aléatoire : si je demande le même nombre de valeurs, les tableaux seront identiques, bien que faux.

    1. #include <iostream>
    2. #define NOMBRE unsigned long
    3. #define TAILLE 10
    4. bool is_in(NOMBRE* order_table, NOMBRE table_taille, NOMBRE nombre);
    5. NOMBRE* list_nombres_premiers(NOMBRE table_taille);
    6. int main(int argc, char** argv)
    7. {
    8.     NOMBRE* tableau = list_nombres_premiers(TAILLE);
    9.     for(NOMBRE i=0; i<TAILLE; i++)
    10.     {
    11.         std::cout << tableau[i] << std::endl;
    12.     }
    13. }
    14. NOMBRE* list_nombres_premiers(NOMBRE table_taille)
    15. {
    16.     NOMBRE tableau[table_taille];
    17.     tableau[0] = 2;
    18.     bool premier;
    19.     for(NOMBRE i=1; i<table_taille; i++)
    20.     {
    21.         tableau[i]=0;
    22.     }
    23.     for(NOMBRE i=3, quantite=1; quantite<table_taille; i++)
    24.     {
    25.         premier = true;
    26.         for(NOMBRE j=0; j<quantite; j++)
    27.         {
    28.             if(i%tableau[j] == 0)
    29.             {
    30.                 premier = false;
    31.                 break;
    32.             }
    33.         }
    34.         if(premier)
    35.         {
    36.             tableau[quantite] = i;
    37.             quantite ++;
    38.             premier = false;
    39.             std::cout << i << std::endl;
    40.         }
    41.     }
    42.     for(NOMBRE z=0; z<TAILLE; z++)
    43.     {
    44.         std::cout << tableau[z] << std::endl;
    45.     }
    46.     return tableau;
    47. }
    48. bool is_in(NOMBRE* order_table, NOMBRE table_taille, NOMBRE nombre)
    49. {
    50.     for(NOMBRE l=0, r=table_taille-1, i=0; l!=r;)
    51.     {
    52.         i=(l+r)/2;
    53.         if(nombre<order_table[i]) r=i;
    54.         else if(nombre>order_table[i]) l=i;
    55.         else return true;
    56.     }
    57.     return false;
    58. }
    J'ai rajouté pas mal d'affichages pour vérifier tout ça. On peut faire varier le nombre deux valeurs demandées en modifiant TAILLE, et NOMBRE me permet de changer le type de nombre selon la taille qu'ils prendront.


    Merci d'avance
    • Partager sur Facebook
    • Partager sur Twitter
      5 septembre 2007 à 17:14:52

      Bien le bonjour,

      Tu retournes un objet local NOMBRE tableau[table_taille]. à partir de là, tu as un comportement indéfini.
      Pas la peine de chercher plus loin.

      Plusieurs solutions dont celle là :
      créer un tableau, l'allouer correctement. passer l'adresse du début à ta fonction de recherche de nombres premiers, elle va remplir le tableau et renvoyer un code d'erreur.
      • Partager sur Facebook
      • Partager sur Twitter
        5 septembre 2007 à 17:22:46

        TU peux aussi créer dynamiquement un nouveau tableau dans la fonction sans le détruire et retourner l'adresse au main

        n'oublis pas de le détruire plus tard.
        • Partager sur Facebook
        • Partager sur Twitter
          5 septembre 2007 à 18:06:45

          D'accords, je crois avoir compris. Si je crée un tableau avec
          1. NOMBRE tableau[table_taille];
          L'espace alloué sera dépendant de la fonction, et donc détruit à la fin de cette dernière (comme une variable globale), alors que si j'utilise
          1. NOMBRE* tableau = new NOMBRE[table_taille];
          L'espace alloué sera indépendant de la fonction et ne sera pas détruit avant que je le demande explicitement.


          Merci beaucoup !
          • Partager sur Facebook
          • Partager sur Twitter

          déterioration anormale d'un tableau après avoir été retourné par ma fonction

          × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
          × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
          • Editeur
          • Markdown