Les membres ayant 30 points peuvent parler sur les canaux annonces, projets et hs du chat.

Forum Casio - Discussions


Index du Forum » Discussions » Que pensez-vous de la norme C imposée par certaines écoles ?
Louloux Hors ligne Ancien administrateur Points: 7035 Défis: 61 Message

Que pensez-vous de la norme C imposée par certaines écoles ?

Posté le 31/12/2015 14:33

Plusieurs fois sur le forum ou le tchat ont éclaté des débats sur la norme de programmation en C qu'imposent certaines écoles d'informatique (42, Epitech, etc), qu'on peut appeler plus simplement la Norme. Pour rappel, en voici quelques points :

ne pas utiliser de boucle itérative (for), mais les remplacer par des boucles conditionnelles (while)
ne pas utiliser la forme do { ... } while(...) mais seulement while(...) { ... }
ne pas utiliser de switch, mais selon le contexte des empilements de if, ou des tableaux de pointeurs, etc
pas plus de 5 fonctions par fichier
pas plus de 25 lignes et 80 colonnes par fonction
pas d'opérateurs ++, --, +=, -=, *=, /=, etc
+ diverses conventions d'espacement, indentation et nomination des variables

Et si vous avez le courage : Norme de 42

Qu'en pensez-vous ? Pensez-vous qu'elle impose légitimement une rigueur, ou qu'au contraire elle bride inutilement les étudiants ?


NOTE : les premières réponses ont été importées d'un autre topic, d'où les dates antérieures.


1, 2, 3, 4, 5 Suivante
Lephenixnoir En ligne Administrateur Points: 21022 Défis: 143 Message

Citer : Posté le 26/12/2015 17:28 | #


Ok, je n'aime pas les normes d'écriture mais je comprends qu'ils en utilisent une. Et puis pourquoi pas ?

Sauf que pour avoir lu la Leur et conversé avec un de ses auteurs, je trouve ça assez terrible que son but ne semble pas être de guider les élèves en leur donnant une syntaxe commune qui se ressemble globalement, mais de lister suffisamment de règles inutiles pour que tout le monde ait exactement le même programme au caractère près ! Alors que le C possède une telle liberté de syntaxe...

Ils défendent pour ça « guider les élèves, leur permettre de se relire les uns les autres » mais faut arrêter de déconner, les élèves qui font une piscine de deux semaines avec des pointeurs et des structures sont capables d'utiliser une boucle for et un switch -- tous deux interdits par la Norme.
Cakeisalie5 En ligne Membre de CreativeCalc Points: 1857 Défis: 10 Message

Citer : Posté le 26/12/2015 17:47 | #


Lephenixnoir a écrit :
de lister suffisamment de règles inutiles pour que tout le monde ait exactement le même programme au caractère près !

Dans les faits, je vois peu de programmes/fonctions se répéter au caractère près à part ce qui est imposé au caractère près.

Lephenixnoir a écrit :
faut arrêter de déconner, les élèves qui font une piscine de deux semaines avec des pointeurs et des structures sont capables d'utiliser une boucle for et un switch -- tous deux interdits par la Norme

Les for et les switch sont des raccourcis, tout comme la stdio, la stdlib etc. Ils veulent te faire utiliser ce qu'il y a à la base, te faire refaire un maximum de choses

Et puis, je ne sais pas pourquoi tu vois aussi mal la Norme. Elle peut être handicapante quand le nombre de fichiers par exemple est limité (à cause des 5 fonctions max par fichier, des 5 arguments max par fonctions, des 5 variables max déclarées dans une fonction), mais en règle générale, elle force à avoir des bons réflexes, comme par exemple décomposer son code, le mettre en anglais, formater correctement ses noms de structures/enums/typedefs, ...

