|
FORUMS PROFESSIONNELS WINDEV, WEBDEV et WINDEV Mobile |
| | | | | |
Prise de référence sur variable |
Débuté par arnaud.benhamdine, 01 déc. 2011 16:14 - 11 réponses |
| |
| | | |
|
| |
Posté le 01 décembre 2011 - 16:14 |
Bonjour,
Est il possible dans Windev de faire une prise de référence sur une variable de type entier (et non pas un objet) ?
Mon problème est le suivant :
Soit une classe cMaClasse avec un constructeur qui accepte un paramètre par adresse : cMaClasse.Constructeur(eParamID est un entier)
L'appel depuis une fenêtre est :
eID est un entier = 0 MonObjet est un cMaClasse(eID)
Dans mon constructeur, si je fais :
Constructeur(eParamID est un entier) eParamID = 1
eID vaut aussi 1 quand je reviens dans le code de la fenêtre.
Ca c'est normal : c'est le principe du passage par adresse.
Le problème, c'est que je ne peux pas faire pointer une autre variable sur celle ci, si je fais :
Déclarations de cMaClasse
LOCAL :eMembre est un entier FIN
Constructeur(eParamID est un entier) :eMembre = eParamID :eMembre = 1
Là quand je reviens dans le code de la fenêtre, eID vaut toujours 0. :eMembre ne référence pas eID
Comment faire pour qu'une modification de :eMembre dans la classe modifie aussi le variable passée au constructeur (sachant que l'on parle ici de variables simples, pour les objets il n'y a pas de difficulté) ???
Merci d'avance pour vos suggestions, Arnaud. |
| |
| |
| | | |
|
| | |
| |
Membre enregistré 952 messages |
|
Posté le 01 décembre 2011 - 16:52 |
Bonjour,
je crois que la prise de référence sur des variables de type simple n'est pas possible grâce à l'opérateur : <-
Donc le plus simple, serait utiliser une propriété dans ta classe. et tu devra utiliser la propriété dans tout le code de ta classe et non pas ta variable..
un peu dans ce genre là : // Déclaration
c_test est une classe PRIVÉ _emembre est un entier _adr_param est un entier FIN
// Propriété (version GET)
RENVOYER _emembre
// Propriété (version SET) PROCEDURE EMembre(Valeur)
_emembre=valeur Transfert(_adr_param,&_emembre,4) [/code]
// Constructeur
Procedure Constructeur(vp_Mbr est un entier)
_adr_param=&vp_Mbr EMembre=1
Voilà,bon code  |
| |
| |
| | | |
|
| | |
| |
Posté le 01 décembre 2011 - 17:57 |
Super !
Je ne connaissais pas cette technique de l'utilisation de & et Transfert(), je m'en vais essayer ça.
C'est qq chose que tu utilises couramment ? Pas de pb à l'usage ?
Merci bcp dans tous les cas.
Cdlt, Arnaud. |
| |
| |
| | | |
|
| | |
| |
Membre enregistré 952 messages |
|
Posté le 01 décembre 2011 - 18:08 |
re bonjour,
aucun soucis pour la fonction Transfert, elle fonctionne très bien 
cependant, juste faire attention a votre plateforme , x64bits ou x32bits
le 3eme paramètre de transfert indique la taille en octets à transférer, donc diffère entre les deux systèmes  |
| |
| |
| | | |
|
| | |
| |
Posté le 01 décembre 2011 - 19:04 |
Ahhhh... je savais qu'il y aurait un petit piège ! 
Merci encore. |
| |
| |
| | | |
|
| | |
| |
Membre enregistré 512 messages |
|
Posté le 02 décembre 2011 - 04:25 |
Bonjour Arnaud et Christophe,
Je me permets un commentaire que j'espère constructif.
Ce que propose Christophe n'est pas une prise de référence: c'est une technique astucieuse de "copie-cachée". Hélas, dans ce cas précis elle est unidirectionnelle.
Unidirectionnel ?! En effet, la modification directe de la valeur de la variable eID ne sera pas répercutée sur la valeur du membre .:eMembre.
En prenant un peu de recul, quand je constates l'effort de conception/programmation nécessaire pour obtenir, sur une variable de type simple, l'équivalent d'une prise de référence sur un objet, je me dis qu'il est plus facile de travailler avec des objets... ...même si ces objets ne servent qu'à "enrober" (wrapper) des données simples.
Bon développement !
-- Pour me contacter par courrier électronique, cliquez sur le lien ci-dessous (protection antispam): http://cerbermail.com/…
-- Pour me contacter par courrier électronique, cliquez sur le lien ci-dessous (protection antispam): http://cerbermail.com/… |
| |
| |
| | | |
|
| | |
| |
Posté le 02 décembre 2011 - 11:33 |
=JBO= a écrit dans le message de news <8f3200d00999ff3d35fc68b511fd37a5@news.pcsoft> :
Bonjour Arnaud et Christophe, Je me permets un commentaire que j'espère constructif. Ce que propose Christophe n'est pas une prise de référence: c'est une technique astucieuse de "copie-cachée". Hélas, dans ce cas précis elle est unidirectionnelle. Unidirectionnel ?! En effet, la modification directe de la valeur de la variable eID ne sera pas répercutée sur la valeur du membre .:eMembre. En prenant un peu de recul, quand je constates l'effort de conception/programmation nécessaire pour obtenir, sur une variable de type simple, l'équivalent d'une prise de référence sur un objet, je me dis qu'il est plus facile de travailler avec des objets... ...même si ces objets ne servent qu'à "enrober" (wrapper) des données simples. Bon développement ! -- Pour me contacter par courrier électronique, cliquez sur le lien ci-dessous (protection antispam): http://cerbermail.com/…-- Pour me contacter par courrier électronique, cliquez sur le lien ci-dessous (protection antispam): http://cerbermail.com/…
Merci pour cet apport effectivement intéressant.
Tu as raison pour le coté unidirectionnel, et je vais effectivement opter pour un objet qui enveloppe les types simples : je pense que c'est plus simple à maintenir et ca permet plus de souplesse si d'autres membres doivent être ajoutés.
Merci encore, Arnaud. |
| |
| |
| | | |
|
| | |
| |
Posté le 09 décembre 2011 - 21:54 |
| |
| |
| | | |
|
| | |
| |
Posté le 13 décembre 2011 - 14:15 |
Bonjour,
Puisque vous utilisez des "&" et des "transfert()", faites les choses jusqu'au bout, utilisez comme membre un pointeur sur la valeur, plutôt que directement la valeur. Et là, plus de problème de "direction".
Attention juste au ramasse-miette!
Arnaud.
Arnaud Benhamdine a écrit dans le message de news <98bf7a740c4ec5b5ba6edc1933d7b717@news.pcsoft> :
=JBO= a écrit dans le message de news <8f3200d00999ff3d35fc68b511fd37a5@news.pcsoft> : Bonjour Arnaud et Christophe, Je me permets un commentaire que j'espère constructif. Ce que propose Christophe n'est pas une prise de référence: c'est une technique astucieuse de "copie-cachée". Hélas, dans ce cas précis elle est unidirectionnelle. Unidirectionnel ?! En effet, la modification directe de la valeur de la variable eID ne sera pas répercutée sur la valeur du membre .:eMembre. En prenant un peu de recul, quand je constates l'effort de conception/programmation nécessaire pour obtenir, sur une variable de type simple, l'équivalent d'une prise de référence sur un objet, je me dis qu'il est plus facile de travailler avec des objets... ...même si ces objets ne servent qu'à "enrober" (wrapper) des données simples. Bon développement ! -- Pour me contacter par courrier électronique, cliquez sur le lien ci-dessous (protection antispam): http://cerbermail.com/…-- Pour me contacter par courrier électronique, cliquez sur le lien ci-dessous (protection antispam): http://cerbermail.com/…Merci pour cet apport effectivement intéressant. Tu as raison pour le coté unidirectionnel, et je vais effectivement opter pour un objet qui enveloppe les types simples : je pense que c'est plus simple à maintenir et ca permet plus de souplesse si d'autres membres doivent être ajoutés. Merci encore, Arnaud. |
| |
| |
| | | |
|
| | |
| |
Posté le 14 décembre 2011 - 21:26 |
hé ben justement c'est la question de départ !
Comment on fait ?
Cdlt, Arnaud. |
| |
| |
| | | |
|
| | |
| |
Posté le 19 décembre 2011 - 17:07 |
Bonjour,
Le "&" est un opérateur qui renvoie une adresse sur un élément en mémoire (Ici une variable allouée (statique ou dynamique après allocation))
L'équivalent WLangage d'un "void *" en C par exemple est un entier système.
Si I est un entier = 123 quelque part dans l'application (attention toutefois aux portées des variables (locales, globales, allouées d'un côté mais plus de l'autre car le ramasse miette aurait fait son boulot ...) Et P est un entier système = &I (Récupération de l'adresse de la variable I à l'intérieur de mon processus)
Alors une affectation serait: J est un entier = 124 transfert(P, &J, dimension(J))
Et une lecture: J est un entier transfert(&J, P, (dimension(J))
Attention également à l'utilisation de transfert(). Cette fonction copiera le nombre d'octet demandé (dans les exemples, le résultat de dimension() qui vaut 4 en 32 bits et 8 en 64 bits) Or, si on tente d'écrire à l'emplacement mémoire P qui serait l'adresse non pas d'un entier mais d'un caractère, alors on fera des accès mémoires pas très propres qui peuvent rendre l'appli instable.
Moi je fais ça régulièrement en remplacement du couple sérialise()/désérialise() dans certains contextes, et je gagne beaucoup en vitesse et en mémoire.
Cordialement,
Arnaud. |
| |
| |
| | | |
|
| | |
| |
Membre enregistré 88 messages |
|
Posté le 27 décembre 2017 - 19:28 |
Bonjour,
J'ai testé le remplacement préconisé par Arnaud de sérialise()/désérialise() par transfert() pour faire une copie sans prise de référence d'une instance de classe.
Ca ne fonctionne pas !
Essai est une Classe aaa est chaîne UNICODE FIN
Essai_2 est une Classe aaa est chaîne FIN
Final_Pour_Essai_DéclaréDsDéclGlobFen,Final_Pour_Essai_DéclaréDsFinInitFen est Essai Final_Pour_Essai2_DéclaréDsDéclGlobFen,Final_Pour_Essai2_DéclaréDsFinInitFen est Essai_2 Essai_DéclaréDsDéclGlobFen est Essai
Essai_DéclaréDsFinInitFen est Essai Essai_DéclaréDsFinInitFen.aaa="Essai_DéclaréDsFinInitFen" Transfert(&Final_Pour_Essai_DéclaréDsFinInitFen,&Essai_DéclaréDsFinInitFen,Dimension(Essai_DéclaréDsFinInitFen)) Trace(Final_Pour_Essai_DéclaréDsFinInitFen.aaa)
Essai_DéclaréDsDéclGlobFen.aaa="Essai_DéclaréDsDéclGlobFen" Transfert(&Final_Pour_Essai_DéclaréDsDéclGlobFen,&Essai_DéclaréDsDéclGlobFen,Dimension(Essai_DéclaréDsDéclGlobFen)) Trace(Final_Pour_Essai_DéclaréDsDéclGlobFen.aaa)
Essai2_DéclaréDsFinInitFen est Essai_2 Essai2_DéclaréDsFinInitFen.aaa="Essai2_DéclaréDsFinInitFen" Transfert(&Final_Pour_Essai2_DéclaréDsFinInitFen,&Essai2_DéclaréDsFinInitFen,Dimension(Essai2_DéclaréDsFinInitFen)) Trace(Final_Pour_Essai2_DéclaréDsFinInitFen.aaa)
Trace(Final_Pour_Essai_DéclaréDsDéclGlobFen.aaa) Trace(Final_Pour_Essai_DéclaréDsFinInitFen.aaa) Trace(Final_Pour_Essai2_DéclaréDsFinInitFen.aaa)
|
| |
| |
| | | |
|
| | | | |
| | |
| | |
| |
|
|
|