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
David Remacle
Marc Boyer a écrit :


C'est en effet un problème: dans une promo classique,
il y a 20% qui comprend du premier coup (et à du mal à
comprendre que les autres puissent ne pas comprendre),
et les autres.
Que fait-on des autres ?

Marc Boyer



Comme dans beaucoup de cas... on les laisse tomber...
Avatar
Marc Boyer
Le 11-09-2009, David Remacle a écrit :
Marc Boyer a écrit :


C'est en effet un problème: dans une promo classique,
il y a 20% qui comprend du premier coup (et à du mal à
comprendre que les autres puissent ne pas comprendre),
et les autres.
Que fait-on des autres ?



Comme dans beaucoup de cas... on les laisse tomber...



C'était pas comme ça que je voyais mon metier d'enseignant,
mais c'est plus simple en effet.

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
bpascal123
> >>    Que fait-on des autres ?



ILS NE PERDENT PAS DE TEMPS AVEC DES TRUCS INUTILES : below :


...en bref, de l'utilité d'apprendre les pointeurs ?



Pour les pointeurs, avec mon niveau, je ne comprends pas toujours leur
utilité pour des programmes où les valeurs sont affectées directement
aux variables.



C'est ça que je veux exprimer quand je parle de la présence de
pointeurs ou non en C. Et je n'imagine pas un programme informatique
sans variables. A mes yeux, un pointeur c'est une variable précédée
par *., pas autre chose. Si on approfondi le concept, ok une variable
en c est un pointeur mais mes connaissances sont limitées. Les
variables dans les autres langages sont-elles également des pointeurs?
Si pointeurs il y a.


Pourquoi faire compliquer quand on peut faire simple :

Pour illustration :



int n ;

int T[n] ;

...

printf("Element %d : ", cnt++) ;

scanf("%d", &*(T+i) ) ;

...



ou :



int n ;

int T[n] ;

...

printf("Element %d : ", cnt++) ;

scanf("%d", &T[i]) ;

...




C'est exactement la même chose, non?



Maintenant je comprends que si on déclare



int n ;

int T[n] ;

int *ptr = T;



...scanf peut devenir :



scanf("%d", ptr++) ;



Mais je ne vois toujours pas l'utilité de ptr++ sauf qu'il y a moins
de combinaisons avec les touches du clavier...



Cependant, je peux me dire que c'est utile pour ce genre de choses que
j'ai compris au bout de 2 mois au hasard d'une page web :



int n ;

int T[n] ;

int *ptr = T;

int m ;

int U[m] ;

int *ptr2 = U ;

...

while (*ptr2++ = *ptr++) ;



=>while copie les éléments de T vers U comme si on traduit un poème
classique en message sms dans un forum 12-25 ans. Cette petite astuce
ne peut pas se faire avec des variables sans * ? Je veux pas m'avancer
et dire sans pointeurs car à chaque fois on me reprend pour me
marteler qu'en c chaque variable est un pointeur.



while (T[n])

U[m++] = T[n++] ;



revient au même résultat?


Alors pour du code de ce niveau, pourquoi utiliser des variables de
variables ???

Pascal
Avatar
espie
In article <h8di13$tba$,
Marc Boyer wrote:
Le 11-09-2009, Stephane Legras-Decussy a écrit :

a écrit dans le message de news:

Seulement, je me demande à partir de quand on commence à travailler
avec une interface graphique plutôt que le terminal?



après etre à l'aise avec fonctions et pointeurs...

le débutant a peur des pointeurs, je ne sais
pas pourquoi...



J'ai aussi du mal à comprendre. Encore que parfois...

il n'y a rien de compliqué, il suffit d'un seul exemple
pour comprendre, c'est la fonction qui échange
2 nombres... j'ai compris les pointeurs en 1 heure
ya 20 ans avec ça...



C'est en effet un problème: dans une promo classique,
il y a 20% qui comprend du premier coup (et à du mal à
comprendre que les autres puissent ne pas comprendre),
et les autres.
Que fait-on des autres ?



Les pointeurs, c'est simple. C'est la gestion de la memoire qui est compliquee.
Si tu expliques correctement comment ca marche, ca va mieux.

Apres, il y a les problemes d'indirection multiple. Le fait qu'en C, tout est
passe par valeur, ca n'aide pas forcement. Il faut parfois faire la distinction
entre ce qui se passe, et pourquoi on fait les choses. Par exemple,

void f(int *a);

et
void g(int b[]);

