2016-06-16 1 views
0

Je suis nouveau sur Eiffel et j'essaie d'utiliser la classe LINKED_LIST pour organiser des instances d'autres classes "MONOMIO" que j'ai créées. J'ai ajouté une fonction pour la commande de ces éléments et j'utilise les fonctions remove et le mouvement du curseur et quand j'essaie d'exécuter le code, il déclenche une exception disant que les objets contenus devraient être lisibles et inscriptibles. Je voudrais savoir comment le faire, voici ma classe:Eiffel - Comment rendre mes cours lisibles?

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 

Je pense que l'exception pose à cause de cette caractéristique que je l'ai fait pour une classe qui a comme caractéristique la LINKED_LIST [MONOMIO] et il est appelé "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; 

J'espère que n'importe qui peut m'aider avec ce problème. Merci.

+0

La classe semble OK, je suppose que le problème est dans le code qui fonctionne avec LINKED_LIST. Pouvez-vous le montrer et nous dire quelle est l'erreur exacte que vous obtenez? Est-ce une erreur de compilation ou une erreur d'exécution? –

+0

@AlexanderKogtenkov C'est une exception soulevée lors de l'exécution, elle indique "lisible: PRECONDITION_VIOLATION raised" et cela est dû à une exigence de LINKED_LIST qui demande que l'objet contenu soit lisible – GiaccomoU

+0

Voulez-vous afficher le code qui mène à l'exception, s'il vous plaît? ('readable' est un nom de sous-clause precondition, il n'est pas lié à votre classe' MONOMIO'.) –

Répondre

0

Supposons que vous ayez une liste avec 1 élément. Ensuite, nous entrons dans la boucle externe et passons au premier élément. Ensuite, nous exécutons contador := indice_monomio_en_revision qui est toujours 0 à ce stade et faire contenido.forth. Nous sommes maintenant au-delà de la liste car il n'y a qu'un seul élément. Cependant contador = tamanio_polinomio est faux (0 = 1), donc nous entrons dans la boucle interne et essayons de récupérer le deuxième élément (inexistant). BOOM!

Autres questions suivantes:

  • Il y a plusieurs appels comme contenido.start suivis par contenido.move. Vous pouvez utiliser un seul appel à go_i_th à la place. Au lieu de compter le nombre d'éléments dans la liste je regarderais la caractéristique after. Il indique quand vous atteignez une fin de la liste. Cela simplifierait la logique de votre boucle (par exemple, l'appel à islast serait supprimé) et vous permet de supprimer certaines variables locales.

Prenant le dernier point en compte, j'écrirait la condition de boucle interne comme

contenido.after 

ce serait au moins éviter l'accident que vous rencontrez. En ce qui concerne la logique, vous devrez peut-être vérifier les caractéristiques start, after, forth et remove pour voir quel effet ils ont. La manière habituelle d'écrire des boucles dans de tels cas est comme

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

En cas de remove probablement vous n'avez pas besoin d'appeler forth.

+0

Mais la fonction de déplacement ne déplace-t-elle pas le curseur "i" positionne vers la droite? Je voulais le laisser à zéro parce que, à la première itération, je resterais dans la même position selon ce que je comprends. Corrigez-moi si je me trompe s'il vous plaît. Un merci pour les conseils! – GiaccomoU

+0

Vous avez raison, je l'ai confondu avec 'go_i_th'. J'espère que l'explication actuelle est sans bug.) –