Le 06-11-2009, Marc Espie a écrit :In article <hd11j5$3ck$,Un moyen pédogogique clair pour indiquer aux étudiants qu'on
commence par raisonner dans un monde gentil, puis qu'on passera
aux choses sérieuses par la suite.
C'est debile. Passer cinq minutes a "je valide ce qui a ete entre, si
c'est pas bon -> abort", c'est quand meme pas serieux.
Sauf que ça suppose que tu explique clairement ce qu'est une erreur,
la notion de fin de flux (toujours un bon moment à expliquer la fin
du clavier), ce qui nous ammène à EOF qui est un entier mais pas un
char, etc...
Tu te souviens qu'un débutant, ça a du mal à trouver le min et
le max dans un tableau de taille fixe ?
Donc, oui, dans mon cours il y avait "les E/S sont gentilles,
faisons de l'algorithmique de base", et puis plus loin "bienvenue
dans le monde réel".
Le 06-11-2009, Marc Espie <espie@lain.home> a écrit :
In article <hd11j5$3ck$1@news.cict.fr>,
Un moyen pédogogique clair pour indiquer aux étudiants qu'on
commence par raisonner dans un monde gentil, puis qu'on passera
aux choses sérieuses par la suite.
C'est debile. Passer cinq minutes a "je valide ce qui a ete entre, si
c'est pas bon -> abort", c'est quand meme pas serieux.
Sauf que ça suppose que tu explique clairement ce qu'est une erreur,
la notion de fin de flux (toujours un bon moment à expliquer la fin
du clavier), ce qui nous ammène à EOF qui est un entier mais pas un
char, etc...
Tu te souviens qu'un débutant, ça a du mal à trouver le min et
le max dans un tableau de taille fixe ?
Donc, oui, dans mon cours il y avait "les E/S sont gentilles,
faisons de l'algorithmique de base", et puis plus loin "bienvenue
dans le monde réel".
Le 06-11-2009, Marc Espie a écrit :In article <hd11j5$3ck$,Un moyen pédogogique clair pour indiquer aux étudiants qu'on
commence par raisonner dans un monde gentil, puis qu'on passera
aux choses sérieuses par la suite.
C'est debile. Passer cinq minutes a "je valide ce qui a ete entre, si
c'est pas bon -> abort", c'est quand meme pas serieux.
Sauf que ça suppose que tu explique clairement ce qu'est une erreur,
la notion de fin de flux (toujours un bon moment à expliquer la fin
du clavier), ce qui nous ammène à EOF qui est un entier mais pas un
char, etc...
Tu te souviens qu'un débutant, ça a du mal à trouver le min et
le max dans un tableau de taille fixe ?
Donc, oui, dans mon cours il y avait "les E/S sont gentilles,
faisons de l'algorithmique de base", et puis plus loin "bienvenue
dans le monde réel".
In article <hd18ve$63s$,
Marc Boyer wrote:Donc, oui, dans mon cours il y avait "les E/S sont gentilles,
faisons de l'algorithmique de base", et puis plus loin "bienvenue
dans le monde réel".
Dans mon cours, il y a "les fonctions d'entree ont un code d'erreur, meme
si on reprend un idiome tout pret, le minimum syndical, c'est erreur
-> abort".
In article <hd18ve$63s$1@news.cict.fr>,
Marc Boyer <Marc.Boyer@cert.onera.fr.invalid> wrote:
Donc, oui, dans mon cours il y avait "les E/S sont gentilles,
faisons de l'algorithmique de base", et puis plus loin "bienvenue
dans le monde réel".
Dans mon cours, il y a "les fonctions d'entree ont un code d'erreur, meme
si on reprend un idiome tout pret, le minimum syndical, c'est erreur
-> abort".
In article <hd18ve$63s$,
Marc Boyer wrote:Donc, oui, dans mon cours il y avait "les E/S sont gentilles,
faisons de l'algorithmique de base", et puis plus loin "bienvenue
dans le monde réel".
Dans mon cours, il y a "les fonctions d'entree ont un code d'erreur, meme
si on reprend un idiome tout pret, le minimum syndical, c'est erreur
-> abort".
Le 06-11-2009, Marc Espie a écrit :In article <hd18ve$63s$,
Marc Boyer wrote:Donc, oui, dans mon cours il y avait "les E/S sont gentilles,
faisons de l'algorithmique de base", et puis plus loin "bienvenue
dans le monde réel".
Dans mon cours, il y a "les fonctions d'entree ont un code d'erreur, meme
si on reprend un idiome tout pret, le minimum syndical, c'est erreur
-> abort".
Et c'est quoi le code d'erreur de scanf ? Et pourquoi getc ne retourne pas
un char ? Et ça veut dire quoi que la valeur de retour est "unsigned char
cast to an int" ?
Le 06-11-2009, Marc Espie <espie@lain.home> a écrit :
In article <hd18ve$63s$1@news.cict.fr>,
Marc Boyer <Marc.Boyer@cert.onera.fr.invalid> wrote:
Donc, oui, dans mon cours il y avait "les E/S sont gentilles,
faisons de l'algorithmique de base", et puis plus loin "bienvenue
dans le monde réel".
Dans mon cours, il y a "les fonctions d'entree ont un code d'erreur, meme
si on reprend un idiome tout pret, le minimum syndical, c'est erreur
-> abort".
Et c'est quoi le code d'erreur de scanf ? Et pourquoi getc ne retourne pas
un char ? Et ça veut dire quoi que la valeur de retour est "unsigned char
cast to an int" ?
Le 06-11-2009, Marc Espie a écrit :In article <hd18ve$63s$,
Marc Boyer wrote:Donc, oui, dans mon cours il y avait "les E/S sont gentilles,
faisons de l'algorithmique de base", et puis plus loin "bienvenue
dans le monde réel".
Dans mon cours, il y a "les fonctions d'entree ont un code d'erreur, meme
si on reprend un idiome tout pret, le minimum syndical, c'est erreur
-> abort".
Et c'est quoi le code d'erreur de scanf ? Et pourquoi getc ne retourne pas
un char ? Et ça veut dire quoi que la valeur de retour est "unsigned char
cast to an int" ?
Et c'est quoi le code d'erreur de scanf ? Et pourquoi getc ne retourne pas
un char ? Et ça veut dire quoi que la valeur de retour est "unsigned char
cast to an int" ?
Non, les codes de retour, c'était la partie "maintenant, on fait attention",
et ça va aussi avec les retours de malloc, etc.
Et c'est quoi le code d'erreur de scanf ? Et pourquoi getc ne retourne pas
un char ? Et ça veut dire quoi que la valeur de retour est "unsigned char
cast to an int" ?
Non, les codes de retour, c'était la partie "maintenant, on fait attention",
et ça va aussi avec les retours de malloc, etc.
Et c'est quoi le code d'erreur de scanf ? Et pourquoi getc ne retourne pas
un char ? Et ça veut dire quoi que la valeur de retour est "unsigned char
cast to an int" ?
Non, les codes de retour, c'était la partie "maintenant, on fait attention",
et ça va aussi avec les retours de malloc, etc.
In article <4af3831b$0$748$,
candide wrote:A part ça, fgets() est tellement bien pensée que la première chose qu'on
fait c'est de ... la recoder. Et c'est une pratique générale à ce que
j'ai pu constater.
Grave n'importe quoi. C'est totalement inexact.
fgets() respecte les principes de conception de la libc. En particulier,
elle ne gere *pas* la memoire de l'utilisateur (ce qui se passe dans les
tampons internes des fichiers). Du coup, dans enormement de cas de figure,
pour faire quelque chose de robuste et tout terrain, il faut utiliser fgets
plus un allocateur memoire (celui de la libc par exemple, mais pas toujours).
sur fgetln s'il est disponible. Ca n'est pas tres complique. A mon sens,
c'est a la portee de n'importe quel programmeur C competent.
In article <4af3831b$0$748$426a74cc@news.free.fr>,
candide <candide@free.invalid> wrote:
A part ça, fgets() est tellement bien pensée que la première chose qu'on
fait c'est de ... la recoder. Et c'est une pratique générale à ce que
j'ai pu constater.
Grave n'importe quoi. C'est totalement inexact.
fgets() respecte les principes de conception de la libc. En particulier,
elle ne gere *pas* la memoire de l'utilisateur (ce qui se passe dans les
tampons internes des fichiers). Du coup, dans enormement de cas de figure,
pour faire quelque chose de robuste et tout terrain, il faut utiliser fgets
plus un allocateur memoire (celui de la libc par exemple, mais pas toujours).
sur fgetln s'il est disponible. Ca n'est pas tres complique. A mon sens,
c'est a la portee de n'importe quel programmeur C competent.
In article <4af3831b$0$748$,
candide wrote:A part ça, fgets() est tellement bien pensée que la première chose qu'on
fait c'est de ... la recoder. Et c'est une pratique générale à ce que
j'ai pu constater.
Grave n'importe quoi. C'est totalement inexact.
fgets() respecte les principes de conception de la libc. En particulier,
elle ne gere *pas* la memoire de l'utilisateur (ce qui se passe dans les
tampons internes des fichiers). Du coup, dans enormement de cas de figure,
pour faire quelque chose de robuste et tout terrain, il faut utiliser fgets
plus un allocateur memoire (celui de la libc par exemple, mais pas toujours).
sur fgetln s'il est disponible. Ca n'est pas tres complique. A mon sens,
c'est a la portee de n'importe quel programmeur C competent.
C'est pas une raison pour lui donner des trucs faux.
Chez toi, peut-etre. Chez moi, non. Une gestion d'erreur minimale, ca n'est
pas complique: juste dire que c'est pas bon et quitter. C'est le minimum
vital aujourd'hui. Si tu apprends du C, on n'est plus il y a quinze ans,
et il faut des le debut eviter que tes debutants fassent du trou de securite
au kilometre.
C'est pas parce que les gens qui font Cpython ne savent pas lire OU essaient
de faire des trucs tres bizarres que fgets est mauvais. C'est pourtant tres
simple d'emploi comme fonction si on sait lire.
Les entrees sont compliquees. C'est le cas dans tous les langages.
Il faudra bien tot ou tard l'expliquer a tes debutants.
Mais sortir gets de sa poubelle, surtout avec tous les arguments
fallacieux que tu avances:
1/ c'est grotesque
2/ c'est une faute qui peut avoir des consequences graves.
Perso, j'aimerais bien que l'incidence des trous de securite diminue
dans ces prochaines annees, donc si tu pouvais arreter d'enseigner le C,
au fond, ca serait pas plus mal...
C'est pas une raison pour lui donner des trucs faux.
Chez toi, peut-etre. Chez moi, non. Une gestion d'erreur minimale, ca n'est
pas complique: juste dire que c'est pas bon et quitter. C'est le minimum
vital aujourd'hui. Si tu apprends du C, on n'est plus il y a quinze ans,
et il faut des le debut eviter que tes debutants fassent du trou de securite
au kilometre.
C'est pas parce que les gens qui font Cpython ne savent pas lire OU essaient
de faire des trucs tres bizarres que fgets est mauvais. C'est pourtant tres
simple d'emploi comme fonction si on sait lire.
Les entrees sont compliquees. C'est le cas dans tous les langages.
Il faudra bien tot ou tard l'expliquer a tes debutants.
Mais sortir gets de sa poubelle, surtout avec tous les arguments
fallacieux que tu avances:
1/ c'est grotesque
2/ c'est une faute qui peut avoir des consequences graves.
Perso, j'aimerais bien que l'incidence des trous de securite diminue
dans ces prochaines annees, donc si tu pouvais arreter d'enseigner le C,
au fond, ca serait pas plus mal...
C'est pas une raison pour lui donner des trucs faux.
Chez toi, peut-etre. Chez moi, non. Une gestion d'erreur minimale, ca n'est
pas complique: juste dire que c'est pas bon et quitter. C'est le minimum
vital aujourd'hui. Si tu apprends du C, on n'est plus il y a quinze ans,
et il faut des le debut eviter que tes debutants fassent du trou de securite
au kilometre.
C'est pas parce que les gens qui font Cpython ne savent pas lire OU essaient
de faire des trucs tres bizarres que fgets est mauvais. C'est pourtant tres
simple d'emploi comme fonction si on sait lire.
Les entrees sont compliquees. C'est le cas dans tous les langages.
Il faudra bien tot ou tard l'expliquer a tes debutants.
Mais sortir gets de sa poubelle, surtout avec tous les arguments
fallacieux que tu avances:
1/ c'est grotesque
2/ c'est une faute qui peut avoir des consequences graves.
Perso, j'aimerais bien que l'incidence des trous de securite diminue
dans ces prochaines annees, donc si tu pouvais arreter d'enseigner le C,
au fond, ca serait pas plus mal...
On 6 nov, 02:59, candide wrote:Tiens à propos, tu parles de fgets() dans "ta" faq sur developpez :
Ma FAQ ?
Si il y a une erreur, il suffit de la signaler.
Qui ne fait pas
d'erreurs...
Sinon, tes explications sont imbitables pour celui qui ne connait pas,
c'est vraiment d'une confusion ...
Il n'est de pire sourd que celui qui ne veut rien entendre ...
A part ça, fgets() est tellement bien pensée que la première chose qu'on
fait c'est de ... la recoder. Et c'est une pratique générale à ce que
j'ai pu constater.
Bof, on peut très bien utiliser fgets() telle quelle. Il suffit de la
faire suivre par une fonction de nettoyage adéquate. C'est largement
suffisant pour faire du code rapidement et simplement (étudiants,
petits projets...) On peut aussi, si on préfère combiner les deux
fonctions en une seule. C'est peut être ce que tu appelles
'recoder'...
Mais on peut aussi recoder complétement une fonction de saisie de
lignes. Je l'ai fait dans ma CLIB (fget_line()). Elle utilise un
tableau dynamique automatique qui fait qu'on a plus de problèmes de
tailles... Reste à penser à libérer le buffer alloué...
Dans ta fonction read_stdin(), tu utilises strchr(), pourtant il est
Oui, car c'est la seule façon simple de déterminer si le 'n' est
présent ou non et d'agir en conséquence.
quand même moins couteux d'utiliser strlen() et de se placer en avant
Certainement pas. strchr() fait une boucle qui s'arrête au premier
caractère trouvé ou au 0 final. strlen() fait une boucle qui s'arrête
au zéro final. Tu vois la différence ?
si il y a un 'n' ... Bref, de la complication inutile. Je commence à
comprendre pourquoi tu trouves ça compliqué.
SI tu n'utilises pas les
méthodes simples, c'est sûr que tout devient plus complexe...
On 6 nov, 02:59, candide <cand...@free.invalid> wrote:
Tiens à propos, tu parles de fgets() dans "ta" faq sur developpez :
Ma FAQ ?
Si il y a une erreur, il suffit de la signaler.
Qui ne fait pas
d'erreurs...
Sinon, tes explications sont imbitables pour celui qui ne connait pas,
c'est vraiment d'une confusion ...
Il n'est de pire sourd que celui qui ne veut rien entendre ...
A part ça, fgets() est tellement bien pensée que la première chose qu'on
fait c'est de ... la recoder. Et c'est une pratique générale à ce que
j'ai pu constater.
Bof, on peut très bien utiliser fgets() telle quelle. Il suffit de la
faire suivre par une fonction de nettoyage adéquate. C'est largement
suffisant pour faire du code rapidement et simplement (étudiants,
petits projets...) On peut aussi, si on préfère combiner les deux
fonctions en une seule. C'est peut être ce que tu appelles
'recoder'...
Mais on peut aussi recoder complétement une fonction de saisie de
lignes. Je l'ai fait dans ma CLIB (fget_line()). Elle utilise un
tableau dynamique automatique qui fait qu'on a plus de problèmes de
tailles... Reste à penser à libérer le buffer alloué...
Dans ta fonction read_stdin(), tu utilises strchr(), pourtant il est
Oui, car c'est la seule façon simple de déterminer si le 'n' est
présent ou non et d'agir en conséquence.
quand même moins couteux d'utiliser strlen() et de se placer en avant
Certainement pas. strchr() fait une boucle qui s'arrête au premier
caractère trouvé ou au 0 final. strlen() fait une boucle qui s'arrête
au zéro final. Tu vois la différence ?
si il y a un 'n' ... Bref, de la complication inutile. Je commence à
comprendre pourquoi tu trouves ça compliqué.
SI tu n'utilises pas les
méthodes simples, c'est sûr que tout devient plus complexe...
On 6 nov, 02:59, candide wrote:Tiens à propos, tu parles de fgets() dans "ta" faq sur developpez :
Ma FAQ ?
Si il y a une erreur, il suffit de la signaler.
Qui ne fait pas
d'erreurs...
Sinon, tes explications sont imbitables pour celui qui ne connait pas,
c'est vraiment d'une confusion ...
Il n'est de pire sourd que celui qui ne veut rien entendre ...
A part ça, fgets() est tellement bien pensée que la première chose qu'on
fait c'est de ... la recoder. Et c'est une pratique générale à ce que
j'ai pu constater.
Bof, on peut très bien utiliser fgets() telle quelle. Il suffit de la
faire suivre par une fonction de nettoyage adéquate. C'est largement
suffisant pour faire du code rapidement et simplement (étudiants,
petits projets...) On peut aussi, si on préfère combiner les deux
fonctions en une seule. C'est peut être ce que tu appelles
'recoder'...
Mais on peut aussi recoder complétement une fonction de saisie de
lignes. Je l'ai fait dans ma CLIB (fget_line()). Elle utilise un
tableau dynamique automatique qui fait qu'on a plus de problèmes de
tailles... Reste à penser à libérer le buffer alloué...
Dans ta fonction read_stdin(), tu utilises strchr(), pourtant il est
Oui, car c'est la seule façon simple de déterminer si le 'n' est
présent ou non et d'agir en conséquence.
quand même moins couteux d'utiliser strlen() et de se placer en avant
Certainement pas. strchr() fait une boucle qui s'arrête au premier
caractère trouvé ou au 0 final. strlen() fait une boucle qui s'arrête
au zéro final. Tu vois la différence ?
si il y a un 'n' ... Bref, de la complication inutile. Je commence à
comprendre pourquoi tu trouves ça compliqué.
SI tu n'utilises pas les
méthodes simples, c'est sûr que tout devient plus complexe...
Apprendre fgets correctement est un cauchemar, pas simplement pour le
Mais non. Peut être que tu as du mal, mais la plupart y arrivent.
Apprendre fgets correctement est un cauchemar, pas simplement pour le
Mais non. Peut être que tu as du mal, mais la plupart y arrivent.
Apprendre fgets correctement est un cauchemar, pas simplement pour le
Mais non. Peut être que tu as du mal, mais la plupart y arrivent.
Mais sortir gets de sa poubelle, surtout avec tous les arguments
fallacieux que tu avances:
1/ c'est grotesque
2/ c'est une faute qui peut avoir des consequences graves.
Mais sortir gets de sa poubelle, surtout avec tous les arguments
fallacieux que tu avances:
1/ c'est grotesque
2/ c'est une faute qui peut avoir des consequences graves.
Mais sortir gets de sa poubelle, surtout avec tous les arguments
fallacieux que tu avances:
1/ c'est grotesque
2/ c'est une faute qui peut avoir des consequences graves.
Ce que je dis, c'est que contrairement à ce que vous pensez, fgets() est
une fonction compliquée à comprendre par les débutants (débutants ça va
jusqu'à L3 Info, oui !). Ce qui m'affole c'est que vous (-ed- et toi)
n'arriviez pas à concevoir cette difficulté. Alors tu as peut-être en
face de toi des étudiants en école d'ingénieurs en _informatique_ (et
donc qui a priori doivent bouffer du C/C++) et qui sont peut-être assez
doués mais sache qu'un étudiant à la fac en L1 de sciences de
l'ingénieur (= physique-chimie-meca), il a énormément de mal avec le C
de même qu'un élève dans une écoles d'ingénieurs généralistes qui doit
passer sous les fourches caudines du C.
Ce que je dis, c'est que contrairement à ce que vous pensez, fgets() est
une fonction compliquée à comprendre par les débutants (débutants ça va
jusqu'à L3 Info, oui !). Ce qui m'affole c'est que vous (-ed- et toi)
n'arriviez pas à concevoir cette difficulté. Alors tu as peut-être en
face de toi des étudiants en école d'ingénieurs en _informatique_ (et
donc qui a priori doivent bouffer du C/C++) et qui sont peut-être assez
doués mais sache qu'un étudiant à la fac en L1 de sciences de
l'ingénieur (= physique-chimie-meca), il a énormément de mal avec le C
de même qu'un élève dans une écoles d'ingénieurs généralistes qui doit
passer sous les fourches caudines du C.
Ce que je dis, c'est que contrairement à ce que vous pensez, fgets() est
une fonction compliquée à comprendre par les débutants (débutants ça va
jusqu'à L3 Info, oui !). Ce qui m'affole c'est que vous (-ed- et toi)
n'arriviez pas à concevoir cette difficulté. Alors tu as peut-être en
face de toi des étudiants en école d'ingénieurs en _informatique_ (et
donc qui a priori doivent bouffer du C/C++) et qui sont peut-être assez
doués mais sache qu'un étudiant à la fac en L1 de sciences de
l'ingénieur (= physique-chimie-meca), il a énormément de mal avec le C
de même qu'un élève dans une écoles d'ingénieurs généralistes qui doit
passer sous les fourches caudines du C.