| Problème avec DIM et ADR | |
|
+4659_minifly Jean Claude JL35 Nardo26 8 participants |
|
Auteur | Message |
---|
Nardo26
Nombre de messages : 2294 Age : 56 Localisation : Valence Date d'inscription : 02/07/2010
| Sujet: Problème avec DIM et ADR Jeu 5 Aoû 2010 - 16:30 | |
| Je suis tombé par hasard sur un bug vraiment surprenant : Suivant l'ordre dans laquel on déclare les variables, le résultat du programme ci-dessous n'est pas identique... - Code:
-
dim txt$,pAdr% ' dim pAdr%,txt$ txt$="AbCd"
pAdr%=adr(txt$)
print "pAdr% = "; pAdr% print "adr(txt$) = ";adr(txt$)
| |
|
| |
JL35
Nombre de messages : 7112 Localisation : 77 Date d'inscription : 29/11/2007
| Sujet: Re: Problème avec DIM et ADR Jeu 5 Aoû 2010 - 16:57 | |
| Les résultats de 2 dernières lignes sont censés être différents pour toi ? parce que chez moi c'est pareil, quel que soit l'ordre... | |
|
| |
Nardo26
Nombre de messages : 2294 Age : 56 Localisation : Valence Date d'inscription : 02/07/2010
| Sujet: Re: Problème avec DIM et ADR Jeu 5 Aoû 2010 - 17:06 | |
| Ben normalement je dois avoir le meme résultat
là, le programme tel quel, j'obtiens : pAdr% = 148146144 adr%(txt$)=148146144
jusque là tout est normal. maintenant si je met la 1ere ligne en commentaire : rem dim txt$,pAdr% et que j'active la 2eme : dim pAdr%,txt$ j'obtiens :
pAdr%=148146208 adr(txt$) = 148146216 <-- ce qui n'est pas la même chose tu en conviendra !!! bizarre... vous avez dis bizarre? comme c'est bizarre !
| |
|
| |
JL35
Nombre de messages : 7112 Localisation : 77 Date d'inscription : 29/11/2007
| Sujet: Re: Problème avec DIM et ADR Jeu 5 Aoû 2010 - 17:43 | |
| J'en conviens volontiers et j'avais bien compris comme ça, et c'est d'autant plus bizarre (mon cher cousin) que si moi j'inverse les deux lignes (enfin, le commentaire) le résultat est aussi bon, les deux valeurs sont identiques... | |
|
| |
Nardo26
Nombre de messages : 2294 Age : 56 Localisation : Valence Date d'inscription : 02/07/2010
| Sujet: Re: Problème avec DIM et ADR Jeu 5 Aoû 2010 - 18:35 | |
| Je viens d'essayer sur un autre PC, XP SP3 : Le problème n'apparait pas... que ce soit en version 19 ou la derniere 20i2.
De même que l'exemple qu'a donné D.J Peters au sujet du pointeur de chaine de caractère, fonctionne très bien sous SP3 mais pas sous SP2... Au départ, je pensai que cela venait de Kernel32.dll du coup je me suis crée une petite dll qui fait l'équivalent du memmove et cela plante également.... Bizarre...
| |
|
| |
Jean Claude
Nombre de messages : 5950 Age : 70 Localisation : 83 Var Date d'inscription : 07/05/2009
| Sujet: Re: Problème avec DIM et ADR Jeu 5 Aoû 2010 - 20:36 | |
| Si Panoramic (ou certaines fonctions, commandes,..) fonctionne différement suivant les systèmes d'exploitations, il y a de quoi être inquiet. A+ | |
|
| |
659_minifly
Nombre de messages : 590 Age : 76 Localisation : Valenciennes Nord Date d'inscription : 29/04/2010
| Sujet: Re: Problème avec DIM et ADR Jeu 5 Aoû 2010 - 20:52 | |
| j'ai le meme probleme j'ai windows 7 | |
|
| |
Jean Claude
Nombre de messages : 5950 Age : 70 Localisation : 83 Var Date d'inscription : 07/05/2009
| Sujet: Re: Problème avec DIM et ADR Jeu 5 Aoû 2010 - 20:57 | |
| Mais , il faudrait peut-être que je vous donne mes résultaits sur Windows XP SP2 et avec un paquet de mise à jour (vu que je les laisse en télécharment automatique). pour affiner le test je n'ai pas utilisé la ligne en commentaite, j'ai inversé l'ordre des variables. - Code:
-
dim pAdr%,txt$
txt$="AbCd"
pAdr%=adr(txt$)
print "pAdr% = "; pAdr% print "adr(txt$) = ";adr(txt$)
Et là, c'est la mauvaise surprise, il y a un changement de valeur des variables. Pour creuser j'ajoute un print str$(...), - Code:
-
dim txt$,pAdr%
txt$="AbCd"
pAdr%=adr(txt$)
print "pAdr% = ";pAdr% print "adr(txt$) = ";adr(txt$) print str$(pAdr%)
IDEM ???????????? A+ | |
|
| |
JL35
Nombre de messages : 7112 Localisation : 77 Date d'inscription : 29/11/2007
| Sujet: Re: Problème avec DIM et ADR Jeu 5 Aoû 2010 - 21:31 | |
| Eh bien, ça c'est ennuyeux, sous Vista (enfin, chez moi) aucun problème, en tournant dans tous les sens... | |
|
| |
Nardo26
Nombre de messages : 2294 Age : 56 Localisation : Valence Date d'inscription : 02/07/2010
| Sujet: Re: Problème avec DIM et ADR Ven 6 Aoû 2010 - 8:01 | |
| Bonjour, Pour compliquer un peu : J'ai rajouté une variable 'toto' volontairement je n'ai pas mis de % pour voir ce que cela faisait... Dans l'exemple ci-dessous, cela ne fonctionne pas chez moi. Mais si je déclare toto en 1ère variable (juste après le dim) tout rentre dans l'ordre et toutes les variables me renvoient la même valeur... - Code:
-
dim txt$,pAdr%,toto
txt$="AbCd"
pAdr%=adr(txt$) toto=pAdr%
print "pAdr% = ";pAdr% print "toto:";toto print "adr(txt$) = ";adr(txt$) print str$(pAdr%)
Et l'écart constaté est toujours le même : 8 octets -> la taille du 'string-descriptor'... | |
|
| |
Jean Claude
Nombre de messages : 5950 Age : 70 Localisation : 83 Var Date d'inscription : 07/05/2009
| Sujet: Re: Problème avec DIM et ADR Ven 6 Aoû 2010 - 12:10 | |
| Chez moi çà donne à chaque run 4 résultats indentiques (ce qui est normal). Par contre si je déplace une variable dans la ligne DIM le résultat change. Finalement, puisqu'il s'agit d'adresse, c'est peut-etre normal que l'adresse change si on change la variable txt$ de place. Je ne suis pas assez "ferru" sur ce sujet pour affirmer quoique ce soit.....
A+ | |
|
| |
Nardo26
Nombre de messages : 2294 Age : 56 Localisation : Valence Date d'inscription : 02/07/2010
| Sujet: Re: Problème avec DIM et ADR Ven 6 Aoû 2010 - 12:27 | |
| oui c'est normal que l'adresse change à chaque run...
| |
|
| |
Jean Claude
Nombre de messages : 5950 Age : 70 Localisation : 83 Var Date d'inscription : 07/05/2009
| Sujet: Re: Problème avec DIM et ADR Ven 6 Aoû 2010 - 13:45 | |
| Non l'adresse (le résultat) ne change pas à chaque run, çà change que si je change l'ordre des variables dans la ligne DIM...
En fait, c'est quoi le problème ? | |
|
| |
Nardo26
Nombre de messages : 2294 Age : 56 Localisation : Valence Date d'inscription : 02/07/2010
| Sujet: Re: Problème avec DIM et ADR Ven 6 Aoû 2010 - 14:06 | |
| Le problème est simple : sur mon PC lorsque j'exécute ce programme : - Code:
-
dim txt$,pAdr%
txt$="Coucou" pAdr%= adr(txt$)
print "pAdr = ";pAdr% print "adr(txt$) = ";adr(txt$)
Le contenu de la variable pAdr% n'est pas égale à adr(txt$) sauf si je change la 1ère ligne et que j'écris : dim pAdr%,txt$
Dernière édition par Nardo26 le Ven 6 Aoû 2010 - 14:27, édité 1 fois | |
|
| |
jjn4
Nombre de messages : 2747 Date d'inscription : 13/09/2009
| Sujet: +++ Ven 6 Aoû 2010 - 14:20 | |
| Cela ne me le fait pas : Si je fais : - Code:
-
dim txt$,pAdr% ' dim pAdr%,txt$
txt$="Coucou" pAdr%= adr(txt$)
print "pAdr = ";pAdr% print "adr(txt$) = ";adr(txt$) Cela donne : - Code:
-
pAdr = 14845920 adr(txt$) = 14845920 Et si je fais : - Code:
-
' dim txt$,pAdr% dim pAdr%,txt$
txt$="Coucou" pAdr%= adr(txt$)
print "pAdr = ";pAdr% print "adr(txt$) = ";adr(txt$) Cela donne : - Code:
-
pAdr = 14845992 adr(txt$) = 14845992 Les chiffres sont à chaque fois identiques, même s'ils diffèrent d'un cas à l'autre, ce qui est normal. PS: Eh, arrête de faire la fête ! | |
|
| |
Nardo26
Nombre de messages : 2294 Age : 56 Localisation : Valence Date d'inscription : 02/07/2010
| Sujet: Re: Problème avec DIM et ADR Ven 6 Aoû 2010 - 14:51 | |
| Je savais qu'elle plairait cette photo... Le PC n'a pas bru... heu...bu et pourtant il veut pas faire ce que je lui demande ! Si pour jean-claude, l'adresse ne change pas entre chaque run cela voudrai dire que Pano alloue de la mémoire pour les variables et ne les libère pas forcement à la fin... où alors vraiment coup de pot ! | |
|
| |
Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: Problème avec DIM et ADR Dim 8 Aoû 2010 - 19:44 | |
| NArdo26, tu as soulevé un lièvre de taille ! Effectivement, les valeurs changent en fonction de l'ordre de déclaration des variables.
Bon, que ce change, c'est normal, mais pour une version donnée du code, les deux lignes résultat affichées DOIVENT être identiques, sinon, il y a de quoi désespérer pour le passage de paramètres au DLL... | |
|
| |
Nardo26
Nombre de messages : 2294 Age : 56 Localisation : Valence Date d'inscription : 02/07/2010
| Sujet: Re: Problème avec DIM et ADR Lun 9 Aoû 2010 - 8:57 | |
| Bonjour Klaus !
Oui en effet, pour l'utilisation des DLLs cela risque d'être dur... Mais bizarrement je n'ai pas rencontré de pb sous XP SP3... Sous Vista le pb existe... et sous Win7 pas encore essayé...
| |
|
| |
Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: Problème avec DIM et ADR Lun 9 Aoû 2010 - 9:15 | |
| Si, si, j'ai XP SP3 et je rencontre le même problème. | |
|
| |
Nardo26
Nombre de messages : 2294 Age : 56 Localisation : Valence Date d'inscription : 02/07/2010
| Sujet: Re: Problème avec DIM et ADR Lun 9 Aoû 2010 - 9:40 | |
| ... et ce n'est pas lié non plus à la version de Panoramic... Ca va être mariole l'utilisation des DLLs. Tout ça grace à D.J Peters lorsque j'ai voulu essayer son petit programme très instructif...
| |
|
| |
Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: Problème avec DIM et ADR Lun 9 Aoû 2010 - 10:05 | |
| Et le plus étonnant, c'est que dans la pratique, je ne rencontre pas de problème de passage de paramètres avec adr - toutes les routines sont testées avec des programmes Panoramic ayant pas mal de variables, et tout marche bien ! Il doit vraiment s'agir d'un cas limite. | |
|
| |
Nardo26
Nombre de messages : 2294 Age : 56 Localisation : Valence Date d'inscription : 02/07/2010
| Sujet: Re: Problème avec DIM et ADR Lun 9 Aoû 2010 - 10:19 | |
| Pourtant elles n'ont rien d'exceptionelle mes 4 lignes de codes... Je pense que c'est lié à la 1ere variable déclarée dans le prog. Dim pAdr% Dim txt$ <- là c'est ok
dans l'exemple ci-dessus, cela à l'air de marcher mais à mon avis le résultat de Adr(pAdr%) ne doit pas être bon...
Le bug doit concerner la 1ere variable déclarée dans le prog. Ce qui fait que tu avais très peu de chance de tomber sur ce pb...
Tiens ca me donne une idée : faire le test sur la question de D.J Peters concernant le adr(tab%(0)) non ca marche pas non plus...
| |
|
| |
Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: Problème avec DIM et ADR Lun 9 Aoû 2010 - 10:42 | |
| De toutes façons, adr(tab%(0)) n'est pas utilisable en Panoramic. Les paramètres aux DLL's sont passées par valeur, et non par référence. Il en est de même pour la fonction adr() elle-même. L'expression tab%(0) est évaluée et donne un résultat dans un espace mémoire temporaire (pile par exemple), et c'est l'adresse de cet espace temporaire que retourne la fonction adr dans ce cas, et non l'adresse de la donnée qui se trouve à tab%(0).
C'est une des limitations de Panoramic - on ne fait que des passages de paramètres par valeur. On peut donc seulement passer les adresses de variables simples et des cellules de tableaux comme dans l'exemple ci-desssus si on ne fait que lire cette valeur dans la routine DLL, mais pas de tableaux entiers. Et si on veut écrire dans la variable, on ne peut passer que des variables simples non indexées: leur adresse est passée par valeur, mais on l'utilise comme pointeur pour écrire dedans.
| |
|
| |
d.j.peters
Nombre de messages : 77 Age : 60 Localisation : Germany Date d'inscription : 31/07/2010
| Sujet: Re: Problème avec DIM et ADR Lun 9 Aoû 2010 - 15:14 | |
| Hello Klaus you are not right with adr(txt$)
it returns a address on an other pointer and this second pointer points to the first char.
pAdr = adr(txt$)
is in C ** char pAdr
and basic as zstring ptr ptr pAdr
if you declare your dll as anything(char * &adr) than you can use it directly be course it's a pointer by reference the same as pointer on pointer by value.
in more detail adr(txt$) points inside an string descriptor
struc string int refrenc_counter int nChars * char pointer_chars this is the result of adr(txt$) end struc
peek(adr(txt$)-4) is the same as len(txt$)
and after b$=txt$ the refrence counter increased from 1 to 2
You know it ?
DJ
Dernière édition par d.j.peters le Mar 10 Aoû 2010 - 11:57, édité 1 fois | |
|
| |
Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: Problème avec DIM et ADR Lun 9 Aoû 2010 - 19:05 | |
| Yes, in fact, I found it by the trial and error method. I hace a DLL routine using 2 Panoramic strins on input, here is the code: - Code:
-
function CompareStr(const s1,s2: pchar): integer; stdcall; export; var pstr: PString; str1, str2: pchar; begin pstr := PString(s1); str1 := pchar(pstr^); pstr := PString(s2); str2 := pchar(pstr^);
result := AnsiCompareStr(str1,str2); end;
But Jack says otherwise; I had a lengthy discussion with him about that problem, and he insisted that adr(s$) directly points to the string data area. Obviously, there is a problem, and I found the above workarround. But your method is by far more elegant, and I will keep it. I know about the string structure width the length at offset -4 and the usage count at offset -8, but there is no valid way to temper with the string length. All you can do in Panoramic, is to allocate sufficient space by tloading some dummy string into the string variable, then pass its address to the function, then write into it checking either the string length or the zero byte. All other hints about DLL's are fully valid. | |
|
| |
Contenu sponsorisé
| Sujet: Re: Problème avec DIM et ADR | |
| |
|
| |
| Problème avec DIM et ADR | |
|