Forum Liberty Basic France

Général » Comment compter les données en datas ? compliqué, mais explications sur <on error goto>
Le 13/09/2020 à 17h09

Modérateur

Groupe: Modérateur

Inscrit le: 09/02/2015
Messages: 612
Hello tous !

La routine habituelle pour mettre des datas en tableau utilise une boucle, coutumièrement for/next, qui attribue à chaque case du tableau une donnée dans la liste des datas :

Code VB :
 
NombreDeDonnees=3
[K] data "un","deux","trois"
 
dim tableau$(NombreDeDonnees)
restore [K]
for a=1 to NombreDeDonnees
    read a$
    tableau$(a)=a$
next
 


Si j'ajoute plusieurs données dans ma ligne de data, ce qui est incontournable en phase de conception, je suis obligé de mettre à jour manuellement la variable NombreDeDonnees

Je voulais automatiser cette mise à jour en utilisant l'instruction "on error goto" dans une boucle while/wend : le but étant que la boucle tourne tant que l'erreur 4, Read past end of data ne se produit pas.

Lorsqu'il n'y a plus de données à lire, l'erreur 4 est produite et le programme va à l'étiquette déclarée dans "on error goto", où je voulais rendre fausse la condition d'exécution de la boucle, qui se serait ainsi arrêtée. Or, une fois l'erreur détectée par on error goto, le programme boucle sur lui-même à l'infini, et on est obligé de l'arrêter avec un ctrl-alt-suppr.

Même en m'arrangeant pour que on error goto ne pointe pas à l’extérieur du while/wend, l'exécution boucle sur elle-même et n'en sort pas.

La méthode qu'on pourrait utiliser, et qu'utilise Roland, si je me souviens bien, est de mettre ces données non pas en data, mais en fichier. On peut alors connaitre le nombre de données en créant une routine de lecture du fichier, et ainsi dimensionner automatiquement les tableaux au bon nombre d'éléments. Mais il y a des situations où je préfère garder les datas.

Quelqu'un a-t-il une idée pour automatiser le comptage des données en datas en vue de dimensionner un tableau ?



Edité par Christophe Le 15/09/2020 à 10h44
____________________
Just BASIC v2.0 :
  • utilisation courante avec GNU/Linux Mageia6 + 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/09/2020 à 18h43

Administrateur

Groupe: Administrateur

Inscrit le: 04/03/2012
Messages: 2253
En datas je ne sais pas; mais en chaine,un:
Code VB :
 
for x=1 to len(c$)
if word$(c$,x)="" then n=x-1: exit for
next x
 

Donne le nombre d'items de la chaine.
Je n'ai pas encore compris l'intérêt de "data"; y en a t-il un ?
____________________
Roro

   
Le 13/09/2020 à 21h57

Modérateur

Groupe: Modérateur

Inscrit le: 09/02/2015
Messages: 612
Chacun fait un peu comme il veut, c'est l'intéret du loisir

Pour ma part j'utilise les datas parce que
  • on les a directement sous les yeux, elles sont clairement identifiables comme bloc de données, avec le mot data en bleu, les chaines en vert et les valeurs en rouge, on ne peut pas faire plus "carré",
  • c'est plus simple qu'un fichier de configuration parce qu'on n'a pas à programmer sa lecture, qui, en outre, fera travailler le disque à chaque lancement du programme
  • c'est humainement plus lisible qu'une longue chaine linéaire traitée avec word$ : je peux organiser 200 données en 10 lignes de 20, ou en 40 lignes de 5 ou n'importe quelle autre combinaison qui donne 200, c'est souple et si je veux définir une matrice c'est l'idéal

L'inconvénient est la cause de la discussion : si on ajoute ou supprime des données, il faut qu'on le dise au programme en modifiant manuellement la variable qui lui dit combien il doit en trouver.

La plupart du temps c'est pas un problème, mais hier j'ai beaucoup oublié de données qu'il m'a fallu insérer à la bonne place, et à chaque fois, reporter la nouvelle quantité, et ça devenait pénible. C'est là que je pensais qu'avec un peu de chance, un "on error goto" pourrait me sauver la mise. Mais ça marche pas, peut-être à cause de la structure même du while/wend.
____________________
Just BASIC v2.0 :
  • utilisation courante avec GNU/Linux Mageia6 + 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/09/2020 à 11h11

Administrateur

Groupe: Administrateur

Inscrit le: 04/03/2012
Messages: 2253
Citation:
C'est plus simple qu'un fichier de configuration

