Pointeur stocké dans une propriété d'un objet

Bonne année à tous,

Je rencontre un problème lorsque je stocke un pointeur vers une table dans une propriété d’un objet.
Je ne rencontre pas ce problème lorsque je stocke un pointeur vers une variable dans une propriété d’un objet.

Ci-dessous un exemple de code pour illustrer le problème :

——
C_OBJET($o)
C_TEXTE($a_Nom;$a_Nom2)
C_POINTEUR($p_table)

$o:=Créer objet

// ---------- Fonctionne avec une variable
$a_Nom:=“Machin”
$o.ptrnom:=->$a_Nom

$a_Nom2:=$o.ptrnom-> // La variable reçoit bien la valeur

// ---------- Une table et un champ
$o.matable:=->[Sujets]
$o.monchamp:=->[Sujets]Nom

// Ne fonctionne pas : Message d’erreur
TOUT SÉLECTIONNER($o.matable->)
CHERCHER($o.matable->;$o.monchamp->#"")

// Fonctionne, mais ne passe pas en compilation :
TOUT SÉLECTIONNER(($o.matable)->)
CHERCHER(($o.matable)->;($o.monchamp)->#"")

// Fonctionne, mais que c’est lourd !
$p_table:=$o.matable
TOUT SÉLECTIONNER($p_table->)
——

Je suis surpris de pouvoir utiliser $o.ptrnom-> et pas $o.matable->

Je m’y prends mal, ou c’est 4D ?

Sauf erreur de ma part, pas possible :

http://forums.4d.com/Post/FR/24114684/1/24124934#24124934
http://forums.4d.com/Post/FR/14528346/1/14531890#14531890

Patrick

Bonjour,
si ça ne marche que de la façon lourde, il faut sans doute t’y résoudre. Si tu utilises la syntaxe avec la propriété entre crochets + guillemets, elle donnerait :
TOUT SÉLECTIONNER(($o->[“matable”])->)
du coup, on voit que ça dépointe deux fois dans la même instruction : je ne crois pas avoir vu un cas où 4D l’accepte.

Personnellement, j’aurais opté pour référencer les numéros de tables et de champs dans mon objet, c’est plus simple et pérenne qu’un pointeur qui n’a de sens que le temps où ce sur quoi il pointe réside en mémoire. Tu peux stocker [table]champ dans un seul entier long avec un http://forums.4d.com/Post/FR/14528346/1/14553806#14531890combo>.

Merci à tous pour vos avis.
Je voulais m’assurer avoir bien compris que cela ne fonctionnait pas.
A mon sens, il n’est pas normal que cela ne fonctionne pas avec un pointeur vers une table, puisque cela fonctionne avec un pointeur vers une variable et que c’est écrit dans l’esprit “objet”.
J’assimile cela à un bogue et je contourne…

: Arnaud DE MONTARD

du coup, on voit que ça dépointe deux fois dans la même instruction :
je ne crois pas avoir vu un cas où 4D l’accepte.
Bien, encore une ânerie à mon actif : le paragraphe https://doc.4d.com/4Dv17R2/4D/17-R2.1720/Pointeurs.300-3857360.fr.htmlPointeurs vers des pointeurs> de la doc utilise le double dépointage :
<code 4D>
MaVar:=“Bonjour”
PointeurUn:=->MaVar
PointeurDeux:=->PointeurUn
(PointeurDeux->)->:=“Au revoir”
ALERTE((PointeurDeux->)->)
</code 4D>
Il faut juste aimer les parenthèses.
Par contre l’absence d’exemple avec une table ou un champ peut être une indication que c’est miné…

Merci d’être allé plus vite que moi, j’étais en train de tester ton truc…

Ce qui est surprenant également dans mon 1er exemple, c’est que cela fonctionne grâce aux parenthèses, mais que c’est refusé par le compilateur :

TOUT SÉLECTIONNER(($o.matable)->)
CHERCHER(($o.matable)->;($o.monchamp)->#"")

TOUT SÉLECTIONNER et CHERCHER sont de très vieilles commandes, qui en outre peuvent être appelées sans le paramètre table (si on l’a définie en “par défaut” avec TABLE PAR DEFAUT, ce qu’il ne faut jamais faire). Ça explique peut-être que le compilateur ne sache pas gérer cette syntaxe, relativement récente. Une déclaration de bug t’en dira peut-être plus.

Cela dit, j’en reviens à ce que je disais au début, utiliser des numéros me semble préférable à tout point de vue. Les 2 exemples ci-dessous le font et compilent sans souci :
<code 4D>
C_OBJET($o)
$o:=Créer objet
$o.numTable:=Table (->[Employee]) //numéro de la table
TOUT SELECTIONNER(Table($o.numTable)->)
</code 4D>
<code 4D>
C_OBJET($o)
$o:=Créer objet
$o.cbo:=DB_comboSet (->[Employee]firstName) //combo table+champ
CHERCHER(Table(Table(DB_comboGet ($o.cbo)))->;DB_comboGet ($o.cbo)->="@")
</code 4D>

(note : en relisant la ligne 5, je réalise que je viens d’accomplir un monument de parenthésage dont je suis incapable dans la vraie vie)

Arnaud, je suis d’accord avec toi concernant l’utilisation des numéros de table/champ plutôt que des pointeurs, mais seulement “en général”. Selon le contexte, l’emploi d’un pointeur est sans risque et l’écriture est plus concise.
Concernant le sujet en cours, oui, il me semble que c’est un bogue, mais je ne vois pas où le déclarer, le processus que j’utilisais jadis semble inopérant (www.bugs.4d.fr/index.htm). Obsolète ?
Comment faire ?

Le lien “Bogues” ouvre une page avec deux options, selon que
• tu es partenaire, c’est chez https://taow.4d.com/home.fr.htmltaow> (y’a tout c’qu’y faut)
• tu ne l’es pas, bouton “je ne suis pas partenaire” (mais je me soigne)