Ada结构成员别名

时间:2014-07-02 11:24:12

标签: syntax structure ada

所以我在Ada中有一个(几何)矢量类型;它是成员xyz的记录。

在某些情况下,我会想要在此处存储彩色三联体,就像GLSL一样。红色值将显示xy中的绿色值和z中的蓝色值。所以它会非常方便 - 让我的代码更简单,更简单,更容易理解,因此更易于维护 - 如果我可以使用rgb作为可互换的xyz的别名(再次像GLSL一样)。

可以这样做吗?

如果它是标记类型,那么我可以定义使用Implicit_Dereference返回对xyz成员的引用的方法;这些可以与真实的结构成员无缝互换。不幸的是,出于实现原因,我不能这样做 - 这必须与C互操作,并且必须具有排除标记的特定结构布局。 AFAICT方法语法仅适用于标记类型(这是一个奇怪的限制)。

建议?

2 个答案:

答案 0 :(得分:2)

您可以使用Unchecked_Union方面,但有很多限制。其中大多数可能不是问题,因为您希望C语言可互操作。例如,

with Ada.Text_IO; use Ada.Text_IO;
procedure Aliasing_Components is
   type Vector (Colours : Boolean := False) is record
      case Colours is
         when False =>
            X, Y, Z : Integer;
         when True =>
            R, G, B : Integer;
      end case;
   end record
     with Unchecked_Union;
   V : Vector;
begin
   V := (Colours => False, X => 42, Y => 137, Z => 2014);
   Put_Line (Integer'Image (V.R));
end Aliasing_Components;

答案 1 :(得分:0)

为什么不使用子程序来执行此操作?

-- In Parent-Package
Type Geometric_Vector is
  X, Y, Z : Natural;
end record;

-- In child-package
Function R( Input : Geometric_Vector ) Return Natural is (input.R);
Function G( Input : Geometric_Vector ) Return Natural is (input.G);
Function B( Input : Geometric_Vector ) Return Natural is (input.B);
Procedure R( Object : in out Geometric_Vector; Value : Natural );
Procedure G( Object : in out Geometric_Vector; Value : Natural );
Procedure B( Object : in out Geometric_Vector; Value : Natural );

-- Child-package implementations:
Procedure R( Object : in out Geometric_Vector; Value : Natural ) is
begin
  Object.R:= Value;
end R;

Procedure G( Object : in out Geometric_Vector; Value : Natural ) is
begin
  Object.G:= Value;
end G;

Procedure B( Object : in out Geometric_Vector; Value : Natural ) is
begin
  Object.G:= Value;
end B;