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 :

exemple d'implantation de stddef


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    amateur
    Inscrit en
    Avril 2012
    Messages
    145
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : amateur
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Avril 2012
    Messages : 145
    Par défaut exemple d'implantation de stddef
    Bonjour,

    Je suis nouveau sur le forum.
    Question du jour: je cherche à savoir comment sont déclarés et/ou concrètement implantés des choses de base comme NULL ou size_t. Apparemment, tout ça est dans stddef. J'ai fouillé glibc en vain pendant des heures sans le trouver; mais apparemment tous les fichiers source qui utilisent ces choses #includent bien stddef (ou un autre fichier qui l'inclue).
    Alors, où trouver stddef? (dans glibc ou une autre implantation).

    Mon but est d'une part de comprendre ce que sont en réalité ces choses-là (pour certaines je soupçonne une part de magie du compilateur), et d'autre part de savoir ce que je fais et les conséquences éventuelles si j'utilise autre chose (par ex int ou un autre type signé pour des size), ou si je les rédéfinie.
    Très bizarrement, toutes les docs consultées --aussi détaillées qu'elles soient-- font l'impasse sur ces infos qui me paraissent basiques, et aucune ne renvoie vers une implantation ou n'en propose un exemple. Mais c'est peut-être moi qui suis bizarre ;-)

    Merci de

  2. #2
    Membre Expert
    Avatar de kwariz
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Octobre 2011
    Messages
    898
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2011
    Messages : 898
    Par défaut
    Salut,

    Pour retrouver ce que tu cherches il faut commencer par savoir comment a été configuré ton gcc, lance la commande gcc -v :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    # gcc -v
    Using built-in specs.
    COLLECT_GCC=gcc
    COLLECT_LTO_WRAPPER=/usr/lib64/gcc/x86_64-suse-linux/4.6/lto-wrapper
    Target: x86_64-suse-linux
    Configured with: ../configure --prefix=/usr --infodir=/usr/share/info --mandir=/usr/share/man --libdir=/usr/lib64 --libexecdir=/usr/lib64 --enable-languages=c,c++,objc,fortran,obj-c++,java,ada --enable-checking=release --with-gxx-include-dir=/usr/include/c++/4.6 --enable-ssp --disable-libssp --disable-plugin --with-bugurl=http://bugs.opensuse.org/ --with-pkgversion='SUSE Linux' --disable-libgcj --disable-libmudflap --with-slibdir=/lib64 --with-system-zlib --enable-__cxa_atexit --enable-libstdcxx-allocator=new --disable-libstdcxx-pch --enable-version-specific-runtime-libs --program-suffix=-4.6 --enable-linux-futex --without-system-libunwind --with-arch-32=i586 --with-tune=generic --build=x86_64-suse-linux
    Thread model: posix
    gcc version 4.6.2 (SUSE Linux)
    Tu repères la valeur de l'option libexecdir, tu lui ajoutes /gcc/[architecture]/[version] et tu regardes un peu l'arborescence en-dessous, tu devrais trouver ton bonheur dans le répertoire include.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    # ls /usr/lib64/gcc/x86_64-suse-linux/4.6/include
    abmintrin.h     float.h       jni.h        omp.h           stdint-gcc.h  x86intrin.h
    ammintrin.h     fma4intrin.h  jni_md.h     pmmintrin.h     stdint.h      xmmintrin.h
    avxintrin.h     gcj           jvmpi.h      popcntintrin.h  tbmintrin.h   xopintrin.h
    bmiintrin.h     ia32intrin.h  lwpintrin.h  smmintrin.h     tmmintrin.h
    bmmintrin.h     immintrin.h   mm3dnow.h    stdarg.h        uchar.h
    cpuid.h         iso646.h      mmintrin.h   stdbool.h       unwind.h
    cross-stdarg.h  jawt.h        mm_malloc.h  stddef.h        varargs.h
    emmintrin.h     jawt_md.h     nmmintrin.h  stdfix.h        wmmintrin.h

  3. #3
    Membre confirmé
    Profil pro
    amateur
    Inscrit en
    Avril 2012
    Messages
    145
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : amateur
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Avril 2012
    Messages : 145
    Par défaut trouvé, merci!
    Tu repères la valeur de l'option libexecdir, tu lui ajoutes /gcc/[architecture]/[version] et tu regardes un peu l'arborescence en-dessous, tu devrais trouver ton bonheur dans le répertoire include.
    Merci, j'ai bien trouvé.

    (En fait, le bon répertoire est aussi donné par la variable LTO_WRAPPER, chez moi:
    COLLECT_LTO_WRAPPER=/usr/lib/gcc/i686-linux-gnu/4.6.1/lto-wrapperà laquelle il suffit de retirer /lto-wrapper.)

    Alors, l'exploration de stddef.h est très instructive, même après un rapide survol. J'imagine qu'il n'y a pas de stddef.c, vu que je n'ai trouvé là-dedans que des déclarations?

    J'en profite pour demander s'il est sûr d'utiliser un entier signé pour des size? Ca m'arrangerait parce que j'implante des séquences (tableaux, strings) qui acceptent des index signés (à la Python, pour signifier "compter à rebours en partant de la fin"), et comme les indices interopèrent sans arrêt avec des sizes, j'imagine qu'il vaut sans doute mieux que tout ça soit du même type.
    Mon point de vue, peut-être erronné, est que tant que le type choisi permet de couvrir l'espace mémoire, ça devrait rouler. Mais j'oublie peut-être des détails ou subtilités de C.

    PS: la lib de gcc definit size_t ainsi:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    #define __SIZE_TYPE__ long unsigned int
    // ...
    typedef __SIZE_TYPE__ size_t;
    Merci encore,
    Denis

  4. #4
    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
    Tu n'as pas à te soucier des valeurs / types / formes exactes de choses comme NULL ou size_t. Ces valeurs peuvent être dépendantes de l'implémentation faite par ton compilateur de la norme (dans les cas où la norme laisse la décision à l'implémentation). Ces informations ne sont pas basiques, car elles ne te servent pas forcément quand tu codes. Quel pour être l'intérêt de savoir que NULL faut 0, 42 ou -666 pour savoir si un pointeur est nul ? Tu le compares à NULL et point barre

    j'implante des séquences (tableaux, strings) qui acceptent des index signés
    Qu'entends-tu par là ?

    Tu écris quelque chose comme tab[-2]; ?

  5. #5
    Membre confirmé
    Profil pro
    amateur
    Inscrit en
    Avril 2012
    Messages
    145
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : amateur
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Avril 2012
    Messages : 145
    Par défaut
    Citation Envoyé par Bktero Voir le message
    Qu'entends-tu par là ?
    Tu écris quelque chose comme tab[-2]; ?
    Oui, c'est ça, sauf qu'évidemment je peux pas utiliser la syntaxe [index]. tab[-2]; ce serait l'avant-dernier item, mais je dois l'écrire item (tab, -2);.

    Denis

  6. #6
    Membre Expert
    Avatar de kwariz
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Octobre 2011
    Messages
    898
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2011
    Messages : 898
    Par défaut
    Salut,

    en fait il n'y pas vraiment de problème tant que tu tapes dans la mémoire allouée :
    les notations tab[i] et *(tab+i) sont équivalentes :

    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
     
    int main()
    {
     
      int tab[]={0,1,2,3,4,5,6,7,8,9};
      int* ptr=tab+9;
      for(int i=0;i<10;i++)
        printf("%d ", ptr[-i]);
      printf("\n");
     
      for(int i=-9;i<1;i++)
        printf("%d ", i[ptr]);
      printf("\n");
     
      int c=2;
      printf("%c\n", "0123456789"[c]);
      printf("%c\n", c["0123456789"]);
     
      return 0;
    }
    produit comme sortie :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    9 8 7 6 5 4 3 2 1 0 
    0 1 2 3 4 5 6 7 8 9 
    2
    2

  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
    Mon point de vue, peut-être erronné, est que tant que le type choisi permet de couvrir l'espace mémoire, ça devrait rouler. Mais j'oublie peut-être des détails ou subtilités de C.
    - Dans la déclaration d'un tableau, l'évaluation de l'expression qui spécifie la taille doit fournir comme résultat un entier plus grand que 0.
    Il n'est pas imposé que cet entier soit unsigned.

    - L'indice d'un tableau doit être un entier. Il n'est pas imposé que cet entier soit unsigned (ni même plus grand que 0).

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

Discussions similaires

  1. Checrche Exemple d'application C++ Builder - MySQL
    Par pcatric dans le forum C++Builder
    Réponses: 12
    Dernier message: 11/11/2002, 23h51
  2. [VB6] Lancer un service, par exemple Sql Server
    Par fea dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 16/10/2002, 14h07
  3. recherche exemple simple pour corba en c++
    Par Pinggui dans le forum CORBA
    Réponses: 4
    Dernier message: 06/05/2002, 11h29

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