如何在Ada中的嵌套聚合中分配记录
我正在尝试初始化一个记录变量,该变量本身包含一个使用聚合的嵌套记录,但似乎无法获得正确的语法。谢谢你的帮助如何在Ada中的嵌套聚合中分配记录,ada,Ada,我正在尝试初始化一个记录变量,该变量本身包含一个使用聚合的嵌套记录,但似乎无法获得正确的语法。谢谢你的帮助 with Step; use Step; package Pattern is -- ADT type Pattern_Type is tagged private; -- ADT components type Bars_Type is private; -- ADT instance methods function Tempo (This
with Step; use Step;
package Pattern is
-- ADT
type Pattern_Type is tagged private;
-- ADT components
type Bars_Type is private;
-- ADT instance methods
function Tempo (This: Pattern_Type) return Integer;
function Bars (This: Pattern_Type) return Bars_Type;
function Get_Next_Step(This: Pattern_Type ) return Step_Type;
-- Static methods
function Get_Basic_Beat return Pattern_Type;
private
type Bars_Type is range 0..2;
Number_Of_Steps : constant Natural := 32;
type Active_Step_Type is mod Number_Of_Steps;
type Steps_Type is array( Active_Step_Type ) of Step_Type;
type Pattern_Type is tagged record
Tempo : Integer range 40..400;
Bars : Bars_Type := 1;
Steps : Steps_Type;
Active_Step : Active_Step_Type := 1;
end record;
-- Package variable
Basic_Beat : Pattern_Type :=
( Tempo => 125,
Steps => Steps_Type'(1..31 => Step_Type'(Instrument => 'K', Velocity => 127, Offset => 0, Active => True)),
others => <> );
end Pattern;
我在GPS中得到了这个构建错误
应为私有类型步骤\步骤中定义的类型。ads:4,找到了复合类型
我试过各种不同的阶梯式组合。。。行根据您的需要,您有不同的选择: 将Step_Type的记录实现公开,以便其他不相关的包可以使用它。但这显然破坏了封装。 添加一个函数,该函数可以根据Step包公共区域中的输入参数创建Step_类型。这是我个人喜欢的方法。 使模式成为Step的子包提供了私有部分的可见性。我通常只在层次结构合理的情况下才这样做。 将步骤类型和模式类型放在同一个包中。然后,它们的私有部分也彼此可见。我也只有在设计布局合理的情况下才会这样做。 2的示例: 使用Ada.Text_IO;使用Ada.Text\u IO; 你好 包装步骤是 -ADT 类型步骤类型被标记为私有; 函数生成 文书:文字; 速度:整数; 偏移量:整数; 活动:布尔值 返回步进式; 私有的 类型步骤\类型标记为记录 仪器:字符:=''; 速度:整数:=0; 偏移量:整数:=0; 活动:布尔值:=false; 结束记录; 函数生成 文书:文字; 速度:整数; 偏移量:整数; 活动:布尔值 返回步骤类型 is Instrument=>Instrument, 速度=>速度, 偏移量=>偏移量, 主动=>主动; 结束步骤; 使用步骤; 包装模式是 -ADT 类型模式\u类型被标记为私有; -ADT组件 类型栏\u类型为私有类型; 私有的 类型栏的类型范围为0..2; 步数:常数自然数=32; 类型Active\u Step\u类型是\u步数的模数; 类型步骤类型是步骤类型的数组活动步骤类型; 类型模式\u类型被标记为记录 节奏:整数范围40..400; 钢筋:钢筋类型:=1; 步骤:步骤类型; 活动步骤:活动步骤类型:=1; 结束记录; -包变量 基本节奏:模式类型:= 节奏=>125, 步骤=>others=>Make'K',127,0,True, 其他=>; 末端模式; 开始 喂,世界!; 结束问候;
根据您的需要,您有不同的选择: 将Step_Type的记录实现公开,以便其他不相关的包可以使用它。但这显然破坏了封装。 添加一个函数,该函数可以根据Step包公共区域中的输入参数创建Step_类型。这是我个人喜欢的方法。 使模式成为Step的子包提供了私有部分的可见性。我通常只在层次结构合理的情况下才这样做。 将步骤类型和模式类型放在同一个包中。然后,它们的私有部分也彼此可见。我也只有在设计布局合理的情况下才会这样做。 2的示例: 使用Ada.Text_IO;使用Ada.Text\u IO; 你好 包装步骤是 -ADT 类型步骤类型被标记为私有; 函数生成 文书:文字; 速度:整数; 偏移量:整数; 活动:布尔值 返回步进式; 私有的 类型步骤\类型标记为记录 仪器:字符:=''; 速度:整数:=0; 偏移量:整数:=0; 活动:布尔值:=false; 结束记录; 函数生成 文书:文字; 速度:整数; 偏移量:整数; 活动:布尔值 返回步骤类型 is Instrument=>Instrument, 速度=>速度, 偏移量=>偏移量, 主动=>主动; 结束步骤; 使用步骤; 包装模式是 -ADT 类型模式\u类型被标记为私有; -ADT组件 类型栏\u类型为私有类型; 私有的 类型栏的类型范围为0..2; 步数:常数自然数=32; 类型Active\u Step\u类型是\u步数的模数; 类型步骤类型是步骤类型的数组活动步骤类型; 类型模式\u类型被标记为记录 节奏:整数范围40..400; 钢筋:钢筋类型:=1; 步骤:步骤类型; 活动步骤:活动步骤类型:=1; 结束记录; -包变量 基本节奏:模式类型:= 节奏=>125, 步骤=>others=>Make'K',127,0,True, 其他=>; 末端模式; 开始 喂,世界!; 结束问候; 模式没有步骤的私有部分的可见性,其中定义了步骤类型,毕竟它是私有类型。要使用aggregatesPattern,您需要该类型的完全可见性。该模式没有步骤的私有部分的可见性,其中定义了步骤类型,毕竟它是私有类型。为了使用聚合,您需要类型的完全可见性
package Step is
-- ADT
type Step_Type is tagged private;
-- ADT instance methods
function Instrument (This : Step_Type) return Character;
function Velocity (This : Step_Type) return Integer;
function Offset (This : Step_Type) return Integer;
function Active (This : Step_type) return Boolean;
private
type Step_Type is tagged record
Instrument : Character := ' ';
Velocity : Integer := 0;
Offset : Integer := 0;
Active : Boolean := false;
end record;
end Step;