Comment traduire CONST POINT *lpPoints en Asm

frobinet Messages postés 64 Date d'inscription jeudi 19 décembre 2002 Statut Membre Dernière intervention 15 décembre 2006 - 26 mai 2003 à 17:36
frobinet Messages postés 64 Date d'inscription jeudi 19 décembre 2002 Statut Membre Dernière intervention 15 décembre 2006 - 28 mai 2003 à 11:05
Bonjour,

Je veux utiliser la fonction Polygon de GDI32.DLL
mais je ne sais pas comment redéfinir en assembleur
un type du style :

CONST POINT *lpPoints en provenant du C++

ma structure étant :

PAINT_POLYGON STRUCT
dwPosition DWORD ?
bTypeDessin DWORD ?
dwNombrePoints DWORD ?
lpPoints ??????????????????????????????????
flLargeur DWORD ?
dwCouleurTrait DWORD ?
dwCouleurFond DWORD ?
bTypeTrait DWORD ?
bTypeRemplissage DWORD ?
bSupprime DWORD ?
PAINT_POLYGON ENDS

pour le moment j'ai fais ceci qui fonctionne mais ne me permet pas de mettre le nombre de points que je veux :

PAINT_POLYGON STRUCT
dwPosition DWORD ?
bTypeDessin DWORD ?
lpPoint1 POINT <>
lpPoint2 POINT <>
lpPoint3 POINT <>
lpPoint4 POINT <>
flLargeur DWORD ?
dwCouleurTrait DWORD ?
dwCouleurFond DWORD ?
bTypeTrait DWORD ?
bTypeRemplissage DWORD ?
bSupprime DWORD ?
PAINT_POLYGON ENDS

Merci pour tous renseignements !

4 réponses

CoreBreaker Messages postés 540 Date d'inscription dimanche 23 mars 2003 Statut Membre Dernière intervention 5 octobre 2007 1
26 mai 2003 à 21:02
sous TASM c'est struc et pas struct
si en C++ c'est CONST POINT *lpPoints alors c'est:
PAINT_POLYGON STRUC
dwPosition DWORD ?
bTypeDessin DWORD ?
dwNombrePoints DWORD ?
lpPoints DWORD ?
flLargeur DWORD ?
dwCouleurTrait DWORD ?
dwCouleurFond DWORD ?
bTypeTrait DWORD ?
bTypeRemplissage DWORD ?
bSupprime DWORD ? 
PAINT_POLYGON ENDS

Et pour la structure POINT:
POINT struc
x DWORD ?
y DWORD ?
POINT ends

Ensuite pour utiliser le champ:
...
poly PAINT_POLYGON <>
index DWORD ?
valeurX DWORD ?
valeurY DWORD ?
...
mov ebx, dword ptr [index]
imul ebx, size POINT   ; Calcul de l'offset à partir de l'index
lea esi, [poly].lpPoints ; Calcul de la base du tableau de structures POINT
mov esi, [esi][ebx] ; Accéder à la structure POINT voulue

; Accès aux champs de la structure POINT pointée par ESI
mov eax, [esi].x 
mov [valeurX], eax
mov eax, [esi].y
mov [valeurY], eax


Core Breaker :)
0
frobinet Messages postés 64 Date d'inscription jeudi 19 décembre 2002 Statut Membre Dernière intervention 15 décembre 2006
27 mai 2003 à 10:29
Bonjour,

Je programme en MASM32 et c'est Struct au lieu de Struc pour
moi.

Mon problème n'est pas de faire référence à une seule
structure POINT mais à dwNombrePoints structures POINT.

En gros je voudrais faire :
lpPoints POINT 100 DUP(?)
mais cette expression ne fonctionne bien sûr pas.

Merci.
0
CoreBreaker Messages postés 540 Date d'inscription dimanche 23 mars 2003 Statut Membre Dernière intervention 5 octobre 2007 1
27 mai 2003 à 19:02
Ah je comprends mieux.
Je ne savais pas que que tu utilisais MASM (désolé)
Je t'ai fourni du code TASM et le dup(?) fonctionne sous TASM vois si tu peux utiliser TASM32 à la place.

sinon sous MASM essaie:
lpPoints  POINT 100 DUP(<>)


tu peux aussi faire et ça marche:
PAINT_POLYGON STRUCT
dwPosition DWORD ?
bTypeDessin DWORD ?
dwNombrePoints DWORD ?
lpPoints BYTE (n * SIZE POINT) DUP(?)
flLargeur DWORD ?
dwCouleurTrait DWORD ?
dwCouleurFond DWORD ?
bTypeTrait DWORD ?
bTypeRemplissage DWORD ?
bSupprime DWORD ? 
PAINT_POLYGON ENDS


Ou
PAINT_POLYGON STRUCT
dwPosition DWORD ?
bTypeDessin DWORD ?
dwNombrePoints DWORD ?
lpPoints BYTE (n * 8) DUP(?)
flLargeur DWORD ?
dwCouleurTrait DWORD ?
dwCouleurFond DWORD ?
bTypeTrait DWORD ?
bTypeRemplissage DWORD ?
bSupprime DWORD ? 
PAINT_POLYGON ENDS


Il faut bien comprendre que tu ne peux pas contruire une structure dans laquelle tu as exactement dwNombrePoints sutructures POINT pour laquelle la valeur dwNombrePoints est changeante car une structure a une taille statique et ne peut donc pas avoir une taille en fonction de la valeur dwNombrePoints qui est dynamique et donc déterminée à l'exécution de ton programme. Sinon il te faut faire une allocation dynamique d'un tableau de dwNombrePoints sutructures POINT et donc la structure que je t'ai donnée est parfaitement adaptée c'est à dire avec:
lpPoints DWORD ?

Ce champ contient donc un pointeur sur la base du tableau dynamique.

Core Breaker :)
0
frobinet Messages postés 64 Date d'inscription jeudi 19 décembre 2002 Statut Membre Dernière intervention 15 décembre 2006
28 mai 2003 à 11:05
Bonjour,

Merci ! je n'avais pas encore compris la subtilité
de DUP !

lpPoints  POINT 100 DUP(<>) 


Pour le MASM32, je l'ai pris parce que je débute en assembleur 32 et c'est celui-que j'ai trouvé le premier.
Il est facile d'installation et est fournis avec des exemples
de difficultés variables assez interessantes.

Encore Merci !

frobinet.
0
Rejoignez-nous