Page 1 sur 2

appel à l'aide

Publié : sam. 30/janv./2010 23:42
par Suduadib
Bonjour à tous,

J'avoue être un peu perdu, pourriez-vous m'expliquer le comportement du bout de code suivant?

Dim a(2)
Dim b(2)
a(1)=1
a(2)=2
; copie du tableau a() dans le tableau b()
b()=a()
Debug b(1)
Debug b(2)
Debug "comportement attendu"
a(1)=12345 ; modification de a(1)
Debug b(1)
Debug b(2)
Debug "pourquoi diable b(1) a t'il été modifié ?"

Merci déjà pour votre attention

Re: appel à l'aide

Publié : dim. 31/janv./2010 1:40
par GallyHC
Bonjour,

Apars dire q'une fois b()=a() soit fait Purebasic Considère que b() est toujours egal a() en memoire. Sinon apar sa je vois pas trop, par contre cela peu provoque des problème. Dans tout les cas bien vu pour le problème.

Cordialement,
GallyHC

Re: appel à l'aide

Publié : dim. 31/janv./2010 9:03
par MLD
Bonjour
Si je ne me trompe pas, Tu as eassayé de copier un tableau, dans un tableau. (Ce qui je pense n'est pas bon.) et non pas les éléments d'un tableau dans un autre tableau.

Re: appel à l'aide

Publié : dim. 31/janv./2010 9:42
par superloupiot
Il semblerait que avant l'affectation, les deux tableaux aient une adresse distincte en mémoire.
Après affectation, ils ont la même adresse. C'est comme si a et b référençait le même tableau.
En somme, un des tableaux a disparu.

Code : Tout sélectionner

OpenWindow(0, 0, 0, 800, 800, "Caise enregistreuse",  #PB_Window_SystemMenu | #PB_Window_MinimizeGadget | #PB_Window_MaximizeGadget | #PB_Window_TitleBar )


Dim a(2)
Dim b(2)

Debug @a()
Debug @b()		; adresse de a différente de adresse de b

b()=a()

Debug @a()
Debug @b()		; adresse de a égale adresse de b


Repeat

	Event = WaitWindowEvent()
	
	
      
 	Select Event

 		; En cas de click sur la crois de fermeture, fermet l'application     
 		Case #PB_Event_CloseWindow
 			If EventWindow() = 0
 				CloseWindow(0)
 				Break
 			EndIf
 			
 	Default
 			
 		
 	EndSelect
      
ForEver
Je trouve que c'est un comportement assez inattendu.

Re: appel à l'aide

Publié : dim. 31/janv./2010 12:02
par Le Soldat Inconnu
Ecrire A() = B() n'est absolument pas bon et ne fonctionne pas

Soit ton tableau n'e comporte pas de string et tu dois faire un copymemory(

Code : Tout sélectionner

Dim a.l(2)
Dim b.l(2)
a(1)=1
a(2)=2
; copie du tableau a() dans le tableau b()
CopyMemory(@a(), @b(), SizeOf(Long) * 3)

Debug b(1)
Debug b(2)
a(1)=12345 ; modification de a(1)
Debug b(1)
Debug b(2)

Soit c'est un tableau avec des strings et la, pas le choix, il faut copier les élément 1 à 1

Re: appel à l'aide

Publié : dim. 31/janv./2010 12:06
par Suduadib
Si c'est le cas, c'est à dire qu'il y a identité complète des tableaux a() et b() lorsqu'on pose b()=a(), alors il me semble que c'est suffisamment important pour que le manuel ou l'aide le mentionne.
Je retourne éplucher les textes ...

merci pour vos premières réponses

Re: appel à l'aide

Publié : dim. 31/janv./2010 12:39
par Le Soldat Inconnu
en fait b() = a(), ça revient à écrire @b() = @a() donc ça recopie juste l'adresse du tableau

Re: appel à l'aide

Publié : dim. 31/janv./2010 13:01
par GallyHC
Bonjour,

Oui a mon avis cela veut dire cela. Par contre je perso, je considère que cela est plus un Bug qu'autre chose. Sa peu provoque pas mal de problème.

Cordialement,
GallyHC

Re: appel à l'aide

Publié : dim. 31/janv./2010 14:05
par MLD
Non ce n'est pas un bug. Par exemple VB, ne le permet pas non plus.
De plus dans un programme si cette opération ce répète plusieurs fois, trés rapidement tu ne saura plus quoi contient quoi.

Re: appel à l'aide

Publié : dim. 31/janv./2010 14:43
par GallyHC
Bonjour,

Alors fait le test de ce code en VB6 et explique moi la capture que je donne avec les resultats, si VB6 ne sais pas le faire je ne comprend pas.

Code : Tout sélectionner

Option Explicit

Private Sub Form_Load()
'
    Dim a(2) As Long
    Dim b() As Long

    a(1) = 1
    a(2) = 2

    b() = a()
    
    a(1) = 12345

    MsgBox ("a1:" & a(1) & vbCrLf & "a2:" & a(2) & vbCrLf & "b1:" & b(1) & vbCrLf & "b2:" & b(2))

    Erase a()
    Erase b()

End Sub
Resultat:
Image

De plus tu dis que si sa ce repete tu ne sera plus ou on en est, c'est peu etre vrai mais si tu le fais c surement pour une bonne raison. Et le programme si il est bien programme, il sera toujours ou il en est lui.

Cordialement,
GallyHC

Re: appel à l'aide

Publié : dim. 31/janv./2010 15:48
par MLD
Bonjour GallyHC
Ton code fonctionne, mais b n'est un tableau, car il n'a aucune dimension, pour avoir une dimension il faudrait soit la déclarée soit utilisé Redim. et dans ce cas ça ne fonctionne plus .

Code : Tout sélectionner

Private Sub Form_Load()
Dim a(2) As Long
Dim b(2) As Long

    a(1) = 1
    a(2) = 2

    b() = a()
    
    a(1) = 12345

    MsgBox ("a1:" & a(1) & vbCrLf & "a2:" & a(2) & vbCrLf & "b1:" & b(1) & vbCrLf & "b2:" & b(2))

End Sub


Amicalement Michel

Re: appel à l'aide

Publié : dim. 31/janv./2010 16:00
par GallyHC
Bonjour,

Dim b() as long > on prepare le tableau sans aucune affectation de valeur.

b() = a() > le tableau b() prend les dimention du tableau a(). Donc le tableau a maintenant une dimension.

oui on ne peu pas copier un tableau a x dimension dans un autre tableau a y dimension. Il faut le declare sans dimension pour qu'il prenne la dimention du tableau de base.

Tu dis que mon tableau n'est pas un tableau donc une variable seulement declare sans valeur n'est pas une variable. Alors oui c'est juste une declaration d'une adresse memoire en attente d'evenement.

cordialement,
GallyHC

Re: appel à l'aide

Publié : dim. 31/janv./2010 16:33
par MLD
GallyHC
GallyHC a écrit :Bonjour,

Dim b() as long > on prepare le tableau sans aucune affectation de valeur.

b() = a() > le tableau b() prend les dimention du tableau a(). Donc le tableau a maintenant une dimension.

oui on ne peu pas copier un tableau a x dimension dans un autre tableau a y dimension. Il faut le declare sans dimension pour qu'il prenne la dimention du tableau de base.

Tu dis que mon tableau n'est pas un tableau donc une variable seulement declare sans valeur n'est pas une variable. Alors oui c'est juste une declaration d'une adresse memoire en attente d'evenement.

cordialement,
GallyHC
Tu m'indiquera dans qu'el manuel tu a lu ce que tu affirme, et a qu'el endroit. Maintenant libre a toi de croire ce que tu veux. Nous somme deux avec LSI a te dire que ce n'est pas un code correct! et Redim ne sert certainement a rien.

Re: appel à l'aide

Publié : dim. 31/janv./2010 16:58
par GallyHC
Sans manuel, que ce soit une variable ou un tableau, cela n'est juste que des donnees formate dans une adresse memoire. de plus la demande de base n'est pas de moi et j'ai juste donne un exemple en VB6 pour te montre que l'on peu le faire.

par contre je ne vois pas ton histoire de redim et ce que cela viens faire la.

cordialement,
GallyHC

Re: appel à l'aide

Publié : dim. 31/janv./2010 17:19
par MLD
GallyHC
CQFD
Mais quand même, j'ai repris ton code, mais j'ai déclaré les deux tableaux aux même dimensions, et si tu veux copier un tableau dans l'autre ça ne peut pas fonctionner.
Pour infos je programme en VB depuis le VB3 . Dans tous les languages un tableau qu'il soit dynamique ou static doit avoir une dimension, soit en début de programme, soit si c'est un tableau dynamique en cours de programme avec une instruction appropriée. mais un tableau qui dimensionne par copie un autre tableau, cela doit faire une sacrée salade. :wink:
(A propos Redim sert a redimensionné un tableau dynamique) :roll:
Sans rancune :lol:
Michel