代码之家  ›  专栏  ›  技术社区  ›  geforce

Eiffel中的奇数“Check_VIOLATION”测试用例失败

  •  0
  • geforce  · 技术社区  · 8 年前

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

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

    我的主要问题是,为什么每当看到“Check-result-end”语句时,它总是抛出Check_violation并失败?也许HAS[…]功能不好?

    目前,任何带有“check result end”的测试用例特性都会使其为false,并抛出check_VILOATION

    enter image description here

    代码:

    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
    
    1 回复  |  直到 8 年前
        1
  •  1
  •   Alexander Kogtenkov    8 年前

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

    因此,如果我们多次添加同一个元素,它的计数应该增加。在初始化行中,我们添加了4个元素 "foo" ,3个元素 "bar" ,2个元素 “foo” 再次,和0个元素 “酒吧” 再一次因此,我们应该有一个包含6个元素的袋子 “foo” 和3个元素 “酒吧” 。也没有元素 "baz" .

    根据此分析,任一初始化都不正确( “foo” 应该是不同的),或者应该进行比较 6 而不是 5 .

    关于类的实现 MY_BAG 想法是有一个功能 add (或界面中指定的任何名称 ADT_BAG )那个

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

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