Forum Liberty Basic France

Le 13/04/2021 à 18h34

Administrateur

Groupe: Administrateur

Inscrit le: 04/03/2012
Messages: 2421
Reprise du message précédent

Citation:
Y'a qu'à demander ! essai sa :

Pfff... J'suis dèg'.. :(
____________________
Roro

   
Le 13/04/2021 à 19h03

Libertynaute Actif

Groupe: Membre

Inscrit le: 17/12/2010
Messages: 120
En vrai, faudrait savoir comment fonctionne exactement "Replace$()" en LIBERTY.
Ce serait plus facile... enfin j'espère !



Edité par joan74 Le 13/04/2021 à 19h08
____________________
"L'urgent c'est fait ! L'impossible est en cours... pour les miracles, merci de prévoir un délai supplémentaire !"

   
Le 13/04/2021 à 19h42

Modérateur

Groupe: Modérateur

Inscrit le: 09/02/2015
Messages: 741
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.
____________________
Just BASIC v2.0 :
  • utilisation courante avec GNU/Linux Mageia7+ Wine (Pas trouvé d'incohérences ou de bug de compilation à ce jour)
  • utilisation occasionnelle ou vérification/débugage difficile avec Windows XP sur un petit eeepc

   
Le 13/04/2021 à 20h11

Modérateur

Groupe: Modérateur

Inscrit le: 09/02/2015
Messages: 741
'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
____________________
Just BASIC v2.0 :
  • utilisation courante avec GNU/Linux Mageia7+ Wine (Pas trouvé d'incohérences ou de bug de compilation à ce jour)
  • utilisation occasionnelle ou vérification/débugage difficile avec Windows XP sur un petit eeepc

   
Le 13/04/2021 à 22h43

Modérateur

Groupe: Modérateur

Inscrit le: 09/02/2015
Messages: 741
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.
____________________
Just BASIC v2.0 :
  • utilisation courante avec GNU/Linux Mageia7+ Wine (Pas trouvé d'incohérences ou de bug de compilation à ce jour)
  • utilisation occasionnelle ou vérification/débugage difficile avec Windows XP sur un petit eeepc

   
Le 14/04/2021 à 07h30

Modérateur

Groupe: Modérateur

Inscrit le: 09/02/2015
Messages: 741
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
 
 
____________________
Just BASIC v2.0 :
  • utilisation courante avec GNU/Linux Mageia7+ Wine (Pas trouvé d'incohérences ou de bug de compilation à ce jour)
  • utilisation occasionnelle ou vérification/débugage difficile avec Windows XP sur un petit eeepc

   
Le 14/04/2021 à 11h12

Administrateur

Groupe: Administrateur

Inscrit le: 04/03/2012
Messages: 2421
Citation:
Non, c'est normal, on remplace 1 par 11,

Il suffit peut-être de faire: "si similaire-->passer"
____________________
Roro

   
Le 14/04/2021 à 15h01

Libertynaute Actif

Groupe: Membre

Inscrit le: 17/12/2010
Messages: 120
@Christophe

(Plus que) PARFAIT !

Ben oui, on peut même faire des remplacement de "" ( a$="" : b$="YaRienIci" )

PS
"if cas=3"
Y'a une raison particulière à spécifier "3" ? Ou c juste qu'il fallait mettre une valeur ?
Pas encore compris se que faisait 'trace'...



Edité par joan74 Le 14/04/2021 à 15h02
____________________
"L'urgent c'est fait ! L'impossible est en cours... pour les miracles, merci de prévoir un délai supplémentaire !"

   
Le 14/04/2021 à 16h52

Modérateur

Groupe: Modérateur

Inscrit le: 09/02/2015
Messages: 741
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
 
 
____________________
Just BASIC v2.0 :
  • utilisation courante avec GNU/Linux Mageia7+ Wine (Pas trouvé d'incohérences ou de bug de compilation à ce jour)
  • utilisation occasionnelle ou vérification/débugage difficile avec Windows XP sur un petit eeepc

   

 |  |

1 Utilisateur en ligne : 0 Administrateur, 0 Modérateur, 0 Membre et 1 Visiteur
Utilisateur en ligne : Aucun membre connecté
Répondre
Vous n'êtes pas autorisé à écrire dans cette catégorie