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 :

Changement de contenu après un realloc


Sujet :

C

  1. #1
    Membre du Club
    Inscrit en
    Décembre 2005
    Messages
    95
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 95
    Points : 66
    Points
    66
    Par défaut Changement de contenu après un realloc
    Salut,

    je fais un realloc sur un tableau d'unsigned long..
    Et il semble que le contenu de ce tableau change avant/après le réalloc..

    De plus, le pointeur semble changer lorsqu'il s'agit de gros tableaux (alors que mes réallocs sont forcement d'une taille inférieure.. mais c'est peut etre normal, y a t il recopie si la taille est plus petite ?)

    Code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
       for(i=0 ; i<orientedGraph->nbArcs*2 ; ++i) printf("%ld ", notOriented->allAdjOut[i]);
       printf("\n");   
     
       if((notOriented->allAdjOut = realloc(notOriented->allAdjOut, notOriented->nbArcs*2)) == NULL) {
          perror("realloc");
          return NULL;
       }  
     
       for(i=0 ; i<notOriented->nbArcs ; ++i) printf("%ld ", notOriented->allAdjOut[i]);
       printf("\n");
    Et cela donne :

    1 2 0 0 3 4 2 2 6 5 0 0
    1 2 0 41 1628733340 1628733340 2 2 6 5

  2. #2
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par lechewal
    je fais un realloc sur un tableau d'unsigned long..
    Et il semble que le contenu de ce tableau change avant/après le réalloc..
    <...>
    Effectivement, ce code (compilable et testable) reproduit le défaut (merci pour la séance de rétro-engineering, j'avais que ça à faire...)
    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
    59
     
    #include <stdlib.h>
    #include <stdio.h>
     
    struct graph
    {
       int nbArcs;
       long *allAdjOut;
    };
     
    void *f (struct graph *orientedGraph, struct graph *notOriented)
    {
       int i;
       for (i = 0; i < orientedGraph->nbArcs * 2; ++i)
          printf ("%ld ", notOriented->allAdjOut[i]);
       printf ("\n");
     
       if ((notOriented->allAdjOut =
            realloc (notOriented->allAdjOut, notOriented->nbArcs)) == NULL)
       {
          perror ("realloc");
          return NULL;
       }
     
       for (i = 0; i < notOriented->nbArcs; ++i)
          printf ("%ld ", notOriented->allAdjOut[i]);
       printf ("\n");
     
       return NULL;
    }
     
    void add (struct graph *this, long data)
    {
       long *p = realloc (this->allAdjOut, this->nbArcs + 1);
       if (p != NULL)
       {
          this->allAdjOut = p;
          this->allAdjOut[this->nbArcs] = data;
          this->nbArcs++;
       }
    }
     
    int main (void)
    {
       struct graph orientedGraph = { 0 };
       struct graph notOriented = { 0 };
     
       add (&orientedGraph, 1);
       add (&orientedGraph, 2);
       add (&orientedGraph, 3);
       add (&orientedGraph, 4);
     
       add (&notOriented, 5);
       add (&notOriented, 6);
     
       f (&orientedGraph, &notOriented);
     
       return 0;
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    5 6 131074 786880 1 2 3 4
    5 6
     
    Press ENTER to continue.
    Maintenant, on va pourvoir travailler sérieusement...

    Mes commentaires :
    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
     
    void *f (struct graph *orientedGraph, struct graph *notOriented)
    {
       int i;
       /* -ed- pourquoi * 2 ?
       for (i = 0; i < orientedGraph->nbArcs * 2; ++i)
       */
       for (i = 0; i < orientedGraph->nbArcs; ++i)
       /* -ed- pourquoi notOriented ?
          printf ("%ld ", notOriented->allAdjOut[i]);
       */
          printf ("%ld ", orientedGraph->allAdjOut[i]);
       printf ("\n");
     
       /* -ed- ce code ne fait rien du tout... */
       if ((notOriented->allAdjOut =
            realloc (notOriented->allAdjOut, notOriented->nbArcs)) == NULL)
       {
          perror ("realloc");
          return NULL;
       }
     
       for (i = 0; i < notOriented->nbArcs; ++i)
          printf ("%ld ", notOriented->allAdjOut[i]);
       printf ("\n");
     
       return NULL;
    }
    Je ne vois pas du tout ce que tu cherches à faire...

  3. #3
    Membre du Club
    Inscrit en
    Décembre 2005
    Messages
    95
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 95
    Points : 66
    Points
    66
    Par défaut
    Désolé pour le mauvais post.. Je m'auto lynche en place publique.

    Le but est de passer d'un graphe orienté a un graphe non orienté.

    Pour un gain de place, je n'utilise qu'un seul tableau (un seul gros malloc donc) pour les listes d'adjacence (utilisation d'un pointeur vers ce tableau pour la liste de chaque nœud)

    Au départ, on ne sait pas combien d'arcs seront dans le graphe non orienté, on alloue donc une liste d'adjacence de nombre d'arc * 2 (pour l'entrant et le sortant..)

    Si on donne un arc dans le non orienté que s'il y avait une flèche dans les deux sens entre les deux noeuds, ce nombre d'arcs est bien plus faible. C'est pourquoi je voulais libérer cette place non utilisée..

    Pour debugger, j'affiche donc ce tableau (les listes d'adjacence du graphe non orienté) avant et après le realloc..

  4. #4
    Membre du Club
    Inscrit en
    Décembre 2005
    Messages
    95
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 95
    Points : 66
    Points
    66
    Par défaut
    Au temps pour moi, j'ai mal utilisé realloc.

    Cela fonctionne maintenant.

    Merci

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

Discussions similaires

  1. [SWING] Jtable changement du contenu d'une cellule
    Par tchoukapi dans le forum Composants
    Réponses: 5
    Dernier message: 07/11/2007, 03h03
  2. Changement du contenu d'un panel
    Par Bogs dans le forum AWT/Swing
    Réponses: 3
    Dernier message: 11/10/2007, 19h38
  3. Changement du contenu d'un textbox
    Par loverdev dans le forum VB.NET
    Réponses: 24
    Dernier message: 15/06/2007, 16h16
  4. Céation de Master page et changement du contenu
    Par Claire07 dans le forum ASP.NET
    Réponses: 2
    Dernier message: 03/04/2007, 14h46
  5. Conservation du contenu après un rafraichissement
    Par nadalator666 dans le forum Langage
    Réponses: 6
    Dernier message: 30/03/2007, 12h36

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