Tiens la tu m'interesse.Envoyé par Emmanuel Delahaye
J'ai arrete il y a quelques temps mais je n'ai pas trouve de reponse convaincante et tu vas surement pouvoir m'eclairer.
Pourquoi les static saymal ?
Tiens la tu m'interesse.Envoyé par Emmanuel Delahaye
J'ai arrete il y a quelques temps mais je n'ai pas trouve de reponse convaincante et tu vas surement pouvoir m'eclairer.
Pourquoi les static saymal ?
Envoyé par Emmanuel DelahayeIl me semble que j'avais laissé un commentaireEnvoyé par gnto
les static sont a utiliser en dernier recours car ils sont défini en mémoire pendant la durée de tout le programme, a l'inverse des variables locales
Parce que ça rend le code non réentrant, aux appels non imbricables car le donnée statique n'est pas instanciable (ou alors à que prix...). Les données persitantes doivent appartenir à l'utilisateur, pas à l'implémenteur.Envoyé par Jack_serious
C'est tout le problème de strtok(), par exemple.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 { T a; T b; f (&a); f (&b); }
Il n'y a aucune justification pour utiliser des statiques. Apprend plutôt à programmer par contexte persistants.Envoyé par gnto
Que le developpeur qui n'a jamais utilisé de variable static se fasse connaître...Envoyé par Emmanuel Delahaye
Aïe, aïe, aïe...qu'est-ce qu'il ne faut pas entendre....
comment géres-tu les flags dans une librairie si tu n'as pas de variables statiques ?
J'évite au maximum. Montre les cas où ce n'est pas possible ?Envoyé par crocodilex
Dans ma CLIB,
http://emmanuel-delahaye.developpez.com/clib.htm
je ne connais que SYSALLOC (normal, il n'y a pas de contexte dans les fonctions malloc() etc. et par définition, je n'ai pas le choix de l'interface) mais la ressource est garantie d'être unique, alors je l'accepte (de toutes façon, je n'ai pas le choix).
Quand aux applications, je ne vois pas non plus à quoi ça pourrait servir à part pour les interruptions matérielles qui devraient partager des données...
Enfin, pour les gros tableaux qui ne tiennent pas en automatique, la solution est évidemment malloc()...
Je suppose que tu parles de bibliothèques ? C'est le dernier endroit où il doit y avoir des statiques.Envoyé par gnto
Quel flag ? Pourquoi faire ? Donne un exemple précis, parce à part le cas très particulier que j'ai énoncé au dessus, je n'en vois pas.
Au fait, on est bien d'accord que je ne parle que des statiques à lecture écriture, bien sûr. Les statiques const sont les bienvenues...
Moi aussi, quand je peux, j'évite au maximun d'utiliser les variables globales et les statics.Envoyé par Emmanuel Delahaye
Je développe du logiciel de base (BSP, drivers et de temps en temps des applis), et je peux t'assurer que dans certains cas je ne peux pas me passer de variables globales.
Donc mettre un niveau de goret 9 sur les statics, je trouve que tu y vas un peu fort...Moi j'aurai mis un niveau 2
OK, Je vais préciser 'au niveau applicatif'. Je suis d'accord que dans un driver, on ne peut pas faire autrement. Mais par définition, la ressource est limitée et les nombre d'instances donc contrôlé.Envoyé par crocodilex
nan je parle de librairie.
Je créé une librairie qui lit dans un fichier, 3 structures on va dire A,B et C.
Je dois lire d'abord la B pour connaitre l'offset ou se situe la A et la C.
Pour simplifier l'utilisation de la librairie au programme utilisateur on n'a que très peu de point d'entrée, j'ai une fonction dans ma lib qui lit la premier fois la structure A ki place un flag(indiquer que la structure B a été lu) et je stock l'offset. La meme fonction lit ensuite la B.
La philosophie de la lib résulte en la simpliciter du programme utilisateur à l'interfacer (surtout qd le programme n'est pas réaliser en C )
Bref je sais pas si j'ai été clair.
Alors je ne connais pas.Envoyé par gnto
Un contexte, c'est UN point d'entrée :Je créé une librairie qui lit dans un fichier, 3 structures on va dire A,B et C.
Je dois lire d'abord la B pour connaitre l'offset ou se situe la A et la C.
Pour simplifier l'utilisation de la librairie au programme utilisateur on n'a que très peu de point d'entrée,
Rien de compliqué. L'utilisateur ne connait même pas les détails de la structure dont il n'a que faire. Les fonctions font le travail.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 /* dans le .h */ struct contexte; int f (struct contexte *self, parametres...);
http://emmanuel-delahaye.developpez.com/tad.htm
J'aime beaucoup cette echelle de goret, bien que je ne soit pas d'accord avec tout les points.Envoyé par Emmanuel Delahaye
Il manque peut etre un paragraphe concernant les méthodes de developpement. Un peu comme ceci : http://www.la-rache.com/
Mais bon, là on est hors sujet.
ok c'est deja moins catégorique.
On est d'accord que c'est goret, faut éviter de les utiliser.
Moi j'ai pas le choix ,je suis coincé par un souci de simplicité d'interfacage, sinon crois moi je les utilisent pas
L'interface est fixée ? Qu'est-ce qui t'empêche de faire du refactoring[1]?Envoyé par gnto
Et quoi ça complique l'interface ? Tu remplaces un paramètre par un autre.
Tu trouves ça compliqué à utiliser les fonctions de FILE (fopen() fgetc() etc? OK, ce qui est tordu, c'est que le contexte n'est pas toujours en 1er paramètre, mais à part ça ?)
-----------------
[1] Mot chic très tendance dans le monde de l'XP... de réécrire ton code, quoi..
c'est compliqué dans mon cas.
Je lis dans un fichier des données puis je décale a un autre endroit du fichier quand je n'ai plus de donnée à lire dans celui ci je lis un fichier suivant puis je lis dans un autre fichier et ainsi de suite.
Je veux bien que l'utilisateur gere le premier fichier d'ailleur c'est ce que je fais, il donne le nom du premiers fichier mais l'enchainement d'ouverture des autres fichiers est invisible. Ainsi l'utilisateur ne sais pas à quelle endroit la donnée a été lu, d'ailleur c'est preferable qu'il ne le gere pas.
Pour ne pas que l'utilisateur, gere un grand nombre de FILE * je les stock.
Quoi de plus simple !!
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 void archive_open(char * name); void archive_load(char * channelName); int archive_get_list_value(Ligne **buffer,size_t count); void archive_close();
Ps : je précise que la lib n'accepte qu'un seul prog utilisateur ( faute de temps )
Heu je prefere dans le cas d'une librairie que le programme utilisateur alloue un buffer et le désalloue. Ainsi le double pointeur est de mise.Envoyé par Emmanuel Delahaye
Qu'il soit Ligne ** ou struct tabdyn * le resultat est le meme
on aura au final, un pointeur sur une structure dans lequel il y aura un poiteur sur une ligne, donc 2 pointeurs...
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager