Je suis sous W11 avec Delphi 6 PE.
J'ai besoin de décrire une section de mémoire contigüe d'une longueur PageLength.
Cette section doit contenir une répétition de segments de longueur identique mais définie à l'exécution, pas par une constante immuable.
J'ai tenté d'écrire ceci:
Ensuite, je déclare MyPage: TPage;
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 Type TSegment = packed record status: byte; fixparam: int64; varparam: array of byte; end; type TPage = packed record segments: array of TSegment unused: array of byte; end;
A l'exécution, je détermine une variable PageSize qui sera chargée dynamiquement d'une valeur puissance de 2 entre 512 et 16384.
Toujours à l'exécution, je détermine une variable ParamSize qui sera chargée dynamiquement d'une valeur décimale arbitraire inférieure à 200.
Alors, je calcule le nombre de segments possibles dans la page: nSeg = PageSize \ (1+8+ParamSize).
Puis, je calcule le reste non utilisé de la page: nRest = PageSize - nSeg*(1+8+ParamSize).
Puis, je fais:
SetLength(MyPage.Segments,nSeg);
Puis, en boucle:
for i:=0 to nSeg-1 do SetLength(MyPage.Segments[i]),1+8+ParamSize));
Finalement, je fais SetLength(unused,nRest);
Mais je me suis vire rendu compte que ma logique n'était pas bonne.
Si je regarde SizeOf(MyPage.Segments[0]), avec une valeur de ParamSize de 16, j'obtiens 13 et non pas 25
En fait, la taille d'un record TSegment est la taille des champs fixes simples (1 + 8 octets), plus 4 octets décrivant l'objet Segments.
Mais ce ne sont pas la liste des éléments de Segments qui, eux, doivent être "ailleurs"...
Donc, ma question est: comment définir un record (ou n'importe quoi, d'ailleurs !) qui décrit une zone mémoire contigüe de ParamSize octets structurés comme ceci:
- 1 octet (status)
- 8 octets (fixparam)
- n octets (varparam)
n étant variable et choisi dynamiquement.
Puis, ensuite, comment définir MyPage comme une suite contigüe de zones mémoire de type TSegment, suivi du nombre d'octets nécessaires pour compléter une zone de PageSize octets.
Par la suite, je voudrais pouvoir lire et écrire ces zones MyPage dans un fichier non typé par BlockRead et BlockWrite.
Je sais que je pourrais y arriver en définissant:
Puis faire tout le reste avec des poiteurs de type pByte. Mais quelle gymnastique ! Et parfaitement il
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 MyPage: array of byte; ... SetLength(MyPagenPageSize);
Je serais très heureux d'avoir un petit coup de pouce...
Partager