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 :

[Enlightenment Foundation Libraries] - Utilisation d'Eina_list


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé Avatar de Mika2008
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    176
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 176
    Par défaut [Enlightenment Foundation Libraries] - Utilisation d'Eina_list
    Bonjour,

    J'aimerais utiliser le systéme de list dnas mon programme, car je pense que ça peut faciliter la vie.

    Pour ça j'utilise une EINA_LIST

    Pour démarrer je me base sur cette exemple :

    source : ici

    qui présente ce 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
    #include <Eina.h>
     
    int main(int ac, char **av)
    {
      int i;
      char *data;
      Eina_List *list = NULL, *l = NULL;
     
      if (ac <= 1)
        return 0;
     
      eina_init();
     
      for (i=0; i<ac; i++)
        list = eina_list_append(list, eina_stringshare_add(av[i]));
     
      EINA_LIST_FOREACH(list, l, data)
        printf("argument : %s\n", data);
     
      return 0;
    }
    Mais quand je compile ce programe j'ai pas mal de warnings :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    — compilation main.c —
    main.c: In function ‘main’:
    main.c:18: warning: implicit declaration of function ‘printf’
    main.c:18: warning: incompatible implicit declaration of built-in function ‘printf’
    — Cr�ation ex�cutable : bin/main —
    pourtant si je lance le programme cela fonctionne plutôt bien :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    ./main mot1 mot2 mot3 mot4 mot5
    argument : ./main
    argument : mot1
    argument : mot2
    argument : mot3
    argument : mot4
    argument : mot5

    Mais bon j'ai essayé de faire un truc encore plus simple en créeant des variables int et de les ajoutes dans ma list pour les afficher :

    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
    #include
     
    int main()
    {
    const int val1 = 10,val2 = 20, val3 = 30, val4 = 40;
    Eina_List *list = NULL, *l = NULL;
    int *data;
     
    eina_init();
     
    list = eina_list_append(list, val1);
    list = eina_list_append(list, val2);
    list = eina_list_append(list, val3);
    list = eina_list_append(list, val4);
     
    EINA_LIST_FOREACH(list, l, data)
    printf(”argument : %d\n”, data);
     
    return 0;
    }
    a la compile j’ai ces erreurs :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    — compilation main.c —
    main.c: In function ‘main’:
    main.c:13: warning: passing argument 2 of ‘eina_list_append’ makes pointer from integer without a cast
    /home/Mika2008/usr/E17svn/include/eina-0/eina/eina_list.h:78: note: expected ‘const void *’ but argument is of type ‘int’
    main.c:14: warning: passing argument 2 of ‘eina_list_append’ makes pointer from integer without a cast
    /home/Mika2008/usr/E17svn/include/eina-0/eina/eina_list.h:78: note: expected ‘const void *’ but argument is of type ‘int’
    main.c:15: warning: passing argument 2 of ‘eina_list_append’ makes pointer from integer without a cast
    /home/Mika2008/usr/E17svn/include/eina-0/eina/eina_list.h:78: note: expected ‘const void *’ but argument is of type ‘int’
    main.c:16: warning: passing argument 2 of ‘eina_list_append’ makes pointer from integer without a cast
    /home/Mika2008/usr/E17svn/include/eina-0/eina/eina_list.h:78: note: expected ‘const void *’ but argument is of type ‘int’
    main.c:19: warning: implicit declaration of function ‘printf’
    main.c:19: warning: incompatible implicit declaration of built-in function ‘printf’
    main.c:19: warning: format ‘%d’ expects type ‘int’, but argument 2 has type ‘int *’
    — Cr�ation ex�cutable : bin/main —
    et pourtant quand je lance mon programme il marche :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Mika2008@Mika2008-desktop:/media/Element/programmation/SYSTEM/TEST_EINA_LIST/bin$ ./main
    argument : 10
    argument : 20
    argument : 30
    argument : 40
    Donc ma question est comment ne plus avoir ces warnins ?
    et est ce que dans une EINA_LIST on peut mettre des variables de type différentes ?
    et surtout ce que je comprend pas cette histoire "*"

    merci à vous

  2. #2
    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
    * Pour le warning sur printf(), inclus <stdio.h>

    * Ton utilisation de la liste est incorrecte :
    Il s'agit d'une liste doublement chainée gérée de façon indépendante des données stockées. Pour que la liste puisse traiter des données de n'importe quel type, elle stocke non la donnée elle même, ce qui serait hautement dépendant du type de celle-ci, mais l'adresse de la donnée en utilisant le type générique void*.
    Les fonctions eina_list_append(), eina_list_append() ou la macro EINA_LIST_FOREACH() prennent donc comme argument l'adresse de la donnée.

    On devrait donc avoir :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    int main(void)
    {
      const int val1 = 10,val2 = 20, val3 = 30, val4 = 40;
      Eina_List *list = NULL, *l = NULL;
      int *data;
      eina_init();
      list = eina_list_append(list, &val1);  //Adresse de val1 !
      list = eina_list_append(list, &val2);
      list = eina_list_append(list, &val3);
      list = eina_list_append(list, &val4);
      EINA_LIST_FOREACH(list, l, data)
      printf(”argument : %d\n”, *data); //Contenu de l'adresse data !
      return 0;
    }
    Note : Tu n'as pas ces warnings dans le premier code, parce que tu stockes des chaines de caractères, donc effectivement des adresses.

  3. #3
    Membre confirmé Avatar de Mika2008
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    176
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 176
    Par défaut
    merci de ta réponse !!

    ça fonctionne.

Discussions similaires

  1. Réponses: 2
    Dernier message: 13/12/2011, 14h50
  2. Réponses: 9
    Dernier message: 06/08/2008, 17h50

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