我需要一些解决这些问题的答案。当我在Ada中使用记录编程时,我陷入了这些错误

我需要一些解决这些问题的答案。当我在Ada中使用记录编程时,我陷入了这些错误,ada,Ada,我是Ada编程新手。这是一个程序的Ada代码,当在执行时键入足球传奇名称时,它会给我一个列表。但我遇到以下错误。请帮助我: 发现的一些错误包括: 1.鉴别器必须具有离散或访问类型 2.在记录声明结束之前,不得使用“FBClub”组件 3.变量部分中的判别式必须是离散部分 4.“玩家”未定义 5.“位置”未定义。 6.没有与sctuals匹配的候选解释:=>在调用继承操作“to_string”的第行“type playernames…” 最大的问题是您将代码与类型声明混合在一起 在Ada中,将案例

我是Ada编程新手。这是一个程序的Ada代码,当在执行时键入足球传奇名称时,它会给我一个列表。但我遇到以下错误。请帮助我:

发现的一些错误包括: 1.鉴别器必须具有离散或访问类型 2.在记录声明结束之前,不得使用“FBClub”组件 3.变量部分中的判别式必须是离散部分 4.“玩家”未定义 5.“位置”未定义。 6.没有与sctuals匹配的候选解释:=>在调用继承操作“to_string”的第行“type playernames…”


最大的问题是您将代码与类型声明混合在一起

在Ada中,将
案例
放在
记录
中仅适用于变体记录;这些记录在某些案例中存在某些字段,但在其他案例中不存在。例如:

type Employee_Type is (Regular, Manager);
type Employee (Emp_Type : Employee_Type) is record
     Name : Unbounded_String;
     case Emp_Type is
         when Manager =>
              Managerial_Level : Integer;
         when Regular =>
              null;
     end case;
end record;
这是一个变体记录;我们在这里假设有两种员工,
管理层
字段仅适用于其中一种。类型为
常规
的记录将根本没有
管理层
字段

此语法不是用于返回不同字段值的语法。相反,您需要在语句中执行此操作,通常是在
过程
函数
(或包初始化,或其他允许语句的位置)

由于您没有使用variant record语法,因此不需要将
player
设置为鉴别器。无论如何,它不起作用;在Ada中,“鉴别器”(如我的示例中的
Emp\u Type
)必须是离散类型,如整数或枚举类型(
Employee\u Type
是枚举类型)或访问类型(访问鉴别器是一个高级概念)。它不能是一个
无界\u字符串
。因此您希望将
播放器
设为常规字段:

type fbplayer is record
    player : Unbounded_String;
    pos : Position;
    country : countries;
    clubs : FBClubs;   -- Note name change!
    WCAppearances : Integer;
end record;
并创建一个过程来填充字段:

procedure Fill_In_Player(P : in out fbplayer; Player : Playernames) is
begin
    P.Player := Player;
    if Player = "David Beckham" then
        P.country := England;
        P.WCAppearances := 3;
        P.pos = Midfielder;
        P.clubs := ??? -- see below
    elsif Player = "Lionel Messi" then
        ------- etc.
    elsif ------
    end if;
end Fill_In_Player;
当你有
Player
并且想要设置记录字段时,调用
Fill\u-In\u-Player
。你必须编写语句才能这样做;你不能在记录声明中这样做

请注意,在Ada中,
case
语句只能用于整数或枚举类型。不能像其他一些语言所允许的那样,使用它们来测试字符串

Ada在标识符或关键字中不使用相同的小写和大写字母。因此,
fbclubs
fbclubs
的名称相同,并且您不能声明该字段

fbclubs : FBClubs;
因为名字冲突,我改了名字

最后,看起来您希望
FBClubs
保存多个俱乐部。但是
FBClubs
是一种枚举类型,因此一次只能保存一个值。如果您希望每个球员记录包含俱乐部列表,则需要执行其他操作,例如使用Ada的容器类型之一(比如
Ada.Containers.Vectors.Vector
)或者类似的东西

type Set_Of_Clubs is array(FBClubs) of Boolean;
其中,如果球员为该俱乐部踢球,则每个数组值均为
true


我不确定这是否会解决所有错误,但看起来您已经有很多工作要做了。

最大的问题是您将代码与类型声明混合在一起

在Ada中,将
案例
放在
记录
中仅适用于变体记录;这些记录在某些案例中存在某些字段,但在其他案例中不存在。例如:

type Employee_Type is (Regular, Manager);
type Employee (Emp_Type : Employee_Type) is record
     Name : Unbounded_String;
     case Emp_Type is
         when Manager =>
              Managerial_Level : Integer;
         when Regular =>
              null;
     end case;
end record;
这是一个变体记录;我们在这里假设有两种员工,
管理层
字段仅适用于其中一种。类型为
常规
的记录将根本没有
管理层
字段

此语法不是用于返回不同字段值的语法。相反,您需要在语句中执行此操作,通常是在
过程
函数
(或包初始化,或其他允许语句的位置)

由于您没有使用variant record语法,因此不需要将
player
设置为鉴别器。无论如何,它不起作用;在Ada中,“鉴别器”(如我的示例中的
Emp\u Type
)必须是离散类型,如整数或枚举类型(
Employee\u Type
是枚举类型)或访问类型(访问鉴别器是一个高级概念)。它不能是一个
无界\u字符串
。因此您希望将
播放器
设为常规字段:

type fbplayer is record
    player : Unbounded_String;
    pos : Position;
    country : countries;
    clubs : FBClubs;   -- Note name change!
    WCAppearances : Integer;
end record;
并创建一个过程来填充字段:

procedure Fill_In_Player(P : in out fbplayer; Player : Playernames) is
begin
    P.Player := Player;
    if Player = "David Beckham" then
        P.country := England;
        P.WCAppearances := 3;
        P.pos = Midfielder;
        P.clubs := ??? -- see below
    elsif Player = "Lionel Messi" then
        ------- etc.
    elsif ------
    end if;
end Fill_In_Player;
当你有
Player
并且想要设置记录字段时,调用
Fill\u-In\u-Player
。你必须编写语句才能这样做;你不能在记录声明中这样做

请注意,在Ada中,
case
语句只能用于整数或枚举类型。不能像其他一些语言所允许的那样,使用它们来测试字符串

Ada在标识符或关键字中不使用相同的小写和大写字母。因此,
fbclubs
fbclubs
的名称相同,并且您不能声明该字段

fbclubs : FBClubs;
因为名字冲突,我改了名字

最后,看起来您希望
FBClubs
保存多个俱乐部。但是
FBClubs
是一种枚举类型,因此一次只能保存一个值。如果您希望每个球员记录包含俱乐部列表,则需要执行其他操作,例如使用Ada的容器类型之一(比如
Ada.Containers.Vectors.Vector
)或者类似的东西

type Set_Of_Clubs is array(FBClubs) of Boolean;
其中,如果球员为该俱乐部踢球,则每个数组值均为
true


我不确定这会解决你所有的错误,但看起来你已经有很多工作要做了。

fbclubs:fbclubs;
就是其中之一