Page 1 sur 1

AllocateMemory() a un drole de comportement ou ....

Publié : lun. 04/juil./2016 0:42
par falsam
[pb 5.42 (x86)]

■ Ce code me donne le bon résultat.

Code : Tout sélectionner

string.s = "Hello !"
Debug StringByteLength(string)

*memory = AllocateMemory( StringByteLength(string))
CopyMemory(@string, *memory, StringByteLength(string))
Debug MemorySize(*memory)
Debug PeekS(*memory)
Debug
7
7
Hello !
■ Par contre celui là en ajoutant un caractere au string a un résultat étrange.

Code : Tout sélectionner

string.s = "Hello !!"
Debug StringByteLength(string)

*memory = AllocateMemory( StringByteLength(string))
CopyMemory(@string, *memory, StringByteLength(string))
Debug MemorySize(*memory)
Debug PeekS(*memory)
Debug
8
8
Hello !!¬;\Bµ¢
■ Que dit l'aide ?
Le nombre d'octets renvoyé n'inclu PAS le caractère 'nul' de fin de chaîne. La taille du caractère nul est de 1 octet en mode ASCII

Est ce que cela veut dire qu'il faut faire un AllocateMemory() en ajoutant 1 systématiquement (ou +2 en unicode)?

Code : Tout sélectionner

*memory = AllocateMemory( StringByteLength(string) + 1)
Si c'est le cas alors question pour Fred : pourquoi le compilateur ne le fais pas systématiquement ?

Merci.

Re: AllocateMemory() a un drole de comportement ou ....

Publié : lun. 04/juil./2016 0:55
par Shadow
Exacte, j'ai eu des soucis avec ça.
Tu rajoute +1 et +2 surement en unicode oui.

Re: AllocateMemory() a un drole de comportement ou ....

Publié : lun. 04/juil./2016 1:42
par Ollivier
Tu mets cette macro dans les trip n tick et ton souhait sera réalisé.

Code : Tout sélectionner

Macro StringByteSize(TheString)
StringByteLength(TheString + "A")
EndMacro

Re: AllocateMemory() a un drole de comportement ou ....

Publié : lun. 04/juil./2016 10:21
par Zorro
ou tu gruges comme ça : :)

Code : Tout sélectionner

string.s = "Hello !!"
Debug StringByteLength(string)

*memory = AllocateMemory( StringByteLength(string ))
CopyMemory(@string, *memory, StringByteLength(string  ))
Debug MemorySize(*memory)
Debug left(PeekS(*memory),MemorySize(*memory))

Re: AllocateMemory() a un drole de comportement ou ....

Publié : lun. 04/juil./2016 10:42
par djes
Comme l'a fait Ollivier, il vaut mieux à mon avis compter la taille d'un caractère unicode "standard" en plus, car un caractère unicode peut aussi bien faire 2 octets que 4, 8... et compter sur une taille fixe ne garantit pas la pérennité du code (qui sait si dans 20 ans, PB n'utilisera pas des caractères unicode de 256 octets !)

Re: AllocateMemory() a un drole de comportement ou ....

Publié : lun. 04/juil./2016 10:53
par Zorro
heu , ça marche aussi ça

Code : Tout sélectionner

Debug left(PeekS(*memory),MemorySize(*memory))
quelque soit la taille renvoyé par MemorySize(*memory) ;)

mais je pense que quoiqu'on en dise, c'est peut etre bien au compilo d'assurer dans ce cas ....

Re: AllocateMemory() a un drole de comportement ou ....

Publié : lun. 04/juil./2016 13:53
par falsam
Merci pour vos réponses.
Zorro a écrit :mais je pense que quoiqu'on en dise, c'est peut etre bien au compilo d'assurer dans ce cas ....
Exactement Zorro. Qu'importe que les données soit en caractères ASCII ou en caractères unicode de 256 octets Le compilateur devrait en tenir compte et allouer la mémoire correctement.

Re: AllocateMemory() a un drole de comportement ou ....

Publié : lun. 04/juil./2016 13:59
par djes
djes a écrit :heu , ça marche aussi ça
Code:
Debug left(PeekS(*memory),MemorySize(*memory))
Oui, ça marche aussi, mais c'était pour répondre précisément à la question...
Zorro a écrit :Zorro a écrit:
mais je pense que quoiqu'on en dise, c'est peut etre bien au compilo d'assurer dans ce cas ....
Exactement Zorro. Qu'importe que les données soit en caractères ASCII ou en caractères unicode de 256 octets Le compilateur devrait en tenir compte et allouer la mémoire correctement.
Ben la mémoire est allouée correctement, le 0 terminal est une spécificité de langage, et ne fait pas partie de la chaîne proprement dite. Ce zéro est d'ailleurs une hérésie, mais c'est une vieille histoire ;)
Après, je ne dis pas qu'il ne faudrait pas que StringByteLength() soit modifiée pour en tenir compte, quelque part ce serait plus logique, mais maintenant c'est un peu tard, car de nombreux codes existent déjà et seraient non fonctionnels. Un flag et une doc adaptée résoudraient le problème.

Re: AllocateMemory() a un drole de comportement ou ....

Publié : lun. 04/juil./2016 14:53
par zaphod_b
Hello,

C'est bizarre comme bug.
En testant ca (windows 10 pro - pb 5.42lts x86) :

Code : Tout sélectionner

string.s="hello !!!"
*mem=AllocateMemory(StringByteLength(string))
CopyMemory(@string,*mem,StringByteLength(string))
Debug MemorySize(*mem)
Debug PeekS(*mem)
Ca marche bien.

En fait ca plante tous les multiples de 8 :

Code : Tout sélectionner

string.s="a"
For i=1 To 255
string=string+"a"
*mem=AllocateMemory(StringByteLength(string))
CopyMemory(@string,*mem,StringByteLength(string))
Debug MemorySize(*mem)
Debug PeekS(*mem)
FreeMemory(*mem)
Next

Re: AllocateMemory() a un drole de comportement ou ....

Publié : lun. 04/juil./2016 14:55
par nico
Un flag, sûrement la meilleure solution.

Une astuce vu sur le forum officielle consiste à faire:
*memory = AllocateMemory( StringByteLength(string) + SizeOf(Character))

SizeOf(Character) vaudra 1 si compiler en ascii et 2 si compiler en unicode.

Re: AllocateMemory() a un drole de comportement ou ....

Publié : lun. 04/juil./2016 17:40
par Shadow
Se serait bien de le mettre dans l'aide :)