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 avec sizeof et compilation séparée


Sujet :

C

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    175
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 175
    Par défaut Erreur avec sizeof et compilation séparée
    Bonjour,

    Je n'arrive pas à comprendre l'erreur suivante à la compilation :
    gcc main.c longueur.o -o prog
    main.c: Dans la fonction «main» :
    main.c:19: erreur: invalid application of «sizeof» to incomplete type «const unsigned char[]»
    make: *** [prog] Erreur 1
    main.c :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    #include <stdio.h>
     
    extern const int x;
    extern const unsigned char tab[];
     
    int main(void)
    {
    	printf ("taille x = %d \n", sizeof x);
    	printf ("taille tab = %d \n", sizeof tab);
     
        return 0;
    }
    longueur.c
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    #include <stdio.h>
     
    const int x = 8;
     
    const unsigned char tab[] = {'c', 'h', 'a', 'r'};
    Visiblement le "sizeof tab" pose problème mais c'est ok pour le "sizeof x"

  2. #2
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Par défaut
    C'est normal, dans le fichier main.c tu dis que tab est un tableau de char mais au moment du sizeof(), le compilateur ne connait pas et ne peut pas connaitre la taille de ce tableau d'où ton erreur.

    Le compilateur ne compile qu'un seul fichier à la fois, et une fois qu'il a compilé ce fichier et qu'il passe au suivant, il a tout oublié du précédent.
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

  3. #3
    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
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    extern const unsigned char tab[];
    La dimension de tab n'est pas spécifiée, le compilateur ne peut pas la deviner quand il compile main.c !
    Par contre, il sait très bien la taille d'un int ce qui ne pose pas de problème pour la variable x

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    175
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 175
    Par défaut
    Comment faire alors pour connaître la taille de tab dans main.c ? j'en ai besoin moi.

  5. #5
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Par défaut
    tu ne peux pas de cette manière.

    Ce que tu peux faire à la limite, c'est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    printf ("taille tab = %d \n", strlen(tab));
    Mais c'est la porte ouverte au crash si la variable tab[] n'est pas initialisée.
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    175
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 175
    Par défaut
    Citation Envoyé par ram_0000 Voir le message
    tu ne peux pas de cette manière.

    Ce que tu peux faire à la limite, c'est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    printf ("taille tab = %d \n", strlen(tab));
    Mais c'est la porte ouverte au crash si la variable tab[] n'est pas initialisée.
    strlen() fonctionne et pas sizeof, pourquoi ?

  7. #7
    Membre chevronné

    Inscrit en
    Juillet 2008
    Messages
    232
    Détails du profil
    Informations forums :
    Inscription : Juillet 2008
    Messages : 232
    Par défaut
    Parce que t est de type "tableau de caracteres", mais le compilateur n'a pas idee combien de caracteres il contient. En C un tableau est juste un pointeur vers son premier element, il n'a pas de champ "taille".

    Par contre strlen sait la taille d'une chaine: la fonction lit simplement tous les caracteres de la chaine jusqu'a ce qu'elle rencontre un zero, qui indique la fin de la chaine.

  8. #8
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Par défaut
    Citation Envoyé par oranoutan Voir le message
    strlen() fonctionne et pas sizeof, pourquoi ?
    sizeof() est évalué par le compilateur à la compilation du module, strlen() est calculé par le programme à l'exécution du module
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

  9. #9
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    175
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 175
    Par défaut
    ok, merci les gens.

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

Discussions similaires

  1. Erreur lors de la compilation avec OmniORB
    Par JohnKwada dans le forum CORBA
    Réponses: 1
    Dernier message: 07/09/2006, 17h34
  2. Compilation de report en erreur avec Ant
    Par ltournayre dans le forum Jasper
    Réponses: 1
    Dernier message: 10/08/2006, 11h33
  3. Problème avec sizeof(...) : erreur de taille
    Par Invité dans le forum Autres éditeurs
    Réponses: 4
    Dernier message: 06/05/2006, 12h53
  4. Erreur avec Glibc en compilation croisée
    Par Senaku-seishin dans le forum Linux
    Réponses: 2
    Dernier message: 02/12/2005, 14h12
  5. Compilation séparée avec dev C/C++
    Par benjiprog dans le forum Dev-C++
    Réponses: 5
    Dernier message: 07/11/2005, 18h26

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