Sign in Join
Wiki copytemporary

Flexible Array Member/fr: what changed

Revision 1 to 2. 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.
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.
22
3-## Introduction
3+## Contents
44
5-**Avertissement:** *cette section est à peu près un copier-coller de l'[article Wikipedia](https://en.wikipedia.org/wiki/Flexible_array_member)*
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
611
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:
12+## Introduction
813
9-``` c
14+**Avertissement:** _cette section est à peu près un copier-coller de l'[article Wikipedia](<https://en.wikipedia.org/wiki/Flexible_array_member>)_
15+
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+```
1018typedef struct mystruct
11-{
12- DWORD a;
13- DWORD b;
14- DWORD c[]; // le membre tableau flexible doit être le dernier
15-};
19+ {
20+ DWORD a;
21+ DWORD b;
22+ DWORD c[]; // le membre tableau flexible doit être le dernier
23+ };
1624```
1725
18-Généralement,de tels struct servent d'entête dans une plus large allocation mémoire variable:
19-
20-``` c
26+Généralement,de tels struct servent d'entête dans une plus large allocation mémoire variable:
27+```
2128struct mystruct* st= malloc(...);
22-...
23-for (int i = 0; i < st->b; i++)
24- st->c[i] = ...;
29+ ...
30+ for (int i = 0; i < st->b; i++)
31+ st->c[i] = ...;
2532```
2633
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.
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.
2835
29-Il est courant d'allouer sizeof(struct) + array_len*sizeof(array element) octets.
36+Il est courant d'allouer sizeof(struct) + array_len*sizeof(array element) octets.
3037
3138## Pascal
3239
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
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+```
3642type
37- mystruct = record
38- a : DWORD;
39- b : DWORD;
40- end;
41- pmystruct = ^mystruct;
43+ mystruct = record
44+ a : DWORD;
45+ b : DWORD;
46+ end;
47+ pmystruct = ^mystruct;
4248```
4349
44-Il existe quelques options pour accéder aux éléments supplémentaires :
50+Il existe quelques options pour accéder aux éléments supplémentaires :
4551
4652### Adressage direct
4753
48-En obtenant explicitement l'adresse qui suit la structure d'en-tête
49-
50-``` pascal
54+En obtenant explicitement l'adresse qui suit la structure d'en-tête
55+```
5156var
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] := ...;
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] := ...;
6267```
6368
6469### Utilisation d'enregistrement supplémentaire
6570
66-Selon l'utilisation, l'enregistrement supplémentaire pourrait chevaucher l'enregistrement d'origine en utilisant [[absolute/fr|absolute]].
67-
68-``` pascal
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+```
6973type
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] := ...;
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] := ...;
8489```
8590
8691### Utilisation d'enegistrement avancé
8792
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
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+```
9195{$modeswitch advancedrecords}
92-
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;
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;
103107```
104108
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
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)
110+```
108111{$modeswitch advancedrecords}
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;
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;
122125```
123126
124127## Voir aussi
125128
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]]
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]]
129132
130133---
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).*
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).*

Back to history