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 :

probleme warnings dans liste chainees


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    115
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 115
    Par défaut probleme warnings dans liste chainees
    bonjour, je rencontre quelques problèmes de compréhension concernant les listes chainées, en effet, il y a des warnings dans mon code que je ne comprends pas la significations notamment warning: "assignment from incompatible pointer type". j'ai localisé les warnings cependant je ne comprends pas leur présence.

    voici le 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
    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
     
    #include<stdio.h>
    #include<stdlib.h>
    #include<string.h>
     
    typedef struct _info
    {
        char* nom_fichier;
        char* source;
        char* dest;
        int taille_fichier;
        int nombre_octets_envoyes;
    }info;
     
    typedef struct element
    {
        info donnees;  
        int taille;
        struct element* next;
    }element;
     
    typedef element* liste_info;
     
     
    // copier la deuxieme variable dans la premiere
    void copier_info(info *donnees1, info *donnees2)
    {
    	donnees1->nom_fichier = strdup(donnees2->nom_fichier);
    	donnees1->source = strdup(donnees2->source);
    	donnees1->dest = strdup(donnees2->dest);
    	donnees1->taille_fichier = donnees2->taille_fichier;
    	donnees1->nombre_octets_envoyes = donnees2->nombre_octets_envoyes;
    }
     
    // teste si deux infos sont egale
    int est_egale_info(info donnees1, info donnees2)
    {
    	if ((!strcmp(donnees1.nom_fichier,donnees2.nom_fichier))) 
    	{
    		return 1;
    	} 
    	else 
    	{
    		return 0;
    	}
    }
     
    // ajouter une donnees en fin de liste
    liste_info ajouter_en_fin(liste_info liste,info *donnees)
    {
        /* On crée un nouvel élément */
        element* nouvelElement = malloc(sizeof(element));
     
     
        /* On assigne la donnee au nouvel élément */
        copier_info(&(nouvelElement->donnees),donnees);
     
        /* On ajoute en fin, donc aucun élément ne va suivre */
        nouvelElement->next = NULL;
     
        if(liste == NULL)
        {
            /* Si la liste est videé il suffit de renvoyer l'élément créé */
            return nouvelElement;
        }
        else
        {
            /* Sinon, on parcourt la liste à l'aide d'un pointeur temporaire et on
            indique que le dernier élément de la liste est relié au nouvel élément */
    	element* temp=liste;
            while(temp->next != NULL)
            {
                temp = temp->next; // warning ici
                temp->taille++;
            }
            temp->next = nouvelElement; // warning ici
            return liste;
        }
    }
    Merci de votre compréhension.

  2. #2
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 485
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur d'emploi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 485
    Par défaut
    Si tu les as localisés, ça aurait été sympa de nous les indiquer…

    Sous Linux avec GCC et les flags de compilation stricte, j'obtiens ces messages dans la fonction « copier_info() ».

    C'est dû au fait qu'il faut définir une des macros _SVID_SOURCE, _BSD_SOURCE ou _XOPEN_SOURCE avec une valeur supérieure ou égale 500 pour cette dernière avant d'inclure <string.h> pour que strdup() soit effectivement déclaré. Oui, c'est subtil.

    Comme elle ne l'est pas, le compilo croit en une déclaration implicite de la fonction la première fois que tu l'utilises et considère qu'elle est de type « int » par défaut, ce qui est bien sûr incompatible avec les pointeurs que tu essaies légitimement de charger.

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    115
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 115
    Par défaut
    dans les exemples d'utilisation de strdup() que j'ai pu voir sur internet, il n'étais pas indiquer qu'il fallait utiliser des macros. je n'ai pas trop compris pourquoi les utiliser dans le cas ou on utilise la fonction strdup() d'après toi.

    Concernant les warnings ils sont localisé ici :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
            /* Sinon, on parcourt la liste à l'aide d'un pointeur temporaire et on
            indique que le dernier élément de la liste est relié au nouvel élément */
    	element* temp=liste;
            while(temp->next != NULL)
            {
                temp = temp->next; // ->>>>> ici
                temp->taille++;
            }
            temp->next = nouvelElement; //  ->>>> ici
            return liste;

Discussions similaires

  1. probleme sur les listes chainees
    Par guipe dans le forum Débuter
    Réponses: 19
    Dernier message: 21/04/2010, 15h49
  2. Réponses: 2
    Dernier message: 21/02/2007, 13h28
  3. [LG]probleme d'ajout dans une liste chainée...
    Par misteryann dans le forum Langage
    Réponses: 5
    Dernier message: 08/03/2004, 20h28
  4. [LG]Tri par insertion dans une liste chainée
    Par mister_dsg dans le forum Langage
    Réponses: 4
    Dernier message: 18/12/2003, 22h34
  5. [LG]suppression dans une liste chainée
    Par mister_dsg dans le forum Langage
    Réponses: 9
    Dernier message: 16/12/2003, 21h20

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