Forum Liberty Basic France : Voir tous les messages du membre

   Le 14/04/2021 à 16h52 Subs et Snippets » Pack de fonctions texte
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 :
 
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
 
 
   Le 14/04/2021 à 07h30 Subs et Snippets » Pack de fonctions texte
Eh bien, c'est plus simple et ça semble fonctionner.

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
 
 
   Le 13/04/2021 à 22h43 Subs et Snippets » Pack de fonctions texte
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.
   Le 13/04/2021 à 20h11 Subs et Snippets » Pack de fonctions texte
'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
   Le 13/04/2021 à 19h42 Subs et Snippets » Pack de fonctions texte
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.
   Le 13/04/2021 à 06h28 Subs et Snippets » Pack de fonctions texte
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 :
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
 
   Le 10/04/2021 à 12h28 Débutant » Pour compter les datas
Sûr à 99% que tu utilises la version 1 de JustBasic, laquelle effectivement reste sur "resume" en surbrillance, essaie la 2 ;)
   Le 10/04/2021 à 12h23 Débutant » Pour compter les datas
Ah ? un premier vrai dysfonctionnement avec Wine ? Intéressant, j'investigationne durant le week-end...
à+
   Le 10/04/2021 à 12h11 Subs et Snippets » Pack de fonctions texte
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 :
 
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
   Le 07/04/2021 à 15h16 Débutant » Pour compter les datas
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 :
 
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]
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 :
 
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...

 |  |

1 Utilisateur en ligne : 0 Administrateur, 0 Modérateur, 0 Membre et 1 Visiteur
Utilisateur en ligne : Aucun membre connecté