Sign in Join
Wiki copytemporary

Flexible Array Member/fr: what changed

Revision 2 to 3. Removed lines have a minus sign; added lines have a plus sign.

OldNewLine
1-C'est une caractéristique rarement utilisée en langage C. Elle a été introduite avec la norme C99. Elle n'a jamais été adoptée par le compilateur C++ (et cela pourrait être la raison de la rare utilisation). Quelques API à la C pourrait bénéficier de cette caractéristique, en particulier celles de bas niveau.
2-
3-## Contents
4-
5- * 1 Introduction
6- * 2 Pascal
7- * 2.1 Adressage direct
8- * 2.2 Utilisation d'enregistrement supplémentaire
9- * 2.3 Utilisation d'enegistrement avancé
10- * 3 Voir aussi
1+C'est une caractéristique rarement utilisée en langage C. Elle a été introduite avec la norme C99. Elle n'a jamais été adoptée par le compilateur C++ (et cela pourrait être la raison de la rare utilisation). Quelques API à la C pourrait bénéficier de cette caractéristique, en particulier celles de bas niveau.
112
123## Introduction
134
14-**Avertissement:** _cette section est à peu près un copier-coller de l'[article Wikipedia](<https://en.wikipedia.org/wiki/Flexible_array_member>)_
5+**Avertissement:** *cette section est à peu près un copier-coller de l'[article Wikipedia](https://en.wikipedia.org/wiki/Flexible_array_member)*
156
16-Le membre tableau flexible est un membre de struct, qui est un tableau sans dimension spécifiée. Il doit être le dernier membre d'un tel struct et doit être acompagné d'au moins un autre membre, comme dans l'exemple suivant:
17-```
7+Le membre tableau flexible est un membre de struct, qui est un tableau sans dimension spécifiée. Il doit être le dernier membre d'un tel struct et doit être acompagné d'au moins un autre membre, comme dans l'exemple suivant:
8+
9+``` c
1810typedef struct mystruct
19- {
20- DWORD a;
21- DWORD b;
22- DWORD c[]; // le membre tableau flexible doit être le dernier
23- };
11+{
12+ DWORD a;
13+ DWORD b;
14+ DWORD c[]; // le membre tableau flexible doit être le dernier
15+};
2416```
2517
26-Généralement,de tels struct servent d'entête dans une plus large allocation mémoire variable:
27-```
18+Généralement,de tels struct servent d'entête dans une plus large allocation mémoire variable:
19+
20+``` c
2821struct mystruct* st= malloc(...);
29- ...
30- for (int i = 0; i < st->b; i++)
31- st->c[i] = ...;
22+...
23+for (int i = 0; i < st->b; i++)
24+ st->c[i] = ...;
3225```
3326
34-L'operateur sizeof sur un tel struct donne la taille du struct comme si le membre tableau flexible était vide. Cela peut inclure un rembourrage ajouté pour accueillir l'élément flexible ; le compilateur est également libre de réutiliser ce remplissage dans le cadre du tableau lui-même.
27+L'operateur sizeof sur un tel struct donne la taille du struct comme si le membre tableau flexible était vide. Cela peut inclure un rembourrage ajouté pour accueillir l'élément flexible ; le compilateur est également libre de réutiliser ce remplissage dans le cadre du tableau lui-même.
3528
36-Il est courant d'allouer sizeof(struct) + array_len*sizeof(array element) octets.
29+Il est courant d'allouer sizeof(struct) + array_len*sizeof(array element) octets.
3730
3831## Pascal
3932
40-Pascal n'a pas de membre de tableau flexible, donc la structure doit être déclarée sans le membre supplémentaire, afin que sizeof(mystruct) renvoie la même valeur qu'en C.
41-```
33+Pascal n'a pas de membre de tableau flexible, donc la structure doit être déclarée sans le membre supplémentaire, afin que sizeof(mystruct) renvoie la même valeur qu'en C.
34+
35+``` pascal
4236type
43- mystruct = record
44- a : DWORD;
45- b : DWORD;
46- end;
47- pmystruct = ^mystruct;
37+ mystruct = record
38+ a : DWORD;
39+ b : DWORD;
40+ end;
41+ pmystruct = ^mystruct;
4842```
4943
50-Il existe quelques options pour accéder aux éléments supplémentaires :
44+Il existe quelques options pour accéder aux éléments supplémentaires :
5145
5246### Adressage direct
5347
54-En obtenant explicitement l'adresse qui suit la structure d'en-tête
55-```
48+En obtenant explicitement l'adresse qui suit la structure d'en-tête
49+
50+``` pascal
5651var
57- i : integer;
58- buf : Pmystruct;
59- c : PDword;
60- begin
61- GetMem(buf, sizeof(mystruct)+ extrasize);
62- ...
63- c:=Pointer(buf)+sizeof(mystruct);
64-
65- for i := 0 to buf.b-1 do
66- c[i] := ...;
52+ i : integer;
53+ buf : Pmystruct;
54+ c : PDword;
55+begin
56+ GetMem(buf, sizeof(mystruct)+ extrasize);
57+ ...
58+ c:=Pointer(buf)+sizeof(mystruct);
59+
60+ for i := 0 to buf.b-1 do
61+ c[i] := ...;
6762```
6863
6964### Utilisation d'enregistrement supplémentaire
7065
71-Selon l'utilisation, l'enregistrement supplémentaire pourrait chevaucher l'enregistrement d'origine en utilisant [absolute](</index.php?title=absolute/fr&action=edit&redlink=1> "absolute/fr \(page does not exist\)").
72-```
66+Selon l'utilisation, l'enregistrement supplémentaire pourrait chevaucher l'enregistrement d'origine en utilisant [[absolute/fr|absolute]].
67+
68+``` pascal
7369type
74- mystructEx = record
75- hdr : mystruct;
76- c : PDword;
77- end;
78- pmystructEx = ^mystructEx;
79-
80-
81- var
82- i : integer;
83- buf : PmystructEx;
84- begin
85- GetMem(buf, sizeof(mystruct)+ extrasize);
86-
87- for i := 0 to buf.hdr.b-1 do
88- buf.c[i] := ...;
70+ mystructEx = record
71+ hdr : mystruct;
72+ c : PDword;
73+ end;
74+ pmystructEx = ^mystructEx;
75+
76+var
77+ i : integer;
78+ buf : PmystructEx;
79+begin
80+ GetMem(buf, sizeof(mystruct)+ extrasize);
81+
82+ for i := 0 to buf.hdr.b-1 do
83+ buf.c[i] := ...;
8984```
9085
9186### Utilisation d'enegistrement avancé
9287
93-Les enregistrements avancés permettent d'utiliser des méthodes et des propriétés pour les enregistrements. Ainsi, le champ pourrait être émulé via une méthode/propriété
94-```
88+Les enregistrements avancés permettent d'utiliser des méthodes et des propriétés pour les enregistrements. Ainsi, le champ pourrait être émulé via une méthode/propriété
89+
90+``` pascal
9591{$modeswitch advancedrecords}
96-
97- type
98- mystruct = packed record
99- a,b: DWORD;
100- function c: PDWORD; inline;
101- end;
102-
103- function mystruct.c: PDWORD;
104- begin
105- Result := PDWORD(pbyte(@self.b)+sizeOf(self.b));
106- end;
107-```
10892
109-OU en utilisant un enregistrement vide. (Un enregistrement vide n'a pas de structure, mais permet d'obtenir une adresse, ce qui devrait faire gagner du temps sur le calcul de l'adresse)
93+type
94+ mystruct = packed record
95+ a,b: DWORD;
96+ function c: PDWORD; inline;
97+ end;
98+
99+function mystruct.c: PDWORD;
100+begin
101+ Result := PDWORD(pbyte(@self.b)+sizeOf(self.b));
102+end;
110103```
104+
105+OU en utilisant un enregistrement vide. (Un enregistrement vide n'a pas de structure, mais permet d'obtenir une adresse, ce qui devrait faire gagner du temps sur le calcul de l'adresse)
106+
107+``` pascal
111108{$modeswitch advancedrecords}
112-
113- type
114- mystruct = packed record
115- a,b: DWORD;
116- function c: PDWORD; inline;
117- strict private
118- cStart: record end;
119- end;
120-
121- function mystruct.c: PDWORD;
122- begin
123- Result := PDWORD(@cStart);
124- end;
109+
110+type
111+ mystruct = packed record
112+ a,b: DWORD;
113+ function c: PDWORD; inline;
114+ strict private
115+ cStart: record end;
116+ end;
117+
118+function mystruct.c: PDWORD;
119+begin
120+ Result := PDWORD(@cStart);
121+end;
125122```
126123
127124## Voir aussi
128125
129- * <https://forum.lazarus.freepascal.org/index.php/topic,45998.0.html> \- fil de discussion original qui a commencé la discussion
130- * <https://en.wikipedia.org/wiki/Flexible_array_member> \- article wikipedia sur les membres tableau flexible.
131- * [[Common problems when converting C header files/fr|Problèmes courants lors de la conversion des fichiers d'entête C]]
126+- <https://forum.lazarus.freepascal.org/index.php/topic,45998.0.html> - fil de discussion original qui a commencé la discussion
127+- <https://en.wikipedia.org/wiki/Flexible_array_member> - article wikipedia sur les membres tableau flexible.
128+- [[Common problems when converting C header files/fr|Problèmes courants lors de la conversion des fichiers d'entête C]]
132129
133130---
134-*From the Free Pascal wiki, page "Flexible Array Member/fr", as the Internet Archive kept it on 2022-10-06. Copyright stays with the author who wrote it, according to the old wiki's [[Licensing]] page. If you have concerns about this material, [message the admin](/wiki-contact).*
131+*From the Free Pascal wiki, page "Flexible Array Member/fr", as it stood on 2022-04-30 after a change by E-ric, out of the wiki's dump of 2024-05-26. Copyright stays with the author who wrote it, according to the old wiki's [[Licensing]] page. If you have concerns about this material, [message the admin](/wiki-contact).*

Back to history