Ca c'est très juste et c'est-ce qui me gonfle avec le Pascal.Envoyé par Jean-Marc.Bourguet
Ca c'est très juste et c'est-ce qui me gonfle avec le Pascal.Envoyé par Jean-Marc.Bourguet
Pas de Wi-Fi à la maison : CPL
En ce qui me concerne également, le standard de fait en matière de langage C est C90 (mais comme le dit Emmanuel, c'est matière à disucussion). Je déclare donc mes variables en début de bloc lorsque je programme en C. Toutefois, lorsque je programme en C++ où le standard en vigueur autorise plus de liberté au niveau de la déclaration des variables, je préfère définir ces variables juste avant leur utilisation afin de les initialiser à une valeur qui fait sens. De plus, cette manière de faire permet de déclarer les variables dont la valeur n'est pas destinée à être modifiée avec le qualificatif const. Cela ne me choque pas si quelqu'un pratique de la sorte en C99, du moment que cela correspond à ses objectifs de portabilité.Envoyé par souviron34
Thierry
"The most important thing in the kitchen is the waste paper basket and it needs to be centrally located.", Donald Knuth
"If the only tool you have is a hammer, every problem looks like a nail.", probably Abraham Maslow
FAQ-Python FAQ-C FAQ-C++
+
Ouh là !! j'ai provoqué un tollé....
Je n'ai pas parcouru toute ta lib, mais ce que j'en ai vu ne m'a pas présenté de telle utilisation...Envoyé par Emmanuel Delahaye
Mais si ça existe, je persiste à dire que c'est plus difficilement lisible... (et portable vers un autre langage. Mais il faut dire que mon expérience est avec des progammeurs/utilisateurs scientifiques, et que en gros les portages sont entre C, Fortran, Prolog, et Pascal)
C'est une implémentation. Je ne vois pas en quoi c'est une justification.Envoyé par médinoc
Quand dans une spécification fonctionnelle tu définis une interface de fonction, tu te fous pas mal de l'initialisation. Tu sais simplement que tu auras besoin de telle et telle variable.Envoyé par Jean-Marc.Bourguet
Il me semble donc logique que lorsque je rentre dans une fonction, je sache que je vais avoir à utiliser l'ensemble de ces variables.
Quand je vais construire une pièce dans une maison, je préfère réfléchir un bon coup avant, calculer, et aller acheter en une seule fois le sable, le ciment, les briques, le plâtre, dans les quantités dont j'aurais besoin, parce que ça fait partie de la conception de la pièce, plutôt que d'y aller au coup par coup, parce qu'au milieu d'un mur j'ai plus de ciment ou plus de briques..
Et enfin je n'ai jamais dit que ce n'était pas faisable, juste que je ne trouve pas ça très lisible en C. Que cela se fasse en C++, aucun problème.
"Un homme sage ne croit que la moitié de ce qu’il lit. Plus sage encore, il sait laquelle".
Consultant indépendant.
Architecture systèmes complexes. Programmation grosses applications critiques. Ergonomie.
C, Fortran, XWindow/Motif, Java
Je ne réponds pas aux MP techniques
Par exemple, pour rester dans des domaines connus...Envoyé par souviron34
http://emmanuel-delahaye.developpez....ib/ed/src/io.c
Ou la, si il faut commencer à écrire du code compatible avec les autres langages, on a pas fini. Heureusement, il existe des passerelles qui permettent de mélanger des fichiers objets écrits en différents langages, ce qui rend cette manip inutile...Mais si ça existe, je persiste à dire que c'est plus difficilement lisible... (et portable vers un autre langage. Mais il faut dire que mon expérience est avec des progammeurs/utilisateurs scientifiques, et que en gros les portages sont entre C, Fortran, Prolog, et Pascal)
Quand on fait une DLL en C, on se fout pas mal de savoir si les fonctions vont être appelées en C, en Java , en assembleur ou en Haskell (je ne sais pas ce que c'est mais, ça fait savant...)...
Par contre, on a scrupuleusement respecté les règles qui permettent de générer une ABI correcte et compatible, et l'usage des flottants et autres chaines est strictement documenté.
Il n'y a absolument aucun rapport entre l'interface et les variables locales et leur éventuelle initialisation.Quand dans une spécification fonctionnelle tu définis une interface de fonction, tu te fous pas mal de l'initialisation. Tu sais simplement que tu auras besoin de telle et telle variable.
Une variable locale, ça fait un travail le plus local possible. En principe, je déclare, je définis et j'initialise en une fois, et la variable est détruite en fin de bloc.
Je ne vois pas ce que ça a d'illisible, au contraire. Les variables locales sont plus(plusse) liées à des contraintes d'implémentation qu'à une signification fonctionnelle précise (sauf valeur de retour). D'ailleurs, la variable qui contient la valeur de retour est généralement définie en première ligne de la fonction. Logigue...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 int f (...) { int ret = 0; /* n'importe quoi qui peut éventuellement altérer ret. */ return ret; }
Pas de Wi-Fi à la maison : CPL
Envoyé par souviron34
- Marquer en début de bloc ou non, c'est de l'implémentation.
- Const est une justification car il y a des variables qu'on ne peut pas initialiser au début d'un bloc. Et une variable const ne peut être qu'initialisée.
Donc, il y a des variables qui ne sont affectées qu'une seule fois dans toute leur portée et qui ne peuvent être const que si elles ne sont pas déclarées en début de bloc.
SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.
"Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
Apparently everyone. -- Raymond Chen.
Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.
De l'initialisation de quoi? Tu ne me parles que d'interface ici, alors que le sujet sont les variables de bloc qui n'apparaissent pas a ce stade de spécification chez moi.Envoyé par souviron34
Non. A la rigueur tu as une idee d'un sous-ensemble des variables que tu vas utiliser, mais tu ne les connais pas toutes. Et ca n'apparait pas dans la spec qui n'atteint pas ce niveau de description.Tu sais simplement que tu auras besoin de telle et telle variable.
Pour autant que l'analogie vaille quelque chose, les variables me semblent plus correspondre aux outils qu'aux materiaux. Et quand je demande a un macon de me contruire un mur, je ne lui indique pas que je veux qu'il utilise deux truelles, un fil a plomb et une betonniere -- immobilise celle-ci tant qu'il est toujours dans la phase de demolition n'est d'ailleurs pas tres sense. Et s'il a un aide qui vient temporairement et qu'il y a une truelle de plus, ca n'a pas d'importance pour moi tant que les specs du mur sont respectees et qu'il n'oublie pas le ferraillage qu'il a facture :-)Il me semble donc logique que lorsque je rentre dans une fonction, je sache que je vais avoir à utiliser l'ensemble de ces variables.
Quand je vais construire une pièce dans une maison, je préfère réfléchir un bon coup avant, calculer, et aller acheter en une seule fois le sable, le ciment, les briques, le plâtre, dans les quantités dont j'aurais besoin, parce que ça fait partie de la conception de la pièce, plutôt que d'y aller au coup par coup, parce qu'au milieu d'un mur j'ai plus de ciment ou plus de briques..
En C j'ai le probleme de la portabilite. J'utilise encore des compilateurs C90. Introduire des blocs est un plus lourd et on se retrouve devant des choix ou parfois introduire un bloc est mieux, parfois declare la variable sans pouvoir l'initialise est mieux.Et enfin je n'ai jamais dit que ce n'était pas faisable, juste que je ne trouve pas ça très lisible en C.
De toute facon, s'il y a une grosse difference de lisibilite, c'est signe qu'il faut regarder s'il ne faut pas decouper le bloc. Et quand on le fait, avoir les variables plus localisees aide a la decoupe.
Les MP ne sont pas là pour les questions techniques, les forums sont là pour ça.
Je partage ta preference car :Envoyé par Emmanuel Delahaye
* C'est davantage portable.
* Il plus facile de voir a quel bloc la variable appartient et donc le code est davantage lisible.
* ll est generalement plus long de trouver une instruction au milieu de declaration de variable (enin pour moi).
* En outre, sauf cas particulier, je ne vois pas le gain apporte par la declaration de variables apres des instructions[1].
Selon ces criteres, je trouveque l'organisation du code utilise par le PO dans le message incrimine ne correspond a de "bonnes habitudes de programmations" (c'est un avis certes assez subjectif).
Dans le meme registre, je reprocherais au code du PO l'utilisation de
Je trouve assez peu lisible de declarer deux varaibles sur la meme ligne, mais la encore ca reste une question de gout.
Code : Sélectionner tout - Visualiser dans une fenêtre à part double valeur1, valeur2;
Comme pour toute regle, il y a des exceptions[2].Envoyé par Médinoc
[1] Hors instructions utilisees pour intialiser des variables. En clair
ne me gene pas. Par contre, je ne vois pas ce qu'apporte l'ecriture
Code : Sélectionner tout - Visualiser dans une fenêtre à part FILE* fp=fopen(...)
[2] D'ailleurs, a mon humble avis, la premiere regle de tout documents "regles de programmation" devrait specifier que toutes les regles qui suivent peuvent, si il existe une bonne raison et que c'est correctement documente, etre enfreinte.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 srand(...) FILE* fp;
Envoyé par gl
100% d'accord.. Et c'est d'ailleurs vrai aussi pour les normes....
"Un homme sage ne croit que la moitié de ce qu’il lit. Plus sage encore, il sait laquelle".
Consultant indépendant.
Architecture systèmes complexes. Programmation grosses applications critiques. Ergonomie.
C, Fortran, XWindow/Motif, Java
Je ne réponds pas aux MP techniques
Pas avec tous les langages.Envoyé par Emmanuel Delahaye
Un problème bien exposé
est, pour moitié, solutionné. / La connaissance s'accroît quand on la partage, pas quand on l'impose. / La violence est le langage des faibles.
Tu peux citer des exemples???Envoyé par David.Schris
Thierry
"The most important thing in the kitchen is the waste paper basket and it needs to be centrally located.", Donald Knuth
"If the only tool you have is a hammer, every problem looks like a nail.", probably Abraham Maslow
FAQ-Python FAQ-C FAQ-C++
+
Au moins BASIC, PerlEnvoyé par mujigka
Les MP ne sont pas là pour les questions techniques, les forums sont là pour ça.
Personnellement je prefere la méthode C99/C++.
Je trouve que déclarer en début de code, en plus du probleme d'initialisation deja évoqué, ca obscurcit les déclarations. En effet, on se retrouve a faire des déclarations de variables "facultatives/sans véritable sens" (notez les guillemets) et on est obligé de compenser en rajoutant des commentaires.
Exemple :
au lieu de :
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 int mafonction() { /*Iterateurs pour les boucles for imbriquées*/ int i; int j; /*variable temporaire de traitement dans la boucle for*/ char temp; /*Variables vraiment utiles*/ //declaration des variables ayant de véritables informations //tout un tas de lignes de code ... for(i;i<max;i++) { for(j;j<max;j++) { ... } } }
De plus, on doit sans cesse se referer au début des fonctions lorsqu'on recherche le nom/type d'une variable meme si elle n'est utile que dans un sous-bloc.
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 int mafonction() { //declaration des variables ayant de véritables informations //tout un tas de lignes de code ... for(int i = 0;i<max;i++) { for(int j = 0;j<max;j++) { char temp; } } }
On est d'accord, mais cette syntaxe de la structure de contrôle for n'est pas supportée par tous les compilateurs, en particulier ceux qui n'implantent pas ou de manière incomplète la nouvelle norme du langage (C99).Envoyé par Ksempac
Thierry
"The most important thing in the kitchen is the waste paper basket and it needs to be centrally located.", Donald Knuth
"If the only tool you have is a hammer, every problem looks like a nail.", probably Abraham Maslow
FAQ-Python FAQ-C FAQ-C++
+
Si cette boucle for n'est pas prise en charge, on peut aussi utiliser cette syntaxe, qui est tout aussi claire :
Inutile de rajouter un commentaire pour expliquer le but de i et j, et les déclarations des variables utiles (en début de bloc beaucoup plus haut) n'ont pas été "polluées".
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 int mafonction() { //declaration des variables ayant de véritables informations //tout un tas de lignes de code ... int i; for(i = 0;i<max;i++) { int j; for(j=0;j<max;j++) { char temp; ... } }
Merci! J'avais mal saisit à quoi se rapportait la remarque de David.Schris (erreur d'exécution)Envoyé par Jean-Marc.Bourguet
Thierry
"The most important thing in the kitchen is the waste paper basket and it needs to be centrally located.", Donald Knuth
"If the only tool you have is a hammer, every problem looks like a nail.", probably Abraham Maslow
FAQ-Python FAQ-C FAQ-C++
+
et tout aussi peu portable... Mais suis d'accord que suivant les objectifs de portabilitérecherchés, cette pratique est recommendable et rend le code plus lisible.Envoyé par Ksempac
Dans ce cas, je préfère:
Mais je déclare en général mes compteurs de boucles en début de routine lorsque je me limite à C90.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12 { int i; for(i = 0;i<max;i++) { int j; for(j=0;j<max;j++) { char temp; ... } } }
Thierry
"The most important thing in the kitchen is the waste paper basket and it needs to be centrally located.", Donald Knuth
"If the only tool you have is a hammer, every problem looks like a nail.", probably Abraham Maslow
FAQ-Python FAQ-C FAQ-C++
+
mais je rajouterais un clin d'oeil .... parce que je n'ai jamais utilisé....
Si tu as besoin de plusieurs fois ce i (c'est à dire tu as plusieurs bloucles séparées par du code), comment ça se passe ? tu re-déclares à chaque fois ? ça doit augmenter la taille de la routine alors non ??
"Un homme sage ne croit que la moitié de ce qu’il lit. Plus sage encore, il sait laquelle".
Consultant indépendant.
Architecture systèmes complexes. Programmation grosses applications critiques. Ergonomie.
C, Fortran, XWindow/Motif, Java
Je ne réponds pas aux MP techniques
pourquoi?Envoyé par souviron34
Thierry
"The most important thing in the kitchen is the waste paper basket and it needs to be centrally located.", Donald Knuth
"If the only tool you have is a hammer, every problem looks like a nail.", probably Abraham Maslow
FAQ-Python FAQ-C FAQ-C++
+
je pose la question. Si tu déclares dans une boucleEnvoyé par mujigka
Est-ce que cette déclaration est valable plus loin (à l'extérieur de la boucle) ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 for ( int i = 0 ....)
Et sinon, si j'ai bsoin d'une autre boucle plus loin et que je re-fais :
Est-ce que ça ne me prend pas 2 int dans la fonction ???
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 for ( int i = 0 ....)
"Un homme sage ne croit que la moitié de ce qu’il lit. Plus sage encore, il sait laquelle".
Consultant indépendant.
Architecture systèmes complexes. Programmation grosses applications critiques. Ergonomie.
C, Fortran, XWindow/Motif, Java
Je ne réponds pas aux MP techniques
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