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 :

définition d'une liste de personne dans une lib


Sujet :

C

  1. #1
    Membre éprouvé
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    1 837
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 1 837
    Points : 996
    Points
    996
    Par défaut définition d'une liste de personne dans une lib
    Bonjour,

    J'ai une liste de personne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    typedef struct {
    	char	*nom;
    	char	*prenom;
    	char	*age;
    } Personne;
    Personne list[???];
    J'ai une bibliothèque qui doit utiliser cette liste : le problème est que je ne sais pas comment passer cette variable vers ma bibliothèque vu qu'elle est de taille dynamique.

    Si pour initialiser ma bibliothèque, j'utilise cette fonction :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void initBibliotheque(Personne  *list);
    => le problème est que je ne vois pas comment ma bibliothèque peut connaitre la taille de ma liste. Je pensais ajouter un second paramètre (nombre d'éléments de la liste) dans ma fonction : comment feriez-vous ?

  2. #2
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2010
    Messages
    254
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2010
    Messages : 254
    Points : 538
    Points
    538
    Par défaut
    Une liste est par définition de taille variable. Contrairement au tableau que tu peux déclarer de manière statique, tu crée une liste en créant un premier maillon auquel tu rattache autant de maillons que nécessaire.

    Si ta librairie manipule des listes à priori les fonctions répertoriées dedans sont faites pour manipuler une liste à partir d'un maillon initiale sans avoir besoin de lui préciser la taille de la liste. Je ne comprend donc pas pourquoi tu veux avoir la taille de la liste.

  3. #3
    Membre émérite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2008
    Messages
    1 515
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France

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

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 515
    Points : 2 505
    Points
    2 505
    Par défaut
    Le plus simple est de passer en argument le nombre d'éléments dans ton tableau.

    Si tu as N personnes, une autre solution est de passer un tableau de N+1 structures et marquer la fin tu tableau par une structure où nom est NULL (en supposant que NULL n'est pas normalement une valeur valeur valide pour un objet personne). De cette façon tu n'as pas besoin de passer la taille du tableau ; ta fonction dans la lib s'arrêtera dès qu'elle verra une personne avec un nom NULL.

  4. #4
    Membre éprouvé
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    1 837
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 1 837
    Points : 996
    Points
    996
    Par défaut
    ok merci,

    Je ne veux pas utiliser de liste chainée car ça ralentira la recherche d'un élément en fonction de son numéro d'entrée.
    Remarque : la liste n'est jamais modifiée (juste initialisée au démarrage)

    Je pense que je vais passer le nombre de personnes en argument : ça me semble la meilleure solution au niveau de la rapidité d'accès des éléments.

    Sémantiquement parlant, comment doit être le prototype de mon fonction ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void initBibliotheque(Personne  *list, int sizeList);
    => c'est pas top ça non (car on ne sait pas si list est un pointeur sur un element Personne ou si c'est un tableau d'élément Personne) ?

    c'est peut être mieux ça ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void initBibliotheque(Personne  list[], int sizeList);
    => mais est-ce que c'est bien standard ? il me semble que certain compilo n'aime pas cette écriture...

  5. #5
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2010
    Messages
    254
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2010
    Messages : 254
    Points : 538
    Points
    538
    Par défaut
    Citation Envoyé par boboss123
    car on ne sait pas si list est un pointeur sur un element Personne ou si c'est un tableau d'élément Personne
    Certes mais en revanche ce que tu passe en paramètre est un pointeur (4 octets) alors que si tu envoie list[] c'est tout le tableau (sizelist octets). Ensuite ta fonction étant une fonction void si tu envoie le tableau en statique, tu le perdra car il ne sera pas retourné. Or si tu travail avec des pointeurs là ca marchera.

  6. #6
    Expert éminent sénior
    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
    Points : 13 926
    Points
    13 926
    Par défaut
    Citation Envoyé par boboss123 Voir le message
    ....

    Sémantiquement parlant, comment doit être le prototype de mon fonction ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void initBibliotheque(Personne  *list, int sizeList);
    => c'est pas top ça non (car on ne sait pas si list est un pointeur sur un element Personne ou si c'est un tableau d'élément Personne) ?

    c'est peut être mieux ça ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void initBibliotheque(Personne  list[], int sizeList);
    => mais est-ce que c'est bien standard ? il me semble que certain compilo n'aime pas cette écriture...
    les deux écritures sont acceptées et la seconde est interprétée par le compilateur comme si c'était la première.

    La première écriture souligne le type exact du paramètre list de la fonction : un pointeur sur Personne
    La seconde souligne le fait que l'argument passé pour le paramètre list est un tableau de Personne, mais le type du paramètre list est encore un pointeur sur Personne

  7. #7
    Membre éprouvé
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    1 837
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 1 837
    Points : 996
    Points
    996
    Par défaut
    ok merci, je vais donc opter pour la seconde méthode

  8. #8
    Membre éprouvé
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    1 837
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 1 837
    Points : 996
    Points
    996
    Par défaut
    rebonjour,

    j'ai encore une question sur l'architecture de ma bibliothèque.

    donc ma fonction d'initialisation ressemblera à ça :
    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
     
     
    typedef struct {
    	char	*nom;
    	char	*prenom;
    	char	*age;
    } Personne;
     
    Personne  *ptList;
    int  size;
     
    void initBibliotheque(Personne  list[], int sizeList){
        ptList = list;
        size = sizeList;
    }
     
    // fonction d'exemple
    char* getNom(int index){
        return list[index].nom.;
    }
    => le problème est que si l'utilisateur de la bibliothèque déclare list sur la pile, il y a risque bug car le tableau peut être détruit.

    Y a t-il un moyen pour que le compilo fasse une erreur si mon tableau n'est pas déclaré en static/global ?
    Comment feriez-vous ?

    Remarque : je ne veux pas faire de copie de mon tableau car je suis très limité en espace RAM (µControlleur)

  9. #9
    Expert éminent sénior
    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
    Points : 13 926
    Points
    13 926
    Par défaut
    Il faut savoir quand tu connais la taille de ta liste pour pouvoir allouer le tableau.
    Je verrai quelque chose comme ça :
    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
    int main(void)
    {
      // Obtention de la taille de la liste  : sizeList
      // Création de la liste
      pList = initBibliotheque(sizeList);
      // Utilisation de la liste
      detruireBibliotheque(pList);
      return 0;
    }
    Personne*  initBibliotheque(int size)
    {
        if(size > 0)return malloc (size* sizeof (Personne));
        return NULL;
    }
    void detruireBibliotheque(Personne* bibli)
    {
       // destruction des choses allouées dans les Personne
       free(bibli);
    } 
    char * getNom(Personne* bibli, int index)
    {
        return bibli[index].nom;
    }

  10. #10
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 734
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 734
    Points : 31 058
    Points
    31 058
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par boboss123 Voir le message
    donc ma fonction d'initialisation ressemblera à ça :
    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
     
     
    typedef struct {
    	char	*nom;
    	char	*prenom;
    	char	*age;
    } Personne;
     
    Personne  *ptList;
    int  size;
     
    void initBibliotheque(Personne  list[], int sizeList){
        ptList = list;
        size = sizeList;
    }
     
    // fonction d'exemple
    char* getNom(int index){
        return list[index].nom.;
    }
    T'as remarqué que ta structure ne contient que des pointeurs. Faudra penser à les allouer avant de les remplir...
    Citation Envoyé par boboss123 Voir le message
    => le problème est que si l'utilisateur de la bibliothèque déclare list sur la pile, il y a risque bug car le tableau peut être détruit.
    Je ne comprends pas trop. De quel utilisateur parles-tu ? C'est toi qui utilise le tableau non ? Donc tu le maitrises...

    Citation Envoyé par boboss123 Voir le message
    Y a t-il un moyen pour que le compilo fasse une erreur si mon tableau n'est pas déclaré en static/global ?
    Si tu pars comme ça, alors c'est qu'il y a une énorme erreur de conception dès le départ. Les variables globales sont à utiliser en dernier ressort quand vraiment on ne peut pas faire autrement. Apparemment, toi tu les utilises pour te "simplifier la vie" ce qui n'est pas la meilleure façon de programmer...

    Citation Envoyé par boboss123 Voir le message
    Comment feriez-vous ?
    Une telle question entraine la réponse immédiate" moi je le ferais correctement" mais je présume que c'est pas ce que tu attends. Mais quel est ton but ?

    Citation Envoyé par boboss123 Voir le message
    Remarque : je ne veux pas faire de copie de mon tableau car je suis très limité en espace RAM (µControlleur)
    Pas la peine. Si c'est bien programmé, tu n'auras qu'un tableau. Mais bon, t'as beau être limité, te faut quand-même de la RAM pour stocker au-moins le contenu du tableau non ???

  11. #11
    Membre éprouvé
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    1 837
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 1 837
    Points : 996
    Points
    996
    Par défaut
    merci pour vos réponses


    Citation Envoyé par Sve@r Voir le message
    Je ne comprends pas trop. De quel utilisateur parles-tu ? C'est toi qui utilise le tableau non ? Donc tu le maitrises...
    Je parlais de l'utilisateur de la bibliothèque (le programmeur) => il n'a donc pas forcement accès aux codes sources de la bibliothèque



    Citation Envoyé par Sve@r Voir le message
    Si tu pars comme ça, alors c'est qu'il y a une énorme erreur de conception dès le départ. Les variables globales sont à utiliser en dernier ressort quand vraiment on ne peut pas faire autrement. Apparemment, toi tu les utilises pour te "simplifier la vie" ce qui n'est pas la meilleure façon de programmer...
    Es-tu vraiment sure de ce que tu avances ? je programme sur µControlleur donc je suis très très limité en RAM... il me semble donc que les malloc sont à éviter (car la gestion de manque de mémoire disponible peut vite devenir un calvaire et consommer des ressources)...



    Citation Envoyé par Sve@r Voir le message
    Une telle question entraine la réponse immédiate" moi je le ferais correctement" mais je présume que c'est pas ce que tu attends. Mais quel est ton but ?
    Mon but est d'avoir une bibliothèque simple d'utilisation (que le programmeur n'est pas forcément besoin de lire la documentation de la bibliothèque pour pouvoir l'utiliser... peut être est-ce utopique ?)





    Après réflexion, je crois que j'ai trouvé une solution qui tienne la route. Ma liste ayant des valeurs fixes non modifiables, je pense que le prototype suivant est ce qu'il me faut :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void initBibliotheque(ROM Personne  list[], int sizeList);
    => avec le mot clef ROM, j'impose donc que ma liste soit stockée en ROM : donc le tableau existera forcement (et impossible à détruire) et de plus ça m'évite de consommer de la RAM.
    - Voyez-vous des inconvénients a cette méthode ?


    Je sais que cette méthode fonctionne sur un µControlleur mais peut-on faire la même chose sur un PC (ne pas utiliser de RAM) ?
    => c'est juste pour information que je veux savoir ça

  12. #12
    Expert éminent sénior
    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
    Points : 13 926
    Points
    13 926
    Par défaut
    Après réflexion, je crois que j'ai trouvé une solution qui tienne la route. Ma liste ayant des valeurs fixes non modifiables, je pense que le prototype suivant est ce qu'il me faut :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void initBibliotheque(ROM Personne  list[], int sizeList);
    => avec le mot clef ROM, j'impose donc que ma liste soit stockée en ROM : donc le tableau existera forcement (et impossible à détruire) et de plus ça m'évite de consommer de la RAM.
    - Voyez-vous des inconvénients a cette méthode ?
    Si le tableau doit contenir des valeurs fixes connues au moment de l'écriture du programme, c'est la bonne solution. Mais alors, à quoi va servir la fonction initBibliotheque() ? Le tableau, sa taille et son contenu sont déjà définis à la compilation.
    Si le tableau doit contenir des valeurs fixes mais chargées pendant l'exécution, je ne vois pas comment le mettre en ROM.

  13. #13
    Membre éprouvé
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    1 837
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 1 837
    Points : 996
    Points
    996
    Par défaut
    Citation Envoyé par diogene Voir le message
    Mais alors, à quoi va servir la fonction initBibliotheque() ?
    Cette fonction permet a la bibliothèque de connaitre l'adresse de la liste (car le tableau n'est pas défini dans la bibliothèque mais dans l'application qui l'utilise) : comment veux-tu faire autrement (je n'ai pas bien compris le problème) ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    typedef struct {
    	char	*nom;
    	char	*prenom;
    	char	*age;
    } Personne;
     
    static ROM Personne  *ptList;
    static int  size;
     
    void initBibliotheque(ROM Personne  list[], int sizeList){
        ptList = list;
        size = sizeList;
    }

  14. #14
    Expert éminent sénior
    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
    Points : 13 926
    Points
    13 926
    Par défaut
    OK. J'avais zappé le fait que tu écrivais une bibliothèque utilisant un tableau extérieur.

  15. #15
    Membre éprouvé
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    1 837
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 1 837
    Points : 996
    Points
    996
    Par défaut
    oki, le sujet est donc clos.
    merci pour votre aide

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

Discussions similaires

  1. [AC-2010] Utiliser valeur d'une liste de choix dans une liste déroulante d'un autre formulaire
    Par Sébastien1609 dans le forum Macros Access
    Réponses: 1
    Dernier message: 11/06/2015, 15h31
  2. Réponses: 9
    Dernier message: 21/05/2014, 20h21
  3. [LibreOffice][Base de données] Recuperer une liste de tables et une liste de champs d'une table sur LibreOffice & OpenOffice
    Par gerard.sauvage dans le forum OpenOffice & LibreOffice
    Réponses: 2
    Dernier message: 08/04/2014, 12h35
  4. Réponses: 1
    Dernier message: 26/12/2010, 21h20
  5. Réponses: 0
    Dernier message: 09/11/2010, 15h43

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