La structure sous-jacente utilisée comme stockage pour les éléments n'alloue pas automatiquement la mémoire pour les nouveaux éléments. Certaines structures le font lorsque la commande d'assignation container [i] := s
est exécutée. Mais ce n'est pas le cas dans le code que vous mentionnez. Par conséquent, l'index i
utilisé dans cette commande n'est pas valide, d'où la violation de précondition. Si vous regardez la trace d'exception ou la pile d'appels, vous verrez que la violation de précondition ne se produit pas dans la fonctionnalité {CONTAINER}.puch_at
, mais dans {ARRAY}.put
ou similaire, qui - par coïncidence et convention de dénomination - utilise la même étiquette de précondition valid_index
.
Il existe différentes façons de résoudre le problème:
Utilisez une structure différente pour le stockage (l'attribut container
dans votre exemple), par exemple ce pourrait être HASH_TABLE [STRING, INTEGER]
. Il devient alors possible de stocker des éléments à des index arbitraires.
Assurez-vous que le stockage est pré-alloué. Si vous connaissez la plage des index possibles, alors container
peut être initialisé pour les utiliser tous depuis le début. Il peut être créé avec create container.make_filled ("", 1, N)
, où N
est l'index maximum. (Je suppose que container
est de type ARRAY [STRING]
.)
Ajouter les éléments un par un. Dans ce cas, la condition préalable de push_at
doit vérifier si l'index fourni existe ou est adjacent au précédemment alloué une:
require
valid_index: i >= 1
existing_or_adjacent_index:
container.valid_index (i) or else
container.valid_index (i - 1)
Le code de push_at
doit être adapté pour utiliser la fonction qui va allouer un nouvel index si la un est fourni au-delà de la gamme d'indices attribués:
container.force (s, i)
Cosmetics: il n'y a pas besoin de répéter la déclaration de type dans l'instruction de création create {CONTAINER} con.make
parce que le type de 012 variablesest CONTAINER
. Donc, il suffit d'utiliser create con.make
.
Merci. J'ai oublié d'incrémenter le conteneur. Problème résolu. – Mzzz