埃菲尔 - 我如何使我的课程可读?

时间:2016-06-16 18:46:58

标签: linked-list eiffel readable

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

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;

我希望有人可以帮我解决这个问题。感谢。

1 个答案:

答案 0 :(得分:0)

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

其他问题包括:

  • 有多次调用,例如0 = 1,后跟contenido.start。您可以使用contenido.move一次调用。

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

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

islast

至少这可以避免您遇到的崩溃。至于逻辑,您可能需要检查功能contenido.after startafterforth,看看它们有什么效果。在这种情况下编写循环的常用方法就像

remove

如果from l.start until l.after loop ... -- Use l.item l.forth end 可能您不需要致电remove