Discussion:
quelques précisions/bizarreries sur les paramêtres formels de generics
(trop ancien pour répondre)
Mehdi Saada
2018-03-19 13:01:32 UTC
Permalink
Je me demande pourquoi dans le cas ou le type paramêtre formel d'un générique est a pour ancêtre un certain type étiquetté on peut changer la représentation:
with AAA; use AAA;
generic
type NT is new type_A with private;
package TENTATIVE is
type B_Type is new Nt with SIZE => 300;
procedure P1 (B : B_Type);
end TENTATIVE;

package AAA is
type Type_A is tagged
record
INT: INTEGER;
end record;
end AAA;

with AAA, TENTATIVE; use AAA;
procedure MAIN is
package TEST is new TENTATIVE(b_type);
begin
end;

Légal ou pas ça compile, tandis que ceci, ou NT est seulement privé, ne marche pas "

De façon amusante, ça ne marche à nouveau plus non plus quand on change
"type NT is new type_A with private;" par
"type T (<>) is tagged private;"

Pourquoi ceci par contre est illégal:
et: "type derived from tagged type must have extension"
"representation item not allowed for generic type"

with Ada.TExt_Io; use Ada.Text_Io;
with Aaa; use Aaa;
generic
type NT is private;
package TENTATIVE is
type B_Type is new Type_A with Size => 300;
end TENTATIVE;
avec comme paramêtre effectif type article NON étiquetté.
Donc on a pas le droit de donner un type étiquetté en paramêtre effectif, quand le paramêtre formel ne l'est pas ?

Merci
J-P. Rosen
2018-03-22 06:05:38 UTC
Permalink
Post by Mehdi Saada
generic
type NT is new type_A with private;
package TENTATIVE is
type B_Type is new Nt with SIZE => 300;
procedure P1 (B : B_Type);
end TENTATIVE;
package AAA is
type Type_A is tagged
record
INT: INTEGER;
end record;
end AAA;
with AAA, TENTATIVE; use AAA;
procedure MAIN is
package TEST is new TENTATIVE(b_type);
begin
end;
Légal ou pas ça compile, tandis que ceci, ou NT est seulement privé, ne marche pas "
Je n'ai pas très bien compris la question, mais ça m'étonnerait que ça
compile vu que B_Type est déclaré DANS Tentative...

Peux-tu reprendre l'exemple, en vérifiant bien ce qui marche et ce qui
ne marche pas?
--
J-P. Rosen
Adalog
2 rue du Docteur Lombard, 92441 Issy-les-Moulineaux CEDEX
Tel: +33 1 45 29 21 52, Fax: +33 1 45 29 25 00
http://www.adalog.fr
Mehdi Saada
2018-03-22 12:07:08 UTC
Permalink
Veuillez m'excuser. J'ai du m'embrouiller un peu. Je rectifie:
package AAA is
type Type_A is tagged
record
INT: INTEGER;
end record;
end AAA;
with AAA; use AAA;
generic
type NT is new type_A with private;
package TENTATIVE is
type B_Type is new Nt with null record with SIZE => 300;
procedure P1 (B : B_Type) is NULL;
end TENTATIVE;
with AAA, TENTATIVE; use AAA;
procedure MAIN is
package TEST is new TENTATIVE(Type_A);
begin Null; end;

Le seul message que j'obtiens à compiler cela est : main.adb:3:01: warning: in instantiation at tentative.ads:5
main.adb:3:01: warning: 172 bits of "B_Type" unused
Mais si je change "type NT is new type_A with private;"
en "type NT is tagged private;"
J'obtiens "tentative.ads:5:48: representation item not allowed for generic type"
Je me demandais pourquoi le fait de savoir que le type NT descendait de type_A, devait rendre possible une clause de représentation impossible si on a pas cette information.
J-P. Rosen
2018-03-24 16:25:45 UTC
Permalink
Post by Mehdi Saada
package AAA is
type Type_A is tagged
record
INT: INTEGER;
end record;
end AAA;
with AAA; use AAA;
generic
type NT is new type_A with private;
package TENTATIVE is
type B_Type is new Nt with null record with SIZE => 300;
procedure P1 (B : B_Type) is NULL;
end TENTATIVE;
with AAA, TENTATIVE; use AAA;
procedure MAIN is
package TEST is new TENTATIVE(Type_A);
begin Null; end;
Le seul message que j'obtiens à compiler cela est : main.adb:3:01: warning: in instantiation at tentative.ads:5
main.adb:3:01: warning: 172 bits of "B_Type" unused
Mais si je change "type NT is new type_A with private;"
en "type NT is tagged private;"
J'obtiens "tentative.ads:5:48: representation item not allowed for generic type"
Je me demandais pourquoi le fait de savoir que le type NT descendait de type_A, devait rendre possible une clause de représentation impossible si on a pas cette information.
Une recherche rapide de l'ARM ne m'a pas éclairé non plus... Repose donc
la question sur c.l.a, Randy saura certainement mieux.
--
J-P. Rosen
Adalog
2 rue du Docteur Lombard, 92441 Issy-les-Moulineaux CEDEX
Tel: +33 1 45 29 21 52, Fax: +33 1 45 29 25 00
http://www.adalog.fr
Mehdi Saada
2018-03-24 17:07:10 UTC
Permalink
Merci quand même, au moins ça m'aura bien amusé de poser une question non-évidente !
Continuer la lecture sur narkive:
Loading...