Usage de 'static'...

Voir le sujet précédent Voir le sujet suivant Aller en bas

Usage de 'static'...

Message  QG le Lun 8 Aoû 2011 - 11:33

Bonjour,

http://www.bien-programmer.fr/notes.php#static

En lisant ceci j'ai vu qu'il était indiqué déviter d'utiliser static devant un objet défini dans un bloc et surtout dans une bibliothèque.
Il est dit :


Place la variable dans la mémoire statique, la rendant persistante. Usage rarissime (quick'n dirty).
A éviter, surtout pour du code réutilisable (bibliothèque).
Je ne comprends pas en quoi c'est sale et pourquoi c'est à éviter ?

J'ai essayé de me renseigner sur diverses FAQ comme celle de developpez.com mais j'ai rien trouvé.
On pourrai m'en dire plus svp ?

Merci d'avance !

QG
Bavard
Bavard

Messages : 11
Date d'inscription : 19/10/2010

Voir le profil de l'utilisateur

Revenir en haut Aller en bas

Re: Usage de 'static'...

Message  -ed- le Mer 24 Aoû 2011 - 0:21

C'est à éviter, car l'espace mémoire ainsi implémenté est unique. La fonction ne peut donc traiter qu'une seule implémentation de l'objet. Comme je l'ai dit, le cas où de telles variables sont utiles sont rarissimes (compteurs de debug, d'erreurs, d'appels de fonction ou générateur pseudo aléatoire ...).

Dans tous les autres cas, on a intérêt à écrire une fonction (ou une famille de fonctions) traitant un nombre quelconque d'objets définis à l'extérieur (programmation orientée objet ...)

http://www.bien-programmer.fr/tad.htm



_________________
C is a sharp tool !

-ed-
Admin
Admin

Messages : 289
Date d'inscription : 26/05/2008
Age : 60
Localisation : Paris 6eme arrondissement (75, France)

Voir le profil de l'utilisateur http://bien-programmer.fr

Revenir en haut Aller en bas

Re: Usage de 'static'...

Message  QG le Jeu 25 Aoû 2011 - 2:12

C'est donc à éviter pour les fonctions qui seront potentiellement utilisées dans un contexte multithread si je comprends bien ?

Après oui je sais que l'on utilise rarement ce genre de variable mais leur simple utilisation dans une fonction qui compte les appels de fonction par exemple n'est pas un réel problème, non ? Ce n'est pas du "vite fait mal fait" ?

QG
Bavard
Bavard

Messages : 11
Date d'inscription : 19/10/2010

Voir le profil de l'utilisateur

Revenir en haut Aller en bas

Re: Usage de 'static'...

Message  -ed- le Jeu 25 Aoû 2011 - 2:15

Je n'ai pas évoqué le problème du multithreading, mais oui, bien sûr, il peut se poser si il y a des accès en écriture à la variable. Mais même en monothread, c'est une pratique peu recommandable en dehors des cas que j'ai évoqué, car ça 'plombe' la fonction, en lui interdisant toute réutilisation intelligente (à cause l'absence de séparation code/données, qui est la base de la Bonne Programmation).

Quelle application exacte veux-tu faire ?

_________________
C is a sharp tool !

-ed-
Admin
Admin

Messages : 289
Date d'inscription : 26/05/2008
Age : 60
Localisation : Paris 6eme arrondissement (75, France)

Voir le profil de l'utilisateur http://bien-programmer.fr

Revenir en haut Aller en bas

Re: Usage de 'static'...

Message  QG le Ven 26 Aoû 2011 - 18:47

Oh je ne veux rien écrire de particulier, je me suis juste interrogé quand j'ai vu l'article.

Mais je ne comprends pas où tu veux en venir en disant qu'en utilisant ce genre de variable il n'y a pas de séparation code/données et donc que cela empêcherai la réutilisation intelligente de la fonction.

QG
Bavard
Bavard

Messages : 11
Date d'inscription : 19/10/2010

