Odd Check_VIOLATION не прошел тестовый пример в Eiffel

Основная проблема на приведенном ниже рисунке заключается в том, что при добавлении оператора «check Result end» он автоматически завершается ошибкой и отображает ошибку «CHECK_VIOLATION» в отладчике.

Кроме того, HASH_TABLE не хранит все переданные ей элементы, но я исправил это, переключив HASH_TABLE[G, INTEGER] вместо использования текущей HASH_TABLE[INTEGER, G]

Моя главная проблема заключается в том, почему он всегда выдает Check_violation и терпит неудачу всякий раз, когда появляется оператор «check result end»? Может быть, функция 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

person geforce    schedule 17.03.2016    source источник
comment
Возможно, я неправильно понимаю ваш код, но у меня сложилось впечатление, что Result := bag [foo] = 5 должен быть Result := bag [foo] = 6 (потому что 4 + 2 = 6).   -  person Louis M    schedule 17.03.2016
comment
Предполагается, что единственный, который проходит, - это Result := bag [bar] = 3   -  person geforce    schedule 17.03.2016
comment
Но это показывает мне, что это должно быть HASH_TABLE[INTEGER,G] вместо моего HASH_TABLE[G, INTEGER], однако это все еще не решает мою проблему   -  person geforce    schedule 17.03.2016


Ответы (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. В противном случае заменяет текущий счетчик элементов суммой текущего счетчика элементов и заданного счетчика элементов.

Для простоты процедура инициализации будет использовать эту функцию для добавления новых элементов вместо непосредственного сохранения элементов в хэш-таблице для правильной обработки повторяющихся элементов.

person Alexander Kogtenkov    schedule 17.03.2016
comment
Почему [bar, 0] делает общее количество баров равным 2 элементам? Разве не должно остаться 3 элемента, так как count равен 0? - person geforce; 17.03.2016
comment
@GeForce, вы правы, в ответе опечатка, исправлю. - person Alexander Kogtenkov; 18.03.2016