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
Marc Boyer
Le 15-09-2009, a écrit :
On 14 sep, 13:31, Gabriel Dos Reis wrote:
(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.


Je me considère comme autodidacte en effet j'ai reçu une formation en
comptabilité à distance et de fait, je pense être devenu autodidacte
pour apprendre en programmer en C. Je voudrais comprendre ce langage
pour passer à d'autres langages. Je crois comprendre que python, c++,
java...sont écrit en C, alors comprendre le C même si ça demande
beaucoup de temps doit en valoir la peine...



Non, absolument pas.
Il faut des soudures pour construire un véhicule, et savoir souder
n'a jamais aidé savoir conduire.
Que python et Java soient codés en C (ce dont je ne suis même
pas sur), serait lié à des qualités de C qui n'ont rien à voir
avec celles de python et Java (bien au contraire même).

De fait, je ne sais pas si apprendre par coeur est un avantage.



Absolument pas. Il faut pratiquer ce que l'on apprend, et retenir
par la pratique.

En fait, dans le langage C, aujourd'hui ce qui me pose le plus de
difficulté, c'est la portabilité entre Windows et Linux et les modes
de saisie utilisateur ou autre avec scanf, frets, getchar...et les
caractères de 'n' et autres.



On retrouve ce que disait Candide sur les débutants qui perdent
du temps avec les saisies.
Tu vas perdre un temps fou avec des détails. Là n'est pas
l'important pour le moment.

Ceci dit, les pages d'annexe du K&R expliquent relativement bien
le fonctionnement de ces choses, qu'il faut ensuite pratiquer,
essayer, etc.

C'est vrai que je n'ai pas encore mis
complètement un pied dans les pointeurs ni une grande maîtrise des
fonctions.



Ca me semble pourtant bien plus utile.

Mais comment se fait-il qu'une simple saisie sur un clavier puisse
fonctionner sous Windows et donner une boucle d'erreurs sans fin sous
Linux ou inversement?



Pour pleins de raisons.
Si ça t'intéresse, lance un post avec u sujet adéquat et un code
qui précise ton problème.

J'ai 2 idées sur la question :

1° le passage d'une norme à une autre ne rend pas les choses faciles
entre les systèmes qui évoluent, mais pas au même moment que les
organismes de normalisation, d'où des décalages de comportements entre
les OS ....



La norme C89, elle commence à être connue...

Alors je dois encore me trouver un livre dans ce domaine?



Ca ne peut pas faire de mal, mais on peut comprendre les E/S
en C sans avoir lu 500 pages sur l'archi des ordis.

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
ld
On 14 sep, 22:22, Gabriel Dos Reis wrote:
ld writes:

[...]

| > et que j'ai passe bien trop
| > longtemps a me battre avec des trucs qui devraient compiler, mais qui ne
| > compilent pas, parce qu'ils redefinissent une macro au fond d'un ente te
| > de bibliotheque, mais l'entete entre en conflit avec un autre entete.
|
| Le preprocesseur est bien souvent le bouc emissaire d'un mal plus
| profond.

« Furthermore, I would like to abolish CPP. »



Tu veux abolir le CPlusPlus ;-)

a+, ld.
Avatar
Gabriel Dos Reis
Marc Boyer writes:

