IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C Discussion :

Erreur de compilation


Sujet :

C

  1. #1
    Futur Membre du Club
    Inscrit en
    Novembre 2005
    Messages
    23
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 23
    Points : 6
    Points
    6
    Par défaut Erreur de compilation
    Salut à tous,

    J'ai plusieurs fois ce message d'erreur "ISO C89 interdit les mélanges de déclarations et de code" à chaque compilation.
    Je compile avec : gcc (GCC) 4.0.2 20050808 (prerelease) (Ubuntu 4.0.1-4ubuntu9)

    Je soupconne que cela vienne du compilateur.
    Quelqu'un peut me confirmer cela ou bien c'est mon code qui est archi faux!

    Voici exactement les erreurs de compilation :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    projet.c: In function ‘conversion_chaine_COMM’:
    projet.c:376: attention : ISO C89 interdit les mélanges de déclarations et de code
    projet.c: In function ‘traiter_commande’:
    projet.c:432: attention : ISO C89 interdit les mélanges de déclarations et de code
    projet.c:441: attention : ISO C89 interdit les mélanges de déclarations et de code
    projet.c:456: attention : ISO C89 interdit les mélanges de déclarations et de code
    projet.c:466: attention : ISO C89 interdit les mélanges de déclarations et de code
    projet.c:481: attention : ISO C89 interdit les mélanges de déclarations et de code
    projet.c:491: attention : ISO C89 interdit les mélanges de déclarations et de code
    projet.c: In function ‘fils’:
    projet.c:540: attention : ISO C89 interdit les mélanges de déclarations et de code
    projet.c: In function ‘superviseur’:
    projet.c:661: attention : implicit declaration of function ‘usleep’
    projet.c:664: attention : implicit declaration of function ‘kill’

  2. #2
    Membre averti Avatar de Jack_serious
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    350
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 350
    Points : 396
    Points
    396
    Par défaut
    Tu pourrais nous montrer ce que tu essaie de compiler s'il te plait ?
    Histoire que l'on puisse de donner les recommandations qui vont bien.
    Et tant qu'a faire, avec quelles options tu compiles ?

    Pour les "implicit declaration", il faut lire les man et faire les #include qui vont bien.

    Ex : pour usleep() et kill():
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    #include <unistd.h>
    #include <signal.h>
    Don't worry, be serious.
    La vie est courte. Prenez votre temps.

    Jack.

  3. #3
    Membre éprouvé
    Avatar de Pouic
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    669
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2004
    Messages : 669
    Points : 977
    Points
    977
    Par défaut
    Typiquement, en C ANSI, on ne peut mélanger du code et des déclarations de variables...
    Il est donc interdit de faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    int var;
    <du code>
    int une_autre_var;
    <du code>
    ...
    Il faut faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    int var;
    int une_autre_var;
    <du code>
    ...
    Les déclarations doivent être en début de bloc...
    Software becomes slower faster than hardware becomes faster
    [size=1]
    http://xrenault.developpez.com

  4. #4
    Futur Membre du Club
    Inscrit en
    Novembre 2005
    Messages
    23
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 23
    Points : 6
    Points
    6
    Par défaut Re:Erreur de compilation
    Et bien chose suprenante, j'ai bien inclu ces bibliotheques..

    Voici une portion du code où il indique une erreur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    /*recuper la saisie envoye par le pere et appel de fonction pour la traiter*/
    void fils(int pvf[2],int fvp[2])
    {
    	char saisie[15];
    	int i=0;
     
    	matrice jeu;
    	commande c;
     
     
    	initialiser_jeu(jeu);
     
    	while(1)
    	{
    		while(1)
    		{
    			/*pour recuperer et stocker dans saisie les commandes provenant du pere*/
    			read(pvf[0],&saisie[i],sizeof(char));
    			if(saisie[i]=='\0')
    			{
    				saisie[i]='\0';
    				i=0;
    				break;
    			}
    			else
    				i++;			
    		}
     
    		c=separer_chaine_entier(saisie);
     
    		char *message; /*<--message d'erreur ici */
    		COMM mess;
    		mess.p=NULL;
     
    		if(strcmp(c.nom,"?")==0)
    		{	
    			mess.m=LISTE;
    			message=conversion_COMM_chaine(mess);
    			if(message!=NULL)
    				write(fvp[1],message,strlen(message)+1);			
    		}
    		else 
    		{
    			if(test_commande(c)==0)
    			{	
    				mess.m=ERREUR;
    				message=conversion_COMM_chaine(mess);
    				if(message!=NULL)
    					write(fvp[1],message,strlen(message)+1);
     
    			}
    			else
    				traiter_commande(c,fvp,jeu);		
    		}		
    	}			
    }
    Et voici mes options de compilation :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    gcc -O -Wall -W -ansi -pedantic -I /usr/X11R6/include -I /usr/local/include -c projet.c
    gcc -o robot projet.o -L /usr/X11R6/lib -L /usr/local/lib -lgraphics -lX11
    Je suis obligé d'utiliser ces options car j'utilise une bibliotheque graphique, trouvée sur le web.http://para.inria.fr/%7Epeskine/ense...phics-doc.html

  5. #5
    Futur Membre du Club
    Inscrit en
    Novembre 2005
    Messages
    23
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 23
    Points : 6
    Points
    6
    Par défaut Re:Erreur de compilation
    Effectivement, j'ai mis les déclarations au début et ca passe à la compilation. Merci

    Mais pour usleep() et kill(), j'ai bien inclu les bibliothèques. Voici mes "#include"
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    #include <stdio.h>
    #include <stdlib.h>
    #include<sys/types.h>
    #include<signal.h>
    #include<string.h>
    #include<time.h>
    #include<unistd.h>
    #include "graphics.h"
    Et pourtant, ces fonctions marchent très bien..

  6. #6
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Points : 6 498
    Points
    6 498
    Par défaut
    Si je ne me trompe pas, celà dépend de la norme du C utilisée par le compilo, (C90 ou non, je ne sais plus).
    "La haine seule fait des choix" - Koan Zen
    "Il ne faut pas être meilleur que les autres, il faut être meilleur que soi." Albert Jacquard
    "Ceux qui savent où ils ont posé leur parapluie ne sont pas alcooliques." - pgibonne.
    Faites du Prolog, ça vous changera les idées !
    Ma page Prolog
    Mes codes sources commentés

    Mon avatar : La Madeleine à la veilleuse de Georges de La Tour

  7. #7
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    1°) usleep et kill ne sont pas standard, donc ils sont sautés dans les includes (#ifndef __STDC__ ... #endif
    2°) Avant le C99, on n'a pas le droit de déclarer des variables en milieu de bloc. Elles doivent obligatoirement être en début de bloc. Par conséquent, tu dois remonter les déclarations de message et mess jusqu'au début du bloc.[/code]
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  8. #8
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut Re: Erreur de compilation
    Citation Envoyé par Vodlich
    J'ai plusieurs fois ce message d'erreur "ISO C89 interdit les mélanges de déclarations et de code" à chaque compilation.
    Oui. En mode C89 (ANSI) ou C90 (ISO) les définitions d'objets doivent être faites en début de bloc et non n'importe où...
    Pas de Wi-Fi à la maison : CPL

  9. #9
    Rédacteur

    Avatar de gege2061
    Femme Profil pro
    Administrateur de base de données
    Inscrit en
    Juin 2004
    Messages
    5 840
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Juin 2004
    Messages : 5 840
    Points : 11 625
    Points
    11 625
    Par défaut Re: Erreur de compilation
    Bonjour,
    Citation Envoyé par Vodlich
    Je soupconne que cela vienne du compilateur.
    Avant de mettre le compilateur en cause, il faut commencer par se remettre en question. Regarde le niveau des bug connu de gcc : GCC Bugs avant de tomber dessus, faut déjà faire du code bougrement tordu!

  10. #10
    Membre averti Avatar de Jack_serious
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    350
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 350
    Points : 396
    Points
    396
    Par défaut Re: Erreur de compilation
    Citation Envoyé par gege2061
    Bonjour,
    Citation Envoyé par Vodlich
    Je soupconne que cela vienne du compilateur.
    Avant de mettre le compilateur en cause, il faut commencer par se remettre en question. Regarde le niveau des bug connu de gcc : GCC Bugs avant de tomber dessus, faut déjà faire du code bougrement tordu!
    Arf, ils sont supers leurs bugs !
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    i=++i
    foo(++i,++i)
    (++i)*(++i)               /* special case with foo=="operator*" */
    std::cout << ++i << ++i   /* foo(foo(std::cout,++i),++i)        */
    C'est sur c'est le genre de trucs qu'on code tres souvent.
    Don't worry, be serious.
    La vie est courte. Prenez votre temps.

    Jack.

  11. #11
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut Re: Erreur de compilation
    Citation Envoyé par Jack_serious
    Arf, ils sont supers leurs bugs !
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    i=++i
    foo(++i,++i)
    (++i)*(++i)               /* special case with foo=="operator*" */
    Ce ne sont pas des bugs, mais des comportements indéfinis. Il est interdit d'utiliser de telles constructions. Si bug il y a de la part du compilateur, c'est de laisser passer ce genre de code sans rien dire.

    Il est clair qu'un programmeur qui utilise de telles horreurs est buggé.
    Pas de Wi-Fi à la maison : CPL

  12. #12
    Futur Membre du Club
    Inscrit en
    Novembre 2005
    Messages
    23
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 23
    Points : 6
    Points
    6
    Par défaut
    Citation Envoyé par Médinoc
    1°) usleep et kill ne sont pas standard, donc ils sont sautés dans les includes (#ifndef __STDC__ ... #endif
    Qu'est ce que tu veux dire ?

  13. #13
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par Vodlich
    Citation Envoyé par Médinoc
    1°) usleep et kill ne sont pas standard, donc ils sont sautés dans les includes (#ifndef __STDC__ ... #endif
    Qu'est ce que tu veux dire ?
    Ces fonctions ne font pas partie de la définition de la bibliothèque standard du C. Lorsqu'on compile en mode C strictement conforme, leurs prototypes ne sont plus disponibles pendant la compilation.
    Pas de Wi-Fi à la maison : CPL

  14. #14
    Futur Membre du Club
    Inscrit en
    Novembre 2005
    Messages
    23
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 23
    Points : 6
    Points
    6
    Par défaut
    Citation Envoyé par Emmanuel Delahaye
    Ces fonctions ne font pas partie de la définition de la bibliothèque standard du C. Lorsqu'on compile en mode C strictement conforme, leurs prototypes ne sont plus disponibles pendant la compilation.
    Et comment eviter ces warnings ?

    Sinon, j'ai encore un problème de compilation, j'ai besoin de thread donc je dois compiler avec -lpthread (c'est bien ça ?). Ce qui me donne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    gcc -O -lpthread -Wall -g -Wextra -O2 -W -ansi -pedantic -I /usr/X11R6/include -I /usr/local/include -c projet.c
    gcc -o robot projet.o -L /usr/X11R6/lib -L /usr/local/lib -lgraphics -lX11
    Mais le compilateur me dit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    gcc: -lpthread: fichier d'entrée d'édition de liens n'est pas utilisé parce l'édition de lien n'a pas été faite
    Que dois-je rajouter pour compiler mon projet ?

  15. #15
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par Vodlich
    Citation Envoyé par Emmanuel Delahaye
    Ces fonctions ne font pas partie de la définition de la bibliothèque standard du C. Lorsqu'on compile en mode C strictement conforme, leurs prototypes ne sont plus disponibles pendant la compilation.
    Et comment eviter ces warnings ?
    Rappel : ceci n'a rien à voir avec le langage C. Le bon forum est "Outils pour C & C++ / EDI / Compilateurs / etc".

    Ne pas compiler en mode strict. Si on a besoin d'extensions, on ne peut plus compiler en mode strict ANSI. Il faut savoir que son code n'est plus standard. C'est pas forcément grave. Ca ne l'empêche pas d'être portable sur un grand nombre de plateformes.
    Sinon, j'ai encore un problème de compilation, j'ai besoin de thread donc je dois compiler avec -lpthread (c'est bien ça ?).
    Oui, à condition que ton compilateur sache où trouver <chemin>/libpthread.a (avec -L<chemin>)
    Ce qui me donne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    gcc -O -lpthread -Wall -g -Wextra -O2 -W -ansi -pedantic -I /usr/X11R6/include -I /usr/local/include -c projet.c
    gcc -o robot projet.o -L /usr/X11R6/lib -L /usr/local/lib -lgraphics -lX11
    • Supprimmer -pedantic si ca coince encore retirer -ansi.
    • Après -I et -L, il ne faut pas d'espace.
    Pas de Wi-Fi à la maison : CPL

  16. #16
    Futur Membre du Club
    Inscrit en
    Novembre 2005
    Messages
    23
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 23
    Points : 6
    Points
    6
    Par défaut
    Vraiment désolé pour avoir posté au mauvais endroit

    Ca ne marche toujours pas, j'ai compiler comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    gcc -O -lpthread -L/etc/include -Wall -g -Wextra -O2 -W -I/usr/X11R6/include -I/usr/local/include -c projet.c
    gcc -o robot projet.o -L/usr/X11R6/lib -L/usr/local/lib -lgraphics -lX11
    et
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    gcc: -lpthread: fichier d'entrée d'édition de liens n'est pas utilisé parce l'édition de lien n'a pas été faite
    PS : les "I" dans -I/usr/X11R6/include -I/usr/local/include sont des "i" majuscule

  17. #17
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par Vodlich
    Vraiment désolé pour avoir posté au mauvais endroit

    Ca ne marche toujours pas, j'ai compiler comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    gcc -O -lpthread -L/etc/include -Wall -g -Wextra -O2 -W -I/usr/X11R6/include -I/usr/local/include -c projet.c
    gcc -o robot projet.o -L/usr/X11R6/lib -L/usr/local/lib -lgraphics -lX11
    et
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    gcc: -lpthread: fichier d'entrée d'édition de liens n'est pas utilisé parce l'édition de lien n'a pas été faite
    PS : les "I" dans -I/usr/X11R6/include -I/usr/local/include sont des "i" majuscule
    Attention à ne pas confondre les commandes de compilation et les commandes d'édition de lien. Quand il y a -c, c'est compilation. Les informations de bibliothèques ne concernent que l'édition de lien. Ceci devrait fonctionner :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    gcc -O  -Wall -g -Wextra -O2 -W -I/usr/X11R6/include -I/usr/local/include -c projet.c
    gcc -o robot projet.o -L/usr/X11R6/lib -L/usr/local/lib -lgraphics -lX11 -lpthread -L/etc/include
    Encore une fois, rien à voir avec le langage C...
    Pas de Wi-Fi à la maison : CPL

  18. #18
    Futur Membre du Club
    Inscrit en
    Novembre 2005
    Messages
    23
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 23
    Points : 6
    Points
    6
    Par défaut
    Ca marche, pour tes explications.
    Encore une fois, désolé ...

Discussions similaires

  1. Erreur de compilation après modification du Uses
    Par DevelOpeR13 dans le forum Langage
    Réponses: 5
    Dernier message: 30/10/2007, 14h23
  2. Réponses: 2
    Dernier message: 23/09/2003, 14h32
  3. Réponses: 10
    Dernier message: 22/09/2003, 21h58
  4. Réponses: 4
    Dernier message: 27/08/2003, 21h34
  5. Réponses: 2
    Dernier message: 04/03/2003, 23h24

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo