gpt4 book ai didi

ada - (Ada 2012) 编译时错误 "expected private type... found composite type"

转载 作者:行者123 更新时间:2023-12-04 16:42:25 25 4
gpt4 key购买 nike

我正在尝试在 Ada 2012 中编写一个非常原始的链表示例程序。我的代码由 3 个文件组成,linked_list.adb , linked_list.adsmain.adb .

用户将运行该程序,只需输入一串数字,后跟零即可结束该序列并退出。该程序只是从标准输入中读取这些数字,打印出列表然后退出。

这是我的完整代码...

文件:“main.adb”

with Linked_List; use Linked_List;

procedure Main is
L : access List_Item;
begin
L := new List_Item'(null, 0);

while Append_Item (L) loop
null;
end loop;

Print_List (L);
end Main;

文件:“linked_list.ads”
with Ada.Text_IO; use Ada.Text_IO;

package Linked_List is
type List_Item is private;

function Append_Item (List_Head : access List_Item) return Boolean;
procedure Print_List (List_Head : access List_Item);

private

type List_Item is
record
Next_Item : access List_Item;
ID : Integer;
end record;

end Linked_List;

文件:“linked_list.ads”
with Ada.Text_IO; use Ada.Text_IO;

package body Linked_List is

function Append_Item (List_Head : access List_Item) return Boolean is
Runner : access List_Item := List_Head;
new_ID : Integer;
begin
if Runner.Next_Item = null then -- if we've found the last item
Put ("Enter ID for new Item (enter 0 to stop): ");
Get (new_ID);

if new_ID = 0 then
return false; -- user wants to quit
else if;
-- add a new item to the end of the list
Runner.Next_Item := new List_Item'(null, new_ID);
return true;
end if;
else;
Runner := Runner.Next_Item;
end if;
end Append_Item;

procedure Print_List (List_Head : access List_Item);
Runner : access List_Item := List_Head;
begin
if Runner = null then
return;
else;
Put ("Item ID: "); Put (Runner.ID);
Runner := Runner.Next_Item;
end if;
end Print_List;

end Linked_List;

我正在使用 Gnatmake 7.4.0,我的编译器命令行是
gnatmake -gnaty -gnaty2 -gnat12 main.adb

我看到的错误消息是:
gnatmake -gnaty -gnaty2 -gnat12 main.adb
aarch64-linux-gnu-gcc-7 -c -gnaty -gnaty2 -gnat12 main.adb
main.adb:6:22: expected private type "List_Item" defined at linked_list.ads:4
main.adb:6:22: found a composite type
gnatmake: "main.adb" compilation error
Makefile:2: recipe for target 'all' failed
make: *** [all] Error 4

我写的语法似乎与我试图学习的书一致:John Barnes 的“Programming in Ada 2012”。

该记录是私下声明的,因此我的客户端程序(主程序)不会看到列表机制内部工作的血腥细节。我究竟做错了什么?

最佳答案

原因是:type List_Item is private (来自 Ada 代码的简单英语)!

这意味着包 Linked_List 的作者不希望它的用户使用它的详细信息(它是一个包含两个组件的记录)。在更复杂的软件中,隐藏这些细节很有用,因为它们可能会发生变化,如果用户使用在 List_Item 类型的设计更改后变得不兼容的细节(在这种情况下,复合类型),用户会遇到麻烦.
有两种解决方案:

  • 公开 List_Item(如果您想构建“真正的”软件,这通常是一个糟糕的解决方案)
  • 添加 Null_List : constant List_Item;type List_Item is privateNull_List : constant List_Item := (null, 0);在私有(private)部分。那么你可以使用Null_List在您的 main.adb 中。
  • 关于ada - (Ada 2012) 编译时错误 "expected private type... found composite type",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57593690/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com