【问题标题】:Eiffel - How do I make my classes readable?Eiffel - 如何使我的课程具有可读性?
【发布时间】:2016-10-18 10:32:36
【问题描述】:

我是 Eiffel 的新手,我正在尝试使用 LINKED_LIST 类来组织我创建的其他类“MONOMIO”的实例。我添加了一个对这些元素进行排序的函数,并使用了删除和光标移动功能,当我尝试执行代码时,它会引发一个异常,指出包含的对象应该是可读可写的。我想知道怎么做,这是我的课:

class
    MONOMIO

feature --Initialization 
    make (coef:INTEGER; expX:INTEGER; expY:INTEGER)
    do
            coeficiente := coef
            exponenteX := expX
            exponenteY := expY
    end
feature
    evaluar(valX: INTEGER; valY: INTEGER): REAL_64
            do
                    Result := coeficiente*(valX^exponenteX)*(valY^exponenteY)
            end;
    coeficiente: INTEGER;

    exponenteX: INTEGER;

    exponenteY: INTEGER;


feature --setter
    set_coeficiente(val: INTEGER)
            do
                coeficiente := val
            end;
end

我认为引发异常的原因是我为一个具有 LINKED_LIST[MONOMIO] 特性的类创建了这个特性,它被称为“contenido”:

simplificar
    local
        tamanio_polinomio: INTEGER -- Número de monomios que tiene el polinomio
        contador: INTEGER
        monomio_a_comparar: MONOMIO -- Auxiliar
        coeficiente_total:INTEGER -- Auxiliar
        indice_monomio_en_revision:INTEGER
    do
        from
            contenido.start
            indice_monomio_en_revision := 0
            tamanio_polinomio := contenido.count
        until
            indice_monomio_en_revision = tamanio_polinomio
        loop
            contenido.start
            contenido.move (indice_monomio_en_revision)
            monomio_a_comparar := contenido.item

            from
                contador := indice_monomio_en_revision
                coeficiente_total := monomio_a_comparar.coeficiente
                contenido.forth
            until
                contador = tamanio_polinomio
            loop
                if
                    (monomio_a_comparar.exponentex = contenido.item.exponentex) and
                    (monomio_a_comparar.exponentey = contenido.item.exponentey)
                then
                    coeficiente_total := coeficiente_total + contenido.item.coeficiente
                    contenido.remove -- Mueve el cursor a la derecha
                    tamanio_polinomio := tamanio_polinomio - 1
                    contador := contador - 1
                else
                    if
                        not contenido.islast
                    then
                        contenido.forth
                    end

                end
                contador := contador + 1
            end
            contenido.start
            contenido.move (indice_monomio_en_revision)
            contenido.item.set_coeficiente (coeficiente_total)
            indice_monomio_en_revision := indice_monomio_en_revision + 1
        end
    end;

我希望任何人都可以帮助我解决这个问题。谢谢。

【问题讨论】:

  • 该类看起来不错,我猜问题出在与 LINKED_LIST 一起使用的代码中。你能告诉我们你得到的确切错误是什么吗?是编译时错误还是运行时错误?
  • @AlexanderKogtenkov 这是运行时引发的异常,它说“可读:PRECONDITION_VIOLATION 引发”,这是由于 LINKED_LIST 要求包含的对象可读
  • 请您显示导致异常的代码,好吗? (readable 是前置条件子句的名称,它与你的类 MONOMIO 无关。)
  • @AlexanderKogtenkov 当然,当异常引发时,它向我展示了这一点,这是其功能“项目”的 LINKED_LIST 代码:item: G -- Current item require -- from TRAVERSABLE not_off: not off require -- from ACTIVE readable: readable do check attached active as a then Result := a.item end end
  • 我指的是您的代码,而不是LINKED_LIST 的代码。我认为问题在于您尝试访问列表之外的项目。

标签: linked-list eiffel readable


【解决方案1】:

假设您有一个包含 1 个元素的列表。然后我们进入外循环并移动到第一个元素。然后我们执行contador := indice_monomio_en_revision,此时仍然是0,然后执行contenido.forth。现在我们超出了列表,因为只有一个元素。但是contador = tamanio_polinomio 是假的(0 = 1),所以我们进入内部循环并尝试检索第二个(不存在的)项目。轰隆隆!

其他问题包括:

  • 有多个调用,例如contenido.start,后跟contenido.move。您可以改用对go_i_th 的一次调用。

  • 我不会计算列表中的项目数,而是查看功能after。它告诉您何时到达列表的末尾。它将简化循环的逻辑(例如,将删除对 islast 的调用)并让您删除一些局部变量。

考虑到最后一点,我会将内循环条件写为

contenido.after

至少这可以避免您遇到的崩溃。至于逻辑,您可能需要检查功能startafterforthremove,看看它们有什么作用。在这种情况下编写循环的常用方法是

from
    l.start
until
    l.after
loop
    ... -- Use l.item
    l.forth
end

如果是remove,您可能不需要致电forth

【讨论】:

  • 但是移动功能不会将光标“i”位置向右移动吗?我的意思是让它归零,因为根据我的理解,在第一次迭代中,它将保持在相同的位置。如果我错了,请纠正我。感谢您的建议!
  • 你说得对,我把它和go_i_th混淆了。我希望当前的解释没有错误。 )
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-11
  • 1970-01-01
  • 2019-09-29
  • 1970-01-01
  • 2017-04-11
  • 1970-01-01
相关资源
最近更新 更多