[résolu] Chr(0) inconnu au bataillon ?

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Avatar de l’utilisateur
DarkVader
Messages : 95
Inscription : mer. 11/juil./2007 10:56

[résolu] Chr(0) inconnu au bataillon ?

Message par DarkVader »

Bonjour,
Voilà quelques temps que je rame pour finalement découvrir que le chr(0) est royalement ignoré d'un string dumoins avec len et stringbytelength !!!

exemple

Code : Tout sélectionner

Debug Len("123456789" + Chr(0) + "1234567890")
qui retourne 19 - plutôt gênant.
Quelle solution utilisez-vous habituellement pour contourner ce bug ?

N'ayant pas fait le tour de toutes les fonctions de chaines,
j'imagine que le comportement est identique avec toute (CountString, FindString etc.) ?

Edit:
CountString, FindString : après vérification même combat


PS: Version 4.10 utilisée
Dernière modification par DarkVader le dim. 23/mars/2008 12:36, modifié 1 fois.
gnozal
Messages : 832
Inscription : mar. 07/déc./2004 17:35
Localisation : France
Contact :

Message par gnozal »

Debug affiche 19 ?!
Chez moi c'est 9, ce qui me parait correct.

Code : Tout sélectionner

Debug Len("123456789" + Chr(0) + "1234567890")
; PB4.10
; --> 9 en mode ANSI
; --> 9 en mode Unicode
Avatar de l’utilisateur
DarkVader
Messages : 95
Inscription : mer. 11/juil./2007 10:56

Message par DarkVader »

Code : Tout sélectionner

sMsg.s="123456789"+chr(0)
sMsg=sMsg+"1234567890"
Debug Len(sMsg)
Résultat 19 - Sous VB le résultat eut été 20.

Il n'en demeure pas moins qu'un string ne peut comporter de chr(0).


J'ai bien trouvé une solution en Asm mais qui malheureusement ne solutionne pas mon problème puisqu'elle filtre également les chr(0)
Avatar de l’utilisateur
djes
Messages : 4252
Inscription : ven. 11/févr./2005 17:34
Localisation : Arras, France

Message par djes »

Oui, ce caractère sert à définir la fin d'une chaîne justement. Il ne devrait donc pas être utilisé. De quoi as-tu besoin au juste, juste d'une fonction pour savoir la taille d'une chaîne?
Anonyme

Message par Anonyme »

C'est logique , chr(0) sert à délimité les strings. je crois que c'est écrit quelque part dans la doc.

Code : Tout sélectionner

Debug Len(Chr(0)+"123456789" + Chr(0) + "1234567890")
; PB4.10
; --> 0 en mode ANSI
; --> 0 en mode Unicode
Avatar de l’utilisateur
DarkVader
Messages : 95
Inscription : mer. 11/juil./2007 10:56

Message par DarkVader »

J'ai des chaines contenant des chr(0) à traiter et j'aimerais en connaître la taille.
J'imagine que c'est possible sinon mon exemple retournerait 9 et non 19.
Anonyme

Message par Anonyme »

T'es sous purebasic ? fait claqué du code.

Edit: C'est quel code ascii qui te sert à délimité les chaine ?
gnozal
Messages : 832
Inscription : mar. 07/déc./2004 17:35
Localisation : France
Contact :

Message par gnozal »

Purebasic utilise des chaînes de type ASCIIZ en mode ANSI, UTF-8 en mode unicode. Autrement dit le zéro est un signal de fin de chaîne.
VB, Powerbasic utilisent des chaînes de type BSTR (binary string), qui supportent des chr(0).
En Purebasic, il faut utiliser des zones mémoires [*Buffer = AllocateMemory(BufferSize)] pour manipuler des données binaires [<> texte].
Avatar de l’utilisateur
DarkVader
Messages : 95
Inscription : mer. 11/juil./2007 10:56

Message par DarkVader »

Je doute que cela aide, je reçois la chaine via un programme extérieur %)

Code : Tout sélectionner

Proceduredll maProc($sMsg)
   lMsg.l=len($sMsg) ;ne fonctionne pas si $sMsg contient des caractères nuls qui sont décontés
;.../..

   
endProcedure
Avatar de l’utilisateur
DarkVader
Messages : 95
Inscription : mer. 11/juil./2007 10:56

Message par DarkVader »

gnozal a écrit :Purebasic utilise des chaînes de type ASCIIZ en mode ANSI, UTF-8 en mode unicode. Autrement dit le zéro est un signal de fin de chaîne.
VB, Powerbasic utilisent des chaînes de type BSTR (binary string), qui supportent des chr(0).
En Purebasic, il faut utiliser des zones mémoires [*Buffer = AllocateMemory(BufferSize)] pour manipuler des données binaires [<> texte].
et comment je connais Buffersize ?
gnozal
Messages : 832
Inscription : mar. 07/déc./2004 17:35
Localisation : France
Contact :

Message par gnozal »

DarkVader a écrit :
gnozal a écrit :Purebasic utilise des chaînes de type ASCIIZ en mode ANSI, UTF-8 en mode unicode. Autrement dit le zéro est un signal de fin de chaîne.
VB, Powerbasic utilisent des chaînes de type BSTR (binary string), qui supportent des chr(0).
En Purebasic, il faut utiliser des zones mémoires [*Buffer = AllocateMemory(BufferSize)] pour manipuler des données binaires [<> texte].
et comment je connais Buffersize ?
C'est la taille des données stockées (en octets).
Avatar de l’utilisateur
DarkVader
Messages : 95
Inscription : mer. 11/juil./2007 10:56

Message par DarkVader »

gnozal a écrit : C'est la taille des données stockées (en octets).
Oui mais comment je définis la valeur de BufferSize suffisant
si je ne connais pas la taille de la chaine transmise ?
Avatar de l’utilisateur
djes
Messages : 4252
Inscription : ven. 11/févr./2005 17:34
Localisation : Arras, France

Message par djes »

Normalement tu devrais recevoir un pointeur...
gnozal
Messages : 832
Inscription : mar. 07/déc./2004 17:35
Localisation : France
Contact :

Message par gnozal »

DarkVader a écrit :
gnozal a écrit : C'est la taille des données stockées (en octets).
Oui mais comment je définis la valeur de BufferSize suffisant
si je ne connais pas la taille de la chaine transmise ?
Tu peux allouer une quantité au départ puis l'augmenter si nécessaire avec ReAllocateMemory().
nico
Messages : 3702
Inscription : ven. 13/févr./2004 0:57

Message par nico »

Avec un pointeur, tu remplaces tous les 0 par un caractère, genre "|" et après tu gères ta chaine avec les commandes de PureBasic.
Répondre