Pointeurs sur des champs de structure

Makino94 Messages postés 4 Statut Membre -  
chuka Messages postés 980 Statut Membre -
Bonjour,

struct InformationEleve
{
char matriculeEleve;
char Identidiant;
char nomEleve;
char prenomEleve;
char section;
};
struct InformationEleve InformationEleve[NB_EL_CLASSE];

Et j'aimerais savoir dans un premier la différence entre une structure de cette forme et une structure qui utilise "typedef",et aussi l'intéret.
Dans un 2ème temps comment faire pour pointer sur un champ et incrémenter de telle sorte que ça pointe sur les champ suivants sans pour autant les citer ( pour les mettre par exemple dans une boucle for).
Merci

3 réponses

kilian Messages postés 8854 Statut Modérateur 1 526
 
Le premier interêt c'est d'avoir des noms de types plus courts.
Le deuxième, c'est que tu crées ton type, c'est en quelque sorte une manière de créer une couche d'abstraction.

Par exemple, avec typedef tu aurais ceci:
struct __InformationEleve
{
char matriculeEleve;
char Identidiant;
char nomEleve;
char prenomEleve;
char section;
};

typedef struct __InformationEleve InformationEleve;

InformationEleve InformationEleve[NB_EL_CLASSE]; 


La tu as un type InformationEleve, tu n'as pas besoin de savoir que c'est une structure ou quoi que ce soit, on te file une batterie de fonction avec laquelle tu joues avec ce type.
Par exemple void changersection(char section, InformationEleve *e)
Ca permet en quelques sorte de rendre le code plus humain, plus abstrait... Le soucis c'est que bien souvent ça obscurcit le code, on ne sait pas bien si InformationEleve est un entier ou une structure etc...alors il faut aller chercher dans les headers et patati et patata.

Dans un 2ème temps comment faire pour pointer sur un champ et incrémenter de telle sorte que ça pointe sur les champ suivants sans pour autant les citer ( pour les mettre par exemple dans une boucle for).

N'y compte pas. En effet tu peux simuler ta structure comme si c'était un tableau. Mais c'est crade, illisible et source d'erreur.

Souvent, les processeurs ont besoin d'aligner les données en mémoire, ce qui fait que si la mémoire doit être alignée sur 4 octets, ta structure occupera réellement ça en mémoire:
struct InformationEleve
{
//0 octets
char matriculeEleve;
char Identidiant;
char nomEleve;
char prenomEleve;
//4 octets
char section;
char padding1;
char padding2;
char padding3;
//8 octets
};

Si on prends ta structure brute, on a 5 octets, il faut que ton compilateur fasse un padding pour compléter jusqu'à avoir un multiple de 4.
Ici ça va, tu n'aurait pas de dégâts en prenant ta structure comme un tableau, mais dans d'autres cas ça pourrait s'avérer catastrophique, exemple:
struct bidule {
    //0 octets
    short s
   //2 octets
   char c
   //3 octets merde, faut aligner pour accéder à l'entier suivant
   char padding; //implicite
   //4 octets
   int i;
   //8 octets
}

Et ici le padding n'était pas forcément aisé à deviner....
1
chuka Messages postés 980 Statut Membre 378
 
Salut,
Pour le typedef, tu definis en fait un nouveau type (au meme titre qu'un int, char etc....)
Donc apres tu peux declarer directement ta structure dans tes declarations.
par exemple:
typedef struct InformationEleve
{
char matriculeEleve;
char Identidiant;
char nomEleve;
char prenomEleve;
char section;
} InfoEle;
int main()
{InfoEle*eleve;
InfoEle listeEleve[50];
Pour le deuxieme, je sais pas...mais si j'ai bien compris ce que tu voulais faire c'est par exemple, si j'ai 6 elements dans ma structure, pouvoir faire une boucle pour remplir les 6 elements...mais je pense que la difficulté c'est que tu n'as pas forcement des elements homogenes...un tableau de char de 15 char, un int , une autre stucture etc...donc il faudrait faire des offsets dans la structure par rapport à l'emplacement mémoire pris par chaque elements....
J'espere ca pourra t'aider!!
@+
0
chuka Messages postés 980 Statut Membre 378
 
Merci Kilian pour cet eclaircissement ( le padding, je ne connaissais pas....)
On en apprend tous les jours, ca c'est vraiment cool!!
@+
0