Voir le profil de l'utilisateur

Revenir en haut Aller en bas

Re: Usage de 'static'...

Message  -ed- le Ven 26 Aoû 2011 - 19:06

C'est parce que tu manques d'expérience ... As-tu lu mon article sur les ADT ?



_________________
C is a sharp tool !

-ed-
Admin
Admin

Messages : 289
Date d'inscription : 26/05/2008
Age : 60
Localisation : Paris 6eme arrondissement (75, France)

Voir le profil de l'utilisateur http://bien-programmer.fr

Revenir en haut Aller en bas

Re: Usage de 'static'...

Message  QG le Sam 3 Sep 2011 - 18:41

Oui j'ai déjà lu l'article et je viens de le relire et je ne comprends toujours pas en quoi l'utilisation de static fait qu'il n'y a plus de séparation code/données

Tu n'aurais pas un exemple pour être plus explicite et pour que cela soit plus clair pour moi ?

QG
Bavard
Bavard

Messages : 11
Date d'inscription : 19/10/2010

Voir le profil de l'utilisateur

Revenir en haut Aller en bas

Re: Usage de 'static'...

Message  -ed- le Dim 4 Sep 2011 - 3:19

Tout simplement parce que ce type de mauvaise conception fait que les données font partie intégrante de la fonction (donc du code). Elles ne peuvent être instanciées qu'une seule fois. Si on veut traiter une deuxième instance des données, on doit copier la fonction (et donc créer une nouvelle variable statique) et changer son nom ... Absurde. On multiplie la taille du code, alors que si on conçoit correctement, on ne doit écrire le code qu'une seule fois. Il sert pour n'importe quel nombre d'instanciations des données traitées.

Par exemple, soit une fonction qui fait un compteur :

avec une variable 'static' :
Code:

int count(void)
{
    static int n; /* 0 par défaut à l'initialisation */

    n++;

  return n;
}

Utilisation :

Code:

#include <stdio.h>
int main (void)
{
  int n;

  n = count();
  printf("n =  %d\n"); /* 1 */

  n = count();
  printf("n =  %d\n"); /* 2 */

  return 0;
}
Maintenant, je veux 2 compteurs, 10 compteurs, 1000 compteurs ? Comment je fais ? Tu crois vraiment qu'on va écrire 1000 fois le code compteur_1(), compteur_2() ... compteur_1000() ?

Évidemment, non. Mauvaise conception.

La Bonne Conception, c'est de séparer le code et les données.
Code:

/* code pur : pas de données. */
int compteur (int *pn)
{
  int n = -1; /* erreur : pointeur NULL : retourne le code d'erreur -1. */
  if (p != NULL)
  {
      n = *p; /* récupérer la valeur */
      n++;    /* l'incrémenter */
      *p = n; /* sauvegarder la valeur */
  }
  return n;
}
Utilisation :
Code:

#include <stdio.h>
int main (void)
{
  int n = 0; /* les données sont crées et gérées dans l’application
                    et non dans la fonction de traitement qui est unique ... */

  n = count(&n);
  printf("n =  %d\n"); /* 1 */

  n = count(&n);
  printf("n =  %d\n"); /* 2 */

  return 0;
}

Code écrit directement dans la réponse. Rien n'a été testé.

_________________
C is a sharp tool !

-ed-
Admin
Admin

Messages : 289
Date d'inscription : 26/05/2008
Age : 60
Localisation : Paris 6eme arrondissement (75, France)

Voir le profil de l'utilisateur http://bien-programmer.fr

Revenir en haut Aller en bas

Re: Usage de 'static'...

Message  Contenu sponsorisé Aujourd'hui à 21:19


Contenu sponsorisé


Revenir en haut Aller en bas

Voir le sujet précédent Voir le sujet suivant Revenir en haut

- Sujets similaires

 
Permission de ce forum:
Vous ne pouvez pas répondre aux sujets dans ce forum