Код ошибки: VUTA (3) Ошибка: отдельная цель Object_call не контролируется - PullRequest
1 голос
/ 29 января 2020

Я абсолютный новичок в Eiffel, и я реализую связанный список в качестве упражнения. Я получаю следующую ошибку в функции имеет (которая говорит вам, если список содержит v).

Error code: VUTA(3)

Error: separate target of the Object_call is not controlled.
What to do: ensure the target of the call is controlled or is not separate.

Class: MY_LINKED_LIST [G]
Feature: has
Type: Generic #1
Line: 159
          then
->          if l_cursor_a.item.is_equal (v) then
              Result := True

Странная вещь в том, что когда я изменяю '.is_equal' для '=' ошибка исчезла. Я не знаю, что означает «контролируемый» в описании ошибки, и какое значение имеет использование «=» в этом контексте. Код следующий:

MY_LINKED_LIST [G]

class
    MY_LINKED_LIST[G]

feature -- Access

    item: G
        require
            not off
        do
            check
                off: attached cursor as l_cursor
            then
                Result := l_cursor.item
            end
        end

    first,
    last: detachable like item


feature -- Measurement

    count: INTEGER

feature -- Element change


feature -- Status report

    index: INTEGER

    before: BOOLEAN

    after: BOOLEAN

    has (v: like item): BOOLEAN
        require

        local
            l_cursor: like cursor
        do
            from
                l_cursor := first_element
            until
                not attached l_cursor or Result
            loop
                check
                    attached l_cursor as l_cursor_a
                then
                    if l_cursor_a.item.is_equal (v) then
                        Result := True
                    end
                    l_cursor := l_cursor_a.next
                end
            end
        ensure
            function_not_change_state: item = old item
        end


feature {NONE} -- Implementation

    cursor,
    first_element,
    last_element: detachable MY_CELL[G]


end -- class

MY_CELL [G]

class
    MY_CELL[G]

feature -- Access

    item: G

1 Ответ

1 голос
/ 30 января 2020

Сообщение об ошибке относится к S COOP - модели параллельного программирования, встроенной в Eiffel. В соответствии с этим функция может быть вызвана для отдельного объекта, только когда объект управляется . Это достигается, когда целью вызова является аргумент функции или когда используется специальная отдельная инструкция . В вашем случае последний будет выглядеть так:

separate l_cursor_a.item as x do
    if x.is_equal (v) then
         Result := True
    end
end

Почему l_cursor_a.item в первую очередь считается отдельным? Он имеет тип G, а формальный обобщенный тип c является неограниченным, что идентично наличию ограничения detachable separate ANY (поэтому, скорее всего, приведенный выше код не будет компилироваться, вам необходимо убедиться, что x присоединяется перед вызовом is_equal).

Оператор равенства = не выполняет никаких вызовов (за исключением случаев, когда задействованные типы раскрываются, но расширенные типы никогда не разделяются). Для ссылочных типов (включая отдельные) просто проверяется, являются ли две ссылки одинаковыми. Это объясняет, почему ошибка исчезает при замене is_equal на =.

Альтернативное решение, позволяющее избежать появления сообщения об ошибке, состоит в том, чтобы изменить ограничение формального генерика c, чтобы оно не было отдельным: MY_LINKED_LIST [G -> detachable ANY].

Примечание. Инструкция проверки check attached l_cursor as l_cursor_a then ... представляется избыточной, компилятор должен автоматически определить, что l_cursor присоединено.

...