Comment traduire CONST POINT *lpPoints en Asm

Signaler
Messages postés
64
Date d'inscription
jeudi 19 décembre 2002
Statut
Membre
Dernière intervention
15 décembre 2006
-
Messages postés
64
Date d'inscription
jeudi 19 décembre 2002
Statut
Membre
Dernière intervention
15 décembre 2006
-
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

Messages postés
540
Date d'inscription
dimanche 23 mars 2003
Statut
Membre
Dernière intervention
5 octobre 2007
1
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 :)
Messages postés
64
Date d'inscription
jeudi 19 décembre 2002
Statut
Membre
Dernière intervention
15 décembre 2006

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.
Messages postés
540
Date d'inscription
dimanche 23 mars 2003
Statut
Membre
Dernière intervention
5 octobre 2007
1
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 :)
Messages postés
64
Date d'inscription
jeudi 19 décembre 2002
Statut
Membre
Dernière intervention
15 décembre 2006

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.