pointeur - help

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

pointeur - help

Message par lule »

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 :

Re: pointeur - help

Message par comtois »

ç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()
http://purebasic.developpez.com/
Je ne réponds à aucune question technique en PV, utilisez le forum, il est fait pour ça, et la réponse peut profiter à tous.
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Re: pointeur - help

Message par Backup »

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

Re: pointeur - help

Message par nico »

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

Re: pointeur - help

Message par lule »

Excellent, ça fonctionne.

comtois -> j'utiliserais par défaut les integer

Merci
lule
Messages : 11
Inscription : lun. 10/mai/2010 17:34

Re: pointeur - help

Message par lule »

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

Re: pointeur - help

Message par Backup »

Merci d'avoir répondu a ma question :?
Répondre