Page 1 sur 1

Y a un truc!

Publié : jeu. 25/nov./2004 21:09
par Chris
J'ai tiré ça de l'exemple sur la mémoire qu'on trouve dans l'aide.

Code : Tout sélectionner

*MemoryID = AllocateMemory(1000)
*Pointer = *MemoryID ; Les deux sont identiques

;CopyMemoryString("Hello ", @*Pointer) ; Ici, ça fonctionne
CopyMemoryString("Hello ", @*MemoryID) ; alors qu'ici, ça ne fonctionne pas
CopyMemoryString("World")


Debug PeekS(*MemoryID)
FreeMemory(*MemoryID)
Quand je sélectionne *Pointer, ça marche, alors que si je prends *MemoryID, ça ne fonctionne pas.

Quelqu'un pourrait m'expliquer !

Publié : jeu. 25/nov./2004 23:16
par nico
Oh là là, j'ai mis un petit moment avant de comprendre.

Bon tout est normal, en fait c'est plutôt bien fait, pour que le deuxième fonctionne il faut que tu fasses:

PeekS(*Pointer)

Pourquoi: parce que le pointeur que tu passes à la fonction CopyMemoryString s'incrémente de la longueur de la chaine et sert donc de référence à la deuxième utilisation de la fonction (et donc le pointeur devient optionnel)

Résultat: t'es obliger dans ton cas de faire une copie du pointeur pour garder l'adresse mémoire du début d'adresse mémoire allouée.

La différence des deux pointeurs te donne la longueur de la chaîne.

:)

Publié : jeu. 25/nov./2004 23:19
par filperj
CopyMemoryString() actualise aussi la valeur du pointeur, d'où l'écriture "@*" (on lui donne l'addresse du pointeur).

Code : Tout sélectionner

*MemoryID = AllocateMemory(1000)
*Pointer = *MemoryID ; Les deux sont identiques

CopyMemoryString("Hello ", @*Pointer)
CopyMemoryString("Hello ", @*Pointer)
CopyMemoryString("World")


Debug *MemoryID
Debug *Pointer
Debug PeekS(*MemoryID)
FreeMemory(*MemoryID)
Je sais pas si je suis très clair :roll:

*EDIT*
Ah, Nico a été plus rapide :lol:

Publié : jeu. 25/nov./2004 23:24
par Chris
Ah Ok, c'est ça que j'arrivais pas à comprendre.

En fait, le premier pointeur, (celui qui sert a faire le AllocateMemory), c'est uniquement l'adresse de début, et le second est modifie à chaque fois qu'on fait CopyMemoryString()

Publié : jeu. 25/nov./2004 23:31
par nico
Tu pensais que le premier pointeur contenait quoi ?

:)

Publié : jeu. 25/nov./2004 23:34
par Chris
Ben le premier, y avait pas de problème, je savais qu'il contenait l'adresse de début du bloc de mémoire.

C'est pour le deuxième que j'avais pas compris. J'avais pas remarqué qu'il changeait à chaque fois.

Publié : jeu. 25/nov./2004 23:42
par nico
Ben moi non plus, j'ai failli dire qu'y avait un gros bug.

En même temps, ça me rassure d'avoir compris, parce que je voyais pas pourquoi on passait l'adresse du pointeur!

Les pointeurs, c'est tout con, mais ça demande une petite gymnastique de l'esprit quand on s'amuse avec parfois.

Code : Tout sélectionner

valeur.l=123456

*Pointeur1=@valeur
*Pointeur2=@*Pointeur1
*Pointeur3=@*Pointeur2

Debug PeekL(PeekL(PeekL(*Pointeur3)))


Chaine.s="dodo"

*Pointeur1=@Chaine
*Pointeur2=@*Pointeur1
*Pointeur3=@*Pointeur2

Debug PeekS(PeekL(PeekL(*Pointeur3)))
:)

Publié : ven. 26/nov./2004 0:22
par Chris
Ca peut être utile, ce truc, pour stocker l'historique de ce qui a éte ajouté dans le bloc mémoire!

Code : Tout sélectionner

Dim P(1,3)

*MemoryID = AllocateMemory(1000) 
*Pointer = *MemoryID

P(0,0) = *Pointer
CopyMemoryString("Hello ", @*Pointer)
P(1,0) = Len("World ")

P(0,1) = *Pointer
CopyMemoryString("World ") 
P(1,1) = Len("World ")

P(0,2) = *Pointer
CopyMemoryString("GlopGlop ")
P(1,2) = Len("GlopGlop ")

P(0,3) = *Pointer
CopyMemoryString("blablabla")
P(1,3) = Len("blablabla")

Debug PeekS(P(0,0),P(1,0))
Debug PeekS(P(0,1),P(1,1))
Debug PeekS(P(0,2),P(1,2))
Debug PeekS(P(0,3),P(1,3))

Debug ""
Debug PeekS(*MemoryID)
FreeMemory(*MemoryID)

Publié : ven. 26/nov./2004 0:31
par nico
Oui mais en général on va utiliser une variable chaine:

Chaine.s="Hello "
CopyMemoryString(@Chaine,@*Pointer)

:)

Publié : ven. 26/nov./2004 0:34
par Chris
Ben tu fais Len(Chaine) au lieu de Len("GlopGlop") :lol:
Je vois pas le problème.

Publié : ven. 26/nov./2004 0:37
par nico
Non je voulais dire que ça devient plus simple:

Tableau.s(10)

Tableau(0)=chaine