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 :

propriétés du sizeof


Sujet :

C

  1. #21
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    200
    Détails du profil
    Informations personnelles :
    Localisation : France, Bas Rhin (Alsace)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 200
    Par défaut
    J'avais bien compris la différence entre octet et char, mais effectivement, le ne conaissais pas l'étymologie de "Byte"

    Merci pour cette correction :-)

    Mais... en ANSI-C, le mot Byte n'existe pas, ou bien ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    #define BYTE unsigned char

  2. #22
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    200
    Détails du profil
    Informations personnelles :
    Localisation : France, Bas Rhin (Alsace)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 200
    Par défaut
    Pour revenir au sujet du post ;


    Voilà ce que je trouve dans l'aide Microsoft
    size_t i = sizeof( int );

    struct align_depends {
    char c;
    int i;
    };
    size_t size = sizeof(align_depends); // The value of size depends on
    // the value set with /Zp or
    // #pragma pack

    int array[] = { 1, 2, 3, 4, 5 }; // sizeof( array ) is 20
    // sizeof( array[0] ) is 4
    size_t sizearr = // Count of items in array
    sizeof( array ) / sizeof( array[0] );
    Je m'interroge sur le "sizeof" appliqué à un tableau.

    Avez vous une explication ?

    Merci

  3. #23
    Membre émérite Avatar de crocodilex
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    697
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 697
    Par défaut
    Citation Envoyé par Nico_stras
    Pour revenir au sujet du post ;


    Voilà ce que je trouve dans l'aide Microsoft


    Je m'interroge sur le "sizeof" appliqué à un tableau.

    Avez vous une explication ?

    Merci
    Je n'ai pas bien saisi la question.
    sizeof appliqué à un tableau donne la taille du tableau.

  4. #24
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    200
    Détails du profil
    Informations personnelles :
    Localisation : France, Bas Rhin (Alsace)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 200
    Par défaut
    Citation Envoyé par crocodilex
    Je n'ai pas bien saisi la question.
    sizeof appliqué à un tableau donne la taille du tableau.
    Pour etre précis, je dirais "sizeof appliqué au pointeur du 1er élément du tableau, donc sizeof du pointeur. Non ?

    Comment la compilateur peut connaitre la taille d'un tableau ? Surtout quand on envoie la pointeur sur le 1er élément du tableau, en paramètre d'une fonction.

  5. #25
    Expert confirmé

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Par défaut
    Citation Envoyé par Nico_stras
    Pour etre précis, je dirais "sizeof appliqué au pointeur du 1er élément du tableau, donc sizeof du pointeur.
    Non.

    http://www.developpez.net/forums/sho...88&postcount=4

  6. #26
    Membre émérite Avatar de crocodilex
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    697
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 697
    Par défaut
    Citation Envoyé par Nico_stras
    Pour etre précis, je dirais "sizeof appliqué au pointeur du 1er élément du tableau, donc sizeof du pointeur. Non ?

    Comment la compilateur peut connaitre la taille d'un tableau ?
    Il ne faut pas confondre pointeur et tableau. Ce sont deux types différents.
    En effet beaucoup de personnes font cette confusion.

  7. #27
    Expert éminent
    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
    Par défaut
    Citation Envoyé par Nico_stras
    Je suis tombé par hasard sur ce post, et je me permets de réagir.

    Byte et octet, c'est la même chose !
    Non.
    Il s'agit simplement du terme français ou du terme anglais.
    Non. En anglais technique (je ne parle pas de jargon de journaliste, OK ?), octet se dit octet et désigne un objet d'exactement 8-bit tels que ceux qu'on manipule dans les flux (fichiers, réseau etc.).

    Byte se traduite par multiplet, mais ce terme est tellement bizarre que le terme byte s'utilise aussi en français.

    En langage C (sujet du forum, je le rappelle), un byte désigne le plus petit espace mémoire adressable d'une taile >= à 8-bit. Un char a exactement la taille d'un byte. Il peut donc faire plus que 8-bit et c'est là toute la différence avec un octet qui lui, fait exactement 8-bit.
    Emmanuel Delahaye a écrit :
    En nombre de bytes... Il n'y a pas d'octets en C. C'est une notion flux ou réseau...

    Je ne comprends pas ce que tu veux dire par là.
    Octet veut dire 8 bits ; tout comme byte.
    C'est sûr que si ta définition de départ est fausse, tout le reste n'est plus cohérent.
    Pour la notion de réseau, tu confonds avec les "bauds" :http://fr.wikipedia.org/wiki/Baud
    Rien à voir. Les Bauds sont en relation avec le débit, ce qui est tout à fait hors-sujet ici.
    Par contre, je suis tout à fait d'accord sur la distinction entre "Byte" et "char", ou "octet" et "char".
    En bien là encore, tu es dans l'erreur. Dans le contexte du langage C (sujet du forum, je le rappelle), un char et byte désignent des objets de même taille. Ensuite, le langage C ajoute la notion de type qui fait qu'un char, un signed char et un unsigned char ne se comportent pas exactement pareil notamment si on effectue des opérations logiques ou arithmétiques dessus.
    "char" est un caractère.
    Euh, c'est pas très clair.... char est un type mais "char" ... est une chaine de caractère
    Suivant le système, un caractère pourra se coder de différentes manières. Le plus commun est la table ASCII, effectivement codée sur 8 bits, soit 1 octet.
    Ben non, justement, les codes ASCII sont codés sur 7-bit.
    Je suis aussi un partisan du terme juste.
    Moi aussi. Alors tu es comblé.
    Mais aussi, partisant de l'utilisation du français. Donc s'il vous plait, utilisez octet et non pas byte.
    Je voudrais bien, mais ces termes ne sont pas équivalents. Alors tu as le droit d'utiliser multiplet à la place de byte.

    La plupart de tes affirmations, malheureusement inexactes, font partie des légendes urbaines bien connues, tenaces et entretenues par des gens (profs, programmeurs, bricoleurs...) qui répètent sans vraiment savoir de quoi ils parlent et surtout sans approfondir leurs connaissance.

    J'avoue sans complexe que la première fois qu'on m'a mis les points sur les i dans ce domaine, je suis tombé du haut de mes 10 ans (à l'époque) de pratique de la programmation et du langage C. Mais j'ai appris à lire, à me remettre en cause et j'ai compris.

    Tu n'es pas le premier à qui ça fait drôle la première fois...

  8. #28
    Expert éminent
    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
    Par défaut
    Citation Envoyé par Nico_stras
    Mais... en ANSI-C, le mot Byte n'existe pas, ou bien ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    #define BYTE unsigned char
    Non. Cette définition ne fait pas partie du langage C. C'est un ajout (qui, AMA, prête plus à confusion qu'autre chose). Personnellement, j'utilise :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    #define uchar unsigned char
    pour économiser mon clavier et mes disques durs.

    EDIT : ou plutôt ceci, que je trouve plus sûr (peut être à tord...)

    http://emmanuel-delahaye.developpez....ed/inc/types.h

  9. #29
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 392
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 392
    Par défaut
    Nico_stras: Un tableau est implicitement convertible en pointeur vers son premier élément, mais n'est pas lui-même un pointeur...

    Emmanuel: Je pense qu'il faudra revoir tes gardes là-dessus un jour ou l'autre. Tu m'avais déjà donné une raison de faire comme tu as fait, mais rétrospectivement, je doute de sa validité...
    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.

  10. #30
    Expert éminent
    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
    Par défaut
    Citation Envoyé par Jean-Marc.Bourguet
    Et je me prends une fessée à chaque fois, merci...

  11. #31
    Expert éminent
    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
    Par défaut
    Citation Envoyé par Médinoc
    Emmanuel: Je pense qu'il faudra revoir tes gardes là-dessus un jour ou l'autre. Tu m'avais déjà donné une raison de faire comme tu as fait, mais rétrospectivement, je doute de sa validité...
    gardes ?

    J'ai fait ça : http://emmanuel-delahaye.developpez....es.htm#tableau

    mais je ne sais pas si c'est très clair...

  12. #32
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 392
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 392
    Par défaut
    Pardon, je parlais de gardes "comme des gardes d'inclusion" sur tes typedefs...
    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.

  13. #33
    Expert éminent
    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
    Par défaut
    Citation Envoyé par Médinoc
    Pardon, je parlais de gardes "comme des gardes d'inclusion" sur tes typedefs...
    Quel rapport avec le sujet ? De quoi parles-tu exactement ? Tu as trouvé un bug dans mon code ?

  14. #34
    Expert confirmé

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Par défaut
    Citation Envoyé par Emmanuel Delahaye
    gardes ?
    Je crois qu'il parlait du fait que tu proteges tes typedefs au cas ou des macros de meme nom seraient deja definies.

    J'ai fait ça : http://emmanuel-delahaye.developpez....es.htm#tableau

    mais je ne sais pas si c'est très clair...

    La fessee ne suffit pas? S'il faut le fouet...

    Il n'y a rien de special aux variables de type tableau; elles se comportent comme tous les objets de type tableau (par exemple *ptr et mat[1] dans le message que j'ai cite ci-dessus).

    Le probleme c'est que les tableaux (tous les tableaux) sont speciaux. Ce sont des lvalues non modifiables; on ne peut pas assigner une nouvelle valeur a tout un tableau. Et dans presque toutes les expressions, ils sont converti implicitement en un pointeur vers leur premier element (et ce pointeur n'est pas une lvalue, il ne designe pas un objet mais simplement une valeur).

    Les exceptions sont: argument de sizeof, argument de & pour tout les tableaux; et les litteraux de type chaine qui servent a initialiser les tableaux.

    * Un tableau est une séquence d'élements de types identiques.
    Ok
    * Le nom du tableau est invariant.
    Tous les noms sont invariants...

    Il a la valeur et le type de l'adresse du premier élément du tableau.
    Non, il designe la totalite du tableau.

    Etant de la même nature qu'un pointeur,
    Il est souvent converti implicitement en un pointeur et alors

    les même regles d'adressage s'appliquent, à savoir que le premier élément est en tab, soit tab + 0 et que son contenu est donc *(tab + 0). De même le contenu du deuxième élément est *(tab + 1) etc.
    * Cette syntaxe étant un peu lourde, le langage C définit une simplification qui est tab[0], tab[1] etc. Le nombre entre les crochets est appelé indice. Son domaine de définition pour un tableau de taille N est 0 à N-1.
    Ok.

  15. #35
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    200
    Détails du profil
    Informations personnelles :
    Localisation : France, Bas Rhin (Alsace)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 200
    Par défaut
    C'est quand même fou à quel point un post peut faire réagir autant de monde, et pas des moindres

    En tout cas, merci à tous pour ces explications, et Mea-culpa pour toutes ces erreurs.

    Effectivement, on tombe des nues en apprenant tout ça.

    Au moins, mes bêtises auront été constructives et encore merci.

    Nicolas
    Strasbourg

    PS : Pour le partisant, oui, c'est impardonnable !!! (que j'avais vite corrigé d'ailleurs)

  16. #36
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    200
    Détails du profil
    Informations personnelles :
    Localisation : France, Bas Rhin (Alsace)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 200
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    int fonction2(char* pTableau)
    {
         return sizeof(pTableau) ;
    }
    
    int main()
    {
         char tableau[8]={'\0'} ;
         int iSize=sizeof(tableau) ;      //8 (taille du TABLEAU COMPLET en bytes)
         printf("%d\n",iSize) ;
         iSize=fonction2(tableau) ;
         printf("%d\n",iSize) ;             //4 (taille du POINTEUR en bytes)
    }
    En exécutant ce petit code, je viens de comprendre plein de choses

    Pour savoir exactement ce que l'on fait, n'est-il pas préférable de faire un sizeof() uniquement sur TYPE et non une DONNEE ?

  17. #37
    Expert éminent
    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
    Par défaut
    Citation Envoyé par Nico_stras
    Pour savoir exactement ce que l'on fait, n'est-il pas préférable de faire un sizeof() uniquement sur TYPE et non une DONNEE ?
    Ca dépend des cas. L'utilisation de la donnée est souvent préférable. Exemple classique : http://emmanuel-delahaye.developpez....tes.htm#malloc

    Et c'est pas sizeof(). C'est sizeof data ou sizeof (type). Ce n'est pas une fonction mais un opérateur unaire.

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

Discussions similaires

  1. [ActiveX] Propriété "Picture" dans un contrôle util
    Par Ricou13 dans le forum VB 6 et antérieur
    Réponses: 3
    Dernier message: 14/12/2002, 15h59
  2. Accés rapide aux propriétés d'un Objet
    Par Alacazam dans le forum C++Builder
    Réponses: 4
    Dernier message: 28/11/2002, 21h56
  3. [ActiveX] Visibilité d'une propriété
    Par paradise dans le forum Composants VCL
    Réponses: 2
    Dernier message: 14/11/2002, 18h33
  4. [controle] propriété read only
    Par Fizgig dans le forum Composants VCL
    Réponses: 6
    Dernier message: 28/08/2002, 10h30
  5. [propriétés]Option Checked
    Par psl dans le forum Composants VCL
    Réponses: 6
    Dernier message: 22/08/2002, 08h07

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