Obtenez vous les meme resultats ?

Sujets variés concernant le développement en PureBasic
PAPIPP
Messages : 534
Inscription : sam. 23/févr./2008 17:58

Obtenez vous les meme resultats ?

Message par PAPIPP »

Bonjour à tous

Obtenez-vous les mêmes résultats que moi ?

Code : Tout sélectionner

Macro _q_t_
"
EndMacro
Macro _n (__n)
_q_t_#__n#=_q_t_+Str(__n)+" "
EndMacro
Macro _s (__S)
_q_t_#__S#=_q_t_+__S+" "
EndMacro
Structure multi 
  StructureUnion
    VA.a[0]
    VB.b[0] 
    VC.c[0] 
    Vs1.s{1}[0]
    Vw.w[0]
    VL.l[0]
    VQ.q[0]
    VF.f[0]
    VD.d[0]
    VS8.s{8}[0]
    VS16.s{16}[0]
  EndStructureUnion
EndStructure
Structure multi2 
  StructureUnion
    VA.a[64]
    VB.b[64] 
    VC.c[64] 
    Vs1.s{1}[64]
    Vw.w[32]
    VL.l[16]
    VQ.q[8]
    VF.f[16]
    VD.d[8]
    VS8.s{8}[8]
    VS16.s{16}[4]
  EndStructureUnion
EndStructure
GR$="123"
CH$="12345"

; Define gr2.multi2
; Define ch2.multi2
; Debug _n(ch2)+_n(gr2)
; ch2\VS16[1]=ch$ 
; gr2\VS16[1]=gr$
; For i=0 To 2
;   Debug _s(gr2\VS16[i])+_s(gr$)+_n(@gr2\VS16[i])
;   Debug _s(ch2\VS16[i])+_s(ch$)+_n(@ch2\VS16[i])
; Next
Debug "***** avec structure [0] *****"

Define gr.multi
Define  ch.multi 
Debug _n(ch)+_n(gr)
ch\VS16[1]=gr$ 
gr\VS16[1]=ch$
For i=0 To 2
  Debug _s(gr\VS16[i])+_s(ch$)
  Debug _s(ch\VS16[i])+_s(GR$)
  Next
  End
  


***** avec structure [0] *****
ch=4407208 gr=4407208
gr\VS16= ch$=12345
ch\VS16= GR$=123
gr\VS16=12345 ch$=12345
ch\VS16=12345 GR$=123
gr\VS16= ch$=12345
ch\VS16= GR$=123


on peut remarquer que les 2 variables CH.multi et GR.multi ont la même adresse

Maintenant rendons actif la procédure avec CH2.multi2 et GR2.multi

Code : Tout sélectionner

 Define gr2.multi2 
	 Define ch2.multi2 
	 Debug _n(ch2)+_n(gr2) 
	 ch2\VS16[1]=ch$  
	 gr2\VS16[1]=gr$ 
	 For i=0 To 2 
	 Debug _s(gr2\VS16[i])+_s(gr$)+_n(@gr2\VS16[i]) 
	 Debug _s(ch2\VS16[i])+_s(ch$)+_n(@ch2\VS16[i]) 
	 Next 
nous obtenons
ch2=4407560 gr2=4407624
gr2\VS16= gr$=123 @gr2\VS16=4407624
ch2\VS16= ch$=12345 @ch2\VS16=4407560
gr2\VS16=123 gr$=123 @gr2\VS16=4407640
ch2\VS16=12345 ch$=12345 @ch2\VS16=4407576
gr2\VS16= gr$=123 @gr2\VS16=4407656
ch2\VS16[i]= ch$=12345 @ch2\VS16[i]=4407592
***** avec structure [0] *****
ch=4407560 gr=4407688
gr\VS16[i]= ch$=12345
ch\VS16[i]= GR$=123
gr\VS16[i]=12345 ch$=12345
ch\VS16[i]=123 GR$=123
gr\VS16[i]= ch$=12345
ch\VS16[i]= GR$=123

Les 2 variables CH.multi et GR.multi ont retrouvées des adresses différentes

Le compilateur s’emmêle-t-il les pédales ?

A+

PS: j'ai essayé avec les PB421 à PB542 on obtient les mêmes résultats
Dernière modification par PAPIPP le jeu. 17/mars/2016 10:35, modifié 2 fois.
Il est fort peu probable que les mêmes causes ne produisent pas les mêmes effets.(Einstein)
Et en logique positive cela donne.
Il est très fortement probable que les mêmes causes produisent les mêmes effets.
Anonyme2
Messages : 3518
Inscription : jeu. 22/janv./2004 14:31
Localisation : Sourans

Re: OBTENEZ-VOUS LES MEMES RESULTATS ?

Message par Anonyme2 »

Bonjour PAPIPP

ligne 47 1er code et même problème avec le second (pas de macro)
_n(ch) n'est pas une fonction bla bla bla

la même chose avec _s
PAPIPP
Messages : 534
Inscription : sam. 23/févr./2008 17:58

Re: OBTENEZ-VOUS LES MEMES RESULTATS ?

Message par PAPIPP »

Excusez moi. Ces macros sont dans le répertoire Résidents chez moi
et je les oublie souvent.

Code : Tout sélectionner

Macro _q_t_
"
EndMacro
Macro _n (__n)
_q_t_#__n#=_q_t_+Str(__n)+" "
EndMacro
Macro _s (__S)
_q_t_#__S#=_q_t_+__S+" "
EndMacro
A+
Il est fort peu probable que les mêmes causes ne produisent pas les mêmes effets.(Einstein)
Et en logique positive cela donne.
Il est très fortement probable que les mêmes causes produisent les mêmes effets.
Anonyme2
Messages : 3518
Inscription : jeu. 22/janv./2004 14:31
Localisation : Sourans

Re: OBTENEZ-VOUS LES MEMES RESULTATS ?

Message par Anonyme2 »

Sans les macros c'est bien comme tu dis, mêmes adresses.

Ce que j'en pense :

Sizeof(multi) retourne 0 ce qui est normal puisqu'il n'existe aucun élément dans la structure.

Je pense que la notation avec des tableaux à 0 élément dans les structures est uniquement une facilité d'écriture pour utiliser un pointeur et faire évoluer l'indice du tableau sans limite car parfois c'est ce qui arrive lorsque la limite haute n'est pas connue par avance.

C'est comme ceci que j'utilise la structure Structure IconDir_0 qui permet d'acceder aux différentes icônes d'un fichier ico.

Un fichier peut avoir, 1, 2, 10, xx icônes, on ne peut pas déclarer une structure variable pour chaque élément.

Code : Tout sélectionner

Structure IconDir_0
      idReserved.u ; réservé, toujours à 0
      idType.u ; resource type, à 1 pour les icônes
      idCount.u ; nombre d'image dans le fichier icônes
      idEntries.IconDirEntry[0] ; l'entrée de chaque image
EndStructure
Je pense donc que dans le 1er cas le compilateur s'égare (?) car chaque variable du type retourne 0 sur :

Code : Tout sélectionner

Debug SizeOf(gr)
Debug SizeOf(ch)
mais ça n'explique pas la même adresse

par contre pour la suite, il reprend ses esprits :mrgreen:

Enfin attendons Fred
Anonyme2
Messages : 3518
Inscription : jeu. 22/janv./2004 14:31
Localisation : Sourans

Re: OBTENEZ-VOUS LES MEMES RESULTATS ?

Message par Anonyme2 »

Mêmes adresses en 32/64 bits ascii/unicode pour la 1ere partie et différentes pour la 2ème.
5.42 LTS

x64 unicode
***** avec structure [0] *****
ch=5368979468 gr=5368979468
gr\VS16= ch$=12345
ch\VS16= GR$=123
gr\VS16=12345 ch$=12345
ch\VS16=12345 GR$=123
gr\VS16= ch$=12345
ch\VS16= GR$=123

