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 :

Ré-adressage par pointeurs


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2011
    Messages
    756
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Haute Garonne (Midi Pyrénées)

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

    Informations forums :
    Inscription : Août 2011
    Messages : 756
    Par défaut Ré-adressage par pointeurs
    Bonjour, bonsoir

    je suis en train d'implémenter une liste doublement chaînée.
    J'ai pour cela un certain nombre de structure, mais je n'arrive pas à coder ce que je veux faire, ou plutôt je ne sais pas comment faire.


    Nous avons une tête de lecture dans cette liste.

    1 -Je crée une cellule
    2- Je met la valeur voulu dans cette nouvelle cellule
    3- Je dois faire en sorte que l'élément suivant de la cellule crée soit la cellule tête; et l'élément précédent est l'ancien élément précédant la tête.

    Voilà mes structures non protégé donc dans le .h cette fois.

    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
    typedef struct unELEMENT {
    int val;
    char nom[TAILLE_MAX];
    }ELEMENT;
     
    typedef struct uneCEL
    {
    	ELEMENT e; //élément courant
    	struct uneCEL *suiv;//pointeur sur élément suivant
    	struct uneCEL *prec;//pointeur sur élément précédent
     
    }CEL;
     
    typedef struct uneLISTE {
    CEL *tete; //pointeur de tete sur une cellule
    }LISTE;
     
    typedef LISTE* LDC;
    Et je dois donc construire ici la fonction correspondant à ce prototype.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void ajoutElemAvant(LDC* l, ELEMENT e1);
    qui réalise donc les étapes que j'ai décrites plus haut si je ne me trompe pas.


    Voilà un début de fonction qui traire un cas particulier.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    void ajoutElemAvant(LDC *l, ELEMENT e1)
    {
    	CEL* maCell=malloc(sizeof(CEL));
    	maCell->e=e1;
    	if(estVideListe(*l))
    	{
    		maCell->suiv=NULL;
    		maCell->prec=NULL;
    		(*l)->tete=maCell;
    	}
          else
    // ........
     
    }


    EDIT:

    J'ai aussi un autre petit soucis, un warning que je n'arrive pas à corriger et qui me fait merder l'exécution, je ne rentre même pas dans la fonction lorsque je la teste.

    Je déclare un élément ELEMENT el
    Ensuite, j'ai donné des valeurs el.val = 10; ça c'est ok

    Mais quand je fais el.nom[TAILLE_MAX]="Bonjour"

    J'obtiens le warning qui me fait assingment makes pointer from integer without a cast sur la ligne. Et j'avoue que je ne comprends rien...

  2. #2
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2009
    Messages
    4 493
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Loire Atlantique (Pays de la Loire)

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

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 493
    Billets dans le blog
    1
    Par défaut
    Pourquoi ce pointeur a t-il droit à une étoile avec que les deux précédents non ?
    Quels est le problème sinon ? Pourquoi ce titre ?


    Pour le warning de l'édit : on ne copie pas une chaine de caractères avec = mais avec strcpy() !

  3. #3
    Membre éprouvé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2011
    Messages
    756
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Haute Garonne (Midi Pyrénées)

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

    Informations forums :
    Inscription : Août 2011
    Messages : 756
    Par défaut
    Pour le warning de l'édit : on ne copie pas une chaine de caractères avec = mais avec strcpy() !
    Je pensais qu'à l'initialisation on pouvait faire une égalité; mais ok ça marche bien aussi comme ça merci


    Par contre, mon début de prog plante toujours =)

    *** stack smashing detected ***: ./liste terminated
    Abandon (core dumped)
    Je ne vois tout simplement pas comment se fait le chaînage; il est évident que je ne fais pas ce qu'il faut...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    maCell->suiv=NULL;
    		maCell->prec=NULL;
    		(*l)->tete=maCell;
    Outre le fait que ça compile, ça me parait logique de dire; je crée une cellule, je lui dis que la case suivante pointe sur null et pareil pour la case précédente.
    Puis j'affecte cette cellule comme étant la cellule de tête.

    Malgré tout j'ai l'erreur situé au dessus !

  4. #4
    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
    Bonjour,
    tete seul est un mauvais nom pour un élément "tête d'écriture" sur une liste, parce que d'après ta spécification ta "tête d'écriture" écrit à la fin de la liste. En clair, elle écrit en queue de liste.

    Par conséquent, tu devrais au moins l'appeler explicitement teteEcriture pour éviter la confusion.

    De plus, une fonction ajoutElemAvant() prend au minimum comme paramètres l'élément à ajouter et l'élément avant lequel l'insertion s'opère (et si on ne peut trouver la liste depuis l'élément, il faut passer la liste en plus).

    Autre question: As-tu vraiment besoin d'agrandir la liste en insérant avant un élément "tête d'écriture"? Ne peux-tu pas directement ajouter à la fin de la liste, sans un élément spécial?
    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.

  5. #5
    Membre éprouvé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2011
    Messages
    756
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Haute Garonne (Midi Pyrénées)

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

    Informations forums :
    Inscription : Août 2011
    Messages : 756
    Par défaut
    Nop, sinon je ne respecterais pas les exigences de mon tp

    J'ai débuggué mon code, ça ne venait pas de ma fonction qui est correcte; mais de mon main, pour une raison que je ne m'explique pas, il plantait avec strcpy à priori, je suis donc passé par un sprintf et ça a fonctionné...

    Pour moi, la tete par analogie avec la pile c'est l'élément le plus haut; et dans ma logique de raisonnement c'est bien ce que je fais.

Discussions similaires

  1. Réponses: 2
    Dernier message: 18/12/2006, 18h03
  2. Petit prob de passage par pointeur
    Par leCcsympas dans le forum C
    Réponses: 6
    Dernier message: 06/12/2006, 09h36
  3. Copie de structure par pointeur - Problème LSB MSB
    Par the_ionic dans le forum Réseau
    Réponses: 4
    Dernier message: 17/07/2006, 15h08
  4. Réponses: 8
    Dernier message: 10/03/2006, 17h28
  5. Echange de valeurs par pointeur et réf
    Par smag dans le forum C++
    Réponses: 6
    Dernier message: 01/03/2005, 18h39

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