Passage de pointeurs par procédure ? How ?

Sujets variés concernant le développement en PureBasic
Avatar de l’utilisateur
flaith
Messages : 1487
Inscription : jeu. 07/avr./2005 1:06
Localisation : Rennes
Contact :

Passage de pointeurs par procédure ? How ?

Message par flaith »

voila mon dilemme, je cherche à passer par différentes procédures avec une seule zone mémoire, qui s'agrandit en plus dans l'une des procédures, voici le code :

Code : Tout sélectionner

Procedure.i received(*ptr.Character)
  ProcedureReturn MemorySize(PeekL(*ptr))
EndProcedure
 
Procedure Send(*ptr.Character, length.i)
  ReAllocateMemory(PeekL(*ptr),length)
  
  For i = 0 To length
    a.c = 32+Random(95)
    PokeC(PeekL(*ptr),a)
  Next i
EndProcedure

Procedure Main()
  *buffer = AllocateMemory(SizeOf(CHARACTER))
  Debug MemorySize(*buffer)
  send(@*buffer,20)
  Debug received(@*buffer)
EndProcedure

main()
Ma procédure Main() alloue la mémoire et appelle la 1ere procédure qui va prendre l'adresse de ma zone mémoire et l'agrandir avec la valeur envoyée, la 2ème procédure renvoi (devrait plutôt) renvoyer la nouvelle taille, sauf qu'elle bloque à 6
Je me casse la tête dessus, y-a t'il un moyen plus simple (sans les "global") ?

Merci par avance :D
Anonyme2
Messages : 3518
Inscription : jeu. 22/janv./2004 14:31
Localisation : Sourans

Message par Anonyme2 »

Code : Tout sélectionner

Procedure.i received(*ptr.Character)
     ProcedureReturn MemorySize(*ptr)
EndProcedure

Procedure Send(*ptr.Character, length.i)
     ReAllocateMemory(*ptr, length)
          
     For i = 0 To length
          a.c = 32 + Random(95)
          ; PokeC(*ptr, a)
          *ptr\c = a
     Next i
EndProcedure

Procedure Main()
     *buffer = AllocateMemory(SizeOf(CHARACTER))
     Debug MemorySize(*buffer)
     send(*buffer, 20)
     Debug received(*buffer)
EndProcedure

Main()
N'oublies pas le freememory() et testes que l'alllocation mémoire a réussie !
Avatar de l’utilisateur
flaith
Messages : 1487
Inscription : jeu. 07/avr./2005 1:06
Localisation : Rennes
Contact :

Message par flaith »

Merci Denis :D

maintenant autre soucis, lancez ce code

Code : Tout sélectionner

Procedure inc_mem(*ptr.Character)
  *ptr + SizeOf(Character)
EndProcedure

Procedure.i received(*ptr.Character)
  For i = 0 To MemorySize(*ptr) - 1
    a.c = *ptr\c
    Debug Str(i)+" - "+Hex(a)+" - "+Chr(a)
    inc_mem(*ptr)
  Next
  ProcedureReturn MemorySize(*ptr)
EndProcedure

Procedure Send(*ptr.Character, length.i)
  ReAllocateMemory(*ptr, length)
  
  For i = 0 To length - 1
    a.c = 32 + Random(95)
    *ptr\c = a
    Debug Str(*ptr\c)+" - "+Chr(*ptr\c)
    inc_mem(*ptr)
  Next i
EndProcedure

Procedure Main()
  *buffer = AllocateMemory(SizeOf(CHARACTER))
  Debug MemorySize(*buffer)
  send(*buffer, 20)
  Debug received(*buffer)
EndProcedure

Main()
Dernière modification par flaith le ven. 23/janv./2009 11:55, modifié 1 fois.
Avatar de l’utilisateur
djes
Messages : 4252
Inscription : ven. 11/févr./2005 17:34
Localisation : Arras, France

Message par djes »

C'est quoi ces vilaines boucles qui vont trop loin?
Tu vieillis! ;)
Avatar de l’utilisateur
flaith
Messages : 1487
Inscription : jeu. 07/avr./2005 1:06
Localisation : Rennes
Contact :

Message par flaith »

djes a écrit :C'est quoi ces vilaines boucles qui vont trop loin?
Tu vieillis! ;)
Merci Djes,

je fatigue aussi :D
Anonyme2
Messages : 3518
Inscription : jeu. 22/janv./2004 14:31
Localisation : Sourans

Message par Anonyme2 »

djes a écrit :C'est quoi ces vilaines boucles qui vont trop loin?
Tu vieillis! ;)
Oui, les boucles vont trop loin, reallocatememory n'est pas testé (il faut passer par un autre pointeur car en cas d'échec, on se retrouve avec un pointeur à 0 et on a perdu le pointeur initial et la longueur des données n'est plus bonne, etc etc.

Lorsque l'on bricole avec la mémoire, il faut avant chaque lecture ou écriture, tester que l'on ne va pas dépasser la zone allouée, c'est tout bête mais sur de long code ça évite des erreurs difficiles à retrouver car l'erreur ne se produit pas là ou on a fait l'erreur, on écrase des zones du système et hop ...

Un code type que j'utilise

Code : Tout sélectionner

*memory = allocate(xx)
if *memory
    *LastMemoryAdress = *memory +memorysize(*memory)-1
endif
Avant chaque lecture/écriture, je teste que le pointeur courant augmenté de la taille des données à lire ne dépasse pas *LastMemoryAdress

Ha, c'est bon de vieillir :mrgreen:
Avatar de l’utilisateur
flaith
Messages : 1487
Inscription : jeu. 07/avr./2005 1:06
Localisation : Rennes
Contact :

Message par flaith »

8O C'était donc pas pour moi le message :?
Répondre