Otto Grimwald a écrit:J'ai vu également un appel à "buferparse();", mais si je le laisse, ça ne compile pas, du coup je l'ai retiré lors de mes essais.
buferparse() il faut l'enlever. C'est pour afficher et tester le parser avec le code du message précédent. Compile le message précédent et test les librairies.
Otto Grimwald a écrit:Auraes, aurais-tu des exemples concrets illustrant ce que tes modifications apportent ?
!!? Tout les mots avec un tiret étaient coupés. Même ceux du dictionnaire : dix-sept dix-huit dix-neuf. Ils ne le sont plus. Tu peux utiliser des mots comme grand-père... Et la propriété 'name' des objets CompassDirection à été corrigée : plus de nordouest sudouest... mais nord-ouest sud-ouest...
auraes a écrit:on ne sait pas s'il n'y a pas de risque d'autres effets de bords vis à vis du code existant (je ne suis pas assez calé en inform pour juger de ça), par exemple des ralentissements dû à certaines boucles etc.
Des ralentissements !? La routine enleve_accents() testait pour n'importe quel mot saisit qui n'était pas dans le dictionnaire et pour chaque caractères du mot, l'ensemble de la table des caractères accentués ! Pourquoi parcourir toute la table pour un caractère non accentué ?
Des effets de bords : et ce fameux 'à', ce n'était pas un effet de bord, et le fait d'être obligé de nommer les objets du compass nordest sudouest... ce n'était pas un effet de bord ? Et regarde ce que je viens de voir dans LanguageToInformese() :
- Code: Tout sélectionner
for (i=0:i<NbMots():i++) ! balayer toute la phrase
{ [...]
if (word == 'dessus')
{
i = 0; continue;
}
[...]
}
i = 0; continue; pose problème : le principe, c'est de balayé la phrase et si il y a des modifications de remettre i à 0 et de balayer à nouveau la phrase. Sauf que la prochaine boucle commencera à 1 et non pas à 0, malgré le i = 0. Pour une boucle qui commence à 0, Il faut mettre i à -1 avec un continue. Pour une boucle qui commence à 1, Il faut mettre en effet i à 0 avec un continue, pour pouvoir à nouveau parcourir toute la boucle.
Pour tester :
- Code: Tout sélectionner
Global n;
[ test i; if( i == 5) { n++; return 1; } rfalse; ];
[ main key i j;
!/*
for( i = 0 : i < 15 : i++){
if(n == 3) break;
print i, " ";
j = test(i);
if(j){
print " | ";
i = 0;
continue;
}
}
!/*
n = 0;
new_line;
for( i = 0 : i < 15 : i++){
if(n == 3) break;
print i, " ";
j = test(i);
if(j){
print " | ";
i = -1;
continue;
}
}
!/*
@read_char 1 ->key;
];
J'obtiens :
Boucle 1: i = 0
012345 | 12345 | 12345 ! Le 0 n'apparait qu'une fois !? (C'est normal.)
Boucle 2 : i = -1
012345 | 012345 | 012345 O.K, je parcours tous les mots à chaque tour de boucle.
- Code: Tout sélectionner
[ main i;
for( i = 0 : i < 15 : i++){
continue;
}
];
![ main i
! store i short_0
! .L0
! jl i short_15 to L2 if FALSE
! jump L1
! .L1
! inc i
! jump L0
! .L2
! rtrue
!]
Le 'jump L1' c'est le continue : il se branche sur .L1 qui est bien situé avant 'inc i'. Donc même si avant le continue, je met i à 0, i sera incrémente avant le prochain tour de boucle.
Bon, je décroche. Faites ce que vous voulez.