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 :

Tableau dynamique probleme


Sujet :

C

  1. #1
    Membre du Club
    Inscrit en
    Janvier 2008
    Messages
    139
    Détails du profil
    Informations forums :
    Inscription : Janvier 2008
    Messages : 139
    Points : 57
    Points
    57
    Par défaut Tableau dynamique probleme
    Bonjour ,

    j'essaye de créer un tableau dynamique mais il ne fonctionne pas :s.
    A chaque tour de boucle j'alloue un nouvelle espace memoire dans lequel je range un entier. Mais ensuite quand je veux lire le tableau ca m'affiche 2 valeurs et les reste c'est des 0 ...

    Qu'est ce qui ne va pas?


    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
     
     
    int* plus_court_chemin(int nbsommets, int compteur, Arc A[nbsommets], int potentiels[nbsommets], int id_arrivee, int id_depart, int tab2_chemin[compteur])
    {
    	int id_affiche,i=0,taille_tab=0;	
    	id_affiche=id_arrivee;
    	//tab_chemin[compteur-1]=id_affiche;
    	int * tab_chemin;
    	while(id_affiche!=id_depart)
    	{
    		tab_chemin = malloc (1 * sizeof(int));
    		if( tab_chemin == NULL )
    		{
         		fprintf(stderr,"Allocation impossible PROBLEME TECHNIQUE");
        		 exit(EXIT_FAILURE);
    		}
    		//compteur++;
    		tab_chemin[i]=A[id_affiche].init;
    		printf("%d ",tab_chemin[i]);
    		id_affiche=A[id_affiche].init;
    		i++;
    		taille_tab++;
    	}
     
     
     
     
    	for(i=0;i<compteur;i++)
    	{
    		printf("test %d ",tab_chemin[i]);
    	}
    	//printf("\n");
    	return(tab_chemin);
    }

  2. #2
    Membre averti
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Décembre 2004
    Messages
    304
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Décembre 2004
    Messages : 304
    Points : 405
    Points
    405
    Par défaut
    il faut à chaque fois "reallouer" de la mémoire en gardant l'existant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    tab_chemin = malloc (1 * sizeof(int));
    //devient
    tab_chemin = (int*) realloc (tab_chemin, (taille_tab +1 )* sizeof(int));

  3. #3
    Membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Avril 2009
    Messages
    59
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2009
    Messages : 59
    Points : 48
    Points
    48
    Par défaut
    Le plus simple est d'allouer un espace mémoire suffisant et de stocker tes valeurs par la suite, par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    tab_chemin = malloc (id_depart * sizeof(int));
    (à moins que tu ne saches vraiment pas dés le départ de combien d'espace mémoire tu devras disposer mais c'est rarement le cas)
    Puis ici :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    int * tab_chemin;
    /* ... */
    if( tab_chemin == NULL )
    ton pointeur n'ayant pas été initialisé, il n'y a aucune chance que cette condition soit vérifiée...

  4. #4
    Membre du Club
    Inscrit en
    Janvier 2008
    Messages
    139
    Détails du profil
    Informations forums :
    Inscription : Janvier 2008
    Messages : 139
    Points : 57
    Points
    57
    Par défaut
    Citation Envoyé par zehle Voir le message
    il faut à chaque fois "reallouer" de la mémoire en gardant l'existant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    tab_chemin = malloc (1 * sizeof(int));
    //devient
    tab_chemin = (int*) realloc (tab_chemin, (taille_tab +1 )* sizeof(int));
    avec cette methode est ce que la case de mon tableau est allouée en debut et ou en fin ?

    exemple :

    tab= 1|2|3|5|

    apres je voudrais ca : | |1|2|3|5|
    et non 1|2|3|5| |

  5. #5
    Membre averti
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Décembre 2004
    Messages
    304
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Décembre 2004
    Messages : 304
    Points : 405
    Points
    405
    Par défaut
    La case sera allouer en fin forcement.
    Tu n'aura qu'a lire ton tableau a l'envers de n-1 à 0
    Ou alors faire un décalage à chaque realloc.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    //apres le realloc
    for(cpt=taille_tab;cpt>0;cpt--)
      tab_chemin[cpt]=tab_chemin[cpt-1];

  6. #6
    Membre du Club
    Inscrit en
    Janvier 2008
    Messages
    139
    Détails du profil
    Informations forums :
    Inscription : Janvier 2008
    Messages : 139
    Points : 57
    Points
    57
    Par défaut
    Citation Envoyé par zehle Voir le message
    La case sera allouer en fin forcement.
    Tu n'aura qu'a lire ton tableau a l'envers de n-1 à 0
    Ou alors faire un décalage à chaque realloc.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    //apres le realloc
    for(cpt=taille_tab;cpt>0;cpt--)
      tab_chemin[cpt]=tab_chemin[cpt-1];
    oui mais je vais faire une liste chainée alors avec une insertion en debut de chaine. Parce que avec ta solution , j 'ai une boucle en plus pour le décalage à chaque nouvelle insertion. Et pour le lire à l'envers c'est que je faisais au départ et j'avais une boucle en plus aussi pour calculer la taille de mon tableau pour savoir quand m'arrêter.

    Merci pour tes renseignements l'ami

Discussions similaires

  1. Probleme tableau dynamique 2D
    Par Guillotin dans le forum Débuter
    Réponses: 3
    Dernier message: 04/02/2009, 15h27
  2. Probleme tableau dynamique
    Par John-Doe dans le forum Débuter
    Réponses: 6
    Dernier message: 31/03/2008, 00h19
  3. Réponses: 9
    Dernier message: 23/12/2007, 19h51
  4. probleme dans tableau dynamique
    Par zulad dans le forum C#
    Réponses: 3
    Dernier message: 27/07/2007, 21h05
  5. probleme de tableau dynamique
    Par El Krotal dans le forum C
    Réponses: 9
    Dernier message: 25/06/2004, 17h00

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