Enfin, ce n'est qu'un détail de 42. Je préfère toujours ça que les devoirs relous (j'ai un pote qui est à la fac, je l'ai aidé sur deux-trois devoirs en Processing, je sais ce que c'est un peu o/)

Promotion ordinaire sur les inscriptions sur Planète Casio : en ce moment, c'est gratuit !
Mon blogBesoin d'utilitaires de transfert vers et depuis la calculatrice sous GNU/Linux ?
Lephenixnoir En ligne Administrateur Points: 21022 Défis: 143 Message

Citer : Posté le 26/12/2015 18:14 | #


Cakeisalie5 a écrit :
Dans les faits, je vois peu de programmes/fonctions se répéter au caractère près à part ce qui est imposé au caractère près.

Avec tout ce qui est imposé au caractère près... parlons concrètement : l'alignement du scope global. Voilà une règle typiquement inutile à mon regard... si tu arrives à me lui trouver une utilité, n'hésite pas à me tenir au courant.

Cakeisalie5 a écrit :
Les for et les switch sont des raccourcis, tout comme la stdio, la stdlib etc. Ils veulent te faire utiliser ce qu'il y a à la base, te faire refaire un maximum de choses

Oui, bien sûr, ça se défend. Mais alors qu'ils expliquent aux élèves comment le for, la stdlib et les entrées/sorties fonctionnent, qu'ils leur fassent réécrire printf() en entier s'ils le veulent, qu'ils leur fassent réimplémenter FILE, et puis une fois que tout ça est fait qu'ils leur laissent les utiliser ! Dans leur vie professionnelle il n'utiliseront jamais l'API d'Unix...

Cakeisalie5 a écrit :
Et puis, je ne sais pas pourquoi tu vois aussi mal la Norme.

Parce que j'ai une fois écrit un programme relativement conséquent (ben t'as dû le faire aussi non ? Le BSQ de l'année dernière) parfaitement fonctionnel sur ma machine et sur celle de la personne à 42 qui m'avait demandé de l'aider et qu'une fois ramené foireusement à le Norme, il ne fonctionnait plus qu'une fois sur deux sur ma machine, et une fois sur dix sur la sienne. Et je l'ai débuggué hein ! En long, en large, en travers et en détail... sans succès. Je dois avouer que ça a bien pourri cette Norme dans mon estime...

Cakeisalie5 a écrit :
Elle peut être handicapante quand le nombre de fichiers par exemple est limité (à cause des 5 fonctions max par fichier, des 5 arguments max par fonctions, des 5 variables max déclarées dans une fonction)

Autant pour 5 fonctions par fichiers je ne comprends pas du tout l'intérêt. 5 ? Non, 4 arguments max par fonction -- du moins, avec la version avec laquelle je travaillais. C'est encore compréhensible parce que la justification se trouve, comme on me l'a exposé, dans les registres, mais empiler un argument n'est pas plus lent que le mettre dans un registre, et le C permettant de dépasser 4 arguments, je ne vois pas de raison de ne pas le faire (les élèves sont suffisamment intelligents pour comprendre si on leur dit qu'en général il vaut mieux se limiter à 4 arguments) : s'ils ne veulent absolument pas l'utiliser il faut faire du strict C89...

Cakeisalie5 a écrit :
[...] mais en règle générale, elle force à avoir des bons réflexes, comme par exemple décomposer son code, le mettre en anglais, formater correctement ses noms de structures/enums/typedefs, ...

Oui, mais elle fait beaucoup plus que ça -- beaucoup trop... pour l'anecdote, en-dehors du fait que je n'ai jamais vu dans une source un nom de structure/enum/typedef formaté selon la Norme, la moulinette elle-même possède un bug lié au passage de structures qui t'oblige à poser un typedef pour chaque structure. Ah ben bravo les bonnes habitudes !

Cakeisalie5 a écrit :
Enfin, ce n'est qu'un détail de 42. Je préfère toujours ça que les devoirs relous (j'ai un pote qui est à la fac, je l'ai aidé sur deux-trois devoirs en Processing, je sais ce que c'est un peu o/)

C'est peut-être un peu fermé d'esprit de ma part de dire ça, mais même si je suis ouvert aux conventions et autres notations qui aident à progresser et/ou prendre des bonnes habitudes, ça fait 6 ans que je code en C, et je le fais beaucoup mieux sans leur Norme qu'avec. 25 lignes par fonction ? « Lol », aurais-je envie de leur répondre, « allez lire les sources de glibc, du moteur 3D Ogre, de Qt, ou de Webkit, et puis on en reparle ».
Dark storm Hors ligne Labélisateur Points: 11542 Défis: 176 Message

Citer : Posté le 26/12/2015 18:17 | #


Franchement, si les raccourcis existent, c'est pas pour rien… Qu'on vous apprenne à structurer un code, je trouve ça nécessaire, mais on a jamais appris l'histoire en oubliant volontairement (et refusant d'en parler) des évènements…
Enfin, je suis comme Lephe, je trouve ça bien d'imposer une "norme", par exemple indenter en K&R (même si je préfère le Allman) et utiliser la notation Snake. Mais de là à interdire l'utilisation de structures algorithmiques, je trouve ça profondément débile.
Finir est souvent bien plus difficile que commencer. — Jack Beauregard
Intelligide Hors ligne Membre de CreativeCalc Points: 49 Défis: 5 Message

Citer : Posté le 31/12/2015 14:49 | #


Louloux a écrit :
ne pas utiliser de boucle itérative (for), mais les remplacer par des boucles conditionnelles (while)


Je trouve ça vraiment crétin. Les boucles itératives ont, pour moi, une utilisation complétement différente de celle de while. Devoir itérer un tableau avec un while est, pour moi, la manière la plus dégueulasse qui soit.

Louloux a écrit :
ne pas utiliser la forme do { ... } while(...) mais seulement while(...) { ... } (while)


Je n'utilise pas beaucoup do { ... } while(...) mais ça peux parfois être pratique

Louloux a écrit :
ne pas utiliser de switch, mais selon le contexte des empilements de if, ou des tableaux de pointeurs, etc (while)


C'est crétin( j'adore ce mot ). J'ai déja fait un empilement de if et franchement, 1) c'est pas beau 2) ça prend de la place et même si on peut faire des else if() le switch reste beaucoup plus élégant.

