[Résolu] peut-on incrémenter ou décrémenter une variable

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Ollivier
Messages : 4190
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Re: peut-on incrémenter ou décrémenter une variable

Message par Ollivier »

Si je trouve le moyen de réparer ma dynamo, j'aurai assez de jus pour te pondre un code Micoute. En attendant, c'est chaud...
boby
Messages : 261
Inscription : jeu. 07/juin/2007 22:54

Re: peut-on incrémenter ou décrémenter une variable

Message par boby »

Avant de comprendre une chaîne, et même un tableau, il faut comprendre le concept de mémoire... Enfin voilà, c'est mon avis, maintenant, chacun fait comme il veut.
C'est là où c'est interessant, moi j'ai utilisé les listes sans même savoir comment ça fonctionnait, tout ce que je savais, c'est que c'était une suite d'information stocké et qu'il y avais des fonctions à appeler pour naviguer dedans. On peut utiliser les fonctions d'un langage sans comprendre leur fonctionnement, il suffit de lire la doc et d'appliquer bétement ce qui est écrit... Et ça fonctionne, c'est si on veux rentrer plus loins dans le délire qu'on a besoin de savoir leur mode de fonctionnement pour éventuelement pouvoir le détourner et faire des choses plus poussé.
Mais là aussi, c'est mon avis et oui chacun fait comme il veut, mais échanger des points de vue reste interessant ;)
Avatar de l’utilisateur
djes
Messages : 4252
Inscription : ven. 11/févr./2005 17:34
Localisation : Arras, France

Re: peut-on incrémenter ou décrémenter une variable

Message par djes »

Oui, absolument. Et puis, peu importe le point d'entrée finalement. Si ça accroche, le débutant va chercher par lui-même et au bout du compte il saura tout ce qu'il faut savoir.
Ollivier
Messages : 4190
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Re: peut-on incrémenter ou décrémenter une variable

Message par Ollivier »

Code : Tout sélectionner

;*************************************************************************************************************************
Concrètement, j'ai essayé de reprendre ton schéma dans la procédure JeRestaure().

La macro Restaure() fait le comptage mais une seule fois à la compilation, comme une sorte d'énumération.

Ce n'est pas très souple, et ça consomme du code.
Il n'y a pas d'instruction qui cherche le label suivant ou précédent, avec Restore.

Là, la seule souplesse, c'est de pouvoir appeler JeRestaure(NuméroDeLaQuestion) librement.

J'avoue qu'un tableau, une liste (conseillée par Boby), voire une chaîne, ce serait beaucoup plus souple... Ou alors, à la manière de Djes, rajouter ça :

Code : Tout sélectionner

maTable:
Data.I ?Test1, ?Test2, ?Test3, etc...
et faire un tableau de pointeurs, mais là encore, c'est mettre de la souplesse pour quelque chose de pas souple.

Là, j'ai juste perfectionné le code de El Papounet avec MacroExpandedCount.

Code : Tout sélectionner

DataSection
        
        Test1:        
        Data.S "L'épisiotomie, qu'est-ce que c'est ?"
        
        Data.S "A. Le nom d'un état fédéral des Etats-Unis d'Amérique ?"
        Data.S "B. Un épisode de Gray's Anatomy ?"
        Data.S "C. Un coup de poële à frire si on remet le couvert ?"
        Data.S "D. Une idée philosophique grecque"
        
        Test2:        
        Data.S "La denrée, qu'est-ce que c'est ?"
        
        Data.S "A. Une purée ?"
        Data.S "B. Une des dents qui permettent de s'adapter à la pression atmosphérique ?"
        Data.S "C. Un ami qui se barre avec un Louis d'or ?"
        Data.S "D. Un arrêté préfectoral autorisant les lâchers flatulatoires hors couvre-feu"
        
        Test3:        
        Data.S "Sauter une étape nécessite :"
        
        Data.S "A. de bien identifier ladite étape ?"
        Data.S "B. rien du tout, car qui trop saute, mal pressent ?"
        Data.S "C. la tenue d'une étude d'experts certifiés ?"
        Data.S "D. l'analyse consensuelle des efforts capitalisés dans la mesure des possibles sacrifices ?"
        
        Test4:        
        Data.S "Susciter, est-ce :"
        
        Data.S "A. Itérer une suspicion"
        Data.S "B. L'imparfait de sucer"
        Data.S "C. Analogue au fait d'émaner"
        Data.S "D. Suggérer abusivement"
        
        Test5:
        Data.S "Dans l'expression << Tant va la cruche à l'eau... >> :"
        
        Data.S "A. qu'à la fin, elle se casse."
        Data.S "B. qu'à la fin, elle se cache."
        Data.S "C. qu'à la fin, elle se lâche."
        Data.S "D. qu'à la fin, elle se fâche."
        
        Test6:
        Data.S "Au XVIIIème siècle..."
        
        Data.S "A. c'était un peu avant le jurassique ?"
        Data.S "B. c'était un siècle avec éruptions islandaises ?"
        Data.S "C. c'est un arrondissement de Marseilles ?"
        Data.S "D. c'est une expression introduisant de nombreux contes de fées ?"
        
        Test7:
        Data.S "Un collapsus qu'est-ce que c'est ?"
        
        Data.S "A. C'est un copain qui fait un lapsus ?"
        Data.S "B. C'est un collage sous Photoshop ?"
        Data.S "C. C'est une violente anomalie médicale ?"
        Data.S "D. C'est un refrain litturgique ?"
        
        Test8:        
        Data.S "La méthano-genèse :"
        
        Data.S "A. intestin ou océan, point trop n'en faut pour salement balloner ?"
        Data.S "B. C'est une méta-donnée ?"
        Data.S "C. C'est une classe ouvrière émergente et concurrente des métallos ?"
        Data.S "D. C'est anglais ?"
        
        Test9:        
        Data.S "En marche normale,"
        
        Data.S "A. Je roule à gauche"
        Data.S "B. Je roule à droite"
        Data.S "C. Je roule à poil"
        Data.S "D. il n'y a pas de marche normale, la voiture électrique elle est où ?"
        
EndDataSection



Macro Restaure()
        Restore Test#MacroExpandedCount
EndMacro

Procedure JeRestaure(Question)
        If Question = 1
                Restaure()
        EndIf
        If Question = 2
                Restaure()
        EndIf
        If Question = 3
                Restaure()
        EndIf
        If Question = 4
                Restaure()
        EndIf
        If Question = 5
                Restaure()
        EndIf
        If Question = 6
                Restaure()
        EndIf
        If Question = 7
                Restaure()
        EndIf
        If Question = 8
                Restaure()
        EndIf
        If Question = 9
                Restaure()
        EndIf
EndProcedure

JeRestaure(5)
Read.S Q$
Read.S RA$
Read.S RB$
Read.S RC$
Read.S RD$

Debug Q$
Debug RA$
Debug RB$
Debug RC$
Debug RD$
Avatar de l’utilisateur
Micoute
Messages : 2522
Inscription : dim. 02/oct./2011 16:17
Localisation : 35520 La Mézière

Re: peut-on incrémenter ou décrémenter une variable

Message par Micoute »

Merci Ollivier, c'est très bon ce code, il faut que je l'analyse en profondeur, mais je crois avoir déjà compris qu'on ne peut pas utiliser une variable pour appeler la macro, mais peut-être JeRestaure, je vais faire des tests en ce sens
Microsoft Windows 10 Famille 64 bits : Carte mère : ASRock 970 Extreme3 R2.0 : Carte Graphique NVIDIA GeForce RTX 3080 : Processeur AMD FX 6300 6 cœurs 12 threads 3,50 GHz PB 5.73 PB 6.00 LTS (x64)
Un homme doit être poli, mais il doit aussi être libre !
Ollivier
Messages : 4190
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Re: peut-on incrémenter ou décrémenter une variable

Message par Ollivier »

Juste MacroExpandedCount à analyser. Je n'avais pas vu que c'était pour tes petits-enfants donc mes exemples de QCM sont évidemment inadaptés.
Avatar de l’utilisateur
Micoute
Messages : 2522
Inscription : dim. 02/oct./2011 16:17
Localisation : 35520 La Mézière

Re: peut-on incrémenter ou décrémenter une variable

Message par Micoute »

Merci beaucoup Ollivier, tes exemple pourront servir un jour, car les QCM ne sont pas réservés qu'aux petits-enfants, alors finalement rien n'est inadapté.
Microsoft Windows 10 Famille 64 bits : Carte mère : ASRock 970 Extreme3 R2.0 : Carte Graphique NVIDIA GeForce RTX 3080 : Processeur AMD FX 6300 6 cœurs 12 threads 3,50 GHz PB 5.73 PB 6.00 LTS (x64)
Un homme doit être poli, mais il doit aussi être libre !
El Papounet
Messages : 57
Inscription : mer. 09/juin/2010 23:47

Re: peut-on incrémenter ou décrémenter une variable

Message par El Papounet »

@Ollivier: Merci pour ces précieuses explications. J'avoue avoir du mal à comprendre toutes les subtilités des macros, et à la vue de leurs possibilités c'est bien dommage... Il va vraiment falloir que je m'y penche plus sérieusement.
Ollivier
Messages : 4190
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Re: peut-on incrémenter ou décrémenter une variable

Message par Ollivier »

Bonjour El Papounet,

j'apprécie cet échange qui, en toute lucidité débute quand même après plusieurs années !

Je suis mitigé pour les macros. Au moins jusqu'à la version 5.50, elles sont légèrement discriminées quand se présente un bug au sein de l'une d'entre elles. Et je n'ai jamais fait la remarque. Pourtant, Fred a tâché d'avoir une certaine écoute le long des années.

J'ai vu des bugs 3D être totalement balayés. Demande honorée.
J'ai vu du code source devenir modifiable à la volée. Demande honorée.
J'ai vu des copies de mémoire s'accélérer. Demande honorée.
J'ai vu un champ totalement libre de toute syntaxe devenir accessible et éditable de manière transparente pour l'éditeur comme pour le compilateur. Demande honorée.

Les macros évoluent peu d'une version à l'autre. Mais quand elles évoluent, c'est pour régresser. Et ce n'est pourtant pas du tout une mauvaise nouvelle, car la dernière demande honorée décrite plus haut, couvre très largement les fonctionnalités des macros, rendant ces dernières obsolètes.

Je vous invite, avec un oeil prudent, à observer ce code source récemment posté.

Il est en deux parties séparées par une directive de compilation. Il se présente sous la forme suivante :

Code : Tout sélectionner

CompilerIf 0

    Partie 1

CompilerEndIf

Partie 2
La partie 2 est classique et exécutée immédiatement. Pour recréer ce code soi-même, il faut copier/coller l'exemple de RunProgram dans la doc.

Cet exemple démarre le compilateur en mode "help". En virant l'option "help", le compilateur démarre alors en mode compilation et il n'attend qu'une chose : un nom de fichier PureBasic à compiler puis exécuter.

Or en lui fournissant la partie 1 étriée des caractères incompatibles, le compilateur compile et exécute cette partie 1.

Dans mon exemple, la partie 1 est le code d'exemple CanvasGadget de la doc, code source traduit en français.

