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

1 2 3 4 5
Avatar
-ed-
On 7 sep, 18:42, YannicK wrote:

Par contre tu as supprimé le prototypage des fonctions pour les décla rer
avant main(). Or, j'avais cru comprendre que c'était une bonne habitude
à prendre pour quand j'aurais à écrire des programmes modulaires .. .
Est-ce aussi pour un problème de respect de la norme ?



Non. C'est simplement que dans un programme 'monobloc' (un seul
fichier source), c'est inutile. Si ça ne l'est pas, c'est qu'il y a un
appel récursif entre des fonctions (volontaire ou non : a() appelle b
() qui appelle a()...). Comme les conséquences peuvent être
désastreuses, ce n'est pas un luxe d'en être prévenu... Si on sépar e
d'office tous les prototypes, comme tu l'avais fait, on ne vois pas
apparaitre ce problème potentiel.

Le prototypage séparé est par contre indispensable quand on fait de la
compilation séparée. Les prototypes sont alors placés dans un fichier
d'interface (xxx.h) qui est inclus dans le ou les fichiers
d'implémentation (xxx.c) et dans tous les fichiers qui utilisent des
définitions ou des prototypes de xxx.
Avatar
-ed-
On 7 sep, 14:06, zwim wrote:
Le Mon, 7 Sep 2009 01:13:15 -0700 (PDT)
Au fait à propos de ce codage :
>   [instructions ...]

>   {
>      int tableau3[4] = { 1, 3, 237, 511 };
>      printf ("Le tableau No 3 contient les valeurs suivantes : n ");
>      affiche_tableau (tableau3, 4);
>      printf ("Je remets a zero toutes les valeurs superieures a
>500n");
>      maximumTableau (tableau3, 4, 500);
>      printf ("Le tableau No 3 contient les valeurs suivantes : n ");
>      affiche_tableau (tableau3, 4);
>   }

>   [instructions ...]

j'ai une question sur l'évolution de la taille de la pile.

J'avais remarqué dans le passé que le fait d'utiliser un nouveau
contexte comme ceci au milieu des instructions d'une fonction
augmentait parfois sensiblement l'utilisation de la stack dédiée à la
fonction.



Ça dépend de l'implémentation. Le langage C ne dit rien sur le sujet.
Il dit simplement que c'est possible. L'efficacité du code produit ne
dépend pas de la définition du langage C.
Avatar
bpascal123
Bonjour

J'ai testé code (lien du premier post) sous Windows avec le
compilateur djgpp et ça fonctionne très bien sans modif. J'en conclu
que Visual Express doit être plus exigeant que djgpp. Jusqu'à présent ,
je faisais l'expérience du contraire, ce qui passe dans un
environnement windows ne passait pas forcément dans linux. Comme toi,
je compile aussi sous ubuntu.

Tu dis être "éternel débutant en C". J'ai commencé à apprendre le C il
y a 4-5 mois.

Je serais curieux de savoir combien d'heure tu as consacré à
l'apprentissage pour arriver à faire ce programme ? Je suppose que ce
code est le fruit de tes connaissances sans avoir vu la solution
officielle.

De mon côté, je n'ai pas encore approché les fonctions ni les
pointeurs, tout mon code est contenu dans main. Je suppose que je n'ai
pas pris une bonne habitude et que ça va me demander un peu de temps.
Je me forme avec :

http://www.ltam.lu/Tutoriel_Ansi_C/

Il y a quelques années, j'ai essayé de faire tout les exercices de ce
site :

http://www.pise.info/algo/codage.htm

pour comprendre un petit peu les bases de la programmation.

Je ne sais pas encore combien de temps je dois investir sur le C pour
arriver à un niveau convenable mais la réponse me fait peur.

Vos conseils sont bienvenus.

Pascal
Avatar
Marc Boyer
Le 09-09-2009, a écrit :
Bonjour


[SNIP]

Je ne sais pas encore combien de temps je dois investir sur le C pour
arriver à un niveau convenable mais la réponse me fait peur.



Comme disais je crois Antoine Leca une fois, l'informatique est
le seul domaine où l'on fait croire aux gens qu'en lisant un bouquin,
il auront le niveau d'un professionel débutant.
Un IUT d'informatique, c'est 2 ans de formation. On arrive à faire
des formations condensées en 1 an pour des gens ayant déjà une
expérience professionnelle.
Et on pourrait longtemps discuter sur la question "le diplomé
d'IUT moyen a-t-il un niveau convenable en C?"

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
YannicK
a écrit :
Bonjour

J'ai testé code (lien du premier post) sous Windows avec le
compilateur djgpp et ça fonctionne très bien sans modif. J'en conclu
que Visual Express doit être plus exigeant que djgpp. Jusqu'à présent,
je faisais l'expérience du contraire, ce qui passe dans un
environnement windows ne passait pas forcément dans linux. Comme toi,
je compile aussi sous ubuntu.

Tu dis être "éternel débutant en C". J'ai commencé à apprendre le C il
y a 4-5 mois.

Je serais curieux de savoir combien d'heure tu as consacré à
l'apprentissage pour arriver à faire ce programme ? Je suppose que ce
code est le fruit de tes connaissances sans avoir vu la solution
officielle.

De mon côté, je n'ai pas encore approché les fonctions ni les
pointeurs, tout mon code est contenu dans main. Je suppose que je n'ai
pas pris une bonne habitude et que ça va me demander un peu de temps.
Je me forme avec :

http://www.ltam.lu/Tutoriel_Ansi_C/

Il y a quelques années, j'ai essayé de faire tout les exercices de ce
site :

http://www.pise.info/algo/codage.htm

pour comprendre un petit peu les bases de la programmation.

Je ne sais pas encore combien de temps je dois investir sur le C pour
arriver à un niveau convenable mais la réponse me fait peur.

Vos conseils sont bienvenus.

Pascal




Bonjour,

Comme me l'ont expliqué les contributeurs de ce forum, le problème de
compilation avec visual c++ 2008 venait du fait que mon code ne
respectait pas complètement la norme C89, mais reprenait aussi des
techniques de programmation prévues par la norme C99 ... alors, on peut
voir le verre à moitié vide ou à moitié plein :

- Soit (pour une fois) Microsoft sait implémenter de manière correcte
une norme
- Soit les outils libres de programmation on 10 ans d'avance sur les
outils propriétaires ;-)

