Forum Liberty Basic France : Voir tous les messages du membre
• Index
Je n'avais pas vérifié la possibilité d'un a$ vide, dans ce cas c'est mieux que la fonction retourne la chaine intacte, et j'ai ajouté un "if" dans la fonction pour prévoir ce cas. b$ aussi peut être vide mais c'est moins gênant.
@Roland, j'étais aussi parti dans ton sens, mais j'ai eu soudain l'intuition qu'on s’ennuyait pour rien avec un avant$ et un après$ pour mettre un milieu$ dedans, et j'ai changé de cap.
@joan74 : trace 2 est actif seulement en mode débugage (la coccinelle à côté de la flèche bleue), et veut dire qu'on exécute le programme pas à pas, en cliquant sur "step into" pour passer à l'instruction suivante, et les variables traitées par l'instruction sont affichées.
if pas=3 then trace 2 veut dire que je voulais voir le déroulement de la fonction pour la valeur de boucle de test n°3, et comme les données à l'intérieur d'une fonction sont indépendantes des données à l'extérieur, j'ai dû transmettre la valeur de test avec les paramètres de la fonction. j'aurais pu m'en passer si j'avais défini test comme une variable globale, mais je n'y ai pas pensé.
pour résumer, on place trace 2 (ou 1) juste avant le bloc d'instruction à surveiller, et trace 0 juste après. trace 0 élimine l'effet de trace 2 et de trace 1 et on reprend l'exécution normale.
Comme j'ai été un peu vite pour poster ce matin, je remet la fonction débarrassée de ses échafaudages et complétée de son anti-a$-vide :
Code VB :
@Roland, j'étais aussi parti dans ton sens, mais j'ai eu soudain l'intuition qu'on s’ennuyait pour rien avec un avant$ et un après$ pour mettre un milieu$ dedans, et j'ai changé de cap.
@joan74 : trace 2 est actif seulement en mode débugage (la coccinelle à côté de la flèche bleue), et veut dire qu'on exécute le programme pas à pas, en cliquant sur "step into" pour passer à l'instruction suivante, et les variables traitées par l'instruction sont affichées.
if pas=3 then trace 2 veut dire que je voulais voir le déroulement de la fonction pour la valeur de boucle de test n°3, et comme les données à l'intérieur d'une fonction sont indépendantes des données à l'extérieur, j'ai dû transmettre la valeur de test avec les paramètres de la fonction. j'aurais pu m'en passer si j'avais défini test comme une variable globale, mais je n'y ai pas pensé.
pour résumer, on place trace 2 (ou 1) juste avant le bloc d'instruction à surveiller, et trace 0 juste après. trace 0 élimine l'effet de trace 2 et de trace 1 et on reprend l'exécution normale.
Comme j'ai été un peu vite pour poster ce matin, je remet la fonction débarrassée de ses échafaudages et complétée de son anti-a$-vide :
Code VB :
chaine$="123456789123456789" for test=1 to 6 select case test case 1 : a$="1" : b$="11" case 2 : a$="1" : b$="aa" case 3 : a$="234" : b$="--" case 4 : a$="4567" : b$="--" case 5 : a$="" : b$=" atchoum! " case 6 : a$="a" : b$="---" end select print a$;" remplacé par ";b$;" donne ";REMPLACE$(chaine$,a$,b$) next end '*********************** function REMPLACE$(chain$,enlever$,remplacer$) enl=len(enlever$) cha=len(chain$) if enl>0 then ch$="" for tour=1 to cha ch$=ch$+mid$(chain$,tour,1) if right$(ch$,enl)=enlever$ then ch$=left$(ch$,len(ch$)-enl)+remplacer$ next REMPLACE$=ch$ else REMPLACE$=chain$ end if end function
Eh bien, c'est plus simple et ça semble fonctionner.
En attente du prochain déraillement
Code VB :
En attente du prochain déraillement

