所以我在Ada中有一个(几何)矢量类型;它是成员x
,y
和z
的记录。
在某些情况下,我会想要在此处存储彩色三联体,就像GLSL一样。红色值将显示x
,y
中的绿色值和z
中的蓝色值。所以它会非常方便 - 让我的代码更简单,更简单,更容易理解,因此更易于维护 - 如果我可以使用r
,g
和b
作为可互换的x
,y
和z
的别名(再次像GLSL一样)。
可以这样做吗?
如果它是标记类型,那么我可以定义使用Implicit_Dereference
返回对x
,y
和z
成员的引用的方法;这些可以与真实的结构成员无缝互换。不幸的是,出于实现原因,我不能这样做 - 这必须与C互操作,并且必须具有排除标记的特定结构布局。 AFAICT方法语法仅适用于标记类型(这是一个奇怪的限制)。
建议?
答案 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;