Rebonsoir!
Merci à vous tous. Chacun y a mis sa pierre:
@Cpl, grâce à toi, j'ai compris comment fonctionne SizeOf(). T'as juste mis ID et ça m'a éclairci:
@Guimauve, ben y a du travail sur les macros, mais, c'est plus fort que moi: ça ne me suffisait pas. Excuse-moi, je suis un flemard de première. Je préfère me prendre la tête au départ, pour glander par la suite.
@Chris, tu m'as mis la puce à l'oreille avec les +4, +8, +12, etc...
Code : Tout sélectionner
PokeS(Perso(1), PeekS(Perso(0)))
PokeS(Perso(1)+4, PeekS(Perso(0)+4))
PokeS(Perso(1)+8, PeekS(Perso(0)+8))
@Lna, j'espère que tu ne m'en voudras pas, j'ai pris ta procédure, je l'ai cuisiné avec une sauce Asméarnaise. J'ai été sans pitié! Sans elle, impossible de faire sa petite soeur ci-dessous.
Esprit d'équipe tout ça
Je vous poste ce code (code test de Guimauve) avec la fonction ssCopy()
Syntaxe :
ssCopy(
NomChaineDestination[(
IndexDestination)],
NomChaineSource[(
IndexSource)], SizeOf(
Structure) )
/!\ Ne copie que les structures contenant des chaînes de type .S.
Pour les autres types, si vous pouviez m'expliquer comment vous avez procédé, ça pourra faire une procédure plus efficace.
N'hésitez pas à me poster le rapport du moindre bug.
Code : Tout sélectionner
Procedure ssCopy(*a,*b, Size.L)
Goto OnPasseLInutile
UnTrucCommeCa.S = UneChoseCommeCa.S
OnPasseLInutile:
Global PrivateValueA0.L
For PrivateValueA0 = 0 To Size Step 4
! MOV ecx, dword [v_PrivateValueA0]
! MOV ebp,dword [esp+16]
! MOV edx,dword [ebp+ecx]
! PUSH dword [_PB_StringBasePosition]
! CALL _SYS_CopyString@0
! MOV ecx, dword [v_PrivateValueA0]
! MOV ebp,dword [esp+16]
! LEA ecx,[ebp+ecx]
! POP edx
! CALL SYS_AllocateString
Next
EndProcedure
Structure ID
Nom.S
Prenom.S
Adresse.S
EndStructure
Dim Perso.ID(99)
Perso(0)\Nom = "Durand"
Perso(0)\Prenom = "Jack"
Perso(0)\Adresse = "3 Rue des stockosses 25000 Fleury"
;La ligne qui couine dans la boucle For ci-dessous...
;Perso(I) = Perso(0)
For I = 1 To 5
ssCopy(Perso(I), Perso(0), SizeOf(ID) ) ; ...remplacée par ssCopy()
Next
;...Et qui équivaudrait à ça:
; Perso(I)\Nom = Perso(0)\Nom
; Perso(I)\Prenom = Perso(0)\Prenom
; Perso(I)\Adresse = Perso(0)\Adresse
; On remplace la source pour vérifier que ce ne sont pas seulement les pointeurs qui ont été copiés...
Perso(0)\Nom = "Dupont"
Perso(0)\Prenom = "Patrick"
Perso(0)\Adresse = "2020 rue du fin fin"
For Index = 0 To 5
; ...Et on affiche le résultat
Debug Perso(Index)\Nom
Debug Perso(Index)\Prenom
Debug Perso(Index)\Adresse
Debug ""
Next