【问题标题】:How to return a Forward_Iterator of a Hashed_Set in Ada?如何在 Ada 中返回 Hashed_Set 的 Forward_Iterator?
【发布时间】:2015-03-27 01:57:33
【问题描述】:

我想在 Ada 中的 hashed_set 的元素上返回一个 Forward_Iterator,如下面的代码所示:

with Ada.Containers.Hashed_Sets;
with Ada.Strings.Unbounded; use Ada.Strings.Unbounded;
with Ada.Strings.Unbounded.Hash;
with Ada.Text_IO; use Ada.Text_IO;

procedure debug is
   package my_set is new Ada.Containers.Hashed_Sets
     (Element_Type        => Unbounded_String, 
      Hash                => Ada.Strings.Unbounded.Hash, 
      Equivalent_Elements => "=");

   function get_Iterator
     (some_set : my_set.set)
      return my_set.Set_Iterator_Interfaces.Forward_Iterator'Class is                 --' Highlight fix
   begin
      return some_set.Iterate;
   end;

   set_1 : my_set.set;

begin
   set_1.insert(To_Unbounded_String("element"));
   for E in get_Iterator (some_set => set_1) loop
      put_line ("i iterate!");
   end loop;

end debug;

问题是代码引发了程序错误 “引发的 PROGRAM_ERROR:debug.adb:6 finalize/adjust 引发的异常”我不明白......(我在 Ubuntu 14.04 下使用 GNAT Ada GPL 2014)

有没有办法修复代码?或者是否有另一种可能在 hashed_set 上返回迭代器?一个应用程序是例如当 hashed_set 是私有记录的一部分时,应该只能从外部迭代元素,而不能更改集合本身。

提前致谢!

PS:这是我在这里的第一个问题,所以如果您有任何改进问题的提示,请告诉我:)

【问题讨论】:

  • 片段不适用于 Ada;据我所知,它们只适用于 JavaScript!我在 GCC 5.0.0 上遇到同样的错误,但在 GCC 4.9.1 上没有。

标签: iterator containers ada


【解决方案1】:

我认为您在 GNAT 中发现了一个错误。请将您的示例提交到 GCC 错误数据库。

但是为什么你想要一个显式的迭代器对象呢?通常你只是循环容器,让编译器处理迭代器对象。

【讨论】:

  • 听起来他正在围绕容器创建一个包装器(私有记录),但仍希望用户迭代实际容器
  • 对于它的价值,代码似乎与 Gnat Pro 7.1.x 一样工作
【解决方案2】:

我只是想发布我对这个问题的解决方案。 我有可能检查 Gnat Pro 7.2.x 的问题,但我不再出现。但是,如果您使用 Hashed_Map 而不是 Hashed_Set 进行类似的方法,它仍然存在。

因为我也可以访问 GNATtracker,所以我在那里发布了我的问题,并被告知这是一个编译器错误。编译器在 Get_Iterator 函数处生成不正确的可访问性检查。

因此,建议的解决方法是取消对函数的相应检查:

   function get_Iterator
     (some_set : my_set.set)
      return my_set.Set_Iterator_Interfaces.Forward_Iterator'Class is                 --' Highlight fix
      pragma Suppress (Accessibility_Check); -- workaround to suppress buggy check
   begin
      return some_set.Iterate;
   end;

此解决方法适用于 Gnat Pro 7.2.x 和 Gnat GPL 2014,适用于 Hashed_Sets 和 Hashed_Maps。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-18
    • 1970-01-01
    • 1970-01-01
    • 2021-06-19
    • 1970-01-01
    • 2020-02-22
    相关资源
    最近更新 更多