Précédent   Forum du club des développeurs et IT Pro > Autres langages > Autres langages > Ada
Ada Forum d'entraide sur la programmation en langage Ada
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 12/07/2012, 12h54   #1
jonas813
Invité de passage
 
Jonas Baggett
Inscription : janvier 2010
Messages : 5
Détails du profil
Informations personnelles :
Nom : Jonas Baggett

Informations forums :
Inscription : janvier 2010
Messages : 5
Points : 0
Points : 0
Par défaut Spécifier l'alignement des champs d'un record avec tableaux discriminés

Bonjour,

J'ai un record discriminé et j'aimerais m'assurer que l'alignement se fait bien sur 32 bits pour tous les champs :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
  type Bit is range 0 .. 1;
  for Bit'Size use 1;
  type Bit_Array is array (Integer range <>) of Bit;
  for Bit_Array'Component_Size use 1;

  type Rec (MSB_A, MSB_B : Integer) is
    record
      A : Bit_Array (0 .. MSB_A);
      B : Bit_Array (0 .. MSB_B);
      C : Integer;
    end record;
En gros ce que j'aimerais faire si A et B ne feraient pas partie du record :
Code :
1
2
  for A'Alignment use Integer'Alignment;
  for B'Alignment use Integer'Alignment;
Je n'ai pas besoin de spécifier la taille des champs mais juste l'alignement. J'ai aussi pensé à rajouter la clause "for Bit_Array'Alignment use Integer'Alignment;" après la déclaration du type Bit_Array, mais j'ai vu que ça n'a eu aucun effet sur les variables Bit_Array.

Merci pour vos réponses
Jonas
jonas813 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/09/2012, 15h32   #2
Blackknight
Membre confirmé
 
Avatar de Blackknight
 
Homme Frédéric Praca
Ingénieur développement logiciels
Inscription : février 2009
Messages : 172
Détails du profil
Informations personnelles :
Nom : Homme Frédéric Praca
Âge : 39
Localisation : France, Seine Maritime (Haute Normandie)

Informations professionnelles :
Activité : Ingénieur développement logiciels
Secteur : Aéronautique - Marine - Espace - Armement

Informations forums :
Inscription : février 2009
Messages : 172
Points : 292
Points : 292
Envoyer un message via AIM à Blackknight Envoyer un message via MSN à Blackknight
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
with Ada.Text_Io;

procedure TestAlign is
   
   type Bit is range 0 .. 1;
   for Bit'Size use 1;
   type Bit_Array is array (Integer range <>) of Bit;
   for Bit_Array'Component_Size use 1;
   for Bit_Array'Alignment use Integer'Alignment;
   
   type Rec (MSB_A, MSB_B : Integer) is
      record
	 A : Bit_Array (0 .. MSB_A);
	 B : Bit_Array (0 .. MSB_B);
	 C : Integer;
      end record;
   
   Mon_Rec : Rec(9, 11);

begin
   Ada.Text_Io.Put_Line(Integer'Image(Mon_Rec'Size));
   Ada.Text_Io.Put_Line(Integer'Image(Mon_Rec.A'Alignment));
   Ada.Text_Io.Put_Line(Integer'Image(Mon_Rec.B'Alignment));
   Ada.Text_Io.Put_Line(Integer'Image(Mon_Rec.C'Alignment));
   Ada.Text_Io.Put_Line(Integer'Image(Mon_Rec'Alignment));
end TestAlign;
Personnellement, ça me retourne :
Donc c'est bien aligné sur 4*Storage_element'Size mais c'est packé.
Ceci dit, si je dépasse la taille de 32 bits pour les tableaux, par exemple avec
Code :
1
2
Mon_Rec : Rec(31, 11);
J'obtiens bien :
Bizarre !
Ou alors, c'est que j'ai fait une bourde
Blackknight est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 04h57.


 
 
 
 
Partenaires

Hébergement Web