Code VB :
chaine$="123456789123456789" for test=1 to 6 select case test case 1 : a$="1" : b$="11" case 2 : a$="1" : b$="aa" case 3 : a$="234" : b$="--" case 4 : a$="567" : b$="--" case 5 : a$="4567" : b$="-" case 6 : a$="a" : b$="---" end select print a$;" remplacé par ";b$;" donne ";REMPLACE$(chaine$,a$,b$,test) next end '*********************** function REMPLACE$(chain$,enlever$,remplacer$,cas) if cas=3 then trace 2 enl=len(enlever$) cha=len(chain$) ch$="" for tour=1 to cha ch$=ch$+mid$(chain$,tour,1) if right$(ch$,enl)=enlever$ then ch$=left$(ch$,len(ch$)-enl)+remplacer$ next REMPLACE$=ch$ end function
Non, c'est normal, on remplace 1 par 11, et au tour d'après, on trouve fort logiquement le second 1 de 11, du coup le programme pense qu'il faut remplacer aussi ce 1, et on boucle comme ça à l'infini.
'suis perplexe :
avec a$="1" et b$="11" on entre dans une boucle infinie
avec a$="1" et b$="aa" le programme fonctionne normalement (à essayer en mode debug)
dans les deux cas, b$ est chaine, on fait des opérations sur les caractères et je n'ai pas converti b$ en valeur numérique quelque part dans le programme
obtenez-vous la même chose ?
Je réfléchirais demain
avec a$="1" et b$="11" on entre dans une boucle infinie
avec a$="1" et b$="aa" le programme fonctionne normalement (à essayer en mode debug)
dans les deux cas, b$ est chaine, on fait des opérations sur les caractères et je n'ai pas converti b$ en valeur numérique quelque part dans le programme
obtenez-vous la même chose ?
Je réfléchirais demain
Normal, ça s'appelle procéder par approximations successives : quand on aura fait le tour de toutes les situations inattendues et que la fonction fonctionnera malgré tout (puisque c'est sa fonction, de fonctionner, on pourra dire qu'on y est arrivé 
J'investigationne. Pour l'instant, avec a$="1" et b$="11", on a une boucle infinie car le cha court aussi vite que le tour, et donc le tour ne rattrappera jamais le cha.

J'investigationne. Pour l'instant, avec a$="1" et b$="11", on a une boucle infinie car le cha court aussi vite que le tour, et donc le tour ne rattrappera jamais le cha.
Eh bien ça n'a pas l'air si simple que ça... Je propose une version à base de "while" qui devrait fonctionner quelle que soit la taille et le nombre d'occurences dans la chaine. Et je travaille sur une version avec des FOR/NEXT, qui me donne bien du fil à retordre.
La version "while" :
Code VB :
La version "while" :
Code VB :
a$="567" b$="--" chaine$="123456789123456789" print "En remplaçant ";a$;" par ";b$;" dans ";chaine$ print " on obtient ";REMPLACE$(chaine$,a$,b$) end '*********************** function REMPLACE$(chain$,enlever$,remplacer$) enl=len(enlever$) cha=len(chain$) tour=1 fini=0 while fini=0 dercar=cha-enl+1 if mid$(chain$,tour,enl)=enlever$ then deb$=left$(chain$,tour-1) fin$=right$(chain$,dercar-tour) chain$=deb$+remplacer$+fin$ cha=len(chain$) end if if tour>=cha then fini=1 else tour=tour+1 wend REMPLACE$=chain$ end function
Sûr à 99% que tu utilises la version 1 de JustBasic, laquelle effectivement reste sur "resume" en surbrillance, essaie la 2

