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 :

Global ou paramètre


Sujet :

C

  1. #1
    Membre éclairé Avatar de |PaRa-BoL
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    738
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 738
    Points : 876
    Points
    876
    Par défaut Global ou paramètre
    Bonjour,

    Petite question :

    J'ai une structure que j'utilise très fréquemment (dans une centaine de fonctions). Actuellement je l'a passe en paramètre à chaque fois et ça commence à devenir fastidieux à maintenir.

    J'ai toujours évité les globales, mais dans ce genre de cas je me pose la question. A quel niveau cela à t il un impacte (a par pourrir mon namespace) ?

    Ma structure :

    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
     
    typedef struct _acetables
    {
    	HTBL **hLogin;
    	HTBL **hSessid;
    	HTBL **hLusers;
    	HTBL **hCallback;
     
    	HTBL **hPubid;
     
    	struct srvconfig *srv;
    	struct USERS *uHead;
     
    	struct _ticks_callback *timers;
     
    	unsigned int nConnected;
     
    	struct _ace_plugins *plugins;
     
    	struct _extend *properties;
    } acetables;
    Merci

  2. #2
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 381
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 381
    Points : 41 582
    Points
    41 582
    Par défaut
    Eh bien, ça peut surtout te pourrir la réentrance, la thread-safety, et bien sûr, ça te limite à un seul exemplaire de la structure...

    En clair, pour une bibliothèque, c'est à bannir.

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    1 298
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 298
    Points : 886
    Points
    886
    Par défaut
    Salut, pour ma part, je passerais ta structure en paramètre (attention, tu passes un pointeur vers cette structure bien entendu !). J'essaye tant que possible d'éviter les globales car je trouve que la relecture du code est plus aisée et cela peut éviter de future bêtises (un collègue reprend ton code, ton code est partagé entre plusieurs développeurs etc...).

    Je ne vois pas en quoi cela gêne de passer un pointeur vers une structure en paramètre à une centaine de fonctions...

    Si tu as une énorme structure qui contient énormément de champs, en quoi cela est-il fastidieux à maintenir ? Car dans le fond, le prototype de tes fonctions reste inchangé : tu ne fais que rajouté des champs à ta structure donc tu ne modifies "que" du fichier .c et ton fichier .h qui contiennent le code et la déclaration de ta structure avec toutes les fonctions d'accès à cette structure (création, copie, duplication, destruction, get, set etc...)

    Bref, je ne serais absolument pas gêné de passer cette structure en paramètre à une centaine de fonctions.

  4. #4
    Membre éclairé Avatar de |PaRa-BoL
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    738
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 738
    Points : 876
    Points
    876
    Par défaut
    Merci pour vos réponses.

    En revanche concernant le fait que ce soit thread-safe il y a quelque chose qui m'échappe.

    Par exemple dans ma structure je fait référence à plusieurs tables de hashage (ou chainlist peu importe).

    imaginons une fonction prenant comme paramètre ma structure. Cette fonction va ensuite modifier une des tables de hashage pointée par ma structure. En quoi cela est thread-safe à ce niveau si 2 thread font appelle à cette fonction ? C'est juste l'accès à la structure qui va être "safe" ?

    Merci

  5. #5
    Membre expérimenté
    Avatar de Gruik
    Profil pro
    Développeur Web
    Inscrit en
    Juillet 2003
    Messages
    1 566
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juillet 2003
    Messages : 1 566
    Points : 1 729
    Points
    1 729
    Par défaut
    Salut,

    +1 avec les autres, la structure en paramètre est LA bonne solution. (j'appelle ça un "contexte")

    Le fait de pas avoir de globale ne rend pas obligatoire l'utilisation du meme contexte, ce qui permet d'avoir des morceaux du soft indépendants qui utilisent leur propre contexte initialisé/paramétré comme ils le veulent sans que les autres puissent le modifier, idem pour des threads qui pourraient posséder leur contexte sans pourrir les autres.
    Biensur tu veux pouvoir avoir des threads qui accedent au meme contexte auquel cas, il te faudra utiliser les mutex & co, de la meme façon que si t'avais une globale.
    Mais avec un contexte, la "globalité" n'est pas obligatoire

    Il y a plein de problèmes dans les bibliothèques C et Unix qui auraient pu être évités si il n'y avait pas eu de paramétrage global obligatoire (par exemples les locales, l'umask, le timezone..) au profit d'une structure intialisée et gérée par l'appelant.

  6. #6
    Expert éminent sénior

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 66
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Points : 17 923
    Points
    17 923
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par Gruik Voir le message
    Il y a plein de problèmes dans les bibliothèques C et Unix qui auraient pu être évités si il n'y avait pas eu de paramétrage global obligatoire (par exemples les locales, l'umask, le timezone..) au profit d'une structure intialisée et gérée par l'appelant.


    les mécanismes fournissent uniquement une valeur par défaut...

    Un setenv dans un programme ne touche en rien le reste !!

    Je ne vois pas en quoi cela est "global" ??

  7. #7
    Membre expérimenté
    Avatar de Gruik
    Profil pro
    Développeur Web
    Inscrit en
    Juillet 2003
    Messages
    1 566
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juillet 2003
    Messages : 1 566
    Points : 1 729
    Points
    1 729
    Par défaut
    Bein si t'as une partie de soft qui modifie la locale et que le reste du soft est prévu pour marcher dans une autre locale, bein ça marche plus comme il faut.
    Heureusement, les fonctions comme setlocale() et umask() retournent la valeur précédente ce qui permet de repositionner à la locale précédente.
    Mais justement lorsqu'il y a des threads, le thread peut s'interrompre entre le moment où on modifie la locale et le moment où on la repositionne..

    Le coup de setenv, ça s'applique qu'a la timezone, je disais juste qu'il aurait été préférable d'avoir les fonctions localtime() etc qui prennent en paramètre une structure de contexte qui contient au moins la timezone, au lieu d'utiliser la variable d'environnement TZ

  8. #8
    Expert éminent sénior

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 66
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Points : 17 923
    Points
    17 923
    Billets dans le blog
    2
    Par défaut
    ok, mais c'est simplement (voir les multiples discussions à ce sujet) parce que les threads ne sont pas "unix-naturels". C'est arrivé sur les unixoides (en tous cas les utilisations massives) par le biais de gens venant du monde M$, qui ne savait pas gérer vraiment plusieurs processus en //.


    Et en ce qui concerne les bibliothèques ré-entrantes, ça se gère.. Avec des tableaux locaux..

  9. #9
    Membre expérimenté
    Avatar de Gruik
    Profil pro
    Développeur Web
    Inscrit en
    Juillet 2003
    Messages
    1 566
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juillet 2003
    Messages : 1 566
    Points : 1 729
    Points
    1 729
    Par défaut
    Citation Envoyé par souviron34 Voir le message
    Et en ce qui concerne les bibliothèques ré-entrantes, ça se gère.. Avec des tableaux locaux..
    C'est à dire?

  10. #10
    Expert éminent sénior

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 66
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Points : 17 923
    Points
    17 923
    Billets dans le blog
    2
    Par défaut
    des tableaux globaux statiques dans le module ré-entrant, qui garde à chaque coup la variable et des pointeurs idoines...

    Mais il est évident qu'un "contexte" est plus facile à manipuler.

    Mais cette notion existe aussi en C et sous unixoides...

  11. #11
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 381
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 381
    Points : 41 582
    Points
    41 582
    Par défaut
    Euh... Si c'est global statique, comment est-que que ça peut être réentrant?
    Il doit forcément il avoir un contexte venant de l'extérieur, même s'il ne s'agit que d'un simple descripteur...

  12. #12
    Expert éminent sénior

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 66
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Points : 17 923
    Points
    17 923
    Billets dans le blog
    2
    Par défaut
    Comme ceci

    strtok_r

    char *strtok_r (char *s, const char *delim, char **ptrptr);

  13. #13
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 381
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 381
    Points : 41 582
    Points
    41 582
    Par défaut
    Ben, y'a rien de global statique ici, justement...

    Il y a un contexte fourni par l'appelant.

Discussions similaires

  1. Réponses: 2
    Dernier message: 19/01/2011, 12h07
  2. Variable Globale et paramètre
    Par Kikouyou1080 dans le forum Général Python
    Réponses: 4
    Dernier message: 02/06/2010, 10h01
  3. [WD14] Paramètre procédure globale
    Par AUZUR dans le forum WinDev
    Réponses: 6
    Dernier message: 19/08/2009, 09h25
  4. [2.3.1] Paramètre global et dataset
    Par peuplier dans le forum BIRT
    Réponses: 8
    Dernier message: 18/02/2009, 14h57
  5. Réponses: 1
    Dernier message: 17/07/2008, 16h41

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