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 :

les niveaux d'indirection sont différents


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Avril 2008
    Messages
    33
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 33
    Par défaut les niveaux d'indirection sont différents
    bonjour à tous,
    j'ai un problème de pointeurs et je suis dessus depuis tout à l'heure et je n'arrive pas à trouver la solution, le probleme est que je dois rendre ce tp aujourd'hui.

    voici mes structures de données:
    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
     
    struct quadruplet
    {
    	char * ch1;
    	char * ch2;
    };
    typedef struct quadruplet  quadruplet;
     
    struct li
    {
    char *ch1;
    char *ch2;
    struct li * suiv;
    };
    typedef struct li *li;
    voici mon code:
    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
    li ajouter_inst(quadruplet elt,li liste)
    {
    li l1= liste ;
    //allouer un maillon
    li q =(li)malloc(sizeof(li));
     
    q->ch1 =(char*) malloc(sizeof(char) * strlen(elt.ch1));
    q->ch2 =(char*) malloc(sizeof(char) * strlen(elt.ch2));
    q->ch1=elt.ch1;
    q->ch2=elt.ch2;
    q->suiv = NULL;
     
    //ajouter à la fin de la liste 
     
    if(l1!=NULL)
    	{	
    		while(l1->suiv!=NULL)
    		{
    			l1=l1->suiv;
    		}
     
    		l1->suiv=q;
    		}
    else { 
    		 liste =q; }
    return liste;
     
     
    }
    voici l'erreur:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Erreur	56	error C2040: 'ajouter_inst'*: les niveaux d'indirection de 'li (quadruplet,li)' et de 'int ()' sont différents	C:\Users\yasmine\compile The one\myparser.y	331
    y'a t-il une solution à ça? je me noie

    merci d'avance

  2. #2
    Membre émérite
    Inscrit en
    Juillet 2005
    Messages
    512
    Détails du profil
    Informations forums :
    Inscription : Juillet 2005
    Messages : 512
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    q->ch1 =(char*) malloc(sizeof(char) * strlen(elt.ch1));
    q->ch2 =(char*) malloc(sizeof(char) * strlen(elt.ch2));
    q->ch1=elt.ch1;
    q->ch2=elt.ch2;
    Ici tu alloues de la mémoire pour q->ch1 et q->ch2
    ensuite tu affectes un autre adresse à ces mêmes pointeurs.

    Vu autrement ce n'est pas comme ceci que l'on copie une chaine de caractère.

    Autre chose :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    li q =(li)malloc(sizeof(li));
    Ton allocation fait la taille d'un pointeur (li est de type pointeur)

  3. #3
    Expert confirmé
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Par défaut
    De plus, une erreur d'allocation :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    li q =(li)malloc(sizeof(li));
    qui alloue un pointeur (li) et pas une struct li.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    li q = malloc(sizeof *q);
    Note : Eviter de cacher un pointeur par un typedef, cela nuit à la lisibilité du code (la peuve ici)

    Le schéma pour copier devrait être :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    q->ch1 = malloc(strlen(elt.ch1)+1);
    if(q->ch1 != NULL) strcpy(q->ch1,elt.ch1);

Discussions similaires

  1. UPDATE DATE1 = DATE2 > les deux dates sont différentes ?!
    Par vmolines dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 16/06/2008, 16h50
  2. Réponses: 5
    Dernier message: 29/04/2008, 16h49
  3. Réponses: 3
    Dernier message: 28/03/2008, 11h34
  4. Réponses: 13
    Dernier message: 06/06/2007, 19h58
  5. Réponses: 9
    Dernier message: 26/04/2007, 13h53

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