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 :

data definition has no type or storage class


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Août 2008
    Messages
    145
    Détails du profil
    Informations forums :
    Inscription : Août 2008
    Messages : 145
    Par défaut data definition has no type or storage class
    Bonjour,

    lorsque je lance mon programme, j'ai ce warning :

    20 J:\Projet_film\fonctions_autre.h [Warning] data definition has no type or storage class

    tout fonctionne à la perfection, et je ne comprends pas du tout ce que me veux ce warning !

    voici le fichier fonctions_autre.h et la fonction qui pose apparemment problème se trouvant dans le fonctions_autre.c :

    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
    /* ----- fonctions_autre.h -----*/
    /* Les prototype des fonctions utiles (header) */
     
    #ifndef DEF_FONCTIONS_AUTRE
    #define DEF_FONCTIONS_AUTRE
     
     
        void flush_stdin(void);
     
        void clean(const char *buffer, FILE *fp);
     
        int verif(char *tab);
     
        int verif_film(char *tab);
     
        void convert(char *tab);
     
        int verifannee (int an);
     
        copie(struct film *a,struct film *b);
     
    #endif
    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
    copie(struct film *a,struct film *b)
    {
        int i;
        strcpy(a->titre,b->titre);
        a->nbr=b->nbr;
        strcpy(a->realisateur.nom,b->realisateur.nom);
        strcpy(a->realisateur.prenom,b->realisateur.prenom);
        strcpy(a->realisateur.nationalite,b->realisateur.nationalite);
        for( i=0 ; i < b->nbr ; i++)
        {
            strcpy(a->liste[i].nom,b->liste[i].nom);
            strcpy(a->liste[i].prenom,b->liste[i].prenom);
            strcpy(a->liste[i].nationalite,b->liste[i].nationalite);
        }
        a->budget=b->budget;
        a->an=b->an;
    }
    voici aussi la déclaration de mes structures se trouvant dans fonction_film.h au cas ou cela pourrait vous être utile :

    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
    struct personne
        {
            char nom[31];//nom de la personne (30 caractère max)
            char prenom[31];//prénom de la personne (30 caractère max)
            char nationalite[41];//nationalité de la personne (40 caractère max)
        };
     
        struct film
        {
            char titre[51];//titre du film (50 caractère max)
            struct personne realisateur;//réalisateur du film
            struct personne *liste;//tableau dynamique de personnes (acteurs)
            int nbr;//nombre d'acteur dans le film
            float budget;//budget du film
            int an;//année de réalisation du film
        };
     
        struct noeud//arbre binaire
        {
            struct film fi;
            struct noeud *fg;//pointe vers le fils gauche
            struct noeud *fd;//pointe vers le fils droit
        };
    Merci d'avance pour votre aide

    edit :

    si je déclare ma fonction en void copie(struct film *a,struct film *b);

    là j'ai un warning tout à fait différents :

    7 J:\Projet_film\fonctions_autre.c In file included from fonctions_autre.c
    20 J:\Projet_film\fonctions_autre.h [Warning] "struct film" declared inside parameter list
    20 J:\Projet_film\fonctions_autre.h [Warning] its scope is only this definition or declaration, which is probably not what you want

    je comprends plus rien :s

  2. #2
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2009
    Messages
    4 493
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 493
    Billets dans le blog
    1
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    copie(struct film *a,struct film *b);
    doit effectivement avoir un type de retour.

    Essaye de mettre des typedef à tes structures. Tu ne peux pas faire de pointeurs sur un type qui n'existe pas. Ici, ça déclare la structure dans les paramètres, un peu bizarre ^^

  3. #3
    Membre confirmé
    Inscrit en
    Août 2008
    Messages
    145
    Détails du profil
    Informations forums :
    Inscription : Août 2008
    Messages : 145
    Par défaut
    Pourtant, voici un programme plus ou moins semblable ou il n'y a pas de typedef sur les structure et ça fonctionne parfaitement. La grosse différence avec mon programme c'est que tout est dans un seul fichier.

    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
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    232
    233
    234
    235
    236
    237
    238
    239
    240
    241
    242
    243
    244
    245
    246
    247
    248
    249
    250
    251
    252
    253
    254
    255
    256
    257
    258
    259
    260
    261
    262
    263
    264
    265
    266
    267
    268
    269
    270
    271
    272
    273
    274
    275
    276
    277
    278
    279
    280
    281
    282
    283
    284
    285
    286
    287
    288
    289
    290
    291
    292
    293
    294
    295
    296
    297
    298
    299
    300
    301
    302
    303
    304
    305
    306
    307
    308
    309
    #include<stdio.h>
    #include<stdlib.h>
     
    struct client
    {
      int numero;
      char nom[21];
      float solde;
    };
     
    struct noeud
    {
      struct client cl;
      struct noeud*fg;
      struct noeud*fd;
    };
     
    void recopie(char *metici,char *copieca)
    { int i;
      for(i=0;!i || metici[i-1]!='\0';i++)  /* !i est identique à i==0: il faut au moins recopier le 1er élément*/
        metici[i]=copieca[i];
    }
     
    egalise(struct client *a,struct client *b)
    {
      recopie(a->nom,b->nom);
      a->solde=b->solde;
      a->numero=b->numero;
    }
     
    void affiche_client(struct client Mr)
    {
        printf("Client Nr: %d",Mr.numero);
        printf("\tSolde: %.2f",Mr.solde);
        printf("\tNom: %s\n",Mr.nom);
    }
     
    struct client new_client(void)
    { struct client Mr;
      printf("\nEntrer le num%cro du client: ",130);
      scanf("%d",&Mr.numero);
      printf("\nEntrer son nom(Max 20 caract%cres SANS ESPACE+Enter): ",138);
      fflush(stdin);
      gets(Mr.nom);
      printf("\nEntrer son solde: ");
      scanf("%f",&Mr.solde);
      return Mr;
    }
     
    struct noeud *new_noeud(struct client c)
    {
      struct noeud *ptr;
      ptr=(struct noeud*) malloc(sizeof(struct noeud));
      if(!ptr)
        printf("\nPlus assez de m%cmoire",130);
      else
      {
          egalise(&(ptr->cl),&c);
          ptr->fg=NULL;
          ptr->fd=NULL;
      }
      return ptr;
    }
     
    int est_plus_petit_ou_egal(char *petit,char *grand)
    {
      int ok=-1,i=0;
      while(ok==-1 && grand[i]!='\0' && petit[i]!='\0')
      {
        if((int)grand[i]==(int)petit[i])
          i++;
        else
        { if((int)grand[i]>(int)petit[i])
            ok=1;
          else
            ok=0;
        }
      }
      if(ok==-1)
      { if(petit[i]!='\0')
          ok=0;
        else
          ok=1;
      }
      return ok;
    }
     
    void inserer(struct noeud **racine, struct noeud *nouv)
    {
      if(*racine==NULL)
        *racine = nouv;
      else
      {
        if(est_plus_petit_ou_egal(((*nouv).cl).nom,((**racine).cl).nom))
          inserer((&(*racine)->fg),nouv);
        else
          inserer((&(*racine)->fd),nouv);
      }
    }
     
    int compare(char *MotA,char *MotB)
    {  int i=0;
       while (MotA[i]==MotB[i] && MotA[i]!='\0')
         i++;
       if(MotA[i]==MotB[i])
         return 1;
       else
         return 0;
    }
     
    void recherche1(struct noeud *racine,char *name)
    { 
      if(racine)
      {
        if(compare((racine->cl).nom,name))
          affiche_client(racine->cl);
        recherche1(racine->fg,name);
        recherche1(racine->fd,name);                  
      }
    }
     
    int recherche2(struct noeud *racine,char *name, int number)
    { int ok=0;
      while(racine && !ok)
      { if(compare((racine->cl).nom,name) && ((racine->cl).numero)==number)
          ok=1;
        else
        {
          if(est_plus_petit_ou_egal(name,(racine->cl).nom))
            racine=racine->fg;
          else
            racine=racine->fd;
        }
      }
      return ok;
    }
     
     
    int supprimer(struct noeud **racine, char *name,int number)
    {
      struct noeud *memo;
      while(*racine!=NULL && (!compare(((**racine).cl).nom,name) || (((**racine).cl).numero)!=number))
      {
        if(est_plus_petit_ou_egal(name,((**racine).cl).nom))
          racine=&((**racine).fg);
        else
          racine=&((**racine).fd);
      }
      if(*racine)/*Si le noeud désigné par **racine est à supprimer*/
      { /*On va le remplacer par le plus petit des plus grands--> voir s'il en existe au moins un*/
        memo=*racine;
        if((**racine).fd)
        { /*si il existe au moins un plus grand (un fils droit)*/
          /*printf("\n Il existe au moins un noeud a droite");*/
          racine=&((**racine).fd);
          while((**racine).fg!=NULL)
            racine=&((**racine).fg);
          /*On a trouvé le plus petit des plus grands: le noeud **racine*/
          egalise(&(memo->cl),&((**racine).cl));/*remplacer l'info du haut par plus petit des plus grands puis supprimmer le noeud du bas*/
          memo=*racine;
          *racine=(**racine).fd;
        }
        else
        { /*si pas de fils droit (pas de plus grand)*/
          /*printf("\n Il n'existe pas de noeud a droite");*/
          *racine=(**racine).fg;
        }
        free(memo);
        return 1;
      }
      else
        return 0;
    }
     
    ecrire_preordre(FILE *fp,struct noeud *racine)
    {
      if(racine)
      {
        fprintf(fp,"%s %f %d ",(racine->cl).nom,(racine->cl).solde,(racine->cl).numero);
        ecrire_preordre(fp,racine->fg);
        ecrire_preordre(fp,racine->fd);                  
      }
    }
     
    void ecrit_fichier(char cible[21],struct noeud **racine)
    { 
      FILE *fp;
      if((fp=fopen(cible,"w"))==NULL)
        printf("ERREUR: impossible d'ouvrir le fichier \"%s\".\n",cible);
      else
        ecrire_preordre(fp,*racine);
      if(!fclose(fp)) /*fclose renvoie la valeur 0 si tout va bien*/
        printf("\nLa fermeture du fichier (apr%cs %ccriture) s'est d%croul%ce normalement.\n",138,130,130,130);
      else
        printf("Erreur de fermeture du fichier.");
    }
     
    void charger_fichier(char cible[21],struct noeud **racine)
    {
      FILE *fp;
      struct noeud *monsieur;
      char name[21];
      float saldo;
      int nbr;
      monsieur=(struct noeud*) malloc(sizeof(struct noeud));
      if((fp=fopen(cible,"r"))==NULL)
        printf("ERREUR: impossible d'ouvrir le fichier \"%s\".\n",cible);
      else
      { while(fscanf(fp,"%s %f %d ",name,&saldo,&nbr)==3)
        { 
          (monsieur->cl).numero=nbr;
          (monsieur->cl).solde=saldo;
          recopie((monsieur->cl).nom,name);
          monsieur->fd=NULL;
          monsieur->fg=NULL;
          inserer(racine,monsieur);
          monsieur=(struct noeud*) malloc(sizeof(struct noeud));
        }
      }
      if(!fclose(fp)) /*fclose renvoie la valeur 0 si tout va bien*/
        printf("\nLa fermeture du fichier s'est d%croul%ce normalement.\n",130,130);
      else
        printf("Erreur de fermeture du fichier.");
    }
     
    void symetrique(struct noeud *racine)
    {
      if(racine)
      {
        symetrique(racine->fg);
        affiche_client(racine->cl);
        symetrique(racine->fd);
      }
    }
     
    main()
    { struct noeud *debut=NULL;
      struct noeud** racine=&debut;
      int i,n,number,modifie,choix=1;
      char name[21];
      while(choix)
      {
        printf("\n  Tapez le num%cro correspondant %c votre choix:",130,133);
        printf("\n  --------------------------------------------");
        printf("\n  1: Charger une liste de clients depuis une liste EXISTANTE");
        printf("\n  2: Sauvegarder la liste de clients en cours dans un fichier");
        printf("\n  3: Inserer un client dans la liste en cours");
        printf("\n  4: Rechercher les clients sur base d'un nom (avec homonymes)");
        printf("\n  5: Rechercher si un client existe sur base d'un nom et de son numero client");
        printf("\n  6: Supprimer un client sur base d'un nom et de son num%cro",130);
        printf("\n  7: Afficher la liste de clients en cours par ordre alphab%ctique",130);
        printf("\n  0: Quitter le programme\n",130);
        scanf("%d",&choix);
        switch(choix)
        {
          case 1: printf("\nVous voulez ouvrir un fichier EXISTANT, entrez le nom du fichier: ");
                  fflush(stdin);
                  gets(name);
                  *racine=NULL;
                  charger_fichier(name,racine);
                  printf("\nEn ordre alphab%ctique on obtient le fichier charg%c:\n",130,130);
                  printf("--------------------------------------------------\n");
                  symetrique(*racine);
                  break;
          case 2: printf("\nVous voulez sauvegarder le fichier, entrez le nom du fichier ");
                  printf("destin%c\n%c m%cmoriser les donn%ces(exple:\"client.dat\")\n",130,133,130,130);
                  fflush(stdin);
                  gets(name);
                  ecrit_fichier(name,racine);
                  break;
          case 3: inserer(&(*racine),new_noeud(new_client()));
                  printf("\nEn ordre alphab%ctique on obtient maintenant le fichier:\n",130);
                  symetrique(*racine);
                  break;
          case 4: printf("\nIntroduire le nom de client recherch%c(donne les homonymes):\n",130);
                  fflush(stdin);
                  gets(name);
                  recherche1(*racine,name);
                  break;
          case 5: printf("\nIntroduire le num%cro du client recherch%c:\n",130,130);
                  scanf("%d",&number);
                  printf("\nIntroduire le nom du client recherch%c:\n",130);
                  fflush(stdin);
                  gets(name);
                  if(recherche2(*racine,name,number))
                    printf("Ce client existe");
                  else
                    printf("Ce client n'existe pas");
                  break;
          case 6: printf("\nIntroduire le num%cro du client %c supprimer:\n",130,133);
                  scanf("%d",&number);
                  printf("\nIntroduire le nom du client %c supprimer:\n",133);
                  fflush(stdin);
                  gets(name);
                  modifie=supprimer(racine,name,number);
                  if(modifie)
                    printf("C'est fait");
                  else
                    printf("Client non trouv%c",130);
                  printf("\nEn ordre alphab%ctique on obtient maintenant:\n",130);
                  symetrique(*racine);
                  break;
          case 7: printf("\nEn alphab%ctique on obtient le fichier:\n",130);
                  symetrique(*racine);
                  break;
          default:printf("\nTout est bien qui finit bien\n",130,130);
        }
      }
    }
    l'équivalent de ma fonctione copie s'appelle ici égalise (ligne 24).

    Aucun warning à la compilation.

  4. #4
    Membre confirmé
    Inscrit en
    Août 2008
    Messages
    145
    Détails du profil
    Informations forums :
    Inscription : Août 2008
    Messages : 145
    Par défaut
    Bon... j'ai rajouté
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    #include "fonctions_film.h"
    dans le fichier fonctions_autre.h et je n'ai plus de warning.

    Je ne comprends pas ce que ça change étant donné qu'ils sont bien inclu dans le main :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    /* ----- main.c -----*/
    /* le main */
    #include <stdio.h> 
    #include <stdlib.h> 
    #include <string.h> 
    #include <windows.h>
    #include "fonctions_film.h"
    #include "fonctions_autre.h"
    du coup je ne sas pas si je dois rajouter ou pas
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    #include "fonctions_autre.h"
    dans le fichier fonctions_film.h

    bref, je trouve pas tout ça très clair

  5. #5
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2009
    Messages
    4 493
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 493
    Billets dans le blog
    1
    Par défaut
    Aucun warning à la compilation.
    Petit coquinou ! N'essaye pas de me feinter, j'ai essayé de le compiler ce code et j'obtiens tout ça :

    d:\Documents and Settings\pgradot\Mes documents\Tools SD\A voir\developpez\main.c|25|warning: return type defaults to 'int'|
    d:\Documents and Settings\pgradot\Mes documents\Tools SD\A voir\developpez\main.c|176|warning: return type defaults to 'int'|
    d:\Documents and Settings\pgradot\Mes documents\Tools SD\A voir\developpez\main.c|237|warning: return type defaults to 'int'|
    d:\Documents and Settings\pgradot\Mes documents\Tools SD\A voir\developpez\main.c||In function 'main'
    d:\Documents and Settings\pgradot\Mes documents\Tools SD\A voir\developpez\main.c|239|warning: unused variable 'n'|
    d:\Documents and Settings\pgradot\Mes documents\Tools SD\A voir\developpez\main.c|239|warning: unused variable 'i'|
    d:\Documents and Settings\pgradot\Mes documents\Tools SD\A voir\developpez\main.c||In function 'ecrire_preordre'
    d:\Documents and Settings\pgradot\Mes documents\Tools SD\A voir\developpez\main.c|183|warning: control reaches end of non-void function|
    d:\Documents and Settings\pgradot\Mes documents\Tools SD\A voir\developpez\main.c||In function 'egalise'
    d:\Documents and Settings\pgradot\Mes documents\Tools SD\A voir\developpez\main.c|29|warning: control reaches end of non-void function|
    ||=== Build finished: 0 errors, 7 warnings ===|

    J'ai compilé avec -Wall -Wextra -std=c99 -pedantic avec MinGW. J'ai essayé de tout enlever et j'ai encore les warnings Quel compilateur utilises-tu ?


    Pour la version avec différents fichiers, as-tu une inclusion qui fait connaitre les structures à tes fonctions ?

    EDIT : bon visiblement, la réponse à ma dernière question était "non". As-tu bien compris le principe de compilation séparée, d'unité de compilation, et d'inclusion de fichiers ?

  6. #6
    Membre confirmé
    Inscrit en
    Août 2008
    Messages
    145
    Détails du profil
    Informations forums :
    Inscription : Août 2008
    Messages : 145
    Par défaut
    j'utilise dev c++

  7. #7
    Expert confirmé
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Par défaut
    du coup je ne sas pas si je dois rajouter ou pas
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    #include "fonctions_autre.h"
    dans le fichier fonctions_film.h
    fonctions_film.h, tel que tu l'as donné, n'utilise aucune des définitions qui figurent dans fonctions_autre.h. Il n'y a aucune raison de faire cet include.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. has incomplete type,forward declaration of ,
    Par Pragmateek dans le forum C++
    Réponses: 12
    Dernier message: 22/07/2006, 15h03
  2. Trouver le Type d'une classe template dynamiquement ?
    Par Serge Iovleff dans le forum Langage
    Réponses: 3
    Dernier message: 23/09/2005, 16h48
  3. Réponses: 11
    Dernier message: 31/01/2005, 17h48
  4. Déterminer le type d'une class dérivée
    Par LDDL dans le forum MFC
    Réponses: 3
    Dernier message: 10/12/2004, 17h36
  5. [Debutant][Collection] Création d'un vecteur de type d'une classe
    Par Tao® dans le forum Collection et Stream
    Réponses: 11
    Dernier message: 22/04/2004, 17h06

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