Page 1 sur 1

Passage de pointeurs par procédure ? How ?

Publié : jeu. 22/janv./2009 20:50
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

Publié : jeu. 22/janv./2009 21:19
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 !

Publié : ven. 23/janv./2009 8:17
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()

Publié : ven. 23/janv./2009 9:13
par djes
C'est quoi ces vilaines boucles qui vont trop loin?
Tu vieillis! ;)

Publié : ven. 23/janv./2009 11:56
par flaith
djes a écrit :C'est quoi ces vilaines boucles qui vont trop loin?
Tu vieillis! ;)
Merci Djes,

je fatigue aussi :D

Publié : ven. 23/janv./2009 19:44
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:

Publié : ven. 23/janv./2009 22:32
par flaith
8O C'était donc pas pour moi le message :?