sont strictement equivalents, mais peut-etre qu'on utilise la premiere pour
faire f(&i) et la deuxieme pour g(t)...

D'ou une difference d'intention, meme si les mecanismes reels sont
identiques.

J'ai vu pas mal de variantes de debutants paumes.

- il y a ceux qui n'essaient pas de comprendre, programmation technique
Shadock, ca finira bien par marcher. Souvent issu du Java, ou le langage
est suffisamment gentil pour les laisser survivre.
- il y a ceux qui ont compris les pointeurs, mais pas la memoire, et qui
du coup, declarent des pointeurs, mais oublient d'allouer de la memoire.
- il y a ceux qui ont a peu compris, mais ont des soucis avec les
indirections, et qui t'ecrivent du f(int ****a); et qui ont du mal avec
les messages d'erreur du compilo.
- il y a ceux qui ont compris comment ca marche, mais pas a quoi ca sert.
Vu la tonne d'idiomes existants en C, faut leur fourguer des exemples
raisonnables en pagaille.
- et puis tous ceux qui n'ont pas eu "le declic". On ne sait pas s'ils
l'auront un jour, mais pour l'instant, ils ne savent pas programmer, et
tout ce qu'ils font, c'est trouver l'exemple qui ressemble le plus a ce
qu'ils veulent faire, et esperent que ca va marcher.

Rien qu'avec cette nomenclature, on a quelques remedes... les deux cas qui
m'embetent le plus sont les premieres et dernieres categories: motiver avec
le baton ne fonctionne que tres mal. Pour le dernier cas, je ne connais
aucune solution, a part exemples, exercices et encore exemples en esperant
que ca finisse par se debloquer. Sans doute un manque notable d'empathie de
ma part, etant tombe dans la marmitte quand j'etais petit.
Avatar
Marc Boyer
Le 11-09-2009, a écrit :

>>    Que fait-on des autres ?



ILS NE PERDENT PAS DE TEMPS AVEC DES TRUCS INUTILES : below :

...en bref, de l'utilité d'apprendre les pointeurs ?

Pour les pointeurs, avec mon niveau, je ne comprends pas toujours leur
utilité pour des programmes où les valeurs sont affectées directement
aux variables.



Les pointeurs sont incontournables (ou très difficilement
contournable) pour:
1) avoir un mode in/out dans les fonctions/sous-programme C
2) partager des donnée entre différentes parties du programme
(genre maintenir une sequence triée par nom *et* par ID)
3) manipuler efficacement de grosses données
4) utiliser des données dont on ne connait pas le nombre
à la compilation

C'est ça que je veux exprimer quand je parle de la présence de
pointeurs ou non en C. Et je n'imagine pas un programme informatique
sans variables. A mes yeux, un pointeur c'est une variable précédée
par *., pas autre chose.



Non, car deux pointeur peuvent partager la même variable.

Si on approfondi le concept, ok une variable
en c est un pointeur mais mes connaissances sont limitées. Les
variables dans les autres langages sont-elles également des pointeurs?



Oui ou non. Ce dépend.

Pourquoi faire compliquer quand on peut faire simple :



Parce qu'on ne peut pas faire autrement.

Pour illustration :



int n ;
int T[n] ;


C99 uniquement !
scanf("%d", &*(T+i) ) ;



De l'art de faire compliqué.

Cependant, je peux me dire que c'est utile pour ce genre de choses que
j'ai compris au bout de 2 mois au hasard d'une page web :


int n ;

int T[n] ;

int *ptr = T;

int m ;

int U[m] ;

int *ptr2 = U ;

while (*ptr2++ = *ptr++) ;



Sans intérêt aucun justement (hormis de faire ouvrir des
grands yeux aux débutants, et peut-être d'aider des compilos
il fut un temps).

=>while copie les éléments de T vers U comme si on traduit un poème
classique en message sms dans un forum 12-25 ans. Cette petite astuce
ne peut pas se faire avec des variables sans * ?



int i;
for (i=0 ; T[i] != 0 ; i++ ) {
U[i]= T[i];
}
U[i]= T[i];

Alors pour du code de ce niveau, pourquoi utiliser des variables de
variables ???



Parce que dans la vraie vie, on passe des paramètres à modifier
aux programmes, on alloue dynamiquement des variables dont on ne
connait pas le nombre à la compilation, on partage des variables
entre différentes structure, on trie de grosses données, et je ne
parle même pas des pointeurs de fonctions.