x64 ascii
***** avec structure [0] *****
ch=5368997592 gr=5368997592
gr\VS16= ch$=12345
ch\VS16= GR$=123
gr\VS16=12345 ch$=12345
ch\VS16=12345 GR$=123
gr\VS16[i]=ÿÿÿÿ ch$=12345
ch\VS16[i]=ÿÿÿÿ GR$=123


x86 unicode
***** avec structure [0] *****
ch=4423988 gr=4423988
gr\VS16[i]= ch$=12345
ch\VS16[i]= GR$=123
gr\VS16[i]=12345 ch$=12345
ch\VS16[i]=12345 GR$=123
gr\VS16[i]= ch$=12345
ch\VS16[i]= GR$=123

x86 ascii
***** avec structure [0] *****
ch=4423704 gr=4423704
gr\VS16[i]= ch$=12345
ch\VS16[i]= GR$=123
gr\VS16[i]=12345 ch$=12345
ch\VS16[i]=12345 GR$=123
gr\VS16[i]= ch$=12345
ch\VS16[i]= GR$=123


la 2eme partie
x64 unicode
ch2=5368998348 gr2=5368998476
gr2\VS16[i]= gr$=123 @gr2\VS16[i]=5368998476
ch2\VS16[i]= ch$=12345 @ch2\VS16[i]=5368998348
gr2\VS16[i]=123 gr$=123 @gr2\VS16[i]=5368998508
ch2\VS16[i]=12345 ch$=12345 @ch2\VS16[i]=5368998380
gr2\VS16[i]= gr$=123 @gr2\VS16[i]=5368998540
ch2\VS16[i]= ch$=12345 @ch2\VS16[i]=5368998412
***** avec structure [0] *****
ch=5368998348 gr=5368998604
gr\VS16[i]= ch$=12345
ch\VS16[i]= GR$=123
gr\VS16[i]=12345 ch$=12345
ch\VS16[i]=123 GR$=123
gr\VS16[i]= ch$=12345
ch\VS16[i]= GR$=123


x64 ascii
ch2=5368997960 gr2=5368998024
gr2\VS16[i]= gr$=123 @gr2\VS16[i]=5368998024
ch2\VS16[i]= ch$=12345 @ch2\VS16[i]=5368997960
gr2\VS16[i]=123 gr$=123 @gr2\VS16[i]=5368998040
ch2\VS16[i]=12345 ch$=12345 @ch2\VS16[i]=5368997976
gr2\VS16[i]= gr$=123 @gr2\VS16[i]=5368998056
ch2\VS16[i]= ch$=12345 @ch2\VS16[i]=5368997992
***** avec structure [0] *****
ch=5368997960 gr=5368998088
gr\VS16[i]= ch$=12345
ch\VS16[i]= GR$=123
gr\VS16[i]=12345 ch$=12345
ch\VS16[i]=123 GR$=123
gr\VS16[i]=ÿÿÿÿ ch$=12345
ch\VS16[i]= GR$=123


x86 unicode
ch2=4424412 gr2=4424540
gr2\VS16[i]= gr$=123 @gr2\VS16[i]=4424540
ch2\VS16[i]= ch$=12345 @ch2\VS16[i]=4424412
gr2\VS16[i]=123 gr$=123 @gr2\VS16[i]=4424572
ch2\VS16[i]=12345 ch$=12345 @ch2\VS16[i]=4424444
gr2\VS16[i]= gr$=123 @gr2\VS16[i]=4424604
ch2\VS16[i]= ch$=12345 @ch2\VS16[i]=4424476
***** avec structure [0] *****
ch=4424412 gr=4424668
gr\VS16[i]= ch$=12345
ch\VS16[i]= GR$=123
gr\VS16[i]=12345 ch$=12345
ch\VS16[i]=123 GR$=123
gr\VS16[i]= ch$=12345
ch\VS16[i]= GR$=123