Ah ? un premier vrai dysfonctionnement avec Wine ? Intéressant, j'investigationne durant le week-end...
à+
à+
Une version un peu plus légère, parce que j'étais parti sur une boucle WHILE/WEND alors que dans notre cas un FOR/NEXT convient parfaitement et est plus bref et plus simple à mettre en oeuvre
Cette version remplace toutes les occurences de a$ trouvées dans chaine$
Code VB :
J'ai ajouté une variable "dercar", dernier caractère, après avoir constaté qu'avec le FOR/NEXT on avait deux utilisations différentes de la somme cha-enl+1
Cette version remplace toutes les occurences de a$ trouvées dans chaine$
Code VB :
a$="345" b$="---" chaine$="123456789123456789" print "En remplaçant ";a$;" par ";b$;" dans ";chaine$ print " on obtient ";REMPLACE$(chaine$,a$,b$) end '*********************** function REMPLACE$(chain$,enlever$,remplacer$) enl=len(enlever$) cha=len(chain$) dercar=cha-enl+1 for tour=1 to dercar if mid$(chain$,tour,enl)=enlever$ then deb$=left$(chain$,tour-1) fin$=right$(chain$,dercar-tour) chain$=deb$+remplacer$+fin$ end if next REMPLACE$=chain$ end function
J'ai ajouté une variable "dercar", dernier caractère, après avoir constaté qu'avec le FOR/NEXT on avait deux utilisations différentes de la somme cha-enl+1
Comme souvent, j'ai dû réfléchir un peu plus que prévu. J'ai voulu traiter tous les codes d'erreur, dont le past end of data, de telle sorte que le programme compte les datas, ou s'arrête proprement en cas d'erreur inattendue. Le listing :
Code VB :
Pour reprendre plus en détail,
Code VB : sera actif dès que l'execution passera sur lui, il n'y a pas d'instruction pour le désactiver. Toutes les erreurs d'exécution brancheront sur [erreur]
On entre maintenant dans la boucle de lecture des datas
Code VB :
Cette boucle est une boucle infinie,et il viendra un moment où les datas seront tous lus, ce qui provoquera une erreur 4, past end of data, lorsque l'exécution arrivera sur READ t$, et nous amènera dans le sous-programme de gestion d'erreur :
Code VB :
<Err> et <Err$> sont les codes et descriptif d'erreur utilisés par JB/LB, ce ne sont pas des variables crées par le programmeur. L'erreur 4 emmène l'exécution sur FIN=1, qui dira à la boucle de lecture qu'elle a fini son travail, puis sur RESTORE, et enfin on retournera dans la boucle avec RESUME.
Pourquoi RESTORE ? parce qu'une fois que l'erreur est traitée, l'exécution reprend à l'instruction qui a fait réagir l'on error goto : READ t$. Il n'y avait déjà plus de data à lire lorsqu'on est arrivé dans [erreur], il n'y en aura pas plus à lire maintenant, et on bouclera à l'infini. Donc en plaçant un RESTORE, on réinitialise la liste des datas, et READ fonctionne à nouveau. Mais la boucle s'arrête puisque FIN a été placé à 1, remplissant la condition de fin de la boucle
Mais si Err est différent de 4 et que nous ne savons pas trop comment gérer d'autres erreurs, on va se contenter de fermer proprement ce qui est ouvert, avant de quitter le programme, et ce sera juste pour éviter un arrêt brutal qui aurait eu lieu, de toute façon, si nous n'avions pas le ON ERROR GOTO. pour en arriver là, il suffit de dé-commenter la ligne 'c=boucle/(boucle-3) et de lancer le programme : le programme affichera le code et le libellé de l'erreur, puis branchera sur la routine de fin qui permettra une fermeture propre des fenêtres ou fichiers éventuellement ouverts
Bon, ça, c'est ce que j'ai compris du principe...
Code VB :
on error goto [erreur] boucle=0 fin=0 while fin=0 read t$ boucle=boucle+1 'c=boucle/(boucle-3) wend print "on a trouvé ";boucle-1;" datas" goto [finiprogramme] [erreur] if Err=4 then fin=1 restore resume else print "Error string is " + chr$(34) + Err$ + chr$(34) print "Error number is ";Err goto [finiprogramme] end if [finiprogramme] print "on ferme ce qu'il faut fermer" print "fin du programme" end data "a","z","e","r","t","y","u","i","o","p"
Pour reprendre plus en détail,
Code VB :
on error goto [erreur]
On entre maintenant dans la boucle de lecture des datas
Code VB :
boucle=0 fin=0 while fin=0 read t$ boucle=boucle+1 'c=boucle/(boucle-3) wend
Cette boucle est une boucle infinie,et il viendra un moment où les datas seront tous lus, ce qui provoquera une erreur 4, past end of data, lorsque l'exécution arrivera sur READ t$, et nous amènera dans le sous-programme de gestion d'erreur :
Code VB :
[erreur] if Err=4 then fin=1 restore resume else print "Error string is " + chr$(34) + Err$ + chr$(34) print "Error number is ";Err goto [finiprogramme] end if
<Err> et <Err$> sont les codes et descriptif d'erreur utilisés par JB/LB, ce ne sont pas des variables crées par le programmeur. L'erreur 4 emmène l'exécution sur FIN=1, qui dira à la boucle de lecture qu'elle a fini son travail, puis sur RESTORE, et enfin on retournera dans la boucle avec RESUME.
Pourquoi RESTORE ? parce qu'une fois que l'erreur est traitée, l'exécution reprend à l'instruction qui a fait réagir l'on error goto : READ t$. Il n'y avait déjà plus de data à lire lorsqu'on est arrivé dans [erreur], il n'y en aura pas plus à lire maintenant, et on bouclera à l'infini. Donc en plaçant un RESTORE, on réinitialise la liste des datas, et READ fonctionne à nouveau. Mais la boucle s'arrête puisque FIN a été placé à 1, remplissant la condition de fin de la boucle
Mais si Err est différent de 4 et que nous ne savons pas trop comment gérer d'autres erreurs, on va se contenter de fermer proprement ce qui est ouvert, avant de quitter le programme, et ce sera juste pour éviter un arrêt brutal qui aurait eu lieu, de toute façon, si nous n'avions pas le ON ERROR GOTO. pour en arriver là, il suffit de dé-commenter la ligne 'c=boucle/(boucle-3) et de lancer le programme : le programme affichera le code et le libellé de l'erreur, puis branchera sur la routine de fin qui permettra une fermeture propre des fenêtres ou fichiers éventuellement ouverts
Bon, ça, c'est ce que j'ai compris du principe...
• Index
1 Utilisateur en ligne : 0 Administrateur, 0 Modérateur, 0 Membre et 1 Visiteur
Utilisateur en ligne : Aucun membre connecté
Utilisateur en ligne : Aucun membre connecté