Louloux a écrit :
pas plus de 5 fonctions par fichier (while)


Ben, du moment que les fonctions sont rangés logiquement, avoir un maximum me parait désuet En C++, il vont peut être dire pas plus de 5 méthodes par fichier

Louloux a écrit :
pas plus de 25 lignes et 80 colonnes par fonction


Heeeeeeeeeeeeeeeeeeeeeu..... Un fonction, pour ma part, est un code encapsulé suivant 2 règles, 1) elle est susceptible d'être appeler plusieurs fois et 2) elle doit faire une seul tâche.

Si la tâche requiert plus de 25 lignes, je vais devoir créer une autre fonction de moins de 25 lignes qui va n'être appeler qu'une seule fois( dans la fonction initiale) donc je trouve ça crétin. Car même si ça peut pousser à écrire du code minimal et très structuré, ça peut aussi créer de véritables merdes

Louloux a écrit :
pas d'opérateurs ++, --, +=, -=, *=, /=, etc




Louloux a écrit :
+ diverses conventions d'espacement, indentation et nomination des variables


Je trouve ça correct car ça uniformise un code. Il n'y a rien de plus dégueu qu'un code où les variables sont nommés à la j'en-ai-marre-de-vivre, etc
Eltoredo Hors ligne Modérateur Points: 4299 Défis: 35 Message

Citer : Posté le 31/12/2015 14:54 | #


Louloux a écrit :
ne pas utiliser la forme do { ... } while(...) mais seulement while(...) { ... } (while)


La forme do while est pratique dans le cadre où on effectue au moins un tour de boucle en l'utilisant. C'est une des bases du C, aucun intérêt de faire une norme concernant son interdiction.

Louloux a écrit :
ne pas utiliser de switch, mais selon le contexte des empilements de if, ou des tableaux de pointeurs, etc (while)


Une fois de plus, le switch est une des bases du C, ça rend le code plus beau, plus lisible et plus optimisé qu'avec des if else, mais l'intérêt peut être d'utiliser les if et les else si ça peut aider à comprendre les bases mais bon...

Louloux a écrit :
pas d'opérateurs ++, --, +=, -=, *=, /=, etc


Intelligide a écrit :


Louloux a écrit :
+ diverses conventions d'espacement, indentation et nomination des variables


Bon bah on va pas s'en plaindre, c'est mieux d'avoir cette norme que de commencer comme je l'ai fait, dégueulassement

En résumé, je trouve ça plutôt débile pour la plupart de ces normes, voilà tout...
La procrastination est une vertu. (voir ma description pour comprendre mon raisonnement)
Drac0300 Hors ligne Membre Points: 839 Défis: 39 Message