Ce n'est pas la même finalité; le fichier permets l'échange de données; quand c'est en "dur" dans le code (data) ça devient inaccessible; pour modifier il faut recompiler.
Citation:
plus lisible qu'une longue chaine linéaire

Rien n'empêche de faire des retours ligne qui feront des blocs
Comme:
Code VB :
 
c$="361 040 035 192 030 064 034 542"+_
   "491 032 517 038 073"+_
   "191 034 067 543"+_
   "....."
 

Je persiste, "data" n'apporte rien de plus, que la contrainte dont tu parles.

EDIT: Le "on error" il faut le mettre avant l'instruction qui va merder
____________________
Roro

   
Le 14/09/2020 à 15h18

Modérateur

Groupe: Modérateur

Inscrit le: 09/02/2015
Messages: 612
Citation:
Je persiste, "data" n'apporte rien de plus, que la contrainte dont tu parles.
C'est pas d'aujourd'hui qu'on en parle, et on campe chacun sur nos positions, on va pas aller bien loin comme ça. Alors je te laisses utiliser les chaines et laisse moi utiliser les datas, on a assez de bouteille tous les deux pour savoir quand utiliser quoi. Un vrai vieux couple ;)

J'ai potassé sur l'on error goto : le WHILE/WEND semble hors de cause. J'avais utilisé RESUME en fin de traitement d'erreur, sauf que ce RESUME renvoie l'exécution sur l'instruction qui a causé l'erreur, et pas sur la suivante. C'est un fonctionnement normal, qui donne une chance de corriger une valeur dans une équation avant de la réappliquer (division par zéro, par ex), puis de retrouver le cheminement normal du programme.

Or, dans notre "read past end of data", on ne peut pas corriger, et comme il n'y a plus de données à lire, si on RESUME on retourne à READ qui ne peux toujours pas lire ce qui n'est plus à lire, et on boucle indéfiniment.

Mais procédons par ordre, j'ai déjà commencé par faire fonctionner ON ERROR GOTO. Le code ci-dessous lit cinq données placées en data. Or, il n'y en a que deux qui sont disponibles, tenter de lire la troisième va provoquer un "read past end of data", mais, grâce à la gestion d'erreur, on reprend l'exécution à l'étiquette [finir], après les instructions READ :
Code VB :
data 3,5',9,8,6,5,3

print "1>";
on error goto [erreur]
read a:print a
 
print "2>";
on error goto [erreur]
read a:print a
 
print "3>";
on error goto [erreur]
read a:print a
 
print "4>";
on error goto [erreur]
read a:print a
 
print "5>";
on error goto [erreur]
read a:print a
 
print "6>";
on error goto [erreur]
read a:print a
 
[finir]
print "finir>on atteint la fin du programme"
end
 
[erreur]
    print "erreur n° ";Err;" : ";Err$
    goto [finir]
    'resume

De manière plus surprenante, le programme fonctionne aussi avec une seule instruction ON ERROR GOTO, ce qui soulève la question de l'étendue de son action : va-t-elle réagir pour toutes les erreurs du programme ?

Le même programe que ci-dessus, avec une seule instruction "on error goto" :
Code VB :
 
data 3,5',9,8,6,5,3

print "1>";
on error goto [erreur]
read a:print a
 
print "2>";
read a:print a
 
print "3>";
read a:print a
 
print "4>";
read a:print a
 
print "5>";
read a:print a
 
print "6>";
read a:print a
 
[finir]
print "finir>on atteint la fin du programme"
end
 
[erreur]
    print "erreur n° ";Err;" : ";Err$
    goto [finir]
    'resume

La suite au prochain numéro, la journée passe vite ;)



Edité par Christophe Le 14/09/2020 à 15h54
____________________
Just BASIC v2.0 :
  • utilisation courante avec GNU/Linux Mageia6 + 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/09/2020 à 15h51

Administrateur

Groupe: Administrateur

Inscrit le: 04/03/2012
Messages: 2253
Pour avoir le nombre de datas il faut les compter pendant qu'on les lis (prélecture)
Et dans le [err] dimensionner le tableau avec le nombre obtenu;
Mais c'est un peu "tordu" comme façon de faire
Code VB :
 
 data 5,4,3,2,1
for  x=1 to 10000
   n=x-1
  on error goto [err]
   read a
next x
wait
[err]
  print n
 
____________________
Roro

   
Le 14/09/2020 à 15h56

Modérateur

Groupe: Modérateur

