Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Différence de résultat entre compilateurs

291 réponses
Avatar
YannicK
Bonjour,

éternel débutant en C pour mon plaisir, je me permets de venir vous
demander quelques éclaircissements sur une situation que je n'arrive pas
à comprendre :

J'utilise le cours en ligne spécial "grand débutant" du "site du zéro" :
<http://www.siteduzero.com/tutoriel-3-14189-apprenez-a-programmer-en-c.html>

Je réalise les exercices du cours dans deux environnements différents :
- sous windows vista avec l'IDE visual C++ 2008 express
- sous linux ubuntu 9.04 avec gcc

J'ai écrit un programme dans le cadre des exercices proposés sur les
tableaux par ce cours en ligne. Le fichier en question peut être
téléchargé ici :
< http://dl.free.fr/to7PFReLM/tableau.c>

Ce qui m'étonne, c'est que j'arrive à compiler sans difficulté ce code
sous Linux, et que le programme se comporte exactement comme je le
souhaite. Par contre, sous Windows, impossible de compiler, l'IDE me
renvoie 42 erreurs et 31 avertissements !!! La plupart des erreurs
semblent être liées aux variables. Par exemple :
"erreur de syntaxe : absence de ';' avant 'type'"
"identificateur non déclaré"

Or, j'ai beau lire et relire mon code, les variables me sembles toutes
déclarées correctement et il ne manque à mon sens pas de ";" en fin
d'instructions. De plus, comme je le disais au début, le même code se
compile sans aucune erreur sous Linux ...

Alors, comment expliquer que deux compilateurs réagissent aussi
différemment, et où et mon erreur ?

Merci par avance du temps que vous pourrez me consacrer,



--
YannicK
yann801 *arobase* yahoo *point* fr
yann801 *at* yahoo *dot* fr

10 réponses

Avatar
Manuel Pégourié-Gonnard
Marc Boyer scripsit:

Le 11-09-2009, Gabriel Dos Reis a écrit :
C'est sûr que si le professeur donne l'impression que c'est compliqué,
les 2/3 des élèves imprimeront que c'est compliqué.



Il y a là une contradiction difficile à gérer pour l'enseignant.
D'une part, il sait qu'il faut que les étudiannts soient attentifs
à ce point, et qu'il les prévienne (à moins d'avoir des étudiants
dont l'attention est constante sur tout son cour, ce qui ne m'a
jamais été donné).
D'autre part, plus on dit que c'est difficile, plus les élèvent
impriment que c'est difficile.

Quel équilibre ? Je suis preneur de toute solution.



Je suis loin de pouvoir proposer une solution, mais j'aimerais apporter
quelques arguments en faveur du « dire que c'est difficile ».
D'une part, certains étudiants peuvent avoir tendance à se décourager,
voire décrocher du reste du cours, si ils n'y arrivent pas alors qu'on
leur répète que c'est facile. D'autre part, y'a aussi une question de
crédibilité de l'enseignant, si on leur dit que c'est facile et qu'ils
ressentent, lisent ou entendent par ailleurs le contraire.

Personellement, quand j'aborde des points difficiles dans un cours,
j'essaie de faire passer un message rassurant comme « bon ok, c'est un
peu délicat, c'est normal si vous avez du mal au début, mais tenez bon
et tout va bien se passer ». Je suis loin de prétendre que c'est /la/
bonne méthode, mais je ne crois pas avoir causé trop de ravages en
faisant comme ça, sur des cours pourtant objectivement difficiles.

Après c'est clair que ça dépend pas mal du public, c'est une constante
dans l'enseignement : il faut s'adapter à son public.

--
Manuel Pégourié-Gonnard Institut de mathématiques de Jussieu
http://weblog.elzevir.fr/ http://people.math.jussieu.fr/~mpg/
Avatar
espie
In article ,
Manuel Pégourié-Gonnard <mpg+ wrote:
Personellement, quand j'aborde des points difficiles dans un cours,
j'essaie de faire passer un message rassurant comme « bon ok, c'est un
peu délicat, c'est normal si vous avez du mal au début, mais tenez bon
et tout va bien se passer ». Je suis loin de prétendre que c'est /la/
bonne méthode, mais je ne crois pas avoir causé trop de ravages en
faisant comme ça, sur des cours pourtant objectivement difficiles.