Citer : Posté le 31/12/2015 14:54 | #


ne pas utiliser de boucle itérative (for), mais les remplacer par des boucles conditionnelles (while)[
ne pas utiliser la forme do { ... } while(...) mais seulement while(...) { ... }


Cakeisalie5 a écrit :
Les for et les switch sont des raccourcis, tout comme la stdio, la stdlib etc. Ils veulent te faire utiliser ce qu'il y a à la base, te faire refaire un maximum de choses

C’est vrai, les raccourcis c’est sale et illisible ! on devrait faire ça proche du proco, on devrait seulement faire des sauts conditionnels avec de l’asm inline !

ne pas utiliser de switch, mais selon le contexte des empilements de if, ou des tableaux de pointeurs, etc

un switch peut toujours être remplacé par un tableau de pointeurs sur fonctions ! Par exemple, pour un :

switch(a){
     case(3000) :
         …
     break;
    case (0):
     break;
    default:
      …
}

peut être avantagement remplacé par un tableau de pointeurs sur fonctions à 3001 cases, avec l’assurance d’un plantage si a valait plus de 3000 ! super non ?
et en plus même avec un empilement de if super propre : en faisant ça :

if (a==0 || a==3000){
   if(a==3000) …
   …
}

au lieu de

switch(a){
     case(3000) :
         …

     case (0):
         …
         break;
    default:
}

on gagne beaucoup en lisibilité et en vitesse vu qu’on fait plus de vérifications ! super !

Dans Z/1Z, 42==666
Coïncidence ? Je ne pense pas.
Louloux Hors ligne Ancien administrateur Points: 7035 Défis: 61 Message

Citer : Posté le 31/12/2015 15:05 | #


Cakeisalie5 a écrit :
Les for et les switch sont des raccourcis, tout comme la stdio, la stdlib etc. Ils veulent te faire utiliser ce qu'il y a à la base, te faire refaire un maximum de choses

Non tu ne peux pas comparer le for à des bibliothèques... Le for est une des entités de base de nombreux langages, et dans l'informatique impérative telle que je l'ai apprise, il est plus propre de servir du for dès qu'il y a une notion d'itération, et du while dès qu'il y a besoin d'une boucle avec un arrêt conditionnel, mais en aucun cas de mélanger les deux.

Ajouté le 31/12/2015 à 15:09 :
Cakeisalie5 a écrit :
Et puis, je ne sais pas pourquoi tu vois aussi mal la Norme. Elle peut être handicapante quand le nombre de fichiers par exemple est limité (à cause des 5 fonctions max par fichier, des 5 arguments max par fonctions, des 5 variables max déclarées dans une fonction), mais en règle générale, elle force à avoir des bons réflexes, comme par exemple décomposer son code, le mettre en anglais, formater correctement ses noms de structures/enums/typedefs, ...

Tu l'as dit : "handicapante". Elle crée des contraintes, et plus on a de contraintes, moins on se concentre sur la réalisation d'un code propre et fonctionnel. Et non, ce n'est pas plus propre de coder avec la Norme. Au contraire un while pour une itération est sale à mon goût.
Breizh_craft En ligne Modérateur Points: 1103 Défis: 7 Message

Citer : Posté le 31/12/2015 15:10 | #


Mais non voyons ! La "Norme", c'est juste parce qu'ils ont une flemme énorme de développer une moulinette correcte

Plus sérieusement, à l'IUT Info, on nous apprends le C au fur et à mesure, les "seules" règles (pour le moment du moins) :

Le programme doit fonctionner ()
Compiler sans Warnings avec la commande "gcc -std=c99 -Wall -Wextra -pedantic", et les quelques arguments nécessaires à chaque cas.
Le code source doit être arbitrairement lisible (tant qu'on indente, le prof se fiche qu'on mette 2,4 ou 8 espaces, qu'on utilise des tabulations...).
Respecter quelques conventions (surtout le nommage des variables, fonctions...).
Commenter.
Les fonctions sont définies par des prototypes, qui doivent être accompagnés de commentaires ainsi :

int fonction(int,int);
//Rôle : indique le rôle de la fonction.
//Pré-condition : conditions à remplir pour appeler cette fonction.
//Post-condition : ce que retourne la fonction selon les différents cas.

Breizh.pm – Un adminsys qui aime les galettes.
Dark storm Hors ligne Labélisateur Points: 11542 Défis: 176 Message

Citer : Posté le 31/12/2015 15:14 | #


+1 Louloux, nous on perd des points si on utilise à mauvais escient le for ou le while.
Et puis, c'est interessant de refaire les bases, ok. Mais à ce compte là pourquoi on refait pas les bases jusqu'à assembler le binaire à la main ?
Finir est souvent bien plus difficile que commencer. — Jack Beauregard
Intelligide Hors ligne Membre de CreativeCalc Points: 49 Défis: 5 Message

Citer : Posté le 31/12/2015 15:20 | #


Breizh_craft a écrit :

Les fonctions sont définies par des prototypes, qui doivent être accompagnés de commentaires ainsi :

int fonction(int,int);
[green]//Rôle : indique le rôle de la fonction.[/green]
[green]//Pré-condition : conditions à remplir pour appeler cette fonction.[/green]
[green]//Post-condition : ce que retourne la fonction selon les différents cas.[/green]


Je trouve pas ces commentaires très joli ni très explicite, pour ma part j'utilise:
Pour un fonction:

[green]
/*
* Rôle
*
* @param type nom fonction
* @return type fonction
* @throw exception condition
*/[/green]
int fonction(int,int);


Pour une variable:

[green]
/*
* Rôle
*
* @var type
*/[/green]
int variable;


C'est emprunté de PhpDoc que je trouve très bien structuré
Breizh_craft En ligne Modérateur Points: 1103 Défis: 7 Message

Citer : Posté le 31/12/2015 16:17 | #


Je respecte juste les consignes du prof, et j'ai intérêt à le faire correctement

Après, on s'en fiche, tant qu'on comprend de quoi on parle.
Breizh.pm – Un adminsys qui aime les galettes.
Lephenixnoir En ligne Administrateur Points: 21022 Défis: 143 Message

Citer : Posté le 31/12/2015 18:05 | #


Breizh_craft a écrit :
Mais non voyons ! La "Norme", c'est juste parce qu'ils ont une flemme énorme de développer une moulinette correcte

La moulinette de 42 possède des bugs d'ailleurs... exemple :
struct s_object;
void f(struct s_object argument);

est invalide (outre le scope global). C'est respectueux de la Norme, mais pour que la moulinette passe il faut écrire :
struct s_object;
typedef struct s_object t_object;
void f(t_object argument);


Breizh_Craft a écrit :
Le programme doit fonctionner ()
Compiler sans Warnings avec la commande "gcc -std=c99 -Wall -Wextra -pedantic", et les quelques arguments nécessaires à chaque cas.
Le code source doit être arbitrairement lisible (tant qu'on indente, le prof se fiche qu'on mette 2,4 ou 8 espaces, qu'on utilise des tabulations...).
Respecter quelques conventions (surtout le nommage des variables, fonctions...).
Commenter.
Les fonctions sont définies par des prototypes, qui doivent être accompagnés de commentaires ainsi [...]

Voilà enfin un peu de bon sens. Je trouve ça un peu bête de C99 (en C11 on a les variadic macros, les structures de données anonymes, plein de trucs utiles), et les définitions de fonctions un peu strictes peut-être, mais c'est presque du détail.
Breizh_craft En ligne Modérateur Points: 1103 Défis: 7 Message

Citer : Posté le 31/12/2015 18:07 | #


Après, je sais pas si on va bosser que avec ça, là on fait des petits programmes tout simple, alors bon...
Breizh.pm – Un adminsys qui aime les galettes.
Smashmaster Hors ligne Ancien modérateur Points: 4561 Défis: 253 Message

Citer : Posté le 31/12/2015 22:14 | #


A la fac c'est différent :

ne pas utiliser de boucle itérative (for), mais les remplacer par des boucles conditionnelles (while)

On peut utiliser les boucles for.
ne pas utiliser de switch, mais selon le contexte des empilements de if, ou des tableaux de pointeurs, etc

Dans un langage de programmation Orienté Objet, les professeurs nous obligent d'utiliser des COR ou des Abstract Factory à la place des switch.
pas plus de 5 fonctions par fichier
pas plus de 25 lignes et 80 colonnes par fonction

Les fonctions doivent être courtes, mais il n'y a pas de valeur fixé
pas d'opérateurs ++, --, +=, -=, *=, /=, etc

...lol

Bref la fac c'est moins stricte, mais ce n'est pas plus mauvais, on apprend quand même à bien programmer.
Eltoredo Hors ligne Modérateur Points: 4299 Défis: 35 Message

Citer : Posté le 31/12/2015 22:15 | #


Par contre, "pas d'opérateurs ++, ...", tu fais comment ?
La procrastination est une vertu. (voir ma description pour comprendre mon raisonnement)
Smashmaster Hors ligne Ancien modérateur Points: 4561 Défis: 253 Message

Citer : Posté le 31/12/2015 22:15 | #


Eltoredo a écrit :
Par contre, "pas d'opérateurs ++, ...", tu fais comment ?


truc = truc + 1;
Eltoredo Hors ligne Modérateur Points: 4299 Défis: 35 Message

Citer : Posté le 31/12/2015 22:16 | #


Oh, bon, c'est pas si grave que ça, je pensais qu'on les utilisait pas du tout
La procrastination est une vertu. (voir ma description pour comprendre mon raisonnement)
Legolas Hors ligne Ancien rédacteur Points: 3266 Défis: 104 Message

Citer : Posté le 31/12/2015 22:17 | #


Smashmaster a écrit :
Eltoredo a écrit :
Par contre, "pas d'opérateurs ++, ...", tu fais comment ?


truc = truc + 1;


Mais c'est con ?! En quoi c'est utile ? Ça ne donne pas plus de lisibilité, ça utilise plus de temps...
Mes programmes
Cacher les programmes
Mes défis
Cacher les défis



Smashmaster Hors ligne Ancien modérateur Points: 4561 Défis: 253 Message

Citer : Posté le 31/12/2015 22:18 | #


Legolas a écrit :
Smashmaster a écrit :
Eltoredo a écrit :
Par contre, "pas d'opérateurs ++, ...", tu fais comment ?


truc = truc + 1;


Mais c'est con ?! En quoi c'est utile ? Ça ne donne pas plus de lisibilité, ça utilise plus de temps...

Je suis d'accord avec toi, après tu n'es pas obligé de respecter les normes.
1, 2, 3, 4, 5 Suivante

LienAjouter une imageAjouter une vidéoAjouter un lien vers un profilAjouter du codeCiterAjouter un spoiler(texte affichable/masquable par un clic)Ajouter une barre de progressionItaliqueGrasSoulignéAfficher du texte barréCentréJustifiéPlus petitPlus grandPlus de smileys !
Cliquez pour épingler Cliquez pour détacher Cliquez pour fermer
Alignement de l'image: Redimensionnement de l'image (en pixel):
Afficher la liste des membres
:bow: :cool: :good: :love: ^^
:omg: :fusil: :aie: :argh: :mdr:
:boulet2: :thx: :champ: :whistle: :bounce:
valider
 :)  ;)  :D  :p
 :lol:  8)  :(  :@
 0_0  :oops:  :grr:  :E
 :O  :sry:  :mmm:  :waza:
 :'(  :here:  ^^  >:)

Σ π θ ± α β γ δ Δ σ λ
Veuillez donner la réponse en chiffre
Vous devez activer le Javascript dans votre navigateur pour pouvoir valider ce formulaire.

Si vous n'avez pas volontairement désactivé cette fonctionnalité de votre navigateur, il s'agit probablement d'un bug : contactez l'équipe de Planète Casio.

Planète Casio v42 © créé par Neuronix et Muelsaco 2004 - 2021 | Il y a 110 connectés | Nous contacter | Qui sommes-nous ? | Licences et remerciements

Planète Casio est un site communautaire non affilié à Casio. Toute reproduction de Planète Casio, même partielle, est interdite.
Les programmes et autres publications présentes sur Planète Casio restent la propriété de leurs auteurs et peuvent être soumis à des licences ou copyrights.
CASIO est une marque déposée par CASIO Computer Co., Ltd