Plus ou moins. Pas exactement, mais il y a quelques similitudes.
Plus ou moins. Pas exactement, mais il y a quelques similitudes.
Tu as raison, rien ne garantit que NULL est représenté avec tous les bits à zéro. Dans ce contexte, il n'est pas possible de se fier à calloc() pour initialiser un tableau de pointeur ou un tableau de flottants à une valeur nulle (NULL ou 0.0 respectivement). C'est en revanche OK pour les entiers.
EDIT: Oups, désolé corrector, ça m'apprendra à répondre sans avoir lu le fil jusqu'à la fin
Thierry
Merci pour vos confirmations !
J'aimerais avoir une petite explication sur ce qu'est réellement "une trap representation" ainsi que "le bit padding" ...
Merci !
En gros, une combinaison de bits interdite provoquant une exception (trap ou 'piège').
Je connais le bit stuffing utilisé en codage numérique réseau et le byte padding qui est le remplissage placé entre les éléments d'une structure pour garantir l'alignement...ainsi que "le bit padding"
n1124 :
6.2.6.2 Integer types
.....
5 The values of any padding bits are unspecified.45) A valid (non-trap) object representation of a signed integer type where the sign bit is zero is a valid object representation of the corresponding unsigned type, and shall represent the same value. For any integer type, the object representation where all the bits are zero shall be a representation of the value zero in that type.
trap representation : état mémoire d'un objet de type T :
- qui ne correspond pas à la représentation d'une valeur de T,
- et qui, s'il est interprété par le processeur comme étant du type T, provoquera une erreur
Par exemple, sur les certaines machines représentant les entiers signés en signe-magnitude, la représentation "zéro négatif" peut être une trap representation. Une variable int non initialisée pourra avoir un tel état. Tenter de la lire provoquera une exception processeur (= trap).
Plus répandu de nos jours : sur un processeur x86, charger un pointeur non valide dans un registre d'adresse peut provoquer une erreur.
unsigned char n'a pas de trap representation, et permet d'examiner la mémoire; mais signed char et char peuvent avoir des "trap representation"!
padding bits : bits appartenant aux bytes d'un objet (sizeof(T) bytes pour un objet de type T), mais qui ne contribuent pas à la représentation de la valeur de l'objet : quel que soit l'état de ces bits, la valeur représentée est la même.
S'il un type T a des bits de padding (= remplissage/rembourrage), deux objets de type T de même valeur n'auront pas forcément la même représentation; si a et b sont de type T, on peut avoir la propriété :
a == b && memcmp (&a, &b, sizeof a) != 0
Copier une variable d'un tel type pourra soit copier tous les bits y compris ceux de padding, soit ne pas modifier les bits de padding de la cible, soit faire n'importe quoi sur ces bits.
Ce qui implique qu'on ne peut pas, en général, comparer la valeur des objets avec memcmp.
char, et ses variantes signées et non-signées, ne peuvent pas avoir de padding bits.
je vois mieux pourquoi la comparaison bit à bit est très déconseilléeEnvoyé par corrector
Merci à tous
Bonjour,
est ce que ça pose un problème de déclarer
dans x.h au lieu de x.c, pour ensuite dans le main faire p->a pour accéder à a plutôt que de devoir créer une fonction x_geta pour chaque tableau (a,b,c etc...)
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 struct x { int *a; int *b; int **c; int taille2; };
Car j'ai besoin de ces tableaux pour les donner à d'autres fonctions. Je ne peux pas me permettre de faire des fonctions dans le TAD (comme le dit médinoc, ou comme expliqué ici http://emmanuel-delahaye.developpez.com/tad.htm) qui elles accèdent aux données car je devrais alors réécrire tous mes algos de traitement qui prennent en entrée un int * par exemple.
Cela ne pose à priori pas de problème. Tout dépend en fait de quel degré d'encapsulation des données tu désires avoir. Si le code client accède directement aux champs de la structure, tout changement ultérieur de cette structure pourrait devenir difficile à mettre en oeuvre.
Thierry
en fait ce qui est surtout important pour moi, c'est de faciliter l'allocation (et désallocation) mémoire de mes tableaux.
Et mettre ces fonctions dans une fichier séparé, je trouve ça pratique.
Donc si je peux aussi accéder aux membres de ma structure directement c'est ce dont j'ai besoin pour ce problème.
Non, ce qui facilite la (dés)allocation, c'est d'avoir des fonctions comme x_create ou x_delete qui s'en occupent.
Par contre le fait de rentre la structure publique facilite l'accés à mes tableaux pour les passer à mes différents algos qui prennent en paramètre un int* par exemple.
Sinon, pour chaque tableau il me faudrait créer une fonction get
Oui.
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager