Page 2 sur 3
Re: Mot clé "this"?
Publié : dim. 11/févr./2024 3:07
par jph
Ollivier a écrit : sam. 10/févr./2024 22:38
Essaie ça :
Merci Ollivier,
Ça ne marche pas. J'ai corrigé quelques lignes car elles ne marchent pas avec SB, mais malgré ça, ça n'exécute jamais l'instruction rec1\Draw() et les suivantes. Il faut regarder le code javascript dans le navigateur pour voir l'erreur. C'est un membre du forum anglais qui me l'a fait découvrir. En JS la fonction Draw() est définie avec une variable comme paramètre et elle est appelée avec un pointeur comme paramètre. Le fameux *this. Et ça, ça dépend de la compilation du code SB En JS. Je ne pense pas que l'on puisse modifier ce comportement, sauf peut-être à redéfinir certaines variables à l'aide de commandes JS inline? C'est pour ça que je me demaandais si ce n'était pas un bug de SB ou tout simplement que ce n'est pas possible?
Re: Mot clé "this"?
Publié : dim. 11/févr./2024 9:09
par threedslider
[Edit] Ah ! Oubliez ce que j'ai dit, j'avais pas vue le code le premier post en PB par Microdeweb

... Je savais que ça allait marcher !
Re: Mot clé "this"?
Publié : mar. 13/févr./2024 16:28
par Ollivier
D'accord threedslider, mais comment oublier ce que tu as dit, quand on ignore ce que tu as dit ?
En langage mindphazerien, tu m'as débranché le cerveau. Pourrais-tu reprendre la prise mâle triphasée 400 volts crête alternatifs qui traîne par terre, et la rebrancher dans la prise femêle adéquate, s'il-te-plaît ?
Re: Mot clé "this"?
Publié : jeu. 15/févr./2024 9:18
par threedslider
@Ollivier
Bah faut mieux pas savoir car je disais de bêtise
Voilà
Re: Mot clé "this"?
Publié : jeu. 15/févr./2024 13:28
par Mindphazer
Ollivier a écrit : mar. 13/févr./2024 16:28
En langage mindphazerien, tu m'as débranché le cerveau. Pourrais-tu reprendre la prise mâle triphasée 400 volts crête alternatifs qui traîne par terre, et la rebrancher dans la prise femêle adéquate, s'il-te-plaît ?
Puisqu'on parle de moi, fais attention à ne pas provoquer une surtension qui pourrait être néfaste pour les neurones

Re: Mot clé "this"?
Publié : jeu. 15/févr./2024 13:37
par Ollivier
@mindphazer
Cette histoire de jus me fait penser à
un extrait du film "Las Vegas parano" !.
@threedslider
Et combien de bêtises anodines et innocentes ont sauvé la planète pour que nous y vivions ? Sûrement plus que considéré...
Pour petite conclusion,
*this est une variable utilisateur structurée. Son nom est une pure convention répandue dans divers langages autres que pureBasic. Et son existence est liée à la poo.
Il est omniprésent dans les procédure baptisées "méthodes". Comme chaque maison a sa clef, chaque procédure a son pointeur
*this.
Code : Tout sélectionner
Structure voiture
couleur.s
EndStructure
Procedure voitureCreate()
ProcedureReturn AllocateMemory(SizeOf(voiture) )
EndProcedure
Define *voiture.voiture = voitureCreate()
Lors de la création d'une instance d'un objet [b[voiture[/b], la valeur de
*this, dans les procédures, prendra la valeur de
*voiture, afin que chaque procédure puisse avoir accès aux données de la structure pointée par
*voiture.
Code : Tout sélectionner
Structure voiture
couleur.s
EndStructure
Procedure voitureCreate()
ProcedureReturn AllocateMemory(SizeOf(voiture) )
EndProcedure
Procedure voitureChangeCouleur(*this.voiture, couleur.s)
*this\couleur = couleur
EndProcedure
Define *voiture.voiture = voitureCreate()
voitureChangeCouleur(*voiture, "noire")
@jph
Tu dis que tu vois un pointeur qui n'est pas initialement dans le code source SB : est-ce que, déjà, la fonction de création (instanciation) retourne une valeur récupérable ?
Comme ici, où je récupère cette valeur :
Re: Mot clé "this"?
Publié : jeu. 15/févr./2024 17:17
par threedslider
Est ce que par hasard Microdeweb a réussi d'importer les modules C++ avec le modèle orienté objets pour interfacer avec PB ? Sa m’intéresse beaucoup car déjà PB supporte le POO d'une certaine marnière mais je doute c'est pour les avancés ^^
Re: Mot clé "this"?
Publié : jeu. 15/févr./2024 19:20
par jph
Ollivier a écrit : jeu. 15/févr./2024 13:37
@jph
Tu dis que tu vois un pointeur qui n'est pas initialement dans le code source SB : est-ce que, déjà, la fonction de création (instanciation) retourne une valeur récupérable ?
Comme ici, où je récupère cette valeur :
En fait, je pense que je ne comprends pas bien le principe des Interfaces. Je vais me documenter là-dessus.
Sinon la Procedure Draw est définie par Draw(*this.sRec) et est appelée par rec1\Draw() sans arguments. C'est ça que je ne comprends pas.
En fait, ce petit programme fonctionne bien en PB, c'est en SB qu'il y a un problème. Dans un fil du forum anglais quelqu'un m'a montré d’où vient le problème, mais pour cela il a regardé le code JavaScript issu de la compilation du petit programme en SB. Et c'est dans ce code compilé que ça ne peut pas fonctionner car la fonction est appelée avec:
, alors qu'elle est définie par
Voici le lien:
https://forums.spiderbasic.com/viewtopic.php?t=2474
Re: Mot clé "this"?
Publié : ven. 16/févr./2024 11:26
par Micoute
Voici un exemple simple sans this :
Code : Tout sélectionner
EnableExplicit
Structure Liste
List Long.l()
EndStructure
Interface Exemple
Afficher(*Liste.Liste)
EndInterface
Structure StructureExemple
*TableVirt
EndStructure
Procedure Nouveau()
Protected *Objet.StructureExemple
*Objet = AllocateMemory(SizeOf(StructureExemple))
*Objet\TableVirt = ?TableVirt_Conversion_de_classe
ProcedureReturn *Objet
EndProcedure
Procedure Afficher(*Objet.StructureExemple, *Liste.Liste)
ForEach *Liste\Long()
Debug *Liste\Long()
Next
EndProcedure
DataSection
TableVirt_Conversion_de_classe: ; Méthodes, la séquence doit être la même que l'interface!
Data.i @Afficher()
EndDataSection
Define *Exemple.Exemple
Define Liste.Liste
AddElement(Liste\Long()) : Liste\Long() = 1
AddElement(Liste\Long()) : Liste\Long() = 2
AddElement(Liste\Long()) : Liste\Long() = 3
*Exemple = Nouveau()
*Exemple\Afficher(Liste)
Re: Mot clé "this"?
Publié : ven. 16/févr./2024 14:40
par jph
Micoute a écrit : ven. 16/févr./2024 11:26
Voici un exemple simple sans this :
Merci pour l'exemple, mais c'est en PB et le ?TableVirt_Conversion_de_classe renvoie une syntax error en SB. C'est pour cette raison que j'avais posé la question. Mais étant donné qu'ici c'est un forum PB, je demandais à tout hasard.
Mais bon, j'ai eu une réponse sur le forum SB en anglais et je m'adressais ici pour savoir si quelqu'un arrivait à la comprendre. Mais ce n'est pas vital, je pourrais continuer à vivre si je n'ai pas de réponse à cette question.
Merci, en tout cas, d'avoir pris le temps de rédiger ce petit exemple.
Re: Mot clé "this"?
Publié : ven. 16/févr./2024 20:58
par Ollivier
Eh beh micoute ! Welcome back !
@jph
Est-ce que tu peux placer les 2 adresses directement ? (au lieu de mettre un pointeur vers les 2 adresses (vt). )
Re: Mot clé "this"?
Publié : sam. 17/févr./2024 6:26
par jph
Ollivier a écrit : ven. 16/févr./2024 20:58
@jph
Est-ce que tu peux placer les 2 adresses directement ? (au lieu de mettre un pointeur vers les 2 adresses (vt). )
Avec plaisir, mais où ça? À la place du ?VPRO? Je mets les 2 adresses comment? Séparées par des virgules? Il me semble que j'avais déjà essayé un truc dans ce style, mais que ça n'avait pas marché.
Re: Mot clé "this"?
Publié : sam. 17/févr./2024 10:17
par Ollivier
Est-ce que tu peux tout mettre dans la mémoire d'un tableau ?
Code : Tout sélectionner
Global Dim tableau.i(1023)
*ici = @tableau(0)
pokei(*ici, premièreAdresse)
pokei(*ici+8, secondeAdresse)
pokei(*ici+16, laSuite)
pokei(*ici+24, desAutresElements)
; etc...
Obtenir ce code-ci :
Code : Tout sélectionner
Structure sRec
*new
*draw
idCanvas.l
x.l
y.l
w.l
h.l
color.l
EndStructure
Pour régler un pointeur à l'adresse d'une procédure :
Re: Mot clé "this"?
Publié : sam. 17/févr./2024 20:40
par jph
Ollivier a écrit : sam. 17/févr./2024 10:17
Est-ce que tu peux tout mettre dans la mémoire d'un tableau ?
Code : Tout sélectionner
Global Dim tableau.i(1023)
*ici = @tableau(0)
pokei(*ici, premièreAdresse)
pokei(*ici+8, secondeAdresse)
pokei(*ici+16, laSuite)
pokei(*ici+24, desAutresElements)
; etc...
En fait, il y a des différences notables entre SB et PB. J'en découvre tous les jours. Pour info, l'instruction PokeI() n'existe pas en SB. Pourquoi? Ça m'échappe un peu. Il doit y avoir une raison, mais laquelle?
Obtenir ce code-ci :
Code : Tout sélectionner
Structure sRec
*new
*draw
idCanvas.l
x.l
y.l
w.l
h.l
color.l
EndStructure
Pourquoi pas? Mais alors les Interfaces ne servent plus dans ce cas là. Mais comme je ne connais pas bien leur fonctionnement, peut-être que je ma trompe.
Pour régler un pointeur à l'adresse d'une procédure :
Je n'arrive pas à suivre le fil de ta pensée. À quoi sert le tableau et le pointeur *ici sur l'adresse de son premier élément? Car tu ne l'utilises pas par la suite. Mais merci quand-même. Ça ne résous pas la question, mais on apprends des choses.
Re: Mot clé "this"?
Publié : dim. 18/févr./2024 20:48
par Ollivier
*ici c'est
*this ou autre. C'est un pointeur vers les données de la structure.
Si tu n'as pas
PokeI(), essaie ceci :
Code : Tout sélectionner
Dim buffer.i(63)
Define *pif.integer = @buffer(0)
buffer(0) = 29
Debug *pif\i