Envoyer une chaine en référence

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
nico
Messages : 3702
Inscription : ven. 13/févr./2004 0:57

Re: Envoyer une chaine en référence

Message par nico »

je ne comprends pas pourquoi chez toi sans le Pokes() ça fonctionne , alors que j'ai un plantage en sortie de procedure sur le Endprocedure ..... :roll:
Désolé, t'as raison ça plante, mais il est possible que cela puisse fonctionner pendant quelques essais, je viens de réessayer et un coup ça marche, un autre coup ça marche pas, d'ailleurs ça plante aussi avec le PokeS quand on fait une série de tests.
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Re: Envoyer une chaine en référence

Message par Backup »

ça ne devrai plus planter ....
puisque je prepare la variable qui reçois en lui ajoutant des espaces (space(1024))

heu ... tu lis les messages avant de repondre ?? :lol:


le principe
tu as une variable A , et une autre B

pour que B puisse s'ecrire dans A
il faut deja formater A (c'est ce que je fais avec le Space(1024 ) )

ensuite toute les opération de memoire dans la procedure, ne plantent plus :)
(a condition de ne pas depasser 1024 caracteres ... pour cet exemple )

rappel du nouveau code :

Code : Tout sélectionner



Declare.a incLettre (lettre)

calldebugger
toto$ = "A" +space(1024) ; ajout de place pour pouvoir remplir uterieurement....
debug "avant l'appel de la procedure toto ="+toto$
incLettre (@toto$)
; comme le debugger est limité en longueur de chaine , je vais utiliser message requester
;debug "Apres l'appel de la procedure toto="+toto$
MessageRequester("toto", toto$)

Procedure.a incLettre (lettre)
   
   ; Invalid memory access
   Debug  "adresse de Toto ="+str(lettre)
   Debug "contenue de Toto= "+peeks(lettre)
   ; on va changer le contenu de toto
   t$="rien ne sert de courir , il faut partir a point , je pourrai ainsi ajouter la longueur que je veux, parcequ'il n'y a pas de raison, que ça bloque , j'ai prevu de la place pour 1024 caracteres de plus ... "
   
   MoveMemory(@t$, lettre, len(t$)) ; marche car on a prevu de la place au depart !!
; du coup on peut aussi utiliser CopyMemory()
; CopyMemory(@t$, lettre, len(t$)) ;marche car j'ai prevu de la place des le debut !!
   
EndProcedure


; Epb

nico
Messages : 3702
Inscription : ven. 13/févr./2004 0:57

Re: Envoyer une chaine en référence

Message par nico »

Oui je lis les réponses mais il me semblait important d'apporter l'explication de mes résultats.

L'exemple de ton code ne répond pas a une problématique réelle, dans ce cas, je passerais par une variable global String parce qu'à un moment faut arrêter de se faire des nœuds au cerveau. :lol:
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Re: Envoyer une chaine en référence

Message par Backup »

c'est quand meme utile ...
pour savoir comment marche les Movememory et compagnie ...


maintenant, c'est clair , qu'a partir du moment ou on ne peut pas reserver un espace memoire a la volée ..

ça limite .....

effectivement , mieux vaut passer par une variable Global ou meme une structure :)
Répondre