Ouaip, je suis pas mal d'accord avec ca.

Ceci-dit, je considere toujours que les pointeurs, c'est essentiellement
trivial. Apres tout, c'est jamais qu'une adresse memoire et un type... il
y a pas mal de technicite specifiques au C, comme l'arithmetique sur pointeur
ou les problemes d'aliasing lies aux mauvais usage de cast, mais on peut
introduire ca tres tard quand le probleme se pose.

Non, par contre, comprendre ce qu'on peut faire avec, pourquoi c'est
indispensable, montrer les idiomes vitaux aux etudiants, ca c'est
complique. Comprendre le boulot de comptable qu'il faut faire en C
pour la gestion de la memoire.

Un truc qui n'aide vraiment pas, c'est la pedagogie tres universitaire de
style "il n'existe rien en dehors du cours, reinventez la roue a chaque
fois". Il est clair que faire du C avec rien, c'est super-chiant. Tout le
monde utilise des bibliotheques (ou fabrique ses propres bibliotheques et
s'en sert), mais voila, on donne des exemples aux etudiants sans bibliotheque,
ou on leur montre des "faux" fragments de code inventes pour le cours.

Dans les solutions que j'ai testees, passer en C++ est une excellente solution
pour rendre plein de choses moins douloureuses. Si on a le temps, c'est
infiniment MIEUX de commencer par C++ que par C: le type-checking plus
strict, et la bibliotheque standard relativement complete font qu'on peut
tres vite faire des choses agreables... et avec Qt, ces jours-ci, il n'y a rien
a redire par rapport a Java: on peut faire du graphique sans le moindre souci.
(et je parle de C++ simple, en evitant l'essentiel de la prog. objet et des
complexites des templates). Ca, c'est si on veut faire de la prog.
en general et que le C n'est pas matiere principale.

Mais voila: quand on n'a que peu de temps, ca marche mal. Avec une trentaine
d'heures de cours, je ne sais pas enseigner le C en commencant par le C++
en m'assurant que les etudiants ne melangeront pas les deux a l'arrivee...
Avatar
Marc Boyer
Le 14-09-2009, Marc Espie a écrit :
In article ,
Manuel Pégourié-Gonnard <mpg+ wrote:
Personellement, quand j'aborde des points difficiles dans un cours,
j'essaie de faire passer un message rassurant comme « bon ok, c'est un
peu délicat, c'est normal si vous avez du mal au début, mais tenez bon
et tout va bien se passer ». Je suis loin de prétendre que c'est /la/
bonne méthode, mais je ne crois pas avoir causé trop de ravages en
faisant comme ça, sur des cours pourtant objectivement difficiles.



Ouaip, je suis pas mal d'accord avec ca.

Ceci-dit, je considere toujours que les pointeurs, c'est essentiellement
trivial. Apres tout, c'est jamais qu'une adresse memoire et un type...



Mais comme tu le disais, ça dépend si on peut s'appuyer sur une
connaissance des étudiants de ce qu'est la mémoire.
Si ça n'a pas été fait, faut en faire un peu.
C'est plus facile d'enseigner le C après 30h d'architecure des
ordinateurs.

il
y a pas mal de technicite specifiques au C, comme l'arithmetique sur pointeur
ou les problemes d'aliasing lies aux mauvais usage de cast, mais on peut
introduire ca tres tard quand le probleme se pose.



Oui.

Non, par contre, comprendre ce qu'on peut faire avec, pourquoi c'est
indispensable, montrer les idiomes vitaux aux etudiants, ca c'est
complique. Comprendre le boulot de comptable qu'il faut faire en C
pour la gestion de la memoire.

Un truc qui n'aide vraiment pas, c'est la pedagogie tres universitaire de
style "il n'existe rien en dehors du cours, reinventez la roue a chaque
fois". Il est clair que faire du C avec rien, c'est super-chiant. Tout le
monde utilise des bibliotheques (ou fabrique ses propres bibliotheques et
s'en sert), mais voila, on donne des exemples aux etudiants sans bibliotheque,
ou on leur montre des "faux" fragments de code inventes pour le cours.



Nous, on faisait le contraire. On leur donnait la spec de strcpy, et
on demandait de le coder, en précisant bien que c'était pour l'exercice,
et que dans la "vraie vie", on utilisait strncpy, où sa propre
bibliothèque de chaine de char (on en faisait 2 différentes).

Dans les solutions que j'ai testees, passer en C++ est une excellente solution
pour rendre plein de choses moins douloureuses. Si on a le temps, c'est
infiniment MIEUX de commencer par C++ que par C: le type-checking plus
strict, et la bibliotheque standard relativement complete font qu'on peut
tres vite faire des choses agreables... et avec Qt, ces jours-ci,
il n'y a rien a redire par rapport a Java: on peut faire du graphique
sans le moindre souci.
(et je parle de C++ simple, en evitant l'essentiel de la prog. objet et des
complexites des templates). Ca, c'est si on veut faire de la prog.
en general et que le C n'est pas matiere principale.



Je ne l'ai jamais essayé, mais c'est aussi l'approche qui me tenterait.

Mais voila: quand on n'a que peu de temps, ca marche mal. Avec une trentaine
d'heures de cours, je ne sais pas enseigner le C en commencant par le C++
en m'assurant que les etudiants ne melangeront pas les deux a l'arrivee...



Pareil.

Marc Boyer
--
En prenant aux 10% des francais les plus riches 12% de leurs revenus,
on pourrait doubler les revenus des 10% les plus pauvres.
http://www.inegalites.fr/spip.php?article1&id_mot0
Avatar
candide
Marc Espie a écrit :

Un truc qui n'aide vraiment pas, c'est la pedagogie tres universitaire de
style "il n'existe rien en dehors du cours, reinventez la roue a chaque
fois". Il est clair que faire du C avec rien, c'est super-chiant. Tout le
monde utilise des bibliotheques (ou fabrique ses propres bibliotheques et
s'en sert), mais voila, on donne des exemples aux etudiants sans bibliotheque,
ou on leur montre des "faux" fragments de code inventes pour le cours.



Absolument, l'enseignement du C est complètement désincarné, c'est super
décourageant, on souffre (parce que la culture du C est intégriste
pousse-au-crime) à coder des algorithmes triviaux. Les étudiants arrivent en L3
et ils n'ont jamais travaillé avec une autre bibliothèque que la lib standard.
On devrait leur proposer d'utiliser une bibliothèque comme ncurses ou la SDL ou
Allegro.

Moi je devais faire un enseignement d'expérimentations algorithmiques en L2 avec
TP en C (je l'ai pratiqué une année) et ce semestre, je vais laisser tomber le C
et le remplacer par Python (que les étudiants ne connaissent pas !) et je suis à
peu près persuadé qu'on ira beaucoup plus loin qu'avec du C et que les étudiants
se sentiront davantage capables.




Mais voila: quand on n'a que peu de temps, ca marche mal. Avec une trentaine
d'heures de cours,



de "cours cours" ou avec TD et TP ?
Avatar
espie
In article <4aae14c8$0$548$,
candide wrote:

Mais voila: quand on n'a que peu de temps, ca marche mal. Avec une trentaine
d'heures de cours,



de "cours cours" ou avec TD et TP ?



Cours-cours, mais ils ne vont pas vite, et il y a de longues digressions
pour expliquer, et des exercices en cours, parce qu'ils ne bossent pas assez
a cote... donc si je ne controle pas directement que "c'est rentre", ca va
dans le mur pour les projets (et puis ils ont un niveau TRES heterogne. Certains
ont des notions raisonnables d'algorithmique, d'autre pas. Je me retrouve
quand meme a devoir expliquer des trucs tel que le parcours d'un tableau
pour y retrouver un element...)
Avatar
candide
Marc Boyer a écrit :


Mais comme tu le disais, ça dépend si on peut s'appuyer sur une
connaissance des étudiants de ce qu'est la mémoire.
Si ça n'a pas été fait, faut en faire un peu.
C'est plus facile d'enseigner le C après 30h d'architecure des
ordinateurs.



Tu veux dire de t'appuyer sur des connaissances d'architecture pour enseigner le
C ? Ça se discute, disons que ça dépend de ton objectif mais en ce qui concerne
mes propres apprentissages, j'essaye d'éviter les empilements. Mais il est tout
à fait possible de s'en passer. La mémoire est une abstraction et elle peut
rester telle quand on enseigne le C. Probablement que dans des usages avancés
voire spécialisés, des connaissances d'archi (et d'assembleur) peuvent être
instructives voire utiles. Un dégogueur utilisé comme un VCR (arrêt sur image,
avance rapide, etc) est un bon outil pédagogique, ça fait vivre un programme,
dommage que les interfaces soient un peu austères (même DDD).



Nous, on faisait le contraire. On leur donnait la spec de strcpy, et
on demandait de le coder, en précisant bien que c'était pour l'exercice,



Exact, c'est à peu près à quoi on passe son temps et c'est très ingrat car il
n'est pas du tout évident quand on part de zéro d'arriver à un code bien ciselé
comme celui d'un Plauger ou de K&R. Moi ça m'amusait mais les étudiants, en
majorité, ça les fait ch** très rapidement. Déjà, ils se disent "à quoi bon
coder un truc qui existe déjà et qui marche très bien ?"
Avatar
candide
Marc Espie a écrit :

de "cours cours" ou avec TD et TP ?



Cours-cours,




Madre mia ! Vous leur faites 30 heures de cours sans le moindre TP ?????
J'espère pour eux que tu fais tes cours sur video-projecteur avec gcc dans tes
valises.

Et quand compilent-ils eux-mêmes avec leurs petits doigts un hello word! ?


Je me retrouve
quand meme a devoir expliquer des trucs tel que le parcours d'un tableau
pour y retrouver un element...)



J'étais très grand débutant il n'y a pas si longtemps et ça n'a rien d'immédiat
d'écrire et même de ré-écrire un code qui fasse cela. Pas évident d'apprendre à
marcher ;) !
Avatar
-ed-
On 13 sep, 13:17, candide wrote:
C'est quoi la question _précise_ ? Si c'est afficher la succession des éléments
d'un tableau d'entiers dont la longueur est donnée en paramètre de la fonction,
aucun problème (et tu le sais bien, cf. ton post de 10:57) :

#include <stdio.h>

void afficher(int t[], int n)
{



Pas l'ombre d'un pointeur ici, c'est complètement transparent pour l'ut ilisateur



Euh, 't' est très précisément un pointeur, même si la syntaxe int t []
est différente de int *t, la finalité est la même... En tout cas, t
*n'est pas* un tableau...
Avatar
Marc Boyer
Le 14-09-2009, candide a écrit :
Marc Boyer a écrit :


Mais comme tu le disais, ça dépend si on peut s'appuyer sur une
connaissance des étudiants de ce qu'est la mémoire.
Si ça n'a pas été fait, faut en faire un peu.
C'est plus facile d'enseigner le C après 30h d'architecure des
ordinateurs.



Tu veux dire de t'appuyer sur des connaissances d'architecture pour
enseigner le C ?



Tout à fait. Un type qui code quotidiennenent en assembleur va très vite
passer au C (même s'il ralera sûtrement sur pleins de trucs qu'il ne peut
plus faire...). D'ailleurs, le C a été inventé par des gens qui codaient
en ASM pour faire un boulot qui devait se faire en ASM.

Ça se discute, disons que ça dépend de ton objectif mais en ce qui concerne
mes propres apprentissages, j'essaye d'éviter les empilements.



Je ne pense pas que ce soit vrai: on apprécise toujours de pouvoir faire
des liens entre connaissances, et ces liens (sous réserve qu'ils soient
vrais), confortent les apprentissage.

Mais il est tout à fait possible de s'en passer.



Oui, je l'ai fait.

La mémoire est une abstraction et elle peut rester telle quand on
enseigne le C.



Mais il faut présenter cette abstration, l'enseigner.

Probablement que dans des usages avancés
voire spécialisés, des connaissances d'archi (et d'assembleur) peuvent être
instructives voire utiles.



Pas besoin d'aller bien loin. Tiens, retourner un pointeur sur
une variable locale de fonction, et manipuler cette valeur...

Nous, on faisait le contraire. On leur donnait la spec de strcpy, et
on demandait de le coder, en précisant bien que c'était pour l'exercice,



Exact, c'est à peu près à quoi on passe son temps et c'est très ingrat car il
n'est pas du tout évident quand on part de zéro d'arriver à un code bien ciselé
comme celui d'un Plauger ou de K&R. Moi ça m'amusait mais les étudiants, en
majorité, ça les fait ch** très rapidement. Déjà, ils se disent "à quoi bon
coder un truc qui existe déjà et qui marche très bien ?"



Et oui. Pourquoi faire des gammes sur un piano ? De toute façon, c'est une
spécificité de l'informatique et de sa copie facile: quelque soit le sujet
que l'on puisse imaginer pour un exercice de TD/TP (ie réalisable en 1-3h),
il en existe déjà au moins 50 implantations sur Google...

Ceci dit, j'ai jamais entendu un élève se plaindre de devoir dériver
une fonction cos( x^2 ) / x sous prétexte que quelqu'un a déjà du le
faire avant...

Marc Boyer
--
En prenant aux 10% des francais les plus riches 12% de leurs revenus,
on pourrait doubler les revenus des 10% les plus pauvres.
http://www.inegalites.fr/spip.php?article1&id_mot0
Avatar
Marc Boyer
Le 14-09-2009, candide a écrit :
Marc Espie a écrit :

Un truc qui n'aide vraiment pas, c'est la pedagogie tres universitaire de
style "il n'existe rien en dehors du cours, reinventez la roue a chaque
fois". Il est clair que faire du C avec rien, c'est super-chiant. Tout le
monde utilise des bibliotheques (ou fabrique ses propres bibliotheques et
s'en sert), mais voila, on donne des exemples aux etudiants sans bibliotheque,
ou on leur montre des "faux" fragments de code inventes pour le cours.



Absolument, l'enseignement du C est complètement désincarné, c'est super
décourageant, on souffre (parce que la culture du C est intégriste
pousse-au-crime) à coder des algorithmes triviaux. Les étudiants arrivent en L3
et ils n'ont jamais travaillé avec une autre bibliothèque que la lib standard.
On devrait leur proposer d'utiliser une bibliothèque comme ncurses ou la SDL ou
Allegro.



Tu va au devant de 3 problèmes avec les biblo graphiques:
- d'abord, t'es obligé de présenter des "commandes magiques" pour que
ça marche (genre #include <titi.h> + compilation avec -I /usr/lib...),
te les faire installer sur les machines (et les universités sont pas
toutes riches en ingé système), et devoir déboguer des usages bizares
de la lib que tu n'avais pas imaginé
- un bon nombre d'étudiants passent leur temps à vouloir changer la
couleur de fond, la fonte, et passent à côté de l'objectif de
l'enseignement,
- les bibliothèques d'IHM fonctionnent sur une prog évenementielle
(ce qu'on appelait "callback"), qui demande encore du temps de
présentation.

Moi je devais faire un enseignement d'expérimentations algorithmiques en L2 avec
TP en C (je l'ai pratiqué une année) et ce semestre, je vais laisser tomber le C
et le remplacer par Python (que les étudiants ne connaissent pas !) et je suis à
peu près persuadé qu'on ira beaucoup plus loin qu'avec du C et que les étudiants
se sentiront davantage capables.



Ca, en 2009, baser un cours d'algorithmique sur le C me semble un bien mauvais
choix. Enseigner le C ne se justifie que si on considère le C comme un langage
dans le domaine professionnel de la formation.

Marc Boyer
--
En prenant aux 10% des francais les plus riches 12% de leurs revenus,
on pourrait doubler les revenus des 10% les plus pauvres.
http://www.inegalites.fr/spip.php?article1&id_mot0