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 a la compilation - C


Sujet :

C

  1. #21
    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 : 68
    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
    Voilà ton code réorganisé et un peu simplifié.

    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
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
     
    Project   : M.a.n.u.
    Compiler  : GNU GCC Compiler (called directly)
    Directory : C:\dev\manu\
    --------------------------------------------------------------------------------
    Switching to target: default
    Compiling: client.c
    client.c:43: warning: unused parameter 'index'
    client.c:43: warning: unused parameter 'fichier'
    Compiling: ecran.c
    ecran.c: In function `deroulant':
    ecran.c:328: warning: comparison between signed and unsigned
    ecran.c:344: warning: passing arg 1 of `strcmp' from incompatible pointer type
    ecran.c:350: warning: passing arg 1 of `strcmp' from incompatible pointer type
    ecran.c: At top level:
    ecran.c:468: warning: unused parameter 'data'
    ecran.c:468: warning: unused parameter 'len'
    ecran.c:468: warning: unused parameter 'lettres'
    ecran.c:468: warning: unused parameter 'x'
    ecran.c:468: warning: unused parameter 'y'
    ecran.c:463: warning: unused parameter 'data'
    ecran.c:463: warning: unused parameter 'len'
    ecran.c:463: warning: unused parameter 'lettres'
    ecran.c:463: warning: unused parameter 'x'
    ecran.c:463: warning: unused parameter 'y'
    ecran.c:458: warning: unused parameter 'data'
    ecran.c:458: warning: unused parameter 'width'
    ecran.c:458: warning: unused parameter 'lettres'
    ecran.c:458: warning: unused parameter 'x'
    ecran.c:458: warning: unused parameter 'y'
    ecran.c:23: warning: unused parameter 'chaine'
    ecran.c:23: warning: unused parameter 'lon'
    ecran.c:23: warning: unused parameter 'autor'
    ecran.c:23: warning: unused parameter 'PosX'
    ecran.c:23: warning: unused parameter 'PosY'
    ecran.c:444: warning: unused parameter 'chaine'
    ecran.c:444: warning: unused parameter 'len'
    ecran.c:444: warning: unused parameter 'autor'
    ecran.c:444: warning: unused parameter 'x'
    ecran.c:444: warning: unused parameter 'y'
    ecran.c:439: warning: unused parameter 'chaine'
    ecran.c:439: warning: unused parameter 'len'
    ecran.c:439: warning: unused parameter 'autor'
    ecran.c:439: warning: unused parameter 'x'
    ecran.c:439: warning: unused parameter 'y'
    ecran.c:434: warning: unused parameter 'chaine'
    ecran.c:434: warning: unused parameter 'len'
    ecran.c:434: warning: unused parameter 'autor'
    ecran.c:434: warning: unused parameter 'x'
    ecran.c:434: warning: unused parameter 'y'
    ecran.c:419: warning: unused parameter 'chaine'
    ecran.c:419: warning: unused parameter 'len'
    ecran.c:419: warning: unused parameter 'autor'
    ecran.c:419: warning: unused parameter 'x'
    ecran.c:419: warning: unused parameter 'y'
    ecran.c:414: warning: unused parameter 'chaine'
    ecran.c:414: warning: unused parameter 'len'
    ecran.c:414: warning: unused parameter 'autor'
    ecran.c:414: warning: unused parameter 'x'
    ecran.c:414: warning: unused parameter 'y'
    ecran.c:406: warning: unused parameter 'prompt'
    ecran.c:406: warning: unused parameter 'var'
    ecran.c:406: warning: unused parameter 'x'
    ecran.c:406: warning: unused parameter 'y'
    Compiling: equipier.c
    Compiling: fichier.c
    Compiling: main.c
    main.c: In function `menu_principal':
    main.c:21: warning: unused variable `l'
    Compiling: auto.c
    auto.c:62: warning: unused parameter 'fichier'
    auto.c:67: warning: unused parameter 'fichier'
    auto.c:67: warning: unused parameter 'fichier_temporaire'
    auto.c:74: warning: 'aff_auto' defined but not used
    Linking console executable: C:\dev\manu\console.exe
    Process terminated with status 0 (0 minutes, 9 seconds)
    0 errors, 59 warnings
    Comme il manque pas mal de corps de fonctions (j'ai réclamé 3 fois le code manquant), il y a des warnings (paramètres non utilisés), c'est normal. Ils disparaitront au fur et à mesure que tu complèteras les fonctions.

    J'ai modifié 'déroulant()' pour qu'il soit compatible avec CONIO2 (ce qu'on trouve sur nos machines Windows à base de MinGW). Elle devrait toujours fonctionner chez toi. J'ai simplifié l'interface (c'est la fonction qui calcule elle même la longueur max...). Le codage de cette fonction est plus complexe que nécessaire, mais elle fonctionne...

    Avant de lire le code, je te conseille de lire ceci, ça aidera à la compréhension des modifications que j'ai faites :

    http://emmanuel-delahaye.developpez.com/codage.htm

    J'y ai quand même passé 3 heures...
    Fichiers attachés Fichiers attachés

  2. #22
    Membre expert
    Avatar de Pragmateek
    Homme Profil pro
    Formateur expert .Net/C#
    Inscrit en
    Mars 2006
    Messages
    2 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Formateur expert .Net/C#
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 635
    Points : 3 958
    Points
    3 958
    Par défaut
    pour déclarer une fonction sans paramètres il faut déclarer void
    Pas nécessairement, en C une fonction "f" sans paramètres se déclare :
    ou
    La première signifiant "f prend un nombre de paramètres supérieur ou égal à 0".
    La deuxième permettant de préciser la sémantique.
    En revanche dans le cadre d'une définition "f()" équivaut à "f(void)".

    En effet dixit la norme n1124 (6.7.5.3 14):
    An identifier list declares only the identifiers of the parameters of the function. An empty list in a function declarator that is part of a definition of that function specifies that the function has no parameters. The empty list in a function declarator that is not part of a definition of that function specifies that no information about the number or types of the parameters is supplied.
    En revanche en C++ "f();" dans une déclaration signifie que la fonction ne prend pas de paramètres.

  3. #23
    Membre régulier
    Profil pro
    Étudiant
    Inscrit en
    Avril 2006
    Messages
    110
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2006
    Messages : 110
    Points : 91
    Points
    91
    Par défaut
    zoro je v prendre tes remarques en compte et merci a tou(te)s pour ce solide coup de main et j'ai depossé mes sources
    Fichiers attachés Fichiers attachés

  4. #24
    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 : 68
    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 M.a.n.u.
    zoro je v prendre tes remarques en compte et merci a tou(te)s pour ce solide coup de main et j'ai depossé mes sources
    Ca, c'est ton code original, qui ne tient absolument pas compte de nos remarques, on est bien d'accord ? Je vais m'en servir pour compléter ce que j'ai posté.

    Terminé. Il reste ceci :
    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
     
    Project   : M.a.n.u.
    Compiler  : GNU GCC Compiler (called directly)
    Directory : C:\dev\manu\
    --------------------------------------------------------------------------------
    Switching to target: default
    Compiling: client.c
    client.c:43: warning: unused parameter 'index'
    client.c:43: warning: unused parameter 'fichier'
    Compiling: ecran.c
    Compiling: equipier.c
    Compiling: fichier.c
    Compiling: main.c
    Compiling: auto.c
    Linking console executable: C:\dev\manu\console.exe
    Process terminated with status 0 (0 minutes, 8 seconds)
    0 errors, 2 warnings
    D'autre part, j'ai relevé pas mal de problèmes avec les fclose(). J'en ai corrigé un peu dans auto.c. Le principe est qu'on ne ferme que ce qui a été ouvert, sinon, le comportement est indéterminé.
    Fichiers attachés Fichiers attachés

  5. #25
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 5
    Points : 5
    Points
    5
    Par défaut pourquoi interdire #include f.c ? élément de réponse
    quelques réponses citent le fait qu'il ne faut pas inclure des fichiers.c dans un fichier.c sans en donner l'explication et je trouve cela dommage.
    je vais tacher d'y répondre.

    la compilation d'un fichier.c et je précise bien d"un seul, ce fait en deux étapes: une précompilation suivi de la compilation proprement dit qui aboutit à la création d'un fichier objet en génral un .o
    c'est à la précompilation que les includes interviennent.
    lorque le précompilateur traite le fichier.c et qu'il rencontre include "toto.h" il ouvre le fichier toto.h et le copie à l'endroit où il se trouve:
    exemple
    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
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    /***********************/
    fichier.c
    /***********************/
    
    int gs32_b;
    
    #include  "toto.h"
    
    void main(void)
    {
    int s32_i
    
    ....
    i=f(RAD);
    ...
    }
    
    int f( int i_s32_IN)
    {
    return i_s32_IN*2;
    }
    /******fin de fichier.c********/
    
    
    /***********************/
    toto.h
    /***********************/
    
    #ifndef __JCB_TOTO__
    #define __JCB_TOTO__
    
    #define RAD 123456
    int f(int);
    
    #endif
    /*fin de toto.h*/
    
    A la fin de la precompilation et par consequent en entrée du compilateur nous avons :
    
    int gs32_b;
    int f(int);
    void main(void)
    {
    int s32_i
    
    ....
    i=f(123456);
    ...
    }
    
    int f( int i_s32_IN)
    {
    return i_s32_IN*2;
    }
    Remarquons qu'il ny a plus aucun commentaire et que RAD est remplace par sa valeur défini dans toto.h
    
    suposons maintenant que le fonction f nous l'ayons mise dans toto.h
     /***********************/
    fichier.c
    /***********************/
    
    int gs32_b;
    
    #include  "toto.h"
    
    void main(void)
    {
    int s32_i
    
    ....
    i=f(RAD);
    ...
    }
    
    /******fin de fichier.c********/
    
    
    /***********************/
    toto.h
    /***********************/
    
    #ifndef __JCB_TOTO__
    #define __JCB_TOTO__
    
    #define RAD 123456
    int f( int i_s32_IN)
    {
    return i_s32_IN*2;
    }
    
    
    #endif
    /*fin de toto.h*/
    
    à la fin de la précompilation
    nous avons :
    int gs32_b;
    int f( int i_s32_IN)
    {
    return i_s32_IN*2;
    }
    void main(void)
    {
    int s32_i
    
    ....
    i=f(123456);
    ...
    }
    La différence est simplement que la fonction f se trouve avant la focnction main ce qui est en soit pas bien génant. Là ou cela ce complique c'est lorsque sue vous avez deux fichier.c qui font appelle tout les deux à toto.h
    Au niveau de la compilation pas de probléme les deux fichiers objets seront générés par contre la derniére étape ,l'éditien de lien(link), se passera mal car le linker se trouvera avec deux fonctions f et comme en général les messages des linkers sont trés peu explicites vous aurez peut_etre du mal à l'interpreter et il se peut qu'avec certains outils ( je ne pas dis compilo exprés car nous avons tendance à oublier les différentes étapes nécessaires à la génération d'un éxcécutable). Donc certains outils peuvent ne rien signaler car il vont générer deux fonctions et appeler soit l'une soit l'autre (je ne l'est pas vérifié) l'inconvénient est la place occupée pour rien (sur un pc pas génént pour de l'embarqué ???.

    Voilà, j'espére vous avoir éclairé pour cette interdiction absolu d'inclure un fichier.c .
    Il ne faut pas oublier que l'inclusion ce fait pour chaque fichier.c d'un projet
    par consequent si vous avez N fichier source incluant un fichier.h ,pour chaque fichier .c le precompilateur inclura le fichier.h(et c'est pas grave puisque nécessaire). Le #ifndef __JCB_TOTO__ traditionnel placé en debut des fichiers include est utile uniquement au précompilateur afin qu'il ne travaille pas pour rien en incluant des fichiers déjà inclu notamment,les stdio.h, stdlib.h etc..
    Il existe une option pour indiquer au compilateur de s'arréter aprés l'excécution du précompilateur. Je l'utilise dans certains cas lorsquej'ai beaucoup de .h . Si cela vous interesse faites le moi savoir et je vous l'indiquerai (c'est peut être -p)

  6. #26
    Expert éminent sénior
    Avatar de Skyounet
    Homme Profil pro
    Software Engineer
    Inscrit en
    Mars 2005
    Messages
    6 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Software Engineer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 6 380
    Points : 13 380
    Points
    13 380
    Par défaut
    Ben la prochaine fois t'oubliera pas les balises code hein.

+ Répondre à la discussion
Cette discussion est résolue.
Page 2 sur 2 PremièrePremière 12

Discussions similaires

  1. [Tomcat][JSP] Erreur de génération /compilation
    Par kedare dans le forum Tomcat et TomEE
    Réponses: 2
    Dernier message: 20/02/2006, 09h21
  2. Réponses: 2
    Dernier message: 11/02/2006, 15h42
  3. Réponses: 6
    Dernier message: 21/11/2005, 13h40
  4. Réponses: 2
    Dernier message: 14/11/2005, 11h07
  5. Erreurs à la compilation
    Par Code source dans le forum GLUT
    Réponses: 11
    Dernier message: 02/05/2004, 19h33

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