Si vous (toi, Micoute et bien d'autres) lisez cette partie 1, ça facilite grandement de disposer d'un code source dans sa langue natale.

La partie 2 travaille comme un gestionnaire de macros qui traite un fichier texte : la partie 1. C'est du pré-process pas optimisé, mais optimisable à des niveaux bien peu à plaindre.

Alors, je ne crie pas victoire, car, en l'état, il n'y a qu'une traduction :
traduction français -> charabia exécutable.

Il manque un traducteur français -> anglais exécutable
et un traducteur anglais exécutable -> français

Ce n'est qu'en ajoutant ces deux traducteurs que ce code sera vertueux : la langue anglaise reste le centre exécutable et tout autre langue locale, pouvant gérer un lexique de traduction verra sa compilation/exécution possible, comme ce code source, quelque soit la langue.

Les traducteurs en question restent de simples détecteurs/remplaceur. C'est une "simple" traduction de vocabulaire, pas grammatical (beaucoup plus lourd et inutile ici).

Il y a une règle à respecter dans l'ordre des expressions dans les noms traduisibles :

Général_ ... _Local

Exemple : Fenêtre_Obtenir_Largeur()

Le piège : Obtenir_Largeur_Fenêtre()

L'exemple sera toujours compris, par ce focus naturel de gauche à droite, de l'objet général à l'objet local, tandis que le piège, les francophones le comprendront très bien. Mais moins sûr qu'un non francophone comprenne efficacement (sans risquer une confusion dans un gros projet) la grammaire française dans sa langue natale.

Le "MacroExpandedCount" ne devient qu'une simple variable de la partie 2. Autrement dit, on ne se contraint pas à une syntaxe de macro à apprendre et comprendre : on crée la transformation qui ressemble à une gestion de macro, transformation adaptée à la syntaxe de la partie 1.

Ici, une macro contraint à n'avoir que des labels numérotés à partir de 1 :
Test1
Test2
Test3
etc...

Là, la partie 2 a un fonctionnement infiniment plus vaste que les macros. On peut créer des noms tels que :

TestASub3
TestBSub6
TestCSub9
TestAAdd12
TestBAdd15
TestCAdd18
etc...

.... et absolument toute autre combinaison. On peut aussi compiler la partie 2 et l'ajouter au pré-processing dans l'éditeur natif pour ne conserver visible dans le scope de l'éditeur que la partie 1 en langue natale.

Je pense donc, sans grandement me vanter, vu le non-accompli qui n'offre que de disposer de sa langue natale, sans lien traducteur vers la grande croisée des chemins de la langue anglaise, que bien que pas fini, ce type de code source rend les macros vraiment non nécessaires.

Cela n'empêche pas un résumé des fonctionnalités des macros :
- compteur (MacroExpandedCount)
- arguments facultatifs (comme avec les arguments des procédures)
- concaténation avec # (souder une expression à un argument)

Autrement dit, tu as fait le tour des macros. Libre à toi (comme à quiconque) d'aller bien plus loin en les détournant par cette autre pratique. Je ne peux malheureusement pas assurer d'établir ce projet, surtout quand il est bien plus vaste que la notion de langage humain. J'ai, sur papier, quelques algos qui seront plus facilement concrétisables et partageables dans le même domaine, avant de réussir à collecter le minimum nécessaire de vocabulaire anglais, allemand, polonais, russe, chinois, japonais, arabes et bien d'autres. Il y a 2000 fonctions natives. On peut estimer à un max de 2500 termes la quantité de vocabulaire techniques à collecter et vérifier pour chaque langue.

En tout cas, un grand merci pour ton appréciation.
El Papounet
Messages : 57
Inscription : mer. 09/juin/2010 23:47

Re: peut-on incrémenter ou décrémenter une variable

Message par El Papounet »

Merci pour cette démonstration.

J'ai réussi à faire fonctionner ton code en modifiant quelque peu les chemins d'accès du compilateur et du source généré.
Cet exemple est certainement instructif au niveau de l'utilisation du compilateur, mais en pratique je crois que pour en arriver au résultat obtenu, c'est se compliquer l'existance.

Loin d'être une as de la programmation (autodidacte), je suppose que certaines subtilités m'échappent de plus, avec l'age...
Peut-être y trouverai-je un jour l'utilité.
Ollivier
Messages : 4190
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Re: peut-on incrémenter ou décrémenter une variable

Message par Ollivier »

El Papounet a écrit :J'ai réussi à faire fonctionner ton code en modifiant quelque peu les chemins d'accès du compilateur et du source généré.
Merci pour ce retour d'information.

Est-ce que tu peux poster le code corrigé ? (dans le sujet "e-cqcm")

Les choix des chemins ont été faits pour éviter de retrouver son source circuler hors contrôle sur Internet. Et pour apporter le moins possible de confusion en se demandant qu'est-ce que ferait ce fichier à tel ou tel endroit.

Aussi je me mets à ta place pour comprendre l'expression << c'est se compliquer l'existence >>. Très vite, je dirai que oui hélas : je découvre un code source qui n'est pas de moi. Le but vanté : se simplifier la vie. Double pavasse qui ne fonctionne pas... Obligé d'aller déboguer je ne sais quel slash de courtoisie au milieu d'un tas d'instructions compliquées sensées se simplifier la vie...

C'est effectivement très contradictoire !

Mais c'est pour bien avoir devant les yeux la totalité du fonctionnement du système depuis le code source jusqu'à son exécution. C'est le décor et les coulisses à la fois. Il n'y a pas de plaisir à faire fonctionner ce système, comme un jeu, ou un logiciel rentable.

Là je montre un décor, ses coulisses et j'explique comment ériger une part de ces coulisses. Je n'explique pas assez pourquoi cette méthode de montage est enrichissante pour celui qui la comprend. Je n'explique pas non plus cette procédure qui, parmi les autres vient convertir et enlever les accents. Bref, faire finalement le principal du travail de pré-processing.

Mais je n'ai pas mis d'instruction de suppression du fichier TRANSIT.PB. Ce fichier temporaire normalisé pour être compilé, et systématiquement écrasé par la compilation suivante.

Un système "propre" et net, supprime ses fichiers temporaires. Là non, c'est vraiment pour pouvoir vérifier et étudier, par la pratique, comment ça procède.

Mais ce procédé que je n'ai pas expliqué est un exemple de procédé. Celui-là, par exemple, discrimine les programmeurs selon leur langue natale. Les langues cyrilliques et hébraïques sont réduites, tandis que les langues asiatiques sont largement gagnantes. Et la langues françaises est entre les deux, puisque ses accents restent une exception. Cette discrimination est dûe à la limitation du nombre de caractères.

Il est très loin d'être parfait ce procédé. Je pourrai faire un procédé parfait, mais là, les coulisses seraient imbuvables pour celui qui découvre.

Pour conclure, je ne serai pas raisonnable de m'écrier que << Si, si : ça simplifie l'existence, quand on veut rassembler une équipe internationale, il y a une barrière qui est pulvérisée. Ça se voit même à l'IRM ! >>. Non...

Donc, tu as raison, en l'état, ça complique l'existence ! Mais ça t'indique que la gestion de chaîne est infinie à côté des macros, tandis que les macros ont un plafond extrêmement limité de fonctionnement. Traduction : il vaut mieux mettre "print" entre guillemets et gérer des Ucase(), des Lcase(), des StringField(), des Mid(), etc... que de mettre "print" entre les balises d'une macro. On ne peut même pas remplacer un accent avec une macro... Et quand bien même de la sueur coulerait pour y parvenir lors d'une mise à jour du compilateur, il resterait encore une infinité de mécaniques impossibles avec les macros, puisque leur but est de remplacer en un seul balayage de code source telles expressions limitées à l'ASCII 7 bits par telles expressions.

La subtilité c'est que c'est un mode d'emploi, pas un projet, un projet où je ferai dépendre des intéressés de mes volontés de le faire évoluer ou non.
Ollivier
Messages : 4190
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Re: [Résolu] peut-on incrémenter ou décrémenter une variable

Message par Ollivier »

Petite précision (ou rappel) : les macros sont limitées en possibilités, comme précédemment dit de ma part, mais elles sont rapides.
Répondre