Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
lule
Messages : 11 Inscription : lun. 10/mai/2010 17:34
Message
par lule » lun. 10/mai/2010 17:47
bonjour,
je suis nouveau, et évidemment j'ai des problèmes avec les pointeurs.
Mon problème: je voudrais créer une class pour la concaténation d'une chaine qui pourrait être très longue, or en sortie je récupère une value qui n'est pas un texte.
voici le code :
Code : Tout sélectionner
EnableExplicit
;STRINGBUILDER -> SB
;UNICODE
Interface classSB
ObjectDestroy .l ()
LengthGet .l ()
Get .l ()
Append .l (psString.s)
EndInterface
Structure tagSB
lvTable.l
*String.l
lLen.l
lMode.l
EndStructure
;-- Constructor Functions
Procedure SB_ObjectCreate(plMode.l = #PB_Unicode)
Protected *This.tagSB = AllocateMemory(SizeOf(tagSB))
*This\lvTable = ?Functions
*This\lLen = SizeOf(LONG)
*This\String = AllocateMemory(*This\lLen)
*This\lMode = plMode
ProcedureReturn *This
EndProcedure
Procedure SB_ObjectDestroy(*This.tagSB)
FreeMemory(*This)
EndProcedure
;-- Manager Functions
;-- Class Functions
Procedure.l SB_LengthGet(*This.tagSB) ; Retourne la longueur
ProcedureReturn (*This\lLen)
EndProcedure
Procedure.s SB_Get(*This.tagSB) ; Retourne la chaîne
Protected sReturn.s
sReturn = PeekS(*This\String + 4,#PB_Unicode)
ProcedureReturn sReturn
EndProcedure
Procedure SB_Append(*This.tagSB, psString.s) ; Ajoute chaine au pointeur
Protected lNewLen = Len(psString) * SizeOf(CHARACTER)
Protected *NewStr = ReAllocateMemory(*This\String, *This\lLen + lNewLen)
If *NewStr
PokeS(*NewStr + *This\lLen , psString)
*This\lLen = MemorySize(*This\String)
Debug PeekS(*This\String + 4)
ProcedureReturn #True
EndIf
ProcedureReturn #False
EndProcedure
DataSection
Functions:
Data.l @SB_ObjectDestroy()
Data.l @SB_LengthGet()
Data.l @SB_Get()
Data.l @SB_Append()
EndDataSection
; -- Code
Global.classSB SB = SB_ObjectCreate()
SB\Append("Ma zone mémoire")
SB\Append(" est maintenant plus grande")
Debug SB\Get()
SB\ObjectDestroy()
toute aide serait la bienvenue, je tourne en rond.
Merci.
comtois
Messages : 5186 Inscription : mer. 21/janv./2004 17:48
Contact :
Message
par comtois » lun. 10/mai/2010 18:12
ça fonctionne bien chez moi (avec un x64) , j'ai juste remplacé tes .l par des .i (c'est le format par défaut, il s'adapte au processeur 32 ou 64 bits)
Code : Tout sélectionner
EnableExplicit
;STRINGBUILDER -> SB
;UNICODE
Interface classSB
ObjectDestroy.i()
LengthGet.i()
Get.i()
Append.i(psString.s)
EndInterface
Structure tagSB
lvTable.i
*String.i
lLen.i
lMode.i
EndStructure
;-- Constructor Functions
Procedure SB_ObjectCreate(plMode.l = #PB_Unicode)
Protected *This.tagSB = AllocateMemory(SizeOf(tagSB))
*This\lvTable = ?Functions
*This\lLen = SizeOf(LONG)
*This\String = AllocateMemory(*This\lLen)
*This\lMode = plMode
ProcedureReturn *This
EndProcedure
Procedure SB_ObjectDestroy(*This.tagSB)
FreeMemory(*This)
EndProcedure
;-- Manager Functions
;-- Class Functions
Procedure SB_LengthGet(*This.tagSB) ; Retourne la longueur
ProcedureReturn (*This\lLen)
EndProcedure
Procedure.s SB_Get(*This.tagSB) ; Retourne la chaîne
Protected sReturn.s
sReturn = PeekS(*This\String + 4,#PB_Unicode)
ProcedureReturn sReturn
EndProcedure
Procedure SB_Append(*This.tagSB, psString.s) ; Ajoute chaine au pointeur
Protected lNewLen = Len(psString) * SizeOf(CHARACTER)
Protected *NewStr = ReAllocateMemory(*This\String, *This\lLen + lNewLen)
If *NewStr
PokeS(*NewStr + *This\lLen , psString)
*This\lLen = MemorySize(*This\String)
Debug PeekS(*This\String + 4)
ProcedureReturn #True
EndIf
ProcedureReturn #False
EndProcedure
DataSection
Functions:
Data.i @SB_ObjectDestroy()
Data.i @SB_LengthGet()
Data.i @SB_Get()
Data.i @SB_Append()
EndDataSection
; -- Code
Global.classSB SB = SB_ObjectCreate()
SB\Append("Ma zone mémoire")
SB\Append(" est maintenant plus grande")
Debug SB\Get()
SB\ObjectDestroy()
Backup
Messages : 14526 Inscription : lun. 26/avr./2004 0:40
Message
par Backup » lun. 10/mai/2010 18:14
salut
prends l'habitude de poster tes codes entre les balises [ code] et [/code ]
pourquoi ne fait tu pas simplement ça :
Code : Tout sélectionner
Procedure.s append(a.s,b.s)
ProcedureReturn a.s+b.s
EndProcedure
aaa$="toto"
bbb$="titi"
Debug append(aaa$,bbb$)
c'est plus court non ?
nico
Messages : 3702 Inscription : ven. 13/févr./2004 0:57
Message
par nico » lun. 10/mai/2010 21:37
En effet, on ne peut pas passer de Chaine, c'est bizarre
En tout cas, j'en ai profiter pour modifier plusieurs parties de ton code qui était bizarre.
Code : Tout sélectionner
EnableExplicit
;STRINGBUILDER -> SB
;UNICODE
Interface classSB
ObjectDestroy .l ()
LengthGet .l ()
Get .l ()
Append .l (psString.s)
EndInterface
Structure tagSB
lvTable.l
*String.i
lLen.l
lMode.l
EndStructure
;-- Constructor Functions
Procedure SB_ObjectCreate(plMode.l = #PB_Unicode)
Protected *This.tagSB = AllocateMemory(SizeOf(tagSB))
*This\lvTable = ?Functions
*This\lLen = 0 ; Modifier
*This\String = 0 ; Modifier
*This\lMode = plMode
ProcedureReturn *This
EndProcedure
Procedure SB_ObjectDestroy(*This.tagSB)
FreeMemory(*This\String) ; Rajouter
FreeMemory(*This)
EndProcedure
;-- Manager Functions
;-- Class Functions
Procedure.l SB_LengthGet(*This.tagSB) ; Retourne la longueur
ProcedureReturn (*This\lLen)
EndProcedure
Procedure.i SB_Get(*This.tagSB)
ProcedureReturn *This\String ; Modifier
EndProcedure
Procedure SB_Append(*This.tagSB, psString.s) ; Ajoute chaine au pointeur
Protected lNewLen.l
Protected *NewStr.i
; ---- Partie Modifier -----------------
lNewLen=StringByteLength(psString , *This\lMode)
If *This\String=0
*NewStr=AllocateMemory(lNewLen + 2)
*This\String=*NewStr
Else
*NewStr=ReAllocateMemory(*This\String, *This\lLen + lNewLen + 2)
*This\String=*NewStr
EndIf
; --------------------------------------
If *NewStr
PokeS(*NewStr + *This\lLen , psString, -1, *This\lMode)
*This\lLen = MemorySize(*This\String) -2
ProcedureReturn #True
EndIf
ProcedureReturn #False
EndProcedure
DataSection
Functions:
Data.l @SB_ObjectDestroy()
Data.l @SB_LengthGet()
Data.l @SB_Get()
Data.l @SB_Append()
EndDataSection
; -- Code
Global.classSB SB = SB_ObjectCreate()
SB\Append("Ma zone mémoire")
SB\Append(" est maintenant plus grande")
Debug PeekS(SB\Get(),-1,#PB_Unicode)
SB\ObjectDestroy()
lule
Messages : 11 Inscription : lun. 10/mai/2010 17:34
Message
par lule » mar. 11/mai/2010 4:09
Excellent, ça fonctionne.
comtois -> j'utiliserais par défaut les integer
Merci
lule
Messages : 11 Inscription : lun. 10/mai/2010 17:34
Message
par lule » mar. 11/mai/2010 4:54
pour le retour de la chaine, c'était un pb de déclaration.
Code : Tout sélectionner
Interface classSB
ObjectDestroy .l ()
LengthGet .l ()
Get .[color=#FF0000]s[/color] ()
Append .l (psString.s)
EndInterface
Backup
Messages : 14526 Inscription : lun. 26/avr./2004 0:40
Message
par Backup » mar. 11/mai/2010 8:36
Merci d'avoir répondu a ma question