Eiffel - 如何使我的 类 可读?
Eiffel - How do I make my classes readable?
我是 Eiffel 的新手,我正在尝试使用 LINKED_LIST class 来组织我创建的其他 class "MONOMIO" 的实例。我添加了一个用于对这些元素进行排序的函数,并使用了删除和光标移动功能,当我尝试执行代码时,它引发了一个异常,说明包含的对象应该是可读和可写的。我想知道怎么做,这是我的 class:
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
我认为出现异常是因为我为 class 制作的这个功能具有 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 个元素的列表。然后我们进入外循环并移动到第一个元素。然后我们执行contador := indice_monomio_en_revision
此时还是0
,做contenido.forth
。现在我们超出了列表,因为只有一个元素。但是 contador = tamanio_polinomio
为假 (0 = 1
),因此我们进入内循环并尝试检索第二个(不存在的)项目。轰!
其他问题包括:
有多个调用,例如 contenido.start
,然后是 contenido.move
。您可以使用对 go_i_th
的单个调用。
我不会计算列表中的项目数,而是查看特征 after
。它告诉您何时到达列表的末尾。它会简化循环的逻辑(例如,将删除对 islast
的调用)并让您删除一些局部变量。
考虑到最后一点,我会把内循环条件写成
contenido.after
至少这样可以避免您遇到的崩溃。至于逻辑,您可能需要检查特征start
、after
、forth
和remove
,看看它们有什么作用。在这种情况下编写循环的通常方法是
from
l.start
until
l.after
loop
... -- Use l.item
l.forth
end
在 remove
的情况下,您可能不需要调用 forth
。
我是 Eiffel 的新手,我正在尝试使用 LINKED_LIST class 来组织我创建的其他 class "MONOMIO" 的实例。我添加了一个用于对这些元素进行排序的函数,并使用了删除和光标移动功能,当我尝试执行代码时,它引发了一个异常,说明包含的对象应该是可读和可写的。我想知道怎么做,这是我的 class:
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
我认为出现异常是因为我为 class 制作的这个功能具有 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 个元素的列表。然后我们进入外循环并移动到第一个元素。然后我们执行contador := indice_monomio_en_revision
此时还是0
,做contenido.forth
。现在我们超出了列表,因为只有一个元素。但是 contador = tamanio_polinomio
为假 (0 = 1
),因此我们进入内循环并尝试检索第二个(不存在的)项目。轰!
其他问题包括:
有多个调用,例如
contenido.start
,然后是contenido.move
。您可以使用对go_i_th
的单个调用。我不会计算列表中的项目数,而是查看特征
after
。它告诉您何时到达列表的末尾。它会简化循环的逻辑(例如,将删除对islast
的调用)并让您删除一些局部变量。
考虑到最后一点,我会把内循环条件写成
contenido.after
至少这样可以避免您遇到的崩溃。至于逻辑,您可能需要检查特征start
、after
、forth
和remove
,看看它们有什么作用。在这种情况下编写循环的通常方法是
from
l.start
until
l.after
loop
... -- Use l.item
l.forth
end
在 remove
的情况下,您可能不需要调用 forth
。