Je crois que djgpp est un dérivé de GCC (les professionnels du C
confirmeront ou infirmeront) donc, cela parait logique qu'il puisse
compiler un code qui reprenne des éléments de la norme C99 ...

Je m'intéresse à la programmation en dilettante depuis plusieurs années,
donc écrire le code que j'ai posté ne m'a pris qu'une heure ou deux ...
Ceci dit, le secret pour maitriser la programmation est la pratique, et
malheureusement, mon emploi du temps ne me permet pas de m'entrainer
autant que je le souhaiterais :-(

Si tu le peux, pratique le plus possible, et vas voir le cours dont
j'indiquais l'adresse dans mon premier message, il est vraiment très
accessible pour un débutant !

<ma vie>

j'ai 41 ans et j'ai découvert le monde de l'ordinateur à 15 ans (en
1983) au club informatique de mon collège, sur un "Goupil 2" ... cela
ressemblait aux premiers PC, la machine était rouge, avec un écran
cathodique monochrome vert, et deux énormes lecteurs de disquettes, un
pour le système (C/PM ?), un pour sauvegarder les programmes que les
profs de maths nous faisaient développer sur l'interpréteur Basic ... je
me souviens de mon désarroi la première fois ou l'on m'a expliqué que :

100 I=I+1

:-)

Maintenant, je suis comptable et je me passionne pour l'informatique de
gestion, l'ordinateur est pour moi un loisir et je souhaiterais, pour
mon plaisir, arriver à développer une application de comptabilité,
éventuellement interfacée avec une base de données type mySql, en C ou
en Python ...

</ma vie>

--
YannicK
yann801 *arobase* yahoo *point* fr
yann801 *at* yahoo *dot* fr
Avatar
bpascal123
J'ai 31, je suis comptable alors peut-être que dans 10 ans, je
tiendrais le même discours. Pour une passion on ne compte pas...

Seulement, je me demande à partir de quand on commence à travailler
avec une interface graphique plutôt que le terminal?
Avatar
Éric Lévénez
a écrit :

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



Tu veux dire que tu penses que le CLI est inférieur au GUI en terme de
programmation ? Le plus dur est de concevoir et coder des algorithme, de
gérer les entrées/sorties... Et pour le GUI c'est juste appeler quelques
fonctions faites par d'autres, sauf si tu veux faire ton propre GUI.

--
Éric Lévénez
FAQ de fclc : <http://www.levenez.com/lang/c/faq/>
Avatar
bpascal123
Yannick,

Dans ton code, je vois que tu ne fais pas appel aux pointeurs. Est-ce
parce que tu as ignoré les pointeurs en apprenant le C ou tu n'en as
pas besoin étant donné ce que tu envisages par la suite ; application
comptable "grand public" en c, python...?

Pascal
Avatar
bpascal123
On 9 sep, 23:00, Éric Lévénez wrote:
a écrit :

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