Inscrit le: 09/02/2015
Messages: 612
Oki, c'est donc faisable. Je teste dès que j'ai deux minutes, là c'est mon côté perfectionniste qui m'a fait revenir pour un rectifier un chouia-machin dans la présentation du listing ;)
a+
____________________
Just BASIC v2.0 :
  • utilisation courante avec GNU/Linux Mageia6 + 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/09/2020 à 16h17

Administrateur

Groupe: Administrateur

Inscrit le: 04/03/2012
Messages: 2253
Code VB :
 
 data 11, 10, 9, 8, 7, 6, 5,4,3,2,1
for  x=1 to 10000
   n=x-1
  on error goto [err]
   read a
next x
wait
[err]
  dim nomb(n)
  restore
  for x=1 to n
    read a: nomb(x)=a: print nomb(x)
  next x
 


Mais lol! ça oblige à compter pour chaque bloc de data.
____________________
Roro

   
Le 15/09/2020 à 10h40

Modérateur

Groupe: Modérateur

Inscrit le: 09/02/2015
Messages: 612
Ca marche, et tout est lu. Je ne savais pas qu'on pouvait sortir d'un FOR/NEXT aussi facilement et qu'on pouvait en plus conserver l'état du compteur de boucle au moment de cette sortie.

Il faudrait maintenant tester avec un WHILE/WEND pour éviter de devoir donner une butée haute, parce qu'au fur et à mesure qu'on travaille sur le programme, on peut avoir plus de données que prévu (je te le concède, je me vois mal écrire plus de dix mille datas ;)

L'"on error goto" réagit à toutes les erreurs que le l'exécution du programme rencontre après l'instruction, et j'imagine la pagaille que ça peut créer. Apparemment, on ne peut pas la désactiver ? Une fois qu'elle est définie, c'est pour jusq'à la fin du programme.

Donc j'ai tenu compte de ce fonctionnement dans le code ci-dessous, et on peut tout à fait gérer une sortie propre du programme en fonction du numéro d'erreur. Cependant, ça complique la routine de fin, qui doit tenir compte de tout ce qui pourrait être encore anormalement ouvert si l'exécution arrive dans cette routine après un error goto.

On s'éloigne du but initial qui était simplement une aide à la création du programme, qui aurait été supprimée un fois le programme au point.

Le second exemple montre que toutes les datas sont lues en une seule fois, et il est courant d'avoir besoin de ne lire qu'une partie des datas. On devrait pouvoir s'en sortir avec une organisation bien déterminée, des étiquettes et un décomptes des données lues, mais là encore, c'est au prix d'une complication rédhibitoire. Donc j'en reste à la rectification manuelle.

Mais la discussion est intéressante.

J'ai travaillé à partir de tes exemples pour éviter de réinventer la roue. Comptage du nombre de données en DATA, et gestion des erreurs :
Code VB :
print "je fais ci, je fais ça, tout va bien"
 
print "je compte le nombre de datas"
data 11, 10, 9, 8, 7, 6, 5,4,3,2,1
for  x=1 to 10000
    n=x-1
    on error goto [err] 's'il n'y a plus de data à lire j'aurais une erreur que je traiterais en [err]
    read a
next x
print "problème : tous les datas ne sont pas lus"
goto [fin]
end
 
[lecture_tableau]
    print "Je lis les datas, je les place en tableau"
    print "et je les affiche à l'écran :"
   dim nomb(n)
   restore
   for x=1 to n
       read a: nomb(x)=a: print nomb(x)
  next x
 
  print "je poursuis le fil du programme, puis j'ai fini"
  goto [fin]
 
'sous-programmes
[err]
    if Err=4 then
        print "erreur rencontrée mais tout va bien,"
        print "elle est attendue et prévue"
        print "il y a ";n;" datas"
        goto [lecture_tableau]
    else
        print "Une erreur s'est produite"
        print "Erreur ";Err;" : ";Err$
        goto [fin]
    end if
 
    end '(normalement cet "end" il ne sert à rien
        'mais sait-on jamais, dès fois qu'on retire le "goto [fin]",
        'ce qui ne le serait pas (fin) mais qui peut se produire
        'ça évite de se retrouver dans les sous-programmes suivants

[fin]
    print "je ferme correctement tout ce qu'il faut fermer"
    print "le programme est achevé"
 


* Cas de l'erreur inattendue.
* Toutes les données en DATA seront lues, on ne peut pas n'en lire qu'une partie :
Code VB :
 
print "je fais ci, je fais ça, tout va bien"
 
