Y a un truc!

Sujets variés concernant le développement en PureBasic
Avatar de l’utilisateur
Chris
Messages : 3731
Inscription : sam. 24/janv./2004 14:54
Contact :

Y a un truc!

Message 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 !
nico
Messages : 3702
Inscription : ven. 13/févr./2004 0:57

Message 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.

:)
filperj
Messages : 395
Inscription : jeu. 22/janv./2004 1:13

Message 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:
Le chaos l'emporte toujours sur l'ordre
parcequ'il est mieux organisé.
(Ly Tin Wheedle)
Avatar de l’utilisateur
Chris
Messages : 3731
Inscription : sam. 24/janv./2004 14:54
Contact :

Message 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()
nico
Messages : 3702
Inscription : ven. 13/févr./2004 0:57

Message par nico »

Tu pensais que le premier pointeur contenait quoi ?

:)
Avatar de l’utilisateur
Chris
Messages : 3731
Inscription : sam. 24/janv./2004 14:54
Contact :

Message 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.
nico
Messages : 3702
Inscription : ven. 13/févr./2004 0:57

Message 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)))
:)
Avatar de l’utilisateur
Chris
Messages : 3731
Inscription : sam. 24/janv./2004 14:54
Contact :

Message 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)
nico
Messages : 3702
Inscription : ven. 13/févr./2004 0:57

Message par nico »

Oui mais en général on va utiliser une variable chaine:

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

:)
Avatar de l’utilisateur
Chris
Messages : 3731
Inscription : sam. 24/janv./2004 14:54
Contact :

Message par Chris »

Ben tu fais Len(Chaine) au lieu de Len("GlopGlop") :lol:
Je vois pas le problème.
nico
Messages : 3702
Inscription : ven. 13/févr./2004 0:57

Message par nico »

Non je voulais dire que ça devient plus simple:

Tableau.s(10)

Tableau(0)=chaine
Répondre