Un type non contraint dans un enregistrement

Le problème exposé dans ce sujet a été résolu.

Bonjour,

Je travaille avec Ada et commence à m'arracher les cheveux sur les types non contraints. Pour faire simple, je cherche à représenter un parallépipède dont les faces se joignent grâce à des encoches.

Ma boite

Toutes les mesures affichées sont renseignées par l'utilisateur sur l'entrée standard. J'étais parti sur un code à la structure suivante :

1
Paramètres -> Représentation abstraite -> Affichage (SVG, par exemple)

Ma représentation aurait cette tête :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
type Point is record
  x : Float;
  y : Float;
end record;

type Facette is array(Integer range <>) of Point; -- Pour faire simple, une facette est un polygone

type Boite is record
  longueur: Facette;
  largeur: Facette;
  fond: Facette;
end record;

Sauf qu'il me dit que je ne peux pas utiliser de type non contraint dans la déclaration de mon type Boite. Du coup, j'ignore comment faire, vu que je ne connais pas à l'avance le nombre de points d'une facette.

Merci.

+0 -0

Il faut que tu ajoutes un (ou plusieurs) discriminant à Boite :

1
2
3
4
5
     type Data_T is array( Natural range <> ) of Integer;

     type Foobar_T( lgt: Natural ) is record
        Data: Data_T( 1..lgt );
     end record;

Par contre, tu vas tomber sur une autre erreur : le compilateur va avoir besoin de connaître la taille de ton tableau.

Soit, tu repenses ton code pour ne pas utiliser de tableaux (tu peux facilement calculer le nombre de points et leur position à partir de la taille de la facette et celle des encoches). soit, tu prends la facilité et tu passes par des références (je préfère de très loin la première).

Faire un package generic ?

main.adb

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
with Ada.Text_IO; use Ada.Text_IO;
with Ada.Integer_Text_IO;  use Ada.Integer_Text_IO;
with Poly;

procedure main is
   N : Integer;
   procedure Sub(N : Integer) is
   package Poly_Real is new Poly(N);  
   P : Poly_Real.Boite;
   begin
   Put(P.L1'Length);
   end Sub;
begin
   Get(N);
   Sub(N);

end main;

poly.ads

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
generic 
Nx: Integer;
package Poly is 
   type Point is 
      record
     x : Float;
     y : Float;
      end record;

   type Facette is array(Integer range <>) of Point;
   -- Pour faire simple, une facette est un polygone


   type Boite is 
      record
      L1: Facette(0..Nx-1) ;
      end record;   
end Poly;

Idéalement, il faudrait virer Point et Facette du package generic. Ca revient à faire un truc du style

1
2
3
4
template <int N> struct Poly{
  template <int K> using Facette = std::array<Point,K>; 
  using Boite = Facette<N>;
};
+0 -0
Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte