Bien programmer en langage C
Vous souhaitez réagir à ce message ? Créez un compte en quelques clics ou connectez-vous pour continuer.
Le deal à ne pas rater :
Coffret dresseur d’élite ETB Pokémon EV06 Mascarade Crépusculaire
56.90 €
Voir le deal

Usage de 'static'...

2 participants

Aller en bas

Usage de 'static'... Empty Usage de 'static'...

Message  QG 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

Revenir en haut Aller en bas

Usage de 'static'... Empty Re: Usage de 'static'...

Message  -ed- 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


-ed-
-ed-
Admin
Admin

Messages : 290
Date d'inscription : 26/05/2008
Age : 67
Localisation : Paris 14eme arrondissement (75, France)

http://bien-programmer.fr

Revenir en haut Aller en bas

Usage de 'static'... Empty Re: Usage de 'static'...

Message  QG 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

Revenir en haut Aller en bas

Usage de 'static'... Empty Re: Usage de 'static'...

Message  -ed- 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 ?
-ed-
-ed-
Admin
Admin

Messages : 290
Date d'inscription : 26/05/2008
Age : 67
Localisation : Paris 14eme arrondissement (75, France)

http://bien-programmer.fr

Revenir en haut Aller en bas

Usage de 'static'... Empty Re: Usage de 'static'...

Message  QG 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

Revenir en haut Aller en bas

Usage de 'static'... Empty Re: Usage de 'static'...

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

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


-ed-
-ed-
Admin
Admin

Messages : 290
Date d'inscription : 26/05/2008
Age : 67
Localisation : Paris 14eme arrondissement (75, France)

http://bien-programmer.fr

Revenir en haut Aller en bas

Usage de 'static'... Empty Re: Usage de 'static'...

Message  QG 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

Revenir en haut Aller en bas

Usage de 'static'... Empty Re: Usage de 'static'...

Message  -ed- 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é.
-ed-
-ed-
Admin
Admin

Messages : 290
Date d'inscription : 26/05/2008
Age : 67
Localisation : Paris 14eme arrondissement (75, France)

http://bien-programmer.fr

Revenir en haut Aller en bas

Usage de 'static'... Empty Re: Usage de 'static'...

Message  Contenu sponsorisé


Contenu sponsorisé


Revenir en haut Aller en bas

Revenir en haut


 
Permission de ce forum:
Vous ne pouvez pas répondre aux sujets dans ce forum
Ne ratez plus aucun deal !
Abonnez-vous pour recevoir par notification une sélection des meilleurs deals chaque jour.
IgnorerAutoriser