Mais en effet, on peut faire les 30-50 premières heures de programmation
sans faire de pointeur.

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 11-09-2009, Marc Espie a écrit :
In article <h8di13$tba$,
Marc Boyer wrote:
Le 11-09-2009, Stephane Legras-Decussy a écrit :

après etre à l'aise avec fonctions et pointeurs...

le débutant a peur des pointeurs, je ne sais
pas pourquoi...



J'ai aussi du mal à comprendre. Encore que parfois...

il n'y a rien de compliqué, il suffit d'un seul exemple
pour comprendre, c'est la fonction qui échange
2 nombres... j'ai compris les pointeurs en 1 heure
ya 20 ans avec ça...



C'est en effet un problème: dans une promo classique,
il y a 20% qui comprend du premier coup (et à du mal à
comprendre que les autres puissent ne pas comprendre),
et les autres.
Que fait-on des autres ?



Les pointeurs, c'est simple. C'est la gestion de la memoire qui est compliquee.
Si tu expliques correctement comment ca marche, ca va mieux.



Voui, mais ça prend plus d'une heure.

Apres, il y a les problemes d'indirection multiple. Le fait qu'en C, tout est
passe par valeur, ca n'aide pas forcement. Il faut parfois faire la distinction
entre ce qui se passe, et pourquoi on fait les choses. Par exemple,

void f(int *a);
et
void g(int b[]);

sont strictement equivalents, mais peut-etre qu'on utilise la premiere pour
faire f(&i) et la deuxieme pour g(t)...



Voui, la conversion implicite tableau -> ptr...

J'ai vu pas mal de variantes de debutants paumes.

- il y a ceux qui n'essaient pas de comprendre, programmation technique
Shadock, ca finira bien par marcher. Souvent issu du Java, ou le langage
est suffisamment gentil pour les laisser survivre.
- il y a ceux qui ont compris les pointeurs, mais pas la memoire, et qui
du coup, declarent des pointeurs, mais oublient d'allouer de la memoire.
- il y a ceux qui ont a peu compris, mais ont des soucis avec les
indirections, et qui t'ecrivent du f(int ****a); et qui ont du mal avec
les messages d'erreur du compilo.
- il y a ceux qui ont compris comment ca marche, mais pas a quoi ca sert.
Vu la tonne d'idiomes existants en C, faut leur fourguer des exemples
raisonnables en pagaille.
- et puis tous ceux qui n'ont pas eu "le declic". On ne sait pas s'ils
l'auront un jour, mais pour l'instant, ils ne savent pas programmer, et
tout ce qu'ils font, c'est trouver l'exemple qui ressemble le plus a ce
qu'ils veulent faire, et esperent que ca va marcher.

Rien qu'avec cette nomenclature, on a quelques remedes... les deux cas qui
m'embetent le plus sont les premieres et dernieres categories: motiver avec
le baton ne fonctionne que tres mal. Pour le dernier cas, je ne connais
aucune solution, a part exemples, exercices et encore exemples en esperant
que ca finisse par se debloquer.



Oui, avec 5-6 TD + 5-6 TP, les étudiants qui bossent y arrivent. Après, ceux
qui regardent de loin et se disent "ça va aller", oui, ils pleurent un peu
en projet...
Mais bon, ça plus le cours, ca fait une vingtaine d'heures pour arriver
à ammener toutes les bonnes volontés. Et oui, il y a la minorité qui a compris
la première heure qui trouve ça un peu long.

Non, le truc vraiment despespérant, c'est quand un étudiant s'acroche, que
tu l'aides, qu'il a le déclic, super content, et que 4 semaines après, en
projet, il refait les même bourdes...
Comprendre *et* s'en souvenir...

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
David Remacle a écrit :


Comme dans beaucoup de cas... on les laisse tomber...





dans la Garonne ... ;)
Avatar
Gabriel Dos Reis
candide writes:

[...]

| Que tu dises qu'il faille arrêter _la programmation en C_, ça p ourrait se
| discuter mais là tu y vas un peu fort là, je connais pas mal d' informaticiens
| qui n'ont pas vraiment compris les pointeurs

tu parles d'informaticiens auto-proclamés ?

Mais tu as raison qu'ailleurs, ils n'appellent pas ça « pointer » -- ils
disent « objet » ou « référence ». Et du cou p ça change tout. Comme
quoi, l'habit fait le moine.

-- Gaby
Avatar
Gabriel Dos Reis
Marc Boyer writes:

[...]

| Que fait-on des autres ?

Ils touïttent.

-- Gaby
Avatar
Gabriel Dos Reis
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.

-- Gaby