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 :oops: ... 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 :mrgreen:

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 :mrgreen:

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 :

Code : Tout sélectionner

Define *voiture.voiture = voitureCreate()

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 :

Code : Tout sélectionner

Define *voiture.voiture = voitureCreate()
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:

Code : Tout sélectionner

v_rec1._vt._Draw(v_rec1);
, alors qu'elle est définie par

Code : Tout sélectionner

rect$f_draw(p_this)
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 :

Code : Tout sélectionner

\new = @new()

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 :

Code : Tout sélectionner

\new = @new()
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