SUGGESTION aux concepteurs de PB sur la gestion des chaînes
Publié : mar. 07/sept./2010 10:10
SUGGESTION aux concepteurs de PB sur la gestion des chaînes de caractères entre un prg principal et une procédure
La valeur ou adresse de la chaîne est passée par procedurereturn comme exemple ci-dessous
1) Sur les chaînes non fixe type : s.s ou ch$
On peut remarquer qu’une chaîne non fixe créée ou copiée dans un sous programme, a la même adresse que celle passée au prg principal
Elle peut donc être modifiée dans le prg principal alors que nous ne maîtrisons pas sa création.
Ce qui veut dire que si nous modifions cette chaîne elle sera remise dans le premier état si on appel le sous prg
Par ailleurs on peut remarquer que la chaîne de longueur 10 n’a pas été tronquée ce qui est normal puisque l’adresse est la même
2) sur les chaînes fixes type sf.s{10}
Cette chaîne est bien recopiée et tronquée ce qui est conforme à la gestion des chaînes de caractères
Remarques ; alors que dans la chaîne non fixe on peut accéder au informations après null chr(0) ce qui n’est pas le cas dans une chaîne fixe. Hormis la remarque précédente le travail sur les deux chaînes sera identique
3) En conclusion
Les routines ASM qui affectent les deux chaînes sont différentes
Pour chaîne non fixe
Pour chaîne fixe :
Imaginons que la routine pour chaîne fixe passe tous les caractères sur la longueur donnée sans les tronquer ce qui est sans incidence sur la suite du traitement puisque cela existe déjà sur les chaînes non fixe
On pourrait passer des structures complexes entre prg principal et sous/prg par exemple
Pouvez_vous modifier la routine _SYS_AssignFixedString@8 de façon à ce qu'elle puisse passer tous les caractères sur la longueur donnée?
Cela donnerait une forte potentialité à PB et l'on pourrait passer des structures complexes entre prg et sous/prg
A+
La valeur ou adresse de la chaîne est passée par procedurereturn comme exemple ci-dessous
Code : Tout sélectionner
Macro __HT(__HQ)
"$"+RSet(Hex(PeekQ(@__HQ+2),#PB_Quad),16,"0")+RSet(Hex(PeekC(@__HQ+1),#PB_Byte),2,"0")+RSet(Hex(PeekC(@__HQ),#PB_Byte),2,"0")
EndMacro
Structure stt
StructureUnion
st.s{1}[10]
st10.s{10}
EndStructureUnion
EndStructure
Global s1.stt
s1\st10="1234506789"
s1\st[5]=Chr(0)
Debug " st10="+__ht(S1\st10)+" @st10="+Str(@S1\st10)
Procedure.s procs()
s.s=Space(10)
CopyMemory(@s1,@s,10)
Debug "s="+__ht(s)+" @s="+Str(@s)
ProcedureReturn s
EndProcedure
Procedure.s procsf()
sf.s{10}=Space(10)
CopyMemory(@s1,@sf,10)
Debug "sf="+__ht(sf)+" @sf="+Str(@sf)
ProcedureReturn sf
EndProcedure
Ss.s=procs()
Debug "ss="+__ht(ss)+" @ss="+Str(@ss)
sfp.s{10}=procsf()
Debug "sfp="+__ht(sfp)+" @sfp="+Str(@sfp)
On peut remarquer qu’une chaîne non fixe créée ou copiée dans un sous programme, a la même adresse que celle passée au prg principal
Elle peut donc être modifiée dans le prg principal alors que nous ne maîtrisons pas sa création.
Ce qui veut dire que si nous modifions cette chaîne elle sera remise dans le premier état si on appel le sous prg
Par ailleurs on peut remarquer que la chaîne de longueur 10 n’a pas été tronquée ce qui est normal puisque l’adresse est la même
2) sur les chaînes fixes type sf.s{10}
Cette chaîne est bien recopiée et tronquée ce qui est conforme à la gestion des chaînes de caractères
Remarques ; alors que dans la chaîne non fixe on peut accéder au informations après null chr(0) ce qui n’est pas le cas dans une chaîne fixe. Hormis la remarque précédente le travail sur les deux chaînes sera identique
3) En conclusion
Les routines ASM qui affectent les deux chaînes sont différentes
Pour chaîne non fixe
Code : Tout sélectionner
Ss.s=procs()
PUSH dword [_PB_StringBasePosition]
CALL _Procedure0
PUSH dword v_Ss
CALL _SYS_AllocateString4@8
Code : Tout sélectionner
sfp.s{10}=procsf()
PUSH dword [_PB_StringBasePosition]
CALL _Procedure2
LEA eax,[v_sfp]
PUSH dword 10
CALL _SYS_AssignFixedString@8
On pourrait passer des structures complexes entre prg principal et sous/prg par exemple
Code : Tout sélectionner
Structure lf
ww.w
qq.q
EndStructure
Structure xx
StructureUnion
Ch.s{10}
Zone_str_complex.lf
EndStructureUnion
EndStructure
Cela donnerait une forte potentialité à PB et l'on pourrait passer des structures complexes entre prg et sous/prg
A+