Novembre 2024 | Lun | Mar | Mer | Jeu | Ven | Sam | Dim |
---|
| | | | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | | Calendrier |
|
|
| @Ouf_ca_passe (RESTORE) | |
| | Auteur | Message |
---|
JL35
Nombre de messages : 7112 Localisation : 77 Date d'inscription : 29/11/2007
| Sujet: @Ouf_ca_passe (RESTORE) Mar 26 Avr 2016 - 14:23 | |
| Concernant ton petit exemple de programme concernant les Read Datas, il comporte quelques erreurs: 1) DIM a$(30,2) alors que plus loin tu fais Read a$(i%,2) avec i% de 17 à 32, donc ça dépasse 30 -> erreur 2) DIM a%(30) et plus loin tu fais Read a%(i%) avec i% de 33 à 41 -> ça dépasse, erreur dans les deux cas tu essayes d'écrire en dehors des cases définies des tableaux. 3) Dans la ligne Data "Export",... tu as ,Quit",... il manque un quote '"' avant le Quit Plus généralement, l'intérêt d'une SUB est en principe de pouvoir être appelée plusieurs fois depuis le programme principal. Dans ton cas ça ne peut marcher qu'une seule fois: 1) Tu définis les variables utilisées dans la Sub par des DIM, tu passes une fois, ok, mais la fois suivante ça va te dire: variable déjà définie ! Il faut utiliser des DIM_LOCAL (variables locales qui n'interfèrent pas avec les variables du programme principal). 2) Les DATAs ayant déjà été lus au premier passage, le pointeur de lecture se trouve à la fin, donc au deuxième passage le READ ne trouvera plus rien à lire (ou alors les datas d'un autre sous-programme !). D'où l'intérêt du RESTORE, qui remet le pointeur au début de tous les DATAs du programme. Comme on est dans une SUB et qu'on n'est pas censé savoir s'il y a ou non d'autres DATAs dans le programme, il faut mettre un DATA repère au début des DATAs de la sub, puis commencer par faire un RESTORE pour réinitialise le pointeur, puis faire des lectures successives jusqu'à retrouver le repère, et là faire les READ successifs nécessaires pour garnir tes tableaux. Quelque chose comme: - Code:
-
DATA "Repère" DATA "Fichiers","Listes","Affichage",... etc... ' et pour la lecture: RESTORE READ b$ WHILE b$<>"Repère": READ b$: END_WHILE ' et là on attaque: For i%=1 to 16 Read a$(i%,1) etc... J'aurais écrit ta sub comme ceci: - Code:
-
' ========================== ' READ,DATA,RESTORE,FOR,NEXT ' ========================== error_french height 0,1000 width 0,200 variables() end ' ==================== sub variables() Print "variables:" Dim_local a$(32,2), a%(41), i%, b$ Data "Début" Data "Fichiers","Listes","Affichage","Opérations","Compte","A Propos...","Aide","Ouvrir","Fermer","-" Data "Exporter","-","Imprimer","-","Quitter","Imputations" Data "Files","Lists","Display on","Operations","Account","About","Help","Open","Close","-" Data "Export","-","Print","-","Quit","Imputations" Data 50,100,150,480,80,100,100,40,40 RESTORE: READ b$: WHILE b$<>"Début": READ b$: END_WHILE For i%=1 to 16 Read a$(i%,1) print a$(i%,1) next i% Print " = PARTIE 2 =" For i%=17 to 32 Read a$(i%,2) print a$(i%,2) next i% Print " = PARTIE 3 =" For i%=33 to 41 Read a%(i%) print a%(i%) next i% end_sub | |
| | | Ouf_ca_passe
Nombre de messages : 285 Age : 76 Localisation : Villeneuve d'Ascq (59-Dpt du NORD) France Date d'inscription : 21/12/2015
| Sujet: Bravo et merci Mar 26 Avr 2016 - 17:43 | |
| 1) Excuse-moi d'avoir écorché ton pseudo JL35. Je ne le ferai plus. 2) Les 3 erreurs que tu me signales sont impardonnables de ma part 3) Tu as bien réalisé ce que je cherchais à faire mais je trouve quand même qu'avec un "RESTORE étiquette" ça aurait été plus simple. 4) Le data B$ de "Debut", je veux bien; puis le pointeur se retrouve sur Data(2) (i.e. "Fichiers") et TANT QUE ce n'est pas "Debut", il peut lire les autres datas avec les boucles FOR-NEXT si bien que je ne comprends pas ce que viennent faire Read b$ : End_while là où tu les as placés et pas en fin de lecture comme je m'y serais attendu. 5) Je réédite mon code car j'ai changé les dim des tableaux et ça fonctionne quand même. Bien ! Par contre, quand je veux lire mes 9 données INTEGER en partant de l'indice 1, il plante parce qu'il ne veut en lire que 8 ?!?! MAIS si ma boucle démarre de 0 au lieu de 1, là il veut bien lire les 9. - Code:
-
' ========================== ' READ,DATA,RESTORE,FOR,NEXT ' ========================== error_french height 0,1000 width 0,200 variables() end ' ==================== sub variables() Print "variables:" Dim_local a$(40,2), a%(40), i%, b$ Data "Début" Data "Fichiers","Listes","Affichage","Opérations","Compte","A Propos...","Aide","Ouvrir","Fermer","-" Data "Exporter","-","Imprimer","-","Quitter","Imputations" Data "Files","Lists","Display on","Operations","Account","About","Help","Open","Close","-" Data "Export","-","Print","-","Quit","Imputations" Data 50,100,150,480,80,100,100,40,40 RESTORE: READ b$: WHILE b$<>"Début" : READ b$: END_WHILE For i%=1 to 16 Read a$(i%,1) print a$(i%,1) next i% Print " = PARTIE 2 =" For i%=1 to 16 Read a$(i%,2) print a$(i%,2) next i% Print " = PARTIE 3 =" For i%=0 to 8 Read a%(i%) print a%(i%) next i% end_sub
En fait, je voulais montrer qq chose a Ygeronimi et, au lieu de simplifier, ça complique, surtout si ce n'est pas sa façon de coder. Bonne soirée à tou(te)s Je pars à la pharmacie chercher du paracétamol. | |
| | | Yannick
Nombre de messages : 8635 Age : 53 Localisation : Bretagne Date d'inscription : 15/02/2010
| Sujet: re Mar 26 Avr 2016 - 18:04 | |
| Je me sers aussi des "data" de temps en temps mais pas souvent. Le plus souvent ceux ci me servent pour créer un fichier encapsulé dans mon code et prédéfini, du style, une image. Cela me sert aussi pour des appli multi-langue. Mais là, au départ, c' était une appli pour moi perso qui est devenu exemple. | |
| | | JL35
Nombre de messages : 7112 Localisation : 77 Date d'inscription : 29/11/2007
| Sujet: Re: @Ouf_ca_passe (RESTORE) Mar 26 Avr 2016 - 18:24 | |
| @Ouf_ca_passe Pour l'écorchage, ne t'inquiètes pas, c'était un clin d'oeil, je ne suis tout de même pas susceptible à ce point-là ! 3) Le Restore Étiquette serait évidemment bien pratique, mais bon, il n'existe pas, alors j'ai cherché un palliatif. 4) Si tu mets ton repère 'Début' en fin de lecture des Datas, comment vas-tu savoir où va commencer ta lecture initiale ? On est dans une Sub, et on n'est pas censé savoir ce que contient le programme principal, en particulier peut-être d'autres séries de datas avant ou après la sub. Si tu n'as pas de repère, Panoramic va lire le 1er data du programme, quel qu'il soit. Ou une autre partie du programme a déjà lu une partie des datas et le pointeur de lecture Read va se trouver n'importe où. Donc le principe c'est à chaque appel de la sub de faire un Restore (qui remet le pointeur de lecture en tête de tous les datas du programme), de lire successivement tous les datas du programme jusqu'à trouver le repère de début (c'est le While... End), et à partir de là on sait qu'on est sur les bons datas. 5) J'ai repris ton code tel quel, pour moi il lit bien les 9 données integer, que ce soit avec 0 to 8 ou 1 to 9 ? PS par contre j'ai un truc bizarre, le programme s'arrête bien sur le end, mais quand je ferme la fenêtre avec la croix rouge, j'ai systématiquement 'Panoramic.exe a cessé de fonctionner', suivi d'un 'Runtime error 216 at 00403F86' ??? Est-ce que c'est dû à ma version de l'éditeur ? ou autre ? Je reviens sur le point 4) qui semble ne pas te paraître très clair, un petit exemple: - Code:
-
' Petit programme d'exemple DIM js$(7), i% DATA "Lundi","Mardi","Mercredi","Jeudi","Vendredi","Samedi","Dimanche" DATA "1","2","3","4","5": ' datas quelconques, pour un autre usage dans le programme HEIGHT 0,1000: WIDTH 0,200 FOR i% = 1 TO 7: READ js$(i%): NEXT i%: ' jours de la semaine ' ... Variables() ' ... END ' ============================== SUB variables() Print " = VARIABLES: =" Dim_local a$(40,2), a%(40), i%, b$ Data "Début" Data "Fichiers","Listes","Affichage","Opérations","Compte","A Propos...","Aide","Ouvrir","Fermer","-" Data "Exporter","-","Imprimer","-","Quitter","Imputations" Data "Files","Lists","Display on","Operations","Account","About","Help","Open","Close","-" Data "Export","-","Print","-","Quit","Imputations" Data 50,100,150,480,80,100,100,40,40 RESTORE: READ b$: WHILE b$<>"Début" : READ b$: END_WHILE For i%=1 to 16 Read a$(i%,1) print a$(i%,1) next i% Print " = PARTIE 2 =" For i%=1 to 16 Read a$(i%,2) print a$(i%,2) next i% Print " = PARTIE 3 =" For i%=0 to 8 Read a%(i%) print a%(i%) next i% END_SUB Tu vois bien que si tu ne mets pas un repère au début des datas qui t'intéressent parmi les autres, ta sub Variables va commencer à lire les datas 1,2,3... Et même si tous les Read de datas du programme sont dans l'ordre des datas, sans cet artifice ta sub ne serait pas réentrante, c'est à dire que la prochaine fois qu'on y ferait appel elle lirait les mauvais datas, ceux du début. D'une manière générale, si les datas sont lus dans le programme principale, ça ne pose pas de problème, mais s'ils sont dans un sous-programme, ou lus dans un sous-programme (c'est à dire susceptibles d'être lus plusieurs fois), là il faut en tenir compte. Une remarque personnelle: un truc qui ne me paraît très judicieux, même si ça marche, je le reconnais, c'est d'avoir deux tableaux de variables du même nom, a$() et a%(), ça prête à confusion. | |
| | | Contenu sponsorisé
| Sujet: Re: @Ouf_ca_passe (RESTORE) | |
| |
| | | | @Ouf_ca_passe (RESTORE) | |
|
Sujets similaires | |
|
| Permission de ce forum: | Vous ne pouvez pas répondre aux sujets dans ce forum
| |
| |
| |