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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre chevronné
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    1 855
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 1 855
    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 très actif
    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
    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 Expert
    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
    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 chevronné
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    1 855
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 1 855
    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 très actif
    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
    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 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
    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 chevronné
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    1 855
    Détails du profil
    Informations personnelles :
    Localisation : France

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

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

    Informations forums :
    Inscription : Septembre 2009
    Messages : 1 855
    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)

+ 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