Tu veux dire que tu penses que le CLI est inférieur au GUI en terme de
programmation ? Le plus dur est de concevoir et coder des algorithme, de
gérer les entrées/sorties... Et pour le GUI c'est juste appeler quelq ues
fonctions faites par d'autres, sauf si tu veux faire ton propre GUI.

--
Éric Lévénez
FAQ de fclc : <http://www.levenez.com/lang/c/faq/>



Je trouve pas que le CLI est inférieur mais le look du CLI n'est pas
très joyeux... Je ne dis pas que le CLI n'est pas efficace mais des
fois on peut joindre l'utile à l'agréable. C'est pas parce que dans
les années 70 et 80 on programmait sur des frigidaires avec un petit
écran ou une imprimante ou des écrans monochromes qu'on doit
s'infliger la même chose...
En php, css, il y a moyen d'avoir un rendu visuel sur une page
web...Je suis d'accord, ces langages sont des langages interprétés
mais n'y t-il pas des ponts entre langages interprétés et compilés?
J'ai vu par hasard sur une page web, qu'il y a la possibilité de
copier-coller un code dans une page web et le site se charge de la
compilation et le résultat s'affiche dans la page web...
Avatar
YannicK
a écrit :
Yannick,

Dans ton code, je vois que tu ne fais pas appel aux pointeurs. Est-ce
parce que tu as ignoré les pointeurs en apprenant le C ou tu n'en as
pas besoin étant donné ce que tu envisages par la suite ; application
comptable "grand public" en c, python...?

Pascal




Si, je fais appel aux pointeus, de manière indirecte puisque les
tableaux sont une forme de pointeurs. Regarde le code ci-dessous pour
t'en convaincre :

// Prototype de la fonction d'affichage
void affiche(int *tableau, int tailleTableau);

int main(int argc, char *argv[])
{
int tableau[4] = {10, 15, 3, 7};

// On affiche le contenu du tableau :

affiche(tableau, 4);

return 0;
}

void affiche(int *tableau, int tailleTableau)
{
int i;

for (i = 0 ; i < tailleTableau ; i++)
{
printf("%dn", tableau[i]);
}
}


Tu peux voir que dans le prototype et dans la déclaration de la fonction
on écrit:

void affiche(int *tableau, int tailleTableau)

par contre, quand on appelle la fonction dans le main(), on écrit :

affiche(tableau, 4);


Comme je le disais dans le premier post qui a ouvert ce fil, je
travaille avec le cours du site du zéro :

<http://www.siteduzero.com/tutoriel-3-14189-apprenez-a-programmer-en-c.html>

Je t'engage vivement à suivre ce cours en ligne qui est le plus
accessible que j'ai pu voir jusqu'à maintenant, même s'il n'est pas
exempt de défaut : il mélange les techniques des deux normes du C, ce
qui m'a valu mon premier post ici !

Ceci dit, l'auteur a beaucoup d'humour et introduit les concepts de
manière très progressive et très pratique : à la fin du cours on est
sensé savoir écrire une application graphique multimédia avec
manipulation de la souris ....

Lis le cours, et surtout fais les exercices, et à partir des exercices
n'hésite pas à coder tes propres variantes : c'est comme cela qu'on
progresse.

Et si vraiment tu vois que tu n'y arrive pas en C, fais comme moi,
commence par un langage plus simple comme Python. Tu peux télécharger un
interpréteur pour windows ici :

http://www.python.org/

Si tu es sous ubuntu, normalement python est installé par défaut.

Tu trouveras un excellent cours ici, de près de 400 pages :

<http://www.framasoft.net/IMG/pdf/python_notes-2.pdf>

Python est un langage interprété (et non compilé comme le C) il est plus
simple que C au sens ou on n'est pas obligé de typer les variables, de
gérer soi-même la mémoire et que les pointeurs n'y existent pas. La
manipulation des chaines de caractères est aussi beaucoup plus simple.

Par contre on peut définir des fonctions comme en C, faire de la
programmation orientée objet comme en C++, et par défaut l'installation
comporte la bibliothèque Tkinter qui permet de développer des
applications graphiques en mode fenêtre ... Le cours indiqué ci-dessus
explique tout ça de manière très claire ...

Pour moi apprendre le langage C est une finalité pour sa portabilité et
son universalité, mais Python est mon "deuxième langage" pour sa
simplicité et sa rapidité de développement, et j'ai beaucoup progressé
grâce à lui ...

Bon courage à toi,

--
YannicK
yann801 *arobase* yahoo *point* fr
yann801 *at* yahoo *dot* fr
1 2 3 4 5