2016-07-13 14 views
0

Я пытаюсь сделать итератор для связанного_листа в Eiffel.Получение ошибки «VEVI: переменная неправильно настроена» в Eiffel

Я получаю эту ошибку: Переменная установлена ​​неправильно.

Class: ITERATOR_ON_COLLECTION [E] 
Feature: make 
Attribute(s): {ITERATOR}.target 
Line: 30 

Я знаю, что это из-за небезопасности, но я не знаю, как это исправить. (Я установил недействительную безопасность Истинные и изменил прекомпилированную библиотеку безопасной версии и clean_compile его.)

следующий класс:

class 
    ITERATOR_ON_COLLECTION [E] 

inherit 
    ITERATOR [E] 

create 
    make 

feature {NONE} -- Attributes 

    collection: LINKED_LIST[E] 
    item_index: INTEGER 

feature -- initialization 

    make(c: LINKED_LIST [E]) 
     require 
      --c /= void 
     do 
      -- create {COLLECTION} collection.make 
      -- create collection.make -- it doesnt work with/without this line 
      collection := c 
      item_index := 1 
     end 

    start 
     do 
      item_index := 1 
     end 

    item: STRING 
     do 
      Result := "hello" 
     end 

    next 
     do 
      item_index := item_index + 1 
     end 

    is_off: BOOLEAN 
     do 
      Result := True 
     end 


    do_until (action: PROCEDURE [E]; test: FUNCTION [E, BOOLEAN]) 
      -- Apply `action' to every item of `target' up to 
      -- and including first one satisfying `test'. 
      -- (Apply to full list if no item satisfies `test'). 
     require else 
      action_exists: action /= Void 
      test_exists: test /= Void 
     do 
     end 

    do_while (action: PROCEDURE [E]; test: FUNCTION [E, BOOLEAN]) 
      -- Apply `action' to every item of `target' up to 
      -- and including first one not satisfying `test'. 
      -- (Apply to full list if all items satisfy `test'). 
     require else 
      action_exists: action /= Void 
      test_exists: test /= Void 
     do 
     end 

    until_do (action: PROCEDURE [E]; test: FUNCTION [E, BOOLEAN]) 
      -- Apply `action' to every item of `target' up to 
      -- but excluding first one satisfying `test'. 
      -- (Apply to full list if no items satisfy `test'.) 
     require else 
      action_exists: action /= Void 
      test_exists: test /= Void 
     do 
     end 

    while_do (action: PROCEDURE [E]; test: FUNCTION [E, BOOLEAN]) 
      -- Apply `action' to every item of `target' up to 
      -- but excluding first one satisfying not `test'. 
      -- (Apply to full list if all items satisfy `test'.) 
     require else 
      action_exists: action /= Void 
      test_exists: test /= Void 
     do 
     end 

    there_exists (test: FUNCTION [E, BOOLEAN]): BOOLEAN 
      -- Is `test' true for at least one item of `target'? 
     require else 
      test_exists: test /= Void 
     do 
     end 

    for_all (test: FUNCTION [E, BOOLEAN]): BOOLEAN 
      -- Is `test' true for all items of `target'? 
     require else 
      test_exists: test /= Void 
     do 
     end 

end 

ответ

0

Не смотря на классе ITERATOR это трудно сказать, что это реальная причина. Вот моя догадка о том, что происходит:

Класс ITERATOR объявляет атрибут target прилагаемого типа. Атрибут должен быть установлен в вашей процедуре создания. Скорее всего, вам нужно отбросить атрибут collection в своем классе и вместо этого использовать target. В зависимости от типа атрибута вам может потребоваться переопределить его в своем классе или нет.

С точки зрения усилий лучше начинать с версий, свободных от пустот, начиная с самого начала, и когда вы переключаетесь с небезопасных настроек на небезопасные, вам может потребоваться убедиться, что класс типы привязаны по умолчанию (найдите опцию конфигурации «Прикреплены ли типы по умолчанию?» в диалоговом окне настроек проектов). Этот параметр должен быть установлен в True (это не делается автоматически в EiffelStudio до 16.11).

Несколько замечаний о других частях коды:

  • Если аргумент типа прилагается нет никакого смысла проверок в форме arg /= Void.

  • Если предварительное условие foo задается для функции в родительском классе нет необходимости повторять это как

    require else 
        foo 
    

    Это может быть безопасно удалены. (Вы можете посмотреть на особенности квартире (или плоскую короткую) форме, чтобы увидеть, что родитель Предпосылка еще есть.)

  • Если комментарии переопределенной функции не изменились, они могут быть заменены

    -- <Precursor> 
    

    Таким образом, любые изменения в версиях родителя будут автоматически отражены в повторных выражениях (опять же посмотрите на плоскую форму).

+0

Большое вам спасибо, это сработало –