2 tableaux associés sans raison [Résolu]

Signaler
Messages postés
4
Date d'inscription
vendredi 18 juin 2010
Statut
Membre
Dernière intervention
10 mai 2011
-
Messages postés
3258
Date d'inscription
jeudi 26 novembre 2009
Statut
Membre
Dernière intervention
3 décembre 2019
-
Bonjour amis programmeurs

J'ai un problème de tableau . J'ai une tableau (déclaré comme variable globale) que j'utilise lors d'un appel de fonction or sa valeur est modifiée alors qu'il n'y a pas de raisons:
voila le code:


Dim datavoies(7, 100) As Integer

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

Dim datavoiestemp(7, 100) As Integer
datavoiestemp = passebas(datavoies)

End Sub

Private Function passebas(ByVal datavoiesautre)

For i = 1 To numdata - 1
datavoiesautre(1, i) = 1
Next

Return datavoiesautre

End Function


Oui l'utilité de ce code présenté comme ça est douteuse mais je l'ai simplifié pour la clarté mais l'architecture est identique.
Datavoiestemp prend bien les valeurs de datavoiesautre (normal!) en utilisant les valeurs de datavoies. MAIS POURQUOI datavoies EST IL MODIFIE? c'est la premiere fois que cela m 'arrive et cela me dépasse, j'ai pourtant bien mis byval dans la fonction.

Dim datavoiestemp(7, 100) As Integer
datavoiestemp=datavoies
datavoiestemp = passebas(datavoiestemp)
Cette forme donne le même résultats.

2 tableaux peuvent ils etre liés? Associés?

10 réponses

Messages postés
107
Date d'inscription
samedi 25 novembre 2000
Statut
Membre
Dernière intervention
4 mai 2013

Bonjour,

Vérifier la documentation avant de commencer à ré-inventer la roue ça peut être bien aussi :

Méthodes statiques Copy de la classe Array (4 surcharges)
Méthodes d'instance CopyTo de la classe Array (2 surcharges)

Cordialement !
Messages postés
4
Date d'inscription
vendredi 18 juin 2010
Statut
Membre
Dernière intervention
10 mai 2011

essayez ça , c'est pareil:

Public Class Form1
Dim datavoies() As Integer = {3, 3, 4, 4, 4, 5, 6, 6}


Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim datavoiestemp() As Integer
datavoiestemp = passebas(datavoies)
End Sub



Private Function passebas(ByVal datavoiesautre)

For i = 0 To 4
datavoiesautre(i) = 1
Next

Return datavoiesautre

End Function
End Class
Messages postés
76
Date d'inscription
jeudi 14 mai 2009
Statut
Membre
Dernière intervention
2 août 2018

Salut,

En vbNet, l'affectation d'objet(checkBox, comboBox, tableaux...) se fait par reference, C'est a dire que si tu fait
monDeuxiemeTableau = monPremierTableau (et c'est le Cas ici), tu n'aura non pas deux tableau dans deux zones de memoires distincte, mais un seul tableau qui aura en fait deux noms différents...

Voila pourquoi, meme si tu utilise byVal, ton deuxieme tableau modifie la valeur de ton premier.


J'espère avoir été claire, bonne chance pour la suite.
Messages postés
76
Date d'inscription
jeudi 14 mai 2009
Statut
Membre
Dernière intervention
2 août 2018

Normalement, ceci devrait marcher:

Private function passebas(byval datavoiesautres)

dim temp as Integer(datavoiesautres.length)
For i = 0 to 4
temp(i) = 1
Next
For i = 5 to dataVoiesautres.length - 1
temp(i) = dataVoiesautres(i)
next
return temp
end function
Messages postés
4
Date d'inscription
vendredi 18 juin 2010
Statut
Membre
Dernière intervention
10 mai 2011

merci pour ces informations, je ne savais pas que tableau1=tableau2 associait le même tableau à deux nom différents.
Je suis pas sur que l'exemple proposé resolve mon problème.
En réalité, j'effectue un filtrage de données sur le tableau mais si le filtrage n'est pas concluant, il faut pouvoir retourner aux données d'origines. Voila pourquoi je voulais "archiver" les données d'origines, travailler sur une copie temporaire, si le filtre est bon, copier le temporaire dans l'archive, si le filtre n'est pas bon, garder l'archive du départ....
Il faut savoir que le tableau est trés long (mais c'est un détail)

Donc comment faire un nouveau tableau dans un nouvel espace mémoire avec un nouveau nom en copiant un premier tableau? un new quelquechose (comme un objet?)

Merci pour vos solutions
Messages postés
76
Date d'inscription
jeudi 14 mai 2009
Statut
Membre
Dernière intervention
2 août 2018

Je te conseille de faire une fonction personnalisée de copie:
Private function copyTab(byval tableau)

dim Copie as Object

For i = 0 to tableau.length - 1
copie(i) = tableau(i)
Next

return temp
end function


ensuite tu affecte le resultat de cette fonction a ton tableau temporaire, et tu peut travailler dessus sans probleme:

Dim tabTemp = copyTab(dataVoies)
Messages postés
14774
Date d'inscription
vendredi 14 mars 2003
Statut
Modérateur
Dernière intervention
7 mars 2021
151
Bonjour,

Je me joint à la discussion sur un point de détail, mais qui a toute son importance :

Private function passebas(byval datavoiesautres)


TOUJOURS mettre Option Strict et Option Explicit à On.

Mon site
Messages postés
4
Date d'inscription
vendredi 18 juin 2010
Statut
Membre
Dernière intervention
10 mai 2011

Merci pour tout, ca fonctionne
aprés strict sur on , j ai 102 erreurs
je suis bon pour une petite demi heure pour rendre mon code plus académique
Messages postés
14774
Date d'inscription
vendredi 14 mars 2003
Statut
Modérateur
Dernière intervention
7 mars 2021
151
Bonjour,

Et oui, cela permet de faire un code plus fiable :)

Note : la 102ième erreur est souvent "Trop d'erreur pour en afficher plus" ;)

Bonne programmation :)

Mon site
Messages postés
3258
Date d'inscription
jeudi 26 novembre 2009
Statut
Membre
Dernière intervention
3 décembre 2019
50
Cela me rappelle la dictée à l'école
les cancres
note 0/20
40 fautes au moins