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:#define BYTE unsigned char
Version imprimable
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:#define BYTE unsigned char
Pour revenir au sujet du post ;
Voilà ce que je trouve dans l'aide Microsoft
Je m'interroge sur le "sizeof" appliqué à un tableau.Citation:
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] );
Avez vous une explication ?
Merci
Je n'ai pas bien saisi la question.Citation:
Envoyé par Nico_stras
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 ?Citation:
Envoyé par crocodilex
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.
Non.Citation:
Envoyé par Nico_stras
http://www.developpez.net/forums/sho...88&postcount=4
Il ne faut pas confondre pointeur et tableau. Ce sont deux types différents.Citation:
Envoyé par Nico_stras
En effet beaucoup de personnes font cette confusion.
Non.Citation:
Envoyé par Nico_stras
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.).Citation:
Il s'agit simplement du terme français ou du terme anglais.
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.
C'est sûr que si ta définition de départ est fausse, tout le reste n'est plus cohérent.Citation:
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.
Rien à voir. Les Bauds sont en relation avec le débit, ce qui est tout à fait hors-sujet ici.Citation:
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.Citation:
Par contre, je suis tout à fait d'accord sur la distinction entre "Byte" et "char", ou "octet" et "char".
Euh, c'est pas très clair.... char est un type mais "char" ... est une chaine de caractère ;)Citation:
"char" est un caractère.
Ben non, justement, les codes ASCII sont codés sur 7-bit.Citation:
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.
Moi aussi. Alors tu es comblé.Citation:
Je suis aussi un partisan du terme juste.
Je voudrais bien, mais ces termes ne sont pas équivalents. Alors tu as le droit d'utiliser multiplet à la place de byte.Citation:
Mais aussi, partisant de l'utilisation du français. Donc s'il vous plait, utilisez octet et non pas 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...
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 :Citation:
Envoyé par Nico_stras
pour économiser mon clavier et mes disques durs.Code:#define uchar unsigned char
EDIT : ou plutôt ceci, que je trouve plus sûr (peut être à tord...)
http://emmanuel-delahaye.developpez....ed/inc/types.h
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é...
Et je me prends une fessée à chaque fois, merci...Citation:
Envoyé par Jean-Marc.Bourguet
gardes ?Citation:
Envoyé par Médinoc
J'ai fait ça : http://emmanuel-delahaye.developpez....es.htm#tableau
mais je ne sais pas si c'est très clair...
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 ?Citation:
Envoyé par Médinoc
Je crois qu'il parlait du fait que tu proteges tes typedefs au cas ou des macros de meme nom seraient deja definies.Citation:
Envoyé par Emmanuel Delahaye
Citation:
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... :sm: :mouarf:
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.
OkCitation:
* Un tableau est une séquence d'élements de types identiques.
Tous les noms sont invariants...Citation:
* Le nom du tableau est invariant.
Non, il designe la totalite du tableau.Citation:
Il a la valeur et le type de l'adresse du premier élément du tableau.
Il est souvent converti implicitement en un pointeur et alorsCitation:
Etant de la même nature qu'un pointeur,
Ok.Citation:
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.
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 !!! :marteau: :marteau: :marteau: (que j'avais vite corrigé d'ailleurs)
En exécutant ce petit code, je viens de comprendre plein de choses :)Code:
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) }
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#mallocCitation:
Envoyé par Nico_stras
Et c'est pas sizeof(). C'est sizeof data ou sizeof (type). Ce n'est pas une fonction mais un opérateur unaire.