appel à l'aide

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Suduadib
Messages : 8
Inscription : mer. 06/janv./2010 20:23

appel à l'aide

Message 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
Avatar de l’utilisateur
GallyHC
Messages : 1708
Inscription : lun. 17/déc./2007 12:44

Re: appel à l'aide

Message 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
Dernière modification par GallyHC le dim. 31/janv./2010 14:48, modifié 1 fois.
Configuration : Tower: Windows 10 (Processeur: i7 "x64") (Mémoire: 16Go) (GeForce GTX 760 - 2Go) - PureBasic 5.72 (x86 et x64)
Avatar de l’utilisateur
MLD
Messages : 1124
Inscription : jeu. 05/févr./2009 17:58
Localisation : Bretagne

Re: appel à l'aide

Message 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.
superloupiot
Messages : 41
Inscription : mer. 30/déc./2009 10:11

Re: appel à l'aide

Message 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.
Le Soldat Inconnu
Messages : 4312
Inscription : mer. 28/janv./2004 20:58
Localisation : Clermont ferrand OU Olsztyn
Contact :

Re: appel à l'aide

Message 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
Je ne suis pas à moitié Polonais mais ma moitié est polonaise ... Vous avez suivi ?

[Intel quad core Q9400 2.66mhz, ATI 4870, 4Go Ram, XP (x86) / 7 (x64)]
Suduadib
Messages : 8
Inscription : mer. 06/janv./2010 20:23

Re: appel à l'aide

Message 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
Le Soldat Inconnu
Messages : 4312
Inscription : mer. 28/janv./2004 20:58
Localisation : Clermont ferrand OU Olsztyn
Contact :

Re: appel à l'aide

Message par Le Soldat Inconnu »

en fait b() = a(), ça revient à écrire @b() = @a() donc ça recopie juste l'adresse du tableau
Je ne suis pas à moitié Polonais mais ma moitié est polonaise ... Vous avez suivi ?

[Intel quad core Q9400 2.66mhz, ATI 4870, 4Go Ram, XP (x86) / 7 (x64)]
Avatar de l’utilisateur
GallyHC
Messages : 1708
Inscription : lun. 17/déc./2007 12:44

Re: appel à l'aide

Message 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
Dernière modification par GallyHC le dim. 31/janv./2010 14:47, modifié 1 fois.
Configuration : Tower: Windows 10 (Processeur: i7 "x64") (Mémoire: 16Go) (GeForce GTX 760 - 2Go) - PureBasic 5.72 (x86 et x64)
Avatar de l’utilisateur
MLD
Messages : 1124
Inscription : jeu. 05/févr./2009 17:58
Localisation : Bretagne

Re: appel à l'aide

Message 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.
Avatar de l’utilisateur
GallyHC
Messages : 1708
Inscription : lun. 17/déc./2007 12:44

Re: appel à l'aide

Message 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
Configuration : Tower: Windows 10 (Processeur: i7 "x64") (Mémoire: 16Go) (GeForce GTX 760 - 2Go) - PureBasic 5.72 (x86 et x64)
Avatar de l’utilisateur
MLD
Messages : 1124
Inscription : jeu. 05/févr./2009 17:58
Localisation : Bretagne

Re: appel à l'aide

Message 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
Avatar de l’utilisateur
GallyHC
Messages : 1708
Inscription : lun. 17/déc./2007 12:44

Re: appel à l'aide

Message 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
Configuration : Tower: Windows 10 (Processeur: i7 "x64") (Mémoire: 16Go) (GeForce GTX 760 - 2Go) - PureBasic 5.72 (x86 et x64)
Avatar de l’utilisateur
MLD
Messages : 1124
Inscription : jeu. 05/févr./2009 17:58
Localisation : Bretagne

Re: appel à l'aide

Message 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.
Avatar de l’utilisateur
GallyHC
Messages : 1708
Inscription : lun. 17/déc./2007 12:44

Re: appel à l'aide

Message 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
Configuration : Tower: Windows 10 (Processeur: i7 "x64") (Mémoire: 16Go) (GeForce GTX 760 - 2Go) - PureBasic 5.72 (x86 et x64)
Avatar de l’utilisateur
MLD
Messages : 1124
Inscription : jeu. 05/févr./2009 17:58
Localisation : Bretagne

Re: appel à l'aide

Message 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
Répondre