Generics Ada通用程序包使用和遵从错误“;“不可见声明”;
我是Ada的新手,我正在尝试制作一个通用的快速排序包,它可以接受n个数字的整数数组。数组中的整数必须在1到1000之间 当我编译下面的代码时,它告诉我Generics Ada通用程序包使用和遵从错误“;“不可见声明”;,generics,ada,Generics,Ada,我是Ada的新手,我正在尝试制作一个通用的快速排序包,它可以接受n个数字的整数数组。数组中的整数必须在1到1000之间 当我编译下面的代码时,它告诉我 main.adb:: "Quicksort" is not visible main.adb:: non-visible declaration at quick_sort.ads:6 main.adb:: "sort" is undefined 然而,我找不到它是这样的原因,它只是似乎是相同的感觉,我可以找到一般教程。我真的很感激如果有人能帮
main.adb:: "Quicksort" is not visible
main.adb:: non-visible declaration at quick_sort.ads:6
main.adb:: "sort" is undefined
然而,我找不到它是这样的原因,它只是似乎是相同的感觉,我可以找到一般教程。我真的很感激如果有人能帮我弄清楚为什么会发生这种情况,以及我如何正确使用泛型
我编写了以下通用包声明和正文
quick_sort.ads文件
package quick_sort is
generic
type element_type is private;
type array_type is array(Natural range <>) of element_type;
procedure Quicksort(arr: in out array_type);
end quick_sort;
编辑:
我试过使用/不使用“use quick\u sort”子句。
无论哪种方式,编译器都会给我以下两个错误
a generic package is not allowed in a use clause
"Quicksort" is not the name of a generic package
我不知道我是否使用了错误的声明符。有什么想法吗?谢谢 您的
Main
以快速排序开始代码>。这意味着Main
的代码可以直接访问Quick\u Sort
,但不能访问其内容-您必须通过说出Quick\u Sort.
来限定它们
您可以使用开始Main
with Quick_Sort; use Quick_Sort;
或者用
package sort is new Quick_Sort.Quicksort(element_type => item);
解决“快速排序”不可见问题的方法。但是,正如您所报告的,编译器现在说,“Quicksort”不是通用包的名称
;这是真的,因为它是泛型过程的名称
当然,上面最后一行应该是
procedure sort is new Quick_Sort.Quicksort(element_type => item);
这导致了新的错误
missing actual "Array_Type"
in instantiation of "Quicksort" declared at yeelan.ada:6
instantiation abandoned
这意味着
arr: array(1..3) of item;
你需要写一些像这样的东西
type Item_Array is array (Natural range <>) of Item;
Arr : Item_Array (1 .. 3);
然后,您将得到一个关于get未定义的错误,但其原因是另一个问题的答案。嗨,Simon,谢谢您的回答。我尝试使用quick_sort,编译器告诉我“use子句中不允许使用泛型包”。如果我删除use子句并按照您指出的方式使用,我相信这应该是有效的,它告诉我“快速排序”不是通用包的名称“.我做错什么了吗?@yeelan:在你发布的代码中,quick\u sort
是一个包,而不是通用包,quick\u sort。Quicksort
是一个通用过程。如果use quick\u sort
给了您这个错误,那么您已经修改了代码,使得quick\u sort
是一个通用包。您可以使程序包或程序通用;一旦你决定了这一点,你需要在如何使用它上保持一致。对包和过程使用类似的名称是令人困惑的。由于过程是包中的唯一内容,您可以将(通用)过程放在顶层,而不使用包。是否可以尝试正确缩进源文本?这可能会使每个人都更容易阅读和理解您要做的事情。您引用的错误消息中的行号与您在问题中包含的源文件不匹配。解决这个问题可能也很有用。
arr: array(1..3) of item;
type Item_Array is array (Natural range <>) of Item;
Arr : Item_Array (1 .. 3);
procedure Sort is new Quicksort(Element_Type => Item,
Array_Type => Item_Array);