| Le 14-09-2009, Gabriel Dos Reis a écrit :
| > Je trouve que
| >
| > struct mpz_internal {
| > // ...
| > };
| >
| > typedef struct mpz_internal mpz_t[1];
| >
| > permet d'écrire des fonctions qui simulent très bien le passage par
| > réference const, e.e.
| >
| > mpz_t mpz_negate(const mpz_t);
| >
| > (et cela marche presque très bien pour des composantes
| > qui sont à l'intersection de C ou C++).
|
| Oui, c'est joli, mais est-ce bien recommandable ?

Pour une certaine catégorie de programmeur, oui.

| Tout variable est un tableau de taille 1. Mais est-ce
| vraiment raisonnable ?

Je ne comprends pas ton affirmation.

| En plus, dans ton exemple, on retourne un tableau, il
| me semble, et c'est pas trop permis en C il me semble.

Oops, le resultat doit etre en passer en parametre non-const -- desole
pour la hate.

| Mais bon, ça permet de retrouver Java: à part int,
| float, bool et leurs copains, tout est référence...

Cela permet de s'en sortir pour un certain nombre de chose.
En realite, l'exemple est tire de GMP -- tu peux regarder les source.

-- Gaby
Avatar
Gabriel Dos Reis
Marc Boyer writes:


[...]

| > Il est presque illusoire de prétendre former quelqu'un à la
| > programmation si cette personne ne consent passer qu'au plus 30h.
|
| En fait, le programme de prog complet s'était:
| Algo/Pascal : 17h cours + 17h TD + 17h TP + 17h Projet
| C : 9h cours + 17h TD + 20h TP + 30h Projet
| Java/POO : 17h cours + 14h TD + 14h TP + 20h Projet
|
| Avec un cours par semestre en gros.
|
| On est à bien plus de 30h. Ca fait 200h à l'emplois du temps.
| Il y a une centaine d'heure réparties sur les 3 projets que
| les étudiants font en plus des heures à l'emplois du temps.

Oui ; je ne suis pas le seul prof qui leur donne des projets.

|
| > La première chose que je fais le au premier cours est de présenter le
| > « syllabus »
| >
| > http://courses.cs.tamu.edu/gdr/2009.fall-315/syllabus.pdf
|
| J'ai lu ça, t'a donné la ref dans un autre post.
| Je viens de lire aussi "programming in an undergraduate CS curriculum"
| de BS que tu avais mentionné.
| J'ai du mal à comparer, car il parle en semaines, mais en gros, il
| a 12 semaines et une vingtaine de "lectures" pour faire ce que nous
| faisions en Algo/Pascal. Et il reconnait "this material is very extensive
| for a first course".

Oui ; on a observe que si le prof n'est pas raisonnablement ambitieux
avec les eleves, ces derniers montrent peu de motivation.

|
| Après, ton cours de C, tu as une vingtaine de "lecture", autant
| de TD (j'ai oublié le terme exact) et plus de 10h de travail perso
| par semaine, pendant combien de semaines ?

Oui (legerement un peu moins pour les TDs.)
On commence fin Aout, et les cours s'arretent juste apres Thanksgiving.
Mais, j'annulerai certains cours (pour cause de voyages).

| > C'est une sorte de contrat : en fait, ce semestre-ci, le premier cours
| > n'était que ça. Ils savent ce que j'attends d'eux et ils savent quoi
| > attendre de moi. S'ils ne sont pas d'accord, ils ne reviennent pas
| > (ils ont en général quelques jours < 5 pour se désinscrire).
| > Si je les vois la semaine d'après, c'est qu'ils ont accepté le contrat.
|
| De loin, ça a l'air bien.
| Tu cherches un chargé de TD ? ;-)

:-)

-- Gaby
Avatar
Gabriel Dos Reis
Richard Delorme writes:

| Le 15/09/2009 08:50, Gabriel Dos Reis a écrit :
| > Richard Delorme writes:
| >
| > | Le 14/09/2009 23:04, Gabriel Dos Reis a écrit :
| > |
| > |>
| > |> | C'est un idiome de style:
| > |> |
| > |> | void
| > |> | f(T a, T b, FILE *c)
| > |> | {
| > |> | /* je fais des trucs avec a et b */
| > |> | /* g, elle, utilisera c */
| > |> | g(a, b, c);
| > |> | }
| > |> |
| > |> | sauf semantique invraisemblable, j'ai generalement le droit de faire ce
| > |> | genre de chose, et pas de necessite imperieuse de savoir ce qui se cache
| > |> | derriere c...
| > |> |
| > |> | ... mais je dois inclure<stdio.h> pour que ca fonctionne...
| > |>
| > |> Comment ce code serait-il allégé sans l'inclusion de<stdio.h> ?
| > |
| > | Ce qui serait allégé est le temps de compilation.
| >
| > Maintenant, nous ne parlons plus de code allégé, mais de la lenteur d'un
| > certain compilateur sur un certain système.
|
| Pour un compilateur donné, moins il y a de code, plus ça compile vite.

