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

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
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

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

Publié : ven. 23/janv./2009 22:32
par flaith

C'était donc pas pour moi le message
