appel à l'aide
appel à l'aide
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
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
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
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)
Re: appel à l'aide
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.
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.
-
- Messages : 41
- Inscription : mer. 30/déc./2009 10:11
Re: appel à l'aide
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.
Je trouve que c'est un comportement assez inattendu.
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
-
- Messages : 4312
- Inscription : mer. 28/janv./2004 20:58
- Localisation : Clermont ferrand OU Olsztyn
- Contact :
Re: appel à l'aide
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(
Soit c'est un tableau avec des strings et la, pas le choix, il faut copier les élément 1 à 1
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)]
[Intel quad core Q9400 2.66mhz, ATI 4870, 4Go Ram, XP (x86) / 7 (x64)]
Re: appel à l'aide
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
Je retourne éplucher les textes ...
merci pour vos premières réponses
-
- Messages : 4312
- Inscription : mer. 28/janv./2004 20:58
- Localisation : Clermont ferrand OU Olsztyn
- Contact :
Re: appel à l'aide
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)]
[Intel quad core Q9400 2.66mhz, ATI 4870, 4Go Ram, XP (x86) / 7 (x64)]
Re: appel à l'aide
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
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)
Re: appel à l'aide
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.
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
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.
Resultat:

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
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

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)
Re: appel à l'aide
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 .
Amicalement Michel
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
Re: appel à l'aide
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
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)
Re: appel à l'aide
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.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
Re: appel à l'aide
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
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)
Re: appel à l'aide
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.
(A propos Redim sert a redimensionné un tableau dynamique)
Sans rancune
Michel
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.

(A propos Redim sert a redimensionné un tableau dynamique)

Sans rancune

Michel