Suivez-nous sur X

|
|
|
0,
A,
B,
C,
D,
E,
F,
G,
H,
I,
J,
K,
L,
M,
N,
O,
P,
Q,
R,
S,
T,
U,
V,
W,
X,
Y,
Z,
ALL
|
|
0,
A,
B,
C,
D,
E,
F,
G,
H,
I,
J,
K,
L,
M,
N,
O,
P,
Q,
R,
S,
T,
U,
V,
W,
X,
Y,
Z
|
|
0,
A,
B,
C,
D,
E,
F,
G,
H,
I,
J,
K,
L,
M,
N,
O,
P,
Q,
R,
S,
T,
U,
V,
W,
X,
Y,
Z
|
|
A propos d'Obligement
|
|
David Brunet
|
|
|
|
Programmation : C - application de la programmation orientée objet aux gadgets
(Article écrit par Batchman et extrait d'A-News (Amiga News) - avril 1989)
|
|
Comme promis le mois dernier, voici un petit exemple de programmation
orientée objet. Ceux qui connaissent déjà ne seront pas très impressionnés mais ce n'est qu'un tout petit exemple de ce
que l'on peut faire.
Le sujet de l'article étant les gadgets, voyons en quoi elle nous facilite la vie. Lorsqu'un gadget est activé par
l'utilisateur, un message est envoyé à la fenêtre qui le contient. Le problème est de savoir de la façon la plus simple possible
quel gadget est activé.
Dans le dernier exemple (du mois de décembre), on récupérait le numéro
du gadget émetteur et, par un "switch/case", on déterminait l'action à exécuter.
La ruse de sioux consiste à placer dans le champ "UserData" de la structure "Gadget" l'adresse de la fonction à exécuter.
De cette manière, on n'aura plus besoin de savoir quel est le gadget activé pour appeler la fonction correspondante ;
on appellera directement la fonction dont l'adresse est située dans le champ "UserData". Si vous n'êtes pas convaincu,
comparez le programme d'exemple avec celui du moi de décembre. C'est tout de même plus simple !
Votre compilateur (j'ai utilisé le Lattice 4.0) risque cependant de protester par un "warning". Méprisez donc cet esprit de
contradiction : le programme est correct (au passage, si un lecteur éclairé trouve la conversion de type nécessaire pour
éliminer ce warning, il gagnera... toute mon admiration). Maintenant, tapez le listing et essayez-le.
Mise à jour (août 1989)
Il y a donc deux lignes sur lesquelles bute le compilateur, qui rend un "warning" (alerte). Attention, ça devient compliqué :
il s'agit de récupérer, à partir d'un pointeur sur un message, l'adresse d'un gadget contenant un pointeur sur une fonction
retournant un entier. Ces lignes sont :
f=((struct Gadget *) Message->IAdress)->UserData;
fin=(*f)();
|
Avec l'aide de plusieurs lecteurs d'A-News, que je remercie au passage, voici ce qu'il fallait écrire :
fin=(*((int(*)())((struct Gadget *) Message->IAdress)->UserData))();
|
Il n'y a plus besoin du pointeur f qui servait d'intermédiaire. "fin" reçoit directement l'entier retourné par la fonction
dont l'adresse est dans le gadget activé et dont adresse (du gadget) se trouve dans le message... Je ne vois vraiment
pas où est la difficulté... Que les nouveaux venus au C ne se découragent pas, cet exemple de conversion explicite de
type est un cas extrême (mais on peut faire pire, il n'y a pas de limites).
|