Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/actionscript-3/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Generics Ada通用程序包使用和遵从错误“;“不可见声明”;_Generics_Ada - Fatal编程技术网

Generics Ada通用程序包使用和遵从错误“;“不可见声明”;

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 然而,我找不到它是这样的原因,它只是似乎是相同的感觉,我可以找到一般教程。我真的很感激如果有人能帮

我是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
然而,我找不到它是这样的原因,它只是似乎是相同的感觉,我可以找到一般教程。我真的很感激如果有人能帮我弄清楚为什么会发生这种情况,以及我如何正确使用泛型

我编写了以下通用包声明和正文

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);