???

J'ai travaille en 2003-2006 sur un compilateur qui venait charge de
certains entetes deja pre-compiles. Cela ne change rien (pour la
vitesse) que tu les inclus ou pas.

Les compilateurs sont plus varies qu'on ne voudrait des fois l'imaginer.

|
| > | On peut légitimement penser que :
| > |
| > | struct file_t;
| >
| > Pour moi, l'abstraction derrière « FILE* » n'est pas sous le control de
| > l'utilisateur, et ce dernier n'a aucune raison de vouloir la dupliquer.
|
| file_t pourrait rester une structure opaque, ce qui en ferait un type
| abstrait non contrôlable par l'utilisateur. Bref ça changerait peu la
| situation actuelle, sauf la possibilité d'éviter l'inclusion de
| <stdio.h>

pouvoir voudrais-tu insister que FILE soit une structure?

| > Si on a mesuré que l'inclusion de<stdio.h> est *réellement* un
| > facteur déterminant dans un projet, alors on devrait légitement
| > demander aux auteurs du dit compilateur de s'occuper de la performance
| > du compilateur -- car cela m'étonnerait que le goulot d'étranglement
| > soit pour<stdio.h> et nettement moins pour d'autres combinaisons
| > d'entêtes, et ceci de manière déterminante pour le projet.
|
| <stdio.h> ici n'est qu'un exemple, et sans doute pas le meilleur. Bien
| sûr les compilateurs ont leur part de responsabilité dans le temps de
| compilation, et il existe des techniques bien connues (en-têtes
| précompilés par exemple) pour accélérer leur performance. Néanmoins je
| pense que les programmeurs ont aussi leur part de responsabilité et il
| est souvent possible de fournir, à fonctionnalité équivalente, un code
| plus rapide à compiler.

La premiere responsabilite du programmeur devrait d'etre d'ecrire des
programmes simples et corrects. C'est deja suffisamment dur comme cela.
C'est non-professionnel de chercher des elaborations sur des details
imagines sans evidence d'impactes reels.

-- Gaby
Avatar
Marc Boyer
Le 15-09-2009, Gabriel Dos Reis a écrit :
Marc Boyer writes:
|
| > La première chose que je fais le au premier cours est de présenter le
| > « syllabus »
| >
| > http://courses.cs.tamu.edu/gdr/2009.fall-315/syllabus.pdf
|
| J'ai lu ça, t'a donné la ref dans un autre post.
| Je viens de lire aussi "programming in an undergraduate CS curriculum"
| de BS que tu avais mentionné.
| J'ai du mal à comparer, car il parle en semaines, mais en gros, il
| a 12 semaines et une vingtaine de "lectures" pour faire ce que nous
| faisions en Algo/Pascal. Et il reconnait "this material is very extensive
| for a first course".

Oui ; on a observe que si le prof n'est pas raisonnablement ambitieux
avec les eleves, ces derniers montrent peu de motivation.



J'étais aussi un enseignant ambitieux. Au final, j'étais
plutot content du résultat. Quand aux étudiants, il fallait qu'ils
aillent coder en stage pour revenir en disant "oui, c'était utile".
Entre la fin du cours et la fin du stage, j'étais plutôt considéré
comme un peu pénible...

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 15-09-2009, Gabriel Dos Reis a écrit :
Marc Boyer writes:
| Le 14-09-2009, Gabriel Dos Reis a écrit :
| > Je trouve que
| >
| > struct mpz_internal {
| > // ...
| > };
| >
| > typedef struct mpz_internal mpz_t[1];
| >
| > permet d'écrire des fonctions qui simulent très bien le passage par
| > réference const, e.e.
| >
| > mpz_t mpz_negate(const mpz_t);
| >
| > (et cela marche presque très bien pour des composantes
| > qui sont à l'intersection de C ou C++).
|
| Oui, c'est joli, mais est-ce bien recommandable ?

Pour une certaine catégorie de programmeur, oui.



D'accord.

| En plus, dans ton exemple, on retourne un tableau, il
| me semble, et c'est pas trop permis en C il me semble.

Oops, le resultat doit etre en passer en parametre non-const -- desole
pour la hate.



Je me demandais ce que j'avais raté.

| Mais bon, ça permet de retrouver Java: à part int,
| float, bool et leurs copains, tout est référence...

Cela permet de s'en sortir pour un certain nombre de chose.
En realite, l'exemple est tire de GMP -- tu peux regarder les source.



Je te crois.

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
Gabriel Dos Reis
Marc Boyer writes:

| Le 15-09-2009, Gabriel Dos Reis a écrit :
| > Marc Boyer writes:
| >|
| >| > La première chose que je fais le au premier cours est de présenter le
| >| > « syllabus »
| >| >
| >| > http://courses.cs.tamu.edu/gdr/2009.fall-315/syllabus.pdf
| >|
| >| J'ai lu ça, t'a donné la ref dans un autre post.
| >| Je viens de lire aussi "programming in an undergraduate CS curriculum"
| >| de BS que tu avais mentionné.
| >| J'ai du mal à comparer, car il parle en semaines, mais en gros, il
| >| a 12 semaines et une vingtaine de "lectures" pour faire ce que nous
| >| faisions en Algo/Pascal. Et il reconnait "this material is very extensive
| >| for a first course".
| >
| > Oui ; on a observe que si le prof n'est pas raisonnablement ambitieux
| > avec les eleves, ces derniers montrent peu de motivation.
|
| J'étais aussi un enseignant ambitieux. Au final, j'étais
| plutot content du résultat. Quand aux étudiants, il fallait qu'ils
| aillent coder en stage pour revenir en disant "oui, c'était utile".

oui, il faut qu'ils ecrivent beaucoup de programmes pour apprecier ce
que le prof leur dit.

Je trouve qu'un sportif debutant qui rechigne la pratique est un
danger pour son equipe ; je ne suis pas loin de penser quelque chose de
similaire en ce qui concerne un programmeur debutant.

| Entre la fin du cours et la fin du stage, j'étais plutôt considéré
| comme un peu pénible...

Ici, meme certains se plaignent que je demande un certain volume horaire
de travail grosso modo, ils sont contents que cela leur serve.

-- Gaby
Avatar
espie
In article <h8o2a1$9a6$,
Marc Boyer wrote:
Le 14-09-2009, Gabriel Dos Reis a écrit :
Je trouve que

struct mpz_internal {
// ...
};

typedef struct mpz_internal mpz_t[1];

permet d'écrire des fonctions qui simulent très bien le passage par
réference const, e.e.

mpz_t mpz_negate(const mpz_t);

(et cela marche presque très bien pour des composantes
qui sont à l'intersection de C ou C++).



Oui, c'est joli, mais est-ce bien recommandable ?
Tout variable est un tableau de taille 1. Mais est-ce
vraiment raisonnable ?



Vu le nom choisi dans l'exemple, qui n'est pas tres anodin, non ca n'est
pas issu d'un logiciel tres recommendable. ;-)
Avatar
-ed-
On 14 sep, 13:25, candide wrote:
-ed- a écrit :

> Euh, 't' est très précisément un pointeur, même si la syntaxe i nt 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.



C'est clairement une erreur.du K&R. s n'est pas un tableau. Ce n'est
pas corrigé dans l'errata ?