OVH Cloud OVH Cloud

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
Pierre Maurette
candide, le 14/09/2009 a écrit :

[...]

Un dégogueur utilisé comme un VCR
(arrêt sur image, avance rapide, etc)



Le pas à pas en arrière est rare, bien que ça existe, sur un petit
nombre d'instructions s'entend. Mais pas dans gdb sous archi Intel sauf
erreur de ma part.

est un bon outil pédagogique, ça fait
vivre un programme, dommage que les interfaces soient un peu austères (même
DDD).



Eclipse - CDT a une perspective Debug tout à fait convenable. Le
problème sous Windows 64bit est de faire fonctionner gdb. Modification
et compilation nécessaire.


--
Pierre Maurette
Avatar
espie
In article <4aae1943$0$25120$,
candide wrote:
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).



Je suis un peu pessimiste sur le coup. Ce que tu decris ne marche pas avec
toutes les populations d'etudiants. Pour que la memoire reste une abstraction,
il faut qu'ils aient de bonnes capacites d'abstraction, justement. Meme
avec toute la bonne volonte du monde, j'ai toujours un mal fou a faire
rentrer la notion de portabilite. La notion d'undefined behavior est tres
difficile a integrer.

L'exemple standard, c'est les etudiants qui ne tapent pas le -O2 -Wall du gcc
(parce que c'est trop long) et qui me pondent du code qui "tombe en marche"
(grace a la superbe idee de gcc d'initialiser a 0 les variables locales
en -O0), et a qui j'ai un mal fou a expliquer que leur programme est buggue
jusqu'a l'os...

Donc, j'ai du code buggue, et des questions, et je suis bien oblige d'expliquer
que le code "tape" a cote, ce qu'une fonction avec pas le bon nombre de
parametres va faire, et tout et tout. En fait, c'est tres dommage que,
sur les compilo modernes, le mode par defaut ne soit pas hyper-strict.
Genre -Wall -O1 -Werror... mais pour ca, faudrait que gcc sache reconnaitre
les faux positifs, et separer les "warnings" des "warnings qui devaient
etre des erreurs" dans 100% des cas, quitte a etre biaise dans le sens
"laisser passer des warnings", mais bon.
Avatar
espie
In article <4aae1b2a$0$32766$,
candide wrote:
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.



Si, ils passent quand meme quelques heures en salle machine avec moi derriere,
pour les lancer (genre 3 ou 6h), mais pour le reste, c'est a eux d'essayer
de faire des trucs et de revenir avec des questions au cours suivant.

Faut dire que j'ai suffisamment d'experience pour pouvoir t'inventer
du listing sans faute au tableau. Comme tu as pu le voir ici, il y a des
points obscurs du C que je ne maitrise pas sans relire la norme, mais je
n'arrive jamais jusqu'a ces points obscurs en cours. Il y a aussi des
tonnes de trucs que je peux faire sur un tableau que je ne peux pas faire
en salle machine, en vrai (montrer rapidement les diverses facons d'ecrire
la meme chose, dire lesquelles posent probleme, faire de la reecriture
automatique sur du code). Mais en general, le cours est bien la comme
reference: ils ont des pointeurs sur de la litterature externe, et des
exemples, et normalement, vers une 20aine d'heures, on arrete d'ecrire des
trucs a partir de rien, et on passe sur du code existant reel... ce qui
est toujours tres drole au depart (et je passe sur projo avec ma machine
et des listings existants).
Avatar
espie
In article <h8l7he$4rv$,
Marc Boyer wrote:
- 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 des trucs bien de l'Ecole ou je suis, c'est l'organisation de la salle
machines: il n'y a que des PC vides, sans disque. On prete/vend aux etudiants
un disque en rack, en debut d'annee, et ils sont de fait admin sur leur
machine. Le boulot de l'equipe systeme, c'est de leur fournir une
installation "decente" en image reseau (une combo linux + windows, en
l'occurrence), et apres les etudiants sont libres d'installer ce qu'ils
veulent.

Ca evite tous les problemes de latence au niveau de l'equipe systeme, meme
si les etudiants rament un peu a installer des packages supplementaires
au debut...

Evidemment, ca suppose qu'on va former des "vrais informaticiens", des gus
qui auront quelques notions d'un peu tout et qui ne seront pas completement
largues lorsqu'on leur proposera d'administrer leur propre poste.
Avatar
Gabriel Dos Reis
Marc Boyer writes:

| Le 11-09-2009, Gabriel Dos Reis a écrit :
| > Marc Boyer writes:
| >
| >| Les pointeurs sont incontournables (ou très difficilement
| >| contournable) pour:
| >
| > La majorité de ceux qui font du Java n'ont jamais entendu parler de
| > pointeurs -- ou alors, ils savent que c'est un truc sale que les gens
| > peu évolués manipulent.
|
| J'avoue que comme dans notre formation, C venait avant Java,
| je n'ai pas vraiment connu ce problème.

Ici, on a des freshmen qui arrivent avec des rudiments de Java (vraiment
des rudiments...). Pour eux, le C est un choc. Du coup, on leur
enseigne autre chose :-)

http://www.research.att.com/~bs/software.pdf


| Reste qu'on a toujours les mêmes problèmes avec les
| mêmes notions:
| - partage d'objet
| - allocation dynamique
| - durée de vie

-- Gaby
Avatar
espie
In article ,
-ed- wrote:
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'utilisateur

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...



... et ca met parfaitement en evidence *le* probleme central des
pointeurs/references, qui est le probleme d'identite des objets non
scalaires... va-t-en expliquer que les parametres sont passes par valeur
en C, sauf pour les tableaux, pour lesquels c'est special, et sans evoquer
la notion de pointeur. Des que tu as des etudiants qui veulent des
explications "precises", si tu veux absolument eviter les pointeurs, tu
te retrouves a devoir inventer des regles tres arbitraires pour expliquer
cela...
Avatar
Gabriel Dos Reis
Marc Boyer writes:

| Le 11-09-2009, Gabriel Dos Reis a écrit :
| > Marc Boyer writes:
| >
| > [...]
| >
| >| > Les pointeurs, c'est simple.
| >|
| >| Voui, mais ça prend plus d'une heure.
| >
| > Ça dépend.
| >
| > 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é).

Dans mon expérience, commencer un cours par « aujourd'hui on va aborder
un sujet difficile » ne capte l'attention de la majorité des élèves que
pendans 30 secondes.

| 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.

J'ai trouver que moviter ce qu'on va faire (le sujet du cours),
expliquer comment ces problèmes surviennent avec des exemples concrets
(mais assez simples pour tenir en 50 min ou 1h15min) a souvent beaucoup
de chances de retenir leur attention pendant un temps relativement assez
long.

-- Gaby
Avatar
candide
-ed- a écrit :
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...



Je sais bien même si ta formulation pourrait se discuter, extrait de K&R2 :


-----------------------------------------
In getline, the arguments are declared by the line

int getline(char s[], int lim);

which specifies that the first argument, s, is an array, and the second, lim, is
an integer.
-----------------------------------------



Mais la question n'est pas là, le pointeur est transparent pour l'utilisateur,
c'est tout ce qui compte. Il suffit jusque que l'utilisateur sache qu'il peut
modifier le contenu du tableau passé en paramètre depuis sa fonction, le
pourquoi du comment, on s'en fout, dans un premier temps du moins. Il me
semblait que t'avais compris la différence qu'il peut y avoir entre une
interface et une implémentation, les cordonniers ....
Avatar
Gabriel Dos Reis
Manuel Pégourié-Gonnard <mpg+ writes:

| 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.

J'évite de leur dire que « c'est facile » ou que « c'est difficile ».
Dans les deux cas, il y a de fortes chances de heurter le progrès
ou l'attention de l'une ou de l'autre. Je concentre mon temps pour
expliquer quels problèmes on essaie de résoudre et pourquoi. Souvent si
le problème est bien compris, alors la présentation de la solution est
plus facile à avaler.

-- Gaby
Avatar
Gabriel Dos Reis
(Marc Espie) writes:

[...]

| Non, par contre, comprendre ce qu'on peut faire avec, pourquoi c'est
| indispensable, montrer les idiomes vitaux aux etudiants, ca c'est
| complique.

C'est certainement compliqué, mais je crois que c'est le but d'un cours
de *programmation* en C. Le professeur peut faire l'économie de sa
terreur pendant qu'il est en train de confronter cette délicatesse :-)

-- Gaby