Pointeurs sur des champs de structure
Makino94
Messages postés
4
Statut
Membre
-
chuka Messages postés 980 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
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
A voir également:
- Pointeurs sur des champs de structure
- Logiciel calcul structure bois gratuit - Télécharger - Architecture & Déco
- Structure d'un rapport de stage - Guide
- Le nom du champ de tableau croisé dynamique n'est pas valide ✓ - Forum Excel
- Word mettre à jour tous les champs ✓ - Forum Word
- Word : Mise à jour des champs - Forum Word
3 réponses
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:
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:
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:
Et ici le padding n'était pas forcément aisé à deviner....
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....
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!!
@+
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!!
@+