下图中的主要问题是,当添加“检查结果结束”语句时,它会自动失败并在调试器中显示“CHECK_VIOLATION”错误。
此外,HASH_TABLE不会存储给它的所有项目,但我通过切换HASH_TABLE [G,INTEGER]而不是使用当前的HASH_TABLE [INTEGER,G]来修复它
我的主要问题是,为什么只要看到“检查结果结束”语句,它总是会抛出Check_violation并失败?也许HAS [...]功能不好?
目前任何带有“检查结果结束”的测试用例功能都会将其设为false并抛出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
答案 0 :(得分:1)
最有可能ADT_BAG代表多重集(也称为包)的抽象,它允许保留项目并告知有多少项目与给定项目相同(不同于一组,其中最多可能存在一个项目) )。如果是这样,使用HASH_TABLE [INTEGER, G]
作为存储是正确的。然后它的键是元素,它的项是元素数字。
因此,如果我们多次添加相同的元素,则应增加其计数。在初始化行中,我们再次添加"foo"
的4个元素,"bar"
的3个元素,"foo"
的2个元素,以及"bar"
的0个元素。因此,我们应该有一个包含6个"foo"
元素和3个"bar"
元素的包。此外,没有元素"baz"
。
根据此分析,初始化不正确("foo"
的数字应该不同)或者应该对6
而不是5
进行比较。
关于类MY_BAG
的实现,我们的想法是拥有一个功能add
(或ADT_BAG
接口中指定的任何名称)
为简单起见,初始化过程将使用此功能添加新项目,而不是直接在哈希表中存储项目以正确处理重复项目。