x86 ascii
ch2=4424056 gr2=4424120
gr2\VS16[i]= gr$=123 @gr2\VS16[i]=4424120
ch2\VS16[i]= ch$=12345 @ch2\VS16[i]=4424056
gr2\VS16[i]=123 gr$=123 @gr2\VS16[i]=4424136
ch2\VS16[i]=12345 ch$=12345 @ch2\VS16[i]=4424072
gr2\VS16[i]= gr$=123 @gr2\VS16[i]=4424152
ch2\VS16[i]= ch$=12345 @ch2\VS16[i]=4424088
***** avec structure [0] *****
ch=4424056 gr=4424184
gr\VS16[i]= ch$=12345
ch\VS16[i]= GR$=123
gr\VS16[i]=12345 ch$=12345
ch\VS16[i]=123 GR$=123
gr\VS16[i]= ch$=12345
ch\VS16[i]= GR$=123
Avatar de l’utilisateur
Kwai chang caine
Messages : 6962
Inscription : sam. 23/sept./2006 18:32
Localisation : Isere

Re: OBTENEZ-VOUS LES MEMES RESULTATS ?

Message par Kwai chang caine »

Tu comprendras aisément que je ne commente pas les résultats :mrgreen: , mais appuyer sur run si ça peut t'aider...ça je sais encore faire :oops:
ch2=4407652 gr2=4407716
gr2\VS16= gr$=123 @gr2\VS16=4407716
ch2\VS16= ch$=12345 @ch2\VS16=4407652
gr2\VS16=123 gr$=123 @gr2\VS16=4407732
ch2\VS16=12345 ch$=12345 @ch2\VS16=4407668
gr2\VS16= gr$=123 @gr2\VS16=4407748
ch2\VS16[i]= ch$=12345 @ch2\VS16[i]=4407684
***** avec structure [0] *****
ch=4407652 gr=4407780
gr\VS16[i]= ch$=12345
ch\VS16[i]= GR$=123
gr\VS16[i]=12345 ch$=12345
ch\VS16[i]=123 GR$=123
gr\VS16[i]= ch$=12345
ch\VS16[i]= GR$=123
ImageLe bonheur est une route...
Pas une destination

PureBasic Forum Officiel - Site PureBasic
Anonyme2
Messages : 3518
Inscription : jeu. 22/janv./2004 14:31
Localisation : Sourans

Re: OBTENEZ-VOUS LES MEMES RESULTATS ?

Message par Anonyme2 »

J'ai fait un asm en x86 pour voir et dans la section des variables globales on a cela
v_ch rb 0
v_gr rb 0
on ne réserve pas de place pour ces 2 variables

Code : Tout sélectionner

PB_DataPointer rd 1
v_i rd 1
v_CH$ rd 1
v_GR$ rd 1
align 4
v_ch rb 0
v_gr rb 0
align 4
align 4
align 4
I_BSSEnd:
section '.data' data readable writeable
SYS_EndDataSection:
et pour le 2eme cas
align 4
PB_DataPointer rd 1
v_i rd 1
v_CH$ rd 1
v_GR$ rd 1
align 4
v_ch rb 0
v_ch2 rb 64
v_gr2 rb 64
v_gr rb 0
align 4
align 4
align 4
I_BSSEnd:
c'est pour cela que ch et ch2 ont la même adresse :
v_ch rb 0
v_ch2 rb 64
et que gr n'a pas la même adresse que gr2
v_gr2 rb 64
v_gr rb 0
PAPIPP
Messages : 534
Inscription : sam. 23/févr./2008 17:58

Re: Obtenez vous les meme resultats ?

Message par PAPIPP »

Bonjour à tous
Et surtout merci à Denis et à KCC pour leurs participations et leurs observations.

J’ai trouvé une méthode permettant d’affecter une adresse à une variable avec structure dynamique.

Il suffit de la préciser avec une allocation mémoire comme ceci

Code : Tout sélectionner

Macro _q_t_
 "
 EndMacro
 Macro _n (__n)
 _q_t_#__n#=_q_t_+Str(__n)+" "
 EndMacro
 Macro _s (__S)
 _q_t_#__S#=_q_t_+__S+" "
 EndMacro


Structure multi 
  StructureUnion
    VA.a[0]
    VB.b[0] 
    VC.c[0] 
    Vs1.s{1}[0]
    Vw.w[0]
    VL.l[0]
    VQ.q[0]
    VF.f[0]
    VD.d[0]
    VS8.s{8}[0]
    VS16.s{16}[0]
  EndStructureUnion
EndStructure
Structure multi2 
  StructureUnion
    VA.a[64]
    VB.b[64] 
    VC.c[64] 
    Vs1.s{1}[64]
    Vw.w[32]
    VL.l[16]
    VQ.q[8]
    VF.f[16]
    VD.d[8]
    VS8.s{8}[8]
    VS16.s{16}[4]
  EndStructureUnion
EndStructure
max=65000
GR$="123"
CH$="12345"

; Define gr2.multi2
; Define ch2.multi2
; Debug _n(ch2)+_n(gr2)
; ch2\VS16[1]=ch$ 
; gr2\VS16[1]=gr$
; For i=0 To 2
;   Debug _s(gr2\VS16[i])+_s(gr$)+_n(@gr2\VS16[i])
;   Debug _s(ch2\VS16[i])+_s(ch$)+_n(@ch2\VS16[i])
; Next
Debug "***** avec structure [0] *****"
Define *gr.multi
*gr.multi=AllocateMemory(max)
Define  *ch.multi 
*ch.multi=AllocateMemory(max)

Debug _n(*ch)+_n(*gr)
*ch\VS16[1]=gr$ 
*gr\VS16[1]=ch$
For i=0 To 2
  Debug _s(*gr\VS16[i])+_s(ch$)
  Debug _s(*ch\VS16[i])+_s(GR$)
  Next
  End



Ps ; Ceci ne permet toujours pas de savoir pourquoi la variable avec structure dynamique que l’on a pas affectée avec une allocation mémoire, s’initialise correctement lorsqu’on utilise une autre procédure sur une structure normale indépendante de la structure dynamique !!

A+
Il est fort peu probable que les mêmes causes ne produisent pas les mêmes effets.(Einstein)
Et en logique positive cela donne.
Il est très fortement probable que les mêmes causes produisent les mêmes effets.
Anonyme2
Messages : 3518
Inscription : jeu. 22/janv./2004 14:31
Localisation : Sourans

Re: Obtenez vous les meme resultats ?

Message par Anonyme2 »

Bonjour Papipp,

il y a tout de même un problème de collision d'adresses dans les second cas pour
align 4
PB_DataPointer rd 1
v_i rd 1
v_CH$ rd 1
v_GR$ rd 1
align 4
v_ch rb 0
v_ch2 rb 64
v_gr2 rb 64
v_gr rb 0
align 4
align 4
align 4
I_BSSEnd:
ch et ch2 ont la même adresse puisque dans la section des variables globales du fichier asm, elles sont déclarées l'une après l'autre et d'abord ch puis ch2.

Pour les gr, gr2 est déclarée avant gr, donc comme sizeof(gr2) n'est pas nulle (gr2 = 64 octets = rb 64 popur le mode ascii), gr se retrouve après gr2 et n'ont pas la même adresse.

en posant un debug sur les adresses en x64 ascii
@ch = 5368979496 @ch2 = 5368979496
@gr = 5368979624 @gr2 = 5368979560
on a bien un décalage de 64 octets entre gr et gr2.

Dans les 2 cas de figure, c'est un bug.

Déclarer une structure avec tous les tableaux vides ne me parait pas trop normal, ceci engendre une taille de variable à 0 que le compilateur ne contrôle pas.

Je regarderais ton dernier code en fin de journée, je n'aurais pas trop de temps avant.
Répondre