0

下图中的主要问题是,当添加“check Result end”语句时,它会自动失败并在调试器中显示“CHECK_VIOLATION”错误。

此外,HASH_TABLE 不会存储给它的所有项目,但我通过切换 HASH_TABLE[G, INTEGER] 而不是使用当前的 HASH_TABLE[INTEGER, G] 解决了这个问题

我的主要问题是为什么它总是抛出 Check_violation 并在看到“检查结果结束”语句时失败?也许 HAS[...] 功能不好?

目前,任何带有“检查结果结束”的测试用例功能都会使其为假并抛出 CHECK_VILOATION

在此处输入图像描述

代码:

class
  MY_BAG[G -> {HASHABLE, COMPARABLE}]
inherit
  ADT_BAG[G]

create
  make_empty, make_from_tupled_array

convert
   make_from_tupled_array ({ARRAY [TUPLE [G, INTEGER]]})

feature{NONE} -- creation

    make_empty
     do
        create table.make(1)
     end

    make_from_tupled_array (a_array: ARRAY [TUPLE [x: G; y: INTEGER]])
     require else
        non_empty: a_array.count >= 0
        nonnegative: is_nonnegative(a_array)
      do

        create table.make(a_array.count)

        across a_array as a
            loop
                 table.force (a.item.y, a.item.x)

            end
      end

feature -- attributes

  table: HASH_TABLE[INTEGER, G]
  counter: INTEGER

测试代码:

  t6: BOOLEAN
    local
        bag: MY_BAG [STRING]
    do
        comment ("t6:repeated elements in contruction")
        bag := <<["foo",4], ["bar",3], ["foo",2], ["bar",0]>> -- test passes
        Result := bag ["foo"] = 5 -- test passes
        check Result end  -- test fails (really weird but as soon as check statement comes it fails)
        Result := bag ["bar"] = 3
        check Result end
        Result := bag ["baz"] = 0


    end
4

1 回答 1

1

很可能 ADT_BAG 代表多重集(也称为袋子)的抽象,它允许保留项目并告诉有多少项目等于给定的项目(与集合不同,最多可能存在一个项目)。如果是这样,HASH_TABLE [INTEGER, G]作为存储使用是正确的。然后它的键是元素,它的项目是元素编号。

所以,如果我们多次添加同一个元素,它的计数应该会增加。在初始化行中,我们添加 4 个元素"foo"、3 个 元素"bar"、2 个"foo"再次元素和 0 个"bar"再次元素。结果,我们应该有一个包含 6 个元素"foo"和 3 个元素的包"bar"。也没有元素"baz"

根据这个分析,要么初始化不正确(数字"foo"应该不同),要么应该进行比较6而不是5

至于类的实现,MY_BAG想法是有一个特性add(或在 的接口中指定的任何名称ADT_BAG

  1. 检查是否有具有给定键的项目。
  2. 如果没有,则添加具有给定计数的新元素。
  3. 否则,将当前元素计数替换为当前元素计数和给定元素计数之和。

为简单起见,初始化过程将使用此功能添加新项目,而不是直接将项目存储在哈希表中以正确处理重复项目。

于 2016-03-17T07:13:32.173 回答