comp.lang.ada
 help / color / mirror / Atom feed
* Discriminant within discriminants
@ 2006-05-03  1:49 stuart clark
  2006-05-03 16:45 ` Jeffrey R. Carter
  2006-05-05  9:03 ` Stephen Leake
  0 siblings, 2 replies; 8+ messages in thread
From: stuart clark @ 2006-05-03  1:49 UTC (permalink / raw)


I have a the following

package message_types

  type id_type is range 1..8;

 type dispense_ack (size:id_type:=id_Type'first) is
   record
     dispense_acks:array(1..size) of acks;
   end record;

  type message_types(dispense_acknowledgement, dispense_request);

  type in_messages(kind :msg_types:=msg_types'first) is
   record
    case type is
      when dispense_acknowledgement =>
         acknowledgements:dispense_ack;
      when dispense_request
         request:integer;
    end case
  end record;

end message_types;

i want to declare a message that is of dispense_acknowledgment type
with a size of 8

i can do

msg:message_types.in_messages(kind=>message_types.dispense_acknowledgment);

this gives me the correct message type but as the dispense_ack is
defaulted to size=1
i get a message of size 1.

the only way i can get my code to compile with a message size of 8 is
to use

declare
  msg:message_types.in_messages;
  dispense_ack_msg:message_types.dispense_ack(size=>8);
begin
  msg:=(kind=>message_types.dispense_acknowledgement,
            acknowledgements=>dispense_ack_msg);

end;

QUESTION : can i declare a message with a type and size in the one
statement without using the intermediate message.




^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: Discriminant within discriminants
  2006-05-03  1:49 Discriminant within discriminants stuart clark
@ 2006-05-03 16:45 ` Jeffrey R. Carter
  2006-05-03 21:05   ` Randy Brukardt
  2006-05-05  9:03 ` Stephen Leake
  1 sibling, 1 reply; 8+ messages in thread
From: Jeffrey R. Carter @ 2006-05-03 16:45 UTC (permalink / raw)


stuart clark wrote:
> 
> package message_types
> 
>   type id_type is range 1..8;
> 
>  type dispense_ack (size:id_type:=id_Type'first) is
>    record
>      dispense_acks:array(1..size) of acks;
>    end record;
> 
>   type message_types(dispense_acknowledgement, dispense_request);

Do you want an "is" in there before the '('?

>   type in_messages(kind :msg_types:=msg_types'first) is
>    record
>     case type is
>       when dispense_acknowledgement =>
>          acknowledgements:dispense_ack;
>       when dispense_request
>          request:integer;
>     end case
>   end record;
> 
> end message_types;
> 
> i want to declare a message that is of dispense_acknowledgment type
> with a size of 8
> 
> the only way i can get my code to compile with a message size of 8 is
> to use
> 
> declare
>   msg:message_types.in_messages;
>   dispense_ack_msg:message_types.dispense_ack(size=>8);
> begin
>   msg:=(kind=>message_types.dispense_acknowledgement,
>             acknowledgements=>dispense_ack_msg);
> 
> end;
> 
> QUESTION : can i declare a message with a type and size in the one
> statement without using the intermediate message.

Msg : Message_Types.In_Messages :=
    (Kind => Message_Types.Dispense_Acknowledgement,
     Acknowledgements =>
        (Size => 8, Dispense_Acks => (1 .. 8 => Thing) ) );

This requires that a value of the (undefined) type Acks be available 
(Thing in the example).

If you don't have such a value, then something along the lines of your 
example is required. Note that you can also do

declare
    Msg : Message_Types.In_Messages
          (Kind => Message_Types.Dispense_Acknowledgement);
    DAM : Message_Types.Dispense_Ack (Size => 8);
begin
    Msg.Acknowledgements := DAM;
end;

(Note also that most dictionaries recommend the spelling "acknowledgment".)

-- 
Jeff Carter
"I would never want to belong to any club that
would have someone like me for a member."
Annie Hall
41



^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: Discriminant within discriminants
  2006-05-03 16:45 ` Jeffrey R. Carter
@ 2006-05-03 21:05   ` Randy Brukardt
  2006-05-04  0:14     ` stuart clark
  2006-05-04  0:45     ` Jeffrey R. Carter
  0 siblings, 2 replies; 8+ messages in thread
From: Randy Brukardt @ 2006-05-03 21:05 UTC (permalink / raw)


"Jeffrey R. Carter" <spam.not.jrcarter@acm.not.spam.org> wrote in message
news:M656g.929814$x96.584697@attbi_s72...
...
> > QUESTION : can i declare a message with a type and size in the one
> > statement without using the intermediate message.
>
> Msg : Message_Types.In_Messages :=
>     (Kind => Message_Types.Dispense_Acknowledgement,
>      Acknowledgements =>
>         (Size => 8, Dispense_Acks => (1 .. 8 => Thing) ) );
>
> This requires that a value of the (undefined) type Acks be available
> (Thing in the example).

If you have Ada 2005 support, you can use the default initialization value
to avoid the need to specify a particular value:

Msg : Message_Types.In_Messages :=
     (Kind => Message_Types.Dispense_Acknowledgement,
      Acknowledgements =>
         (Size => 8, Dispense_Acks => (1 .. 8 => <>) ) );

                  Randy.





^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: Discriminant within discriminants
  2006-05-03 21:05   ` Randy Brukardt
@ 2006-05-04  0:14     ` stuart clark
  2006-05-04  0:57       ` Jeffrey R. Carter
  2006-05-04  0:45     ` Jeffrey R. Carter
  1 sibling, 1 reply; 8+ messages in thread
From: stuart clark @ 2006-05-04  0:14 UTC (permalink / raw)


I tried exactly as you have both suggested but i get a gnat compile
error of

"Acknowledgements does not match any discriminant"




^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: Discriminant within discriminants
  2006-05-03 21:05   ` Randy Brukardt
  2006-05-04  0:14     ` stuart clark
@ 2006-05-04  0:45     ` Jeffrey R. Carter
  1 sibling, 0 replies; 8+ messages in thread
From: Jeffrey R. Carter @ 2006-05-04  0:45 UTC (permalink / raw)


Randy Brukardt wrote:
> 
> If you have Ada 2005 support, you can use the default initialization value
> to avoid the need to specify a particular value:
> 
> Msg : Message_Types.In_Messages :=
>      (Kind => Message_Types.Dispense_Acknowledgement,
>       Acknowledgements =>
>          (Size => 8, Dispense_Acks => (1 .. 8 => <>) ) );

Yes, and when Ada 0X is standardized and compilers are available, that's 
the kind of advice I will give.

-- 
Jeff Carter
"I would never want to belong to any club that
would have someone like me for a member."
Annie Hall
41



^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: Discriminant within discriminants
  2006-05-04  0:14     ` stuart clark
@ 2006-05-04  0:57       ` Jeffrey R. Carter
       [not found]         ` <4a9k52ha4ohqkcd01ghn6c7785d6pvf91e@4ax.com>
  0 siblings, 1 reply; 8+ messages in thread
From: Jeffrey R. Carter @ 2006-05-04  0:57 UTC (permalink / raw)


stuart clark wrote:
> I tried exactly as you have both suggested but i get a gnat compile
> error of
> 
> "Acknowledgements does not match any discriminant"

Interesting. After correcting some obvious errors, I get

message_test.adb:7:26: anonymous arrays not allowed as components

Correcting that, I get

message_test.adb:25:04: warning: variable "Msg" is not referenced

The code is

procedure Message_Test is
    package Message_Types is
       type Id_Type is range 1 .. 8;

       type Acks is new Boolean;

       type Ack_List is array (Id_Type range <>) of Acks;

       type Dispense_Ack (Size : Id_Type := Id_Type'First) is record
          Dispense_Acks : Ack_List (1 .. Size);
       end record;

       type Message_Types is
          (Dispense_Acknowledgement, Dispense_Request);

       type In_Messages (Kind : Message_Types := Message_Types'First) is
       record
          case Kind is
          when Dispense_Acknowledgement =>
             Acknowledgements : Dispense_Ack;
          when Dispense_Request =>
                Request : Integer;
          end case;
       end record;
    end Message_Types;

    Msg : Message_Types.In_Messages :=
       (Kind => Message_Types.Dispense_Acknowledgement,
       Acknowledgements =>
       (Size => 8,
        Dispense_Acks => (1 .. 8 => Message_Types.Acks'First) ) );
begin -- Message_Test
    null;
end Message_Test;

This is with MinGW GNAT 3.4.2.

-- 
Jeff Carter
"I would never want to belong to any club that
would have someone like me for a member."
Annie Hall
41



^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: Discriminant within discriminants
       [not found]         ` <4a9k52ha4ohqkcd01ghn6c7785d6pvf91e@4ax.com>
@ 2006-05-04 17:57           ` Jeffrey R. Carter
  0 siblings, 0 replies; 8+ messages in thread
From: Jeffrey R. Carter @ 2006-05-04 17:57 UTC (permalink / raw)


Dennis Lee Bieber wrote:
> On Thu, 04 May 2006 00:57:02 GMT, "Jeffrey R. Carter"
> <spam.not.jrcarter@acm.not.spam.org> declaimed the following in
> comp.lang.ada:

I deny all claims of declaiming.

>> message_test.adb:25:04: warning: variable "Msg" is not referenced
>>
> 	Well, that looks reasonable...

Sure. The point is, I don't get an error, which the OP got for the same 
construct.

-- 
Jeff Carter
"All citizens will be required to change their underwear
every half hour. Underwear will be worn on the outside,
so we can check."
Bananas
29



^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: Discriminant within discriminants
  2006-05-03  1:49 Discriminant within discriminants stuart clark
  2006-05-03 16:45 ` Jeffrey R. Carter
@ 2006-05-05  9:03 ` Stephen Leake
  1 sibling, 0 replies; 8+ messages in thread
From: Stephen Leake @ 2006-05-05  9:03 UTC (permalink / raw)


"stuart clark" <stuart.clark@baesystems.com> writes:

> package message_types
>
>   type id_type is range 1..8;
>
>  type dispense_ack (size:id_type:=id_Type'first) is
>    record
>      dispense_acks:array(1..size) of acks;
>    end record;
>
>   type message_types(dispense_acknowledgement, dispense_request);
>
>   type in_messages(kind :msg_types:=msg_types'first) is
>    record
>     case type is
>       when dispense_acknowledgement =>
>          acknowledgements:dispense_ack;
>       when dispense_request
>          request:integer;
>     end case
>   end record;
>
> end message_types;
>
> i want to declare a message that is of dispense_acknowledgment type
> with a size of 8

Try:

procedure Message_Acks is
   type Id_Type is range 1 .. 8;

   type Acks is new Boolean;

   type Ack_List is array (Id_Type range <>) of Acks;

   type Dispense_Ack (Size : Id_Type := Id_Type'First) is record
      Dispense_Acks : Ack_List (1 .. Size);
   end record;

   type Message_Types is (Dispense_Acknowledgement, Dispense_Request);

   type In_Messages
     (Kind : Message_Types := Message_Types'First;
      Size : ID_Type := Id_Type'First) is
      record
         case Kind is
         when Dispense_Acknowledgement =>
            Acknowledgements : Dispense_Ack (Size);
         when Dispense_Request =>
            Request : Integer;
         end case;
      end record;

    Msg : In_Messages (Dispense_Acknowledgement, Size => 8);
begin -- Message_Test
    null;
end Message_Acks;

-- 
-- Stephe



^ permalink raw reply	[flat|nested] 8+ messages in thread

end of thread, other threads:[~2006-05-05  9:03 UTC | newest]

Thread overview: 8+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2006-05-03  1:49 Discriminant within discriminants stuart clark
2006-05-03 16:45 ` Jeffrey R. Carter
2006-05-03 21:05   ` Randy Brukardt
2006-05-04  0:14     ` stuart clark
2006-05-04  0:57       ` Jeffrey R. Carter
     [not found]         ` <4a9k52ha4ohqkcd01ghn6c7785d6pvf91e@4ax.com>
2006-05-04 17:57           ` Jeffrey R. Carter
2006-05-04  0:45     ` Jeffrey R. Carter
2006-05-05  9:03 ` Stephen Leake

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox