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

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Avatar de l’utilisateur
falsam
Messages : 7321
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

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

Message 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.
Configuration : Windows 11 Famille 64-bit - PB 6.20 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Shadow
Messages : 1413
Inscription : mer. 04/nov./2015 17:39

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

Message par Shadow »

Exacte, j'ai eu des soucis avec ça.
Tu rajoute +1 et +2 surement en unicode oui.
Processeur: Intel Core I7-4790 - 4 Cœurs - 8 Thread: 3.60 Ghz.
Ram: 32 GB.
Disque: C: SDD 250 GB, D: 3 TB.
Vidéo: NVIDIA GeForce GTX 960: 2 GB DDR5.
Écran: Asus VX248 24 Pouces: 1920 x 1080.
Système: Windows 7 64 Bits.

PureBasic: 5.60 x64 Bits.
Ollivier
Messages : 4197
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

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

Message 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
Avatar de l’utilisateur
Zorro
Messages : 2186
Inscription : mar. 31/mai/2016 9:06

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

Message 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))
Avatar de l’utilisateur
djes
Messages : 4252
Inscription : ven. 11/févr./2005 17:34
Localisation : Arras, France

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

Message 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 !)
Avatar de l’utilisateur
Zorro
Messages : 2186
Inscription : mar. 31/mai/2016 9:06

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

Message 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 ....
Avatar de l’utilisateur
falsam
Messages : 7321
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

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

Message 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.
Configuration : Windows 11 Famille 64-bit - PB 6.20 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Avatar de l’utilisateur
djes
Messages : 4252
Inscription : ven. 11/févr./2005 17:34
Localisation : Arras, France

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

Message 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.
zaphod_b
Messages : 76
Inscription : mar. 09/déc./2014 20:02

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

Message 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
Dernière modification par zaphod_b le lun. 04/juil./2016 14:58, modifié 1 fois.
nico
Messages : 3702
Inscription : ven. 13/févr./2004 0:57

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

Message 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.
Shadow
Messages : 1413
Inscription : mer. 04/nov./2015 17:39

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

Message par Shadow »

Se serait bien de le mettre dans l'aide :)
Processeur: Intel Core I7-4790 - 4 Cœurs - 8 Thread: 3.60 Ghz.
Ram: 32 GB.
Disque: C: SDD 250 GB, D: 3 TB.
Vidéo: NVIDIA GeForce GTX 960: 2 GB DDR5.
Écran: Asus VX248 24 Pouces: 1920 x 1080.
Système: Windows 7 64 Bits.

PureBasic: 5.60 x64 Bits.
Répondre