print "je compte le nombre de datas"
data 11, 10, 9, 8,
data 7, 6, 5,4,3,2,1
for  x=1 to 10000
    n=x-1
    on error goto [err] 's'il n'y a plus de data à lire j'aurais une erreur que je traiterais en [err]
    read a
next x
print "problème : tous les datas ne sont pas lus"
goto [fin]
end
 
[lecture_tableau]
    print "Je lis les datas, je les place en tableau"
    print "et je les affiche à l'écran :"
    'b=a/0 'dé-commenter cette ligne pour faire réagir
    '   l'<on error goto> sur une erreur imprévue
   dim nomb(n)
   restore
   for x=1 to n
       read a: nomb(x)=a: print nomb(x)
  next x
 
  print "je poursuis le fil du programme, puis j'ai fini"
  goto [fin]
 
'sous-programmes
[err]
    if Err=4 then
        print "erreur rencontrée mais tout va bien,"
        print "elle est attendue et prévue"
        print "il y a ";n;" datas"
        goto [lecture_tableau]
    else
        print "Oh ! Une erreur inattendue s'est produite"
        print "Erreur ";Err;" : ";Err$
        goto [fin]
    end if
 
    end '(normalement cet "end" il ne sert à rien
        'mais sait-on jamais, dès fois qu'on retire le "goto [fin]",
        'ce qui ne le serait pas (fin) mais qui peut se produire
        'et on irait alors dans les sous-programmes suivants

[fin]
    print "je ferme correctement tout ce qu'il faut fermer"
    print "le programme est achevé"
    end
 
data -1,-2,-3,-4
 


On s'est encore bien amusé la-dessus, j'ai appris quelque chose. la discussion n'est pas close, on peut continuer.



Edité par Christophe Le 15/09/2020 à 10h58
____________________
Just BASIC v2.0 :
  • utilisation courante avec GNU/Linux Mageia6 + 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 15/09/2020 à 12h44

Administrateur

Groupe: Administrateur

Inscrit le: 04/03/2012
Messages: 2253
Citation:
conserver l'état du compteur de boucle

Qui ne se fait pas par l'opération du saint esprit ("n=x-1").
Citation:
tester avec un WHILE/WEND

ça marchera pareil avec un while 1 mais on n'y coupe pas de sortir un état de compteur (qui faut créer) , en tant que "butée haute" pour dimensionner le tableau.
Citation:
j'imagine la pagaille que ça peut créer

Tu l'a dit, à utiliser avec parcimonie...
Citation:
une aide à la création du programme,

Intéressant, tu peux développer ?

Dans ton code j'aurais mis un "wait" à la place du "end".
L'avantage de travailler avec les chaines plutôt qu'avec les datas, c'est qu'en plus du: "word$()", on dispose des: "left$(); right$(); mid$() et instr().
A quoi servent au juste les datas ? Dans le temps on y stockait des adresses, on peut y stocker des pixels; mais mettre des données en "dur" dans le code est rarement une bonne idée; dans l'idéal on met une procédure qui engendre les données
____________________
Roro

   
Le 15/09/2020 à 18h44

Modérateur

Groupe: Modérateur

Inscrit le: 09/02/2015
Messages: 612
Citation:
Qui ne se fait pas par l'opération du saint esprit ("n=x-1").
N'empêche que tu viens de citer sa valeur, donc il n'y a pas besoin du saint esprit ;)

Citation:
ça marchera pareil avec un while 1 mais on n'y coupe pas de sortir un état de compteur (qui faut créer) , en tant que "butée haute" pour dimensionner le tableau.

Par "butée haute" j'entendais la valeur de droite du for/next, pas la valeur de la boucle quand l'<on error goto> a eu lieu.

Philosophiquement parlant, quand une condition est atteinte, c'est plus propre d'utiliser un while/wend parce qu'il est fait pour ça, plutot qu'un for/next dont on force l'arrêt avant terme. On est bien d'accord qu'un while/wend oblige à installer un compteur dans sa boucle si on veut savoir combien il a fait de tours.

Voilà la routine en while/wend :
Code VB :
 
n=0
while Err=0
    on error goto [erreur]
    read a
    n=n+1
wend
 

J'ai été obligé de mettre le <on error goto> dans la boucle, mais il reste toujours actif ailleurs, depuis la première fois qu'il est rencontré..

Le prog :
Code VB :
 
print "je fais ci, je fais ça, tout va bien"
 
print "je compte le nombre de datas"
data 11, 10, 9, 8,
data 7, 6, 5,4,3,2,1
 
n=0
while Err=0
    on error goto [erreur]
    read a
    n=n+1
wend
 
[lecture_tableau]
    print "Je lis les datas, je les place en tableau"
    print "et je les affiche à l'écran :"
    'b=a/0 'dé-commenter cette ligne pour faire réagir
    '   l'<on error goto> sur une erreur imprévue
   dim nomb(n)
   restore
   for x=1 to n
       read a: nomb(x)=a: print nomb(x)
  next x
  'end 'end final,

  print "je poursuis le fil du programme, puis j'ai fini"
  goto [fin]
 
'sous-programmes
[erreur]
    if Err=4 then
        print "erreur rencontrée mais tout va bien,"
        print "elle est attendue et prévue"
        print "il y a ";n;" datas"
        goto [lecture_tableau]
    else
        print "Oh ! Une erreur inattendue s'est produite"
        print "Erreur ";Err;" : ";Err$
        goto [fin]
    end if
 
    end '(normalement cet "end" il ne sert à rien
        'mais sait-on jamais, dès fois qu'on retire le "goto [fin]",
        'ce qui ne le serait pas (fin) mais qui peut se produire
        'et on irait alors dans les sous-programmes suivants

[fin]
    print "je ferme correctement tout ce qu'il faut fermer"
    print "le programme est achevé"
    end
 
data -1,-2,-3,-4
 


Citation:
Citation:
une aide à la création du programme,


Intéressant, tu peux développer ?

Oui. Pour rester dans le contexte qui nous intéresse, qui est que j'avais fait pas mal d'oublis dans mes datas, que je n'ai pas vu tous ces oublis en même temps et qu'il m'a fallu y revenir plusieurs fois.

Donc dans ce contexte, si mon nombre de data est nd :
j'ajoute une valeur, je recherche nd, j'ajoute 1 à nd, je relance le programme
j'en supprime deux, je recherche nd, j'enlève deux à nd, je relance le programme
j'en remet une, je recherche ndj, 'ajoute 1 à nd, je relance le programme
j'en ajoute trois, je creherche nd, j'ajoute 3 à nd, je relance le programme

Maintenant, le programme compte lui-meme les datas
j'ajoute une valeur, je relance le programme
j'en supprime deux, je relance le programme
j'en remet une, je relance le programme
j'en ajoute trois, je relance le programme

Aide à la création du programme : le temps et l'énergie qu'on économise à ne plus chercher nd dans le listing pour le mettre à jour, on le passe à la conception de l’algorithme suivant.

Citation:
Dans ton code j'aurais mis un "wait" à la place du "end".

A quel endroit (J'en ai mis plusieurs) et pourquoi ?

Citation:
L'avantage de travailler avec les chaines plutôt qu'avec les datas, c'est qu'en plus du: "word$()", on dispose des: "left$(); right$(); mid$() et instr().
A quoi servent au juste les datas ? Dans le temps on y stockait des adresses, on peut y stocker des pixels; mais mettre des données en "dur" dans le code est rarement une bonne idée; dans l'idéal on met une procédure qui engendre les données


Je pense plutôt qu'il n'y a pas d'avantage ni d'inconvénient, mais des solutions qui sont plus adaptées que d'autres à un contexte particulier. Affirmer que les data sont rarement une bonne idée, tu m"excusera, Ta Majesté, mais c'est un peu cavalier. Les data ne sont qu'un outil, et tout dépend de l'utilisation qu'on en fait.
____________________
Just BASIC v2.0 :
  • utilisation courante avec GNU/Linux Mageia6 + 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 15/09/2020 à 19h09

Administrateur

Groupe: Administrateur

Inscrit le: 04/03/2012
Messages: 2253
Citation:
Dans ton code j'aurais mis un "wait" à la place du "end".

A quel endroit (J'en ai mis plusieurs) et pourquoi ?

Partout; je craindrais que le end fasse un clear des variables
Citation:
Affirmer que les data sont rarement une bonne idée

Je ne parle pas des "datas" mais des données en général.
Dans le cas du jeu à la c**, comme la chaine de mots est en dur l'encodage est en dur, c'est logique; mais il est superflu, si ce n'est pour ajouter du trouble à la confusion (du mystère).
Il semble quand même que hors la lecture il n'est pas si évident de travailler avec "data"; .
____________________
Roro

   
Le 16/09/2020 à 09h59

Modérateur

Groupe: Modérateur

Inscrit le: 09/02/2015
Messages: 612
Cette fois-ci, ça marche en mettant l'<on error goto> avant la boucle. Je ne sais pas pourquoi ça n'a pas marché hier, il y a un détail qui a dû m'échapper. Mais si ça marche aujourd'hui :
Code VB :
 
n=0
on error goto [erreur]
while Err=0
    read a
    n=n+1
wend
 

J'ai utilisé directement la variable Err de l'<on error goto> comme condition à tester, mais à priori, ce n'est pas une bonne idée, parce que, d'après l'aide, certaines erreurs n'ont pas de code numérique, et dans ce cas, Err reste à zéro. Est-ce grave ?

Admettons qu'une de ces erreurs arrive : l'exécution va à [Erreur], où le cas Err<>4 branche sur la routine de fin de programme, donc tout va bien, la détection d'erreur fait le travail attendu

Mais j'ai fait confiance à ma routine de traitement d'erreur, faut pas que je me sois planté dans son écriture. Peut-être que si on voulait être académique, on aurait écrit

Code VB :
 
n=0
fin=0
on error goto [erreur]
while fin=0
    read a
    n=n+1
wend
 

et dans le traitement d'erreur, on aurait écrit : if Err=4 then fin=1. On n'aurait pas mélangé notre boucle à surveiller avec le traitement d'erreur.

Quoi qu'il en soit, voici le programme complet, avec la solution "while Err=0"
Code VB :
 
print "je fais ci, je fais ça, tout va bien"
print "je compte le nombre de datas"
data 11, 10, 9, 8,
data 7, 6, 5,4,3,2,1
 
n=0
on error goto [erreur]
while Err=0
    read a
    n=n+1
wend
end
 
[lecture_tableau]
    print "Je lis les datas, je les place en tableau"
    print "et je les affiche à l'écran :"
    'b=a/0 'dé-commenter cette ligne pour faire réagir
    '   l'<on error goto> sur une erreur imprévue
   dim nomb(n)
   restore
   for x=1 to n
       read a: nomb(x)=a: print nomb(x)
  next x
 
  print "je poursuis le fil du programme, puis j'ai fini"
  goto [fin]
 
'sous-programmes
[erreur]
    if Err=4 then
        print "erreur rencontrée mais tout va bien,"
        print "elle est attendue et prévue"
        print "il y a ";n;" datas"
        goto [lecture_tableau]
    else
        print "Oh ! Une erreur inattendue s'est produite"
        print "Erreur ";Err;" : ";Err$
        goto [fin]
    end if
 
    end '(normalement cet "end" il ne sert à rien
        'mais sait-on jamais, dès fois qu'on retire le "goto [fin]",
        'ce qui ne le serait pas (fin) mais qui peut se produire
        'et on irait alors dans les sous-programmes suivants

[fin]
    print "je ferme correctement tout ce qu'il faut fermer"
    print "le programme est achevé"
    end
 
data -1,-2,-3,-4
 


Citation:
Citation:
Citation:
Dans ton code j'aurais mis un "wait" à la place du "end".


A quel endroit (J'en ai mis plusieurs) et pourquoi ?


Partout; je craindrais que le end fasse un clear des variables

Normalement, l'exécution ne passe pas par ces "end", que je place pour prévenir, dans des phases de prototypage, les conséquences d'éventuelles erreurs de programmation. Ils évitent que l'exécution continue sur du code qu'elle ne devrait pas lire si j'ai mal paramétré un branchement ou quand je ne suis pas sûr de moi. Si on arrive sur ces "end" c'est qu'il est déjà trop tard.

Citation:
Dans le cas du jeu à la c**, comme la chaine de mots est en dur l'encodage est en dur, c'est logique; mais il est superflu, si ce n'est pour ajouter du trouble à la confusion (du mystère).


C'était là tout le jeu et tout le plaisir ;)

A la base, c'est le gag de la montagne qui accouche d'une souris, et j'ai manqué de temps : on aurait eu une liste de mots trois fois plus grande, une série de data super-carrées à n'y rien comprendre et un dialogue farfelu à afficher là où on attend du sérieux. Au final il n'y avait que dix phrases à afficher.

Je les aurais :
mises en data
Code VB :
data "phrase1"
data "phrase2"
...


ou en chaine
Code VB :
ch1$="phrase1"
ch2$="phrase2"
...


ou en tableau de chaine
Code VB :
ch$(0)="phrase1"
ch$(1)="phrase2"
...


Et franchement, ça ne fait pas beaucoup de différence. Sur ce cas précis, l'utilisation des data nécessite une routine supplémentaire pour les intégrer dans un tableau, donc autant écrire directement le tableau. Mais, s'il fait plus d'une quinzaine de ligne, ça va devenir plus pénible d'écrire le nom du tableau avec un index différent à chaque ligne, que d'écrire le mot "data")

Des fois on ne connait pas encore la structure qu'aura notre programme, ni le nom des variables qui vont recevoir les données ni le traitement qui leur sera appliqué, on ne sait pas trop non plus dans quelle direction on va aller, mais on a déjà les données, alors, on les place en data et on vient chercher celles qui nous intéressent en temps utile.

Dans un programme finalisé, effectivement, l'utilité des datas est plus restreinte : ce sont des constantes du programme, des choix qui seront toujours proposés par défaut, des matrices qui doivent être dans un état bien défini au lancement..., et rien n'empêche de faire un fichier de config qui remplit le même rôle. Quelque part, je pense qu'on devait être d'accord depuis un bout de temps...
____________________
Just BASIC v2.0 :
  • utilisation courante avec GNU/Linux Mageia6 + 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 16/09/2020 à 11h44

Administrateur

Groupe: Administrateur

Inscrit le: 04/03/2012
Messages: 2253
Citation:
RESUME renvoie l'exécution sur l'instruction qui a causé l'erreur, et pas sur la suivante

Comme l'erreur est provoquée (connue); il ne sert à rien d'en tester ou d'en utiliser la nature (4) (qu'on connaît).
Et en règle générale, il ne doit pas y avoir d'erreur; gérer les erreurs c'est un peu comme bâtir tordu et redresser à l'enduit.
Même les erreurs "utilisateur" doivent êtres évitées.
Citation:
montagne qui accouche d'une souris

Le sujet est intéressant (définition de la règle), et loin d'être résolu.
Citation:
l'exécution ne passe pas par ces "end"

Ah d'accord...
Citation:
il n'y avait que dix phrases à afficher.

J'aime bien ta façon de complexifier les choses; je me rappelle de-->: http://libertybasic.fr/forum/topic-454+il-est-temps-de-faire-les-courses.php qui était fort ingénieux.
Citation:
donc autant écrire directement le tableau.

Mais les données viennent de quelque part; et donc, c'est "data"; chaine, ou fichier.
Bah "Data" en fait c'est un entonnoir dont on n'a pas besoin.
Citation:
alors, on les place en data et on vient chercher celles qui nous intéressent en temps utile.

ça se défend, moi ce qui me gène c'est que c'est en dur dans le code; les données devraient êtres en fichier (et organisées), l'encodage supprimé, remplacé par une formule (genre: 1er verbe 1er nom, 1er article...), il ne reste qu'à imaginer.
Citation:
Quelque part, je pense qu'on devait être d'accord depuis un bout de temps...

C'est aussi mon avis. :)
ça n'enlève rien au problèmes du choix et de la validité des règles.
____________________
Roro

   
Le 17/09/2020 à 00h46

Modérateur

Groupe: Modérateur

Inscrit le: 09/02/2015
Messages: 612
Citation:
Citation:
RESUME renvoie l'exécution sur l'instruction qui a causé l'erreur, et pas sur la suivante

Comme l'erreur est provoquée (connue); il ne sert à rien d'en tester ou d'en utiliser la nature (4) (qu'on connaît).
Et en règle générale, il ne doit pas y avoir d'erreur; gérer les erreurs c'est un peu comme bâtir tordu et redresser à l'enduit.
Même les erreurs "utilisateur" doivent êtres évitées.

Si tu connais une astuce pour éviter les erreurs de l'utilisateur et les bugs... ;)

Dans la mesure où tu détournes le système de gestion d'erreur pour gérer une erreur en particulier, tu prend la responsabilité de la gestion de toutes les erreurs qui peuvent arriver, c'est donc bien de prévoir ce qu'on fera si l'erreur survenue n'est pas celle que tu as prévu.

Il y a, dans [lecture_tableau], une ligne test du genre b=a/0, qui ne manquera pas de faire réagir l'<on error goto>

Citation:
Citation:
montagne qui accouche d'une souris

Le sujet est intéressant (définition de la règle), et loin d'être résolu.

Je vais voir à le terminer dans les jours qui viennent, je n'ai pas eu le temps la dernière fois, et c'était, sur le moment, assez frustrant par ailleurs. Mais ce qui est déjà produit fait le job. Loin d'être résolu, c'est toi qui le dit, ou j'ai pas compris de quoi tu parles...

Citation:
Citation:
donc autant écrire directement le tableau.

Mais les données viennent de quelque part; et donc, c'est "data"; chaine, ou fichier.
Bah "Data" en fait c'est un entonnoir dont on n'a pas besoin.

Il me fallait mettre les mots dans des chaines ou des fichiers et pas dans des datas ? Chez moi, le système à base de data fonctionne bien, j'en fais ce que j'en veux, tout comme toi tu fais avec les fichiers, j'ai pas de souci avec, et j'économise une routine de lecture de fichier.

Citation:
Citation:
alors, on les place en data et on vient chercher celles qui nous intéressent en temps utile.

ça se défend, moi ce qui me gène c'est que c'est en dur dans le code; les données devraient êtres en fichier (et organisées), l'encodage supprimé, remplacé par une formule (genre: 1er verbe 1er nom, 1er article...),


Je vois bien que ça te gêne, mais j'ai du mal à comprendre en quoi. Pourquoi les données devraient absolument être en fichier ? Ca fait un fichier de plus dans un dossier qui est peut-être déjà bien rempli, un petit curieux pensera bien faire en y modifiant une ligne et fera planter l'appli au démarrage suivant, il n'y a pas que des avantages à mettre les données dans un fichier.

Quant à l'encodage, il fait partie du mystère, avec les data.

Citation:
il ne reste qu'à imaginer.

Et si tu réécrivais mon programme avec tes méthodes ? Ce n'est pas un défi, juste un exercice, qui permettrait de démontrer qu'on peut prendre des chemins différents pour arriver au même résultat.

Citation:
Citation:
Quelque part, je pense qu'on devait être d'accord depuis un bout de temps...

C'est aussi mon avis. :)
ça n'enlève rien au problèmes du choix et de la validité des règles.


Oui, on était d'accord, mais sur la part marginale des data dans des programmes fonctionnels ("à quoi ça sert ?"). Marginale mais non nulle : protéger des données contre une modification malvenue, définir des séries de données propres au programme et pas générable par des algorithmes, ou qui prendraient trop de temps, ou seraient trop compliquées, à être générés par des algorithmes, etc..

Rendez-vous la page de la montagne qui accouche d'une souris d'ici quelques jours pour discuter des problèmes de choix et de validité de règles...

A+, et bonne nuit, vu l'heure.
____________________
Just BASIC v2.0 :
  • utilisation courante avec GNU/Linux Mageia6 + 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 17/09/2020 à 12h36

Administrateur

Groupe: Administrateur

Inscrit le: 04/03/2012
Messages: 2253
Tu a fait comme tu voulais le faire, et au final, personne ne peut juger du bien fondé de ton choix.
Mettre des données en dur dans le code, c'est un peu comme si au lieu de se servir des règles de math; on liait (par un encodage) la multitude des résultats (en dur dans le code) aux différentes opérations.
Ou en encore comparable à la différence entre une formule (généralisable) et une abaque (cas particuliers).
Je ne dis pas que ça n'a jamais d'utilité, ça peut en avoir.
En clair il faudrait pointer sur les mots en fonction de leur nature et non de leurs places (pour que la méthode soit généralisable) (d'où la nécessité de pré-organiser les données (verbes, noms adjectifs...ect...); c'est en ça que je dis que le problème est loin d'être résolu.
En clair, je ne suis pas très clair.
____________________
Roro

   
Le 18/09/2020 à 01h20

Modérateur

Groupe: Modérateur

Inscrit le: 09/02/2015
Messages: 612
Et pourtant si, mais on en discutera sur l'autre fil.

Quand on voit le mot "data", tu pense "donnée en dur dans le programme", et moi je pense "échafaudage" : quand la construction est terminée, on retire l'échafaudage, et on ne laisse que les éventuelles data qu'il serait pertinent de conserver, voilà qui devrait clore notre malentendu (utile, au demeurant, pour la réflexion qu'il a engendré)

Bon, il doit bien y avoir un troquet dans ce patelin, on va aller se prendre une bière ;)
____________________
Just BASIC v2.0 :
  • utilisation courante avec GNU/Linux Mageia6 + 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 19/09/2020 à 11h06

Administrateur

Groupe: Administrateur

Inscrit le: 04/03/2012
Messages: 2253
A la réflexion, il semble que faire fonctionner des mots ne puisse se faire qu'avec de la data brute en affectation directe (ou indirecte (encodage mystère), car chaque cas est unique, et on ne peut donc pas le mettre en formule.
C'est dommage...
____________________
Roro

   
Général » Comment compter les données en datas ? compliqué, mais explications sur <on error goto>  

 |  |

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