2016-06-16 3 views
0

私はEiffelを初めて使いました。私はLINKED_LISTクラスを使用して、他のクラス "MONOMIO"のインスタンスを整理しようとしています。私はこの要素を並べ替えるための関数を追加し、removeとカーソルの移動機能を使用します。コードを実行しようとすると、含まれているオブジェクトが読み書き可能でなければならないという例外が発生します。私は[MONOMIO]機能LINKED_LISTとして持つクラスのために作られてきた、それはだ、私は例外があるため、この機能によって提起考えるEiffel - クラスを読みやすくするにはどうしたらいいですか?

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 

:私はこれが私のクラスで、それを行う方法を知りたいのです

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; 

私はこの問題を誰かが助けてくれることを願っています。ありがとう。

+0

クラスは正常に見えますが、問題はLINKED_LISTで動作するコードにあると思います。あなたはそれを見せて、あなたが得た正確なエラーは何かを教えてくれますか?それはコンパイル時エラーかランタイムエラーですか? –

+0

@AlexanderKogtenkov実行時に "読み取り可能:PRECONDITION_VIOLATIONが発生しました"という例外があります.LINKED_LISTには、含まれているオブジェクトを読み込めるように要求されているためです。 – GiaccomoU

+0

例外につながるコードを表示しますか? ( 'readable'は前提条件の副節の名前ですが、あなたのクラス' MONOMIO'には関係ありません。確認してください) –

答えて

0

要素が1つのリストがあるとします。次に、外側のループに入り、最初の要素に移動します。その後、contador := indice_monomio_en_revisionを実行します。この時点ではまだ0であり、contenido.forthです。今では要素が1つしかないので、リストからは外れています。ただし、contador = tamanio_polinomioはfalse(0 = 1)なので、内部ループに入り、2番目(存在しない)のアイテムを取得しようとします。ブーム!

その他の問題が含まれます:

  • contenido.move続いcontenido.startなどの複数の呼び出しがあります。代わりにgo_i_thへの1回の呼び出しを使用できます。

  • リストの項目数をカウントする代わりに、機能afterを調べます。あなたがリストの終わりに達した時を知らせます。ループのロジックを簡略化します(たとえば、islastの呼び出しは削除されます)。いくつかのローカル変数を削除できます。

    私は少なくとも、これはあなたが経験するクラッシュを回避する

    contenido.after 
    

    ように、内側ループ条件を記述したアカウントへの最後のポイントを取る

。ロジックに関しては、機能にどのような影響があるか調べるには、機能startafterforthremoveをチェックする必要があります。そのような場合にはループを書くための通常の方法は、removeの場合

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

ようなもので、おそらくあなたはforthを呼び出す必要はありません。

+0

ですが、移動機能はカーソル「i」の位置を右に移動しませんか?最初の反復では、私が理解していることに応じて同じ位置にとどまるため、ゼロにすることを意味しました。もし私が間違っていたら私を訂正してください。アドバイスに感謝します! – GiaccomoU

+0

あなたは正しいです、私は 'go_i_th'と混同しました。私は現在の説明がバグフリーであることを願っています。 ) –

関連する問題