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 :

realloc avec tableau dynamique ne marche pas


Sujet :

C

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    251
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 251
    Points : 121
    Points
    121
    Par défaut realloc avec tableau dynamique ne marche pas
    Bonjour.
    J'ai déjà posté, mais je pense que je me suis mal exprimé, puisque j'ai pas eu de réponses.
    J'ai donc amélioré ma question, et je fournit un exemple complet de mon problème.
    J'ai un pointeur vers une structure. Je l'initialise, puis j'ajoute deux éléments de type la structure, et j'affiche ces deux éléments.
    Après exécution, il affiche ajout impossible, et je n'arrive pas à voir où je perds mon pointeur.
    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
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
     
    // test_simple.cpp*: définit le point d'entrée pour l'application console.
    //
     
    #include "stdafx.h"
     
    #include <stdlib.h>
    #include <stdio.h>
    #include <string.h>
     
    typedef struct s
    {
    int nombre;
    char *elt;
    }s;
     
    typedef s *p_s;
     
    s initialiser_s(char *chaie)
    {
    	s e;
    	e.elt = chaie;
    	return e;
    }
    p_s initialiser_p_s()
    {
    p_s l = (p_s)malloc(sizeof(s));
    if(l!= NULL)
    	{
    		l->nombre = 0;
    		l->elt = NULL;
    	}
    	else
    	{
    		printf("initialisation impossible");
    	}
    	return l;
    }
     
    p_s ajouter_p_s(p_s l, s e)
    {
    	l = (p_s)realloc(l, (l->nombre + 1)*sizeof(s));
    	if(l != NULL)
    	{
    		l[l->nombre] = e;
    		l->nombre++;
    	}
    	else
    	{
    		printf("ajout impossible \n");
    	}
    	return l;
    }
     
    void afficher_p_s(p_s l)
    {
    	int i;
    	if(l->nombre == 0)
    	{
    		printf("Vide");
    	}
    	else
    	{
    		for(i=0; i < (l->nombre); i++) 
    		{
    			//affiche_s(l[i]);
    			printf("ceci est une ligne");
    			printf("\n");
    		}
    	}
    }
    int main()
    {
    	char *a = "unechainedecaractere";
    	char *b = "uneatrechainononnnn";
     
    	p_s p1 = initialiser_p_s();
     
    	s e1 = initialiser_s(a);
    	s e2 = initialiser_s(b);
     
    	p1 = ajouter_p_s(p1, e1);
    	p1 = ajouter_p_s(p1, e2);
     
    	//free(p1);
     
    	return 0;
    }
    D'avance merci...

  2. #2
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Points : 50 367
    Points
    50 367
    Par défaut
    La fonction initialiser_s(char *chaie) n'initialise pas le membre nombre de la structure et cela pose un problème quand tu fais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    l[l->nombre] = e;
    l->nombre++;
    Mais je pense qu'il y a un problème plus profond dans ta conception.

    Tel que je vois ton code, j'ai l'impression que le membre elt de ta structure n'est pas un char * mais plutôt un char * [] (un tableau de char * dans lequel le membre nombre correspond au nombre d'elements dans ton tableau.

    Si c'est cela, ta variable p1 n'a aucune raison d'être un pointeur mais peut devenir une variable 'pleine' et la fonction d'ajout d'un char * peut devenir
    p_s ajouter_p_s(p_s l, char *chaine)

    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
    p_s ajouter_p_s(p_s l, char * chaine)
    {
    	l->elt = (char **)realloc(l, (l->nombre + 1)*sizeof(s));
    	if(l->elt != NULL)
    	{
    		l->elt[l->nombre] = chaine;
    		l->nombre++;
    	}
    	else
    	{
    		printf("ajout impossible \n");
    	}
    	return l;
    }
     
    int main()
    {
    	char *a = "unechainedecaractere";
    	char *b = "uneatrechainononnnn";
     
            /* init */
    	s p1;
    	p1.nombre = 0;
    	p1.elt = NULL;
     
    	// inutile maintenant
            // s e1 = initialiser_s(a);
    	// s e2 = initialiser_s(b);
     
    	p1 = ajouter_p_s(&p1, "unechainedecaractere");
    	p1 = ajouter_p_s(&p1, "uneatrechainononnnn");
     
    	//surtout plus de free car p1 est une variable pleine 
           //free(p1);
     
    	return 0;
    }
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    251
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 251
    Points : 121
    Points
    121
    Par défaut
    Merci beaucoup Raymond.
    En fait, l'exemple n'est qu'illustratif. Il s'agit bien dans mon cas réel d'un pointeur vers une structure...
    Par contre, c'est bien le membre nombre qui n'était pas initialisé.
    Je viens de le faire, et apparemment mon problème est résolu.
    Je marque le post comme résolu...

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

Discussions similaires

  1. Réponses: 0
    Dernier message: 06/06/2008, 17h03
  2. Comment compiler en 64 bits avec gcc, -m64 ne marche pas.
    Par jeanlouis_lecodeur dans le forum GCC
    Réponses: 1
    Dernier message: 27/02/2008, 17h40
  3. TabSheet avec enabled à false ne marche pas?
    Par codial dans le forum Delphi
    Réponses: 8
    Dernier message: 06/03/2007, 12h46
  4. problème avec tableau dynamique
    Par akrobat dans le forum C++
    Réponses: 7
    Dernier message: 28/04/2006, 15h29
  5. aperçu d image avec input type file marche pas dans ffx
    Par siddh dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 09/11/2005, 09h11

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