Modification variable appartenant à une collection

Résolu
cs_gbern Messages postés 5 Date d'inscription jeudi 15 mai 2003 Statut Membre Dernière intervention 8 décembre 2010 - 8 déc. 2010 à 13:36
cs_gbern Messages postés 5 Date d'inscription jeudi 15 mai 2003 Statut Membre Dernière intervention 8 décembre 2010 - 8 déc. 2010 à 23:18
Bonjour,
Si j'utilise la ligne 22 j'ai le message d'erreur de la ligne 23
Je voudrais que cette ligne 22 fasse le meme travail que les lignes 26 à 28 ( qui elles fonctionnent très bien)
Si quelqu'un pouvait me mettre sur la voie ?
Merci pour votre aide
PS. J'utilise VB 2010 Express
Bernard

10Module fStart
11 Public Structure autreData
12 Dim code As Int16
13 Dim flag As Boolean
14 End Structure
15 Public myDATA As New Dictionary(Of Int32, autreData)
16 Public DATA As autreData
'
17 Sub Main()
'
18 DATA.code 1254 : DATA.flag True : myDATA.Add(259, DATA)
19 DATA.code 1255 : DATA.flag False : myDATA.Add(301, DATA)
20 DATA.code 1256 : DATA.flag True : myDATA.Add(125, DATA)
21 DATA.code 1257 : DATA.flag False : myDATA.Add(302, DATA)
22 DATA.code 1258 : DATA.flag True : myDATA.Add(124, DATA)
'
23 For Each W In myDATA
24 Console.WriteLine(" : " & W.Key & " " & W.Value.code & " " & W.Value.flag)
25 Next
'
26 DATA = myDATA(301) : myDATA.Remove(301)
27 DATA.flag = True
28 myDATA.Add(301, DATA)
'
29 myDATA(302).flag = True
31 'Message erreur : Cette expression est une valeur et ne peut donc pas être la cible d'une assignation
'
32 Console.WriteLine("---")
33 For Each W In myDATA
34 Console.WriteLine("bg : " & W.Key & " " & W.Value.code & " " & W.Value.flag)
35 Next
36 Console.Read()
37 End Sub
38End Module

5 réponses

NHenry Messages postés 15113 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 22 avril 2024 159
8 déc. 2010 à 14:22
Bonjour,

3 choses :

1) Voyant que "W" n'est pas déclarée, j'en conclu que tu n'as pas activé Option Strict et Option Explicit, fais-le.

2) Evite les déclarations sur une lignes séparées par un ":", ce n'est pas très lisible, dans ce cas, préfère faire un constructeur pour ta structure (ça fonctionne :) )

3) Utilises la coloration syntaxique fournie par le forum (3ième icône en partant de la droite).


3
Sehnsucht Messages postés 107 Date d'inscription samedi 25 novembre 2000 Statut Membre Dernière intervention 4 mai 2013
8 déc. 2010 à 16:11
Bonjour,

Pour NHenry, le fait que W ne soit pas explicitement déclaré n'a peut-être rien à voir avec Option Strict/Explicit dans ce cas (même si je suis d'accord sur leur utilisation systématique). En effet l'OP dit travailler avec VB10 qui possède désormais un bon moteur d'inférence, ainsi dans le contexte W est inféré en tant que KeyValuePair(Of Int32, autreData) (chose vérifiable par la présence de l'intellisense sur les propriétés Key et Value)

En ce qui concerne le souci, cela provient du fait que autreData est une Structure, autrement dit est manipulée par valeur (et non pas par référence comme les classes).
De ce fait lorsque tu fais myData(302) tu récupère une copie "anonyme" de l'objet contenu dans ton dictionnaire, ce qui implique que toute modification effectuée ensuite serait perdue dès la fin de la ligne (chose que constate et signale le compilateur)

Par exemple ici pour modifier la valeur du flag tu as fait comme ceci:
DATA = myDATA(301)
myDATA.Remove(301)
DATA.flag = True
myDATA.Add(301, DATA)

Si tu manipulais une classe tu pourrais faire ceci (outre le fait de pouvoir directement modifier la valeur)
DATA = myDATA(301)
DATA.flag = True
' ici myDATA(301).flag vaut True

parce DATA représente juste un "alias" vers myDATA(301) on dit qu'ils référencent (pointent vers) le même objet.

Cordialement !
3
cs_gbern Messages postés 5 Date d'inscription jeudi 15 mai 2003 Statut Membre Dernière intervention 8 décembre 2010
8 déc. 2010 à 21:15
Bonsoir,
1) merci à NHenry,
mais bien qu'ayant mis Option Strict et Option Explicit
le compilateur ne dit rien sur le fait que la variable X ne soit pas déclarée.
2) également un grand merci à Sehnsucht, mais ou trouver une doc qui m'explique de manière simple comment utiliser une classe
(si ce n'est pas trop te demander, pourrais-tu me donner un squelette d'utilisation d'une classe avec une variable et une collection)
Cordialement
Ci-dessous le coding modifié.
Bernard

Option Strict On
Option Explicit On
Module fStart

    Public Structure autreData
        Dim code As Int16
        Dim flag As Boolean
    End Structure
    Public myDATA As New Dictionary(Of Int32, autreData)
    Public DATA As autreData
    '
    Sub Main()
        '
        DATA.code = 1254
        DATA.flag = True
        myDATA.Add(259, DATA)
        DATA.code = 1255
        DATA.flag = False
        myDATA.Add(301, DATA)
        DATA.code = 1256
        DATA.flag = True
        myDATA.Add(125, DATA)
        DATA.code = 1257
        DATA.flag = False
        myDATA.Add(1001, DATA)
        DATA.code = 1258
        DATA.flag = True
        myDATA.Add(124, DATA)
        '
        For Each W As KeyValuePair(Of Int32, autreData) In myDATA
            Console.WriteLine(" : " & W.Key & "  " & W.Value.code & "  " & W.Value.flag)
        Next
        '
        DATA = myDATA(301)
        myDATA.Remove(301)
        DATA.flag = True
        myDATA.Add(301, DATA)
        '
        'myDATA(301).flag = True
        'Message erreur : Cette expression est une valeur et ne peut donc pas être la cible d'une assignation
        '
        Console.WriteLine("--")
        For Each X In myDATA
            Console.WriteLine(" : " & X.Key & "  " & X.Value.code & "  " & X.Value.flag)
        Next
        Console.Read()
    End Sub
End Module
3
NHenry Messages postés 15113 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 22 avril 2024 159
8 déc. 2010 à 22:45
Bonjour,

Proposition d'implémentation :
Option Strict On
Option Explicit On
Module fStart

    Public class autreData
        Public Sub New(byval pCode as Int16,ByVal pFlag as Boolean)
            mcode=pcode
        End sub
        
        Public Property Code as Int16
            Get
                Return mCode
            End Get
            Set(byval pValue as Int16)
                mCode=pValue
            end set
        End Property
        
        Public Property Flag as Boolean
            Get
                Return mFlag
            End Get
            Set(byval pValue as Boolean)
                mFlag=pValue
            end set
        End Property
        
        
        
        Private mCode As Int16
        Private mFlag As Boolean
    End Structure
    Public myDATA As New Dictionary(Of Int32, autreData)
    '
    Sub Main()
        '
        myDATA.Add(259, New autreData(1254,True))
        myDATA.Add(301, New autreData(1255,False))
        myDATA.Add(125, New autreData(1256,True))
        myDATA.Add(1001, New autreData( 1257,False))
        myDATA.Add(124, New autreData(1258,True))
        '
        For Each W As KeyValuePair(Of Int32, autreData) In myDATA
            Console.WriteLine(" : " & W.Key & "  " & W.Value.code & "  " & W.Value.flag)
        Next
        '
        myDATA(301).flag=True

        Console.WriteLine("--")
        For Each X In myDATA
            Console.WriteLine(" : " & X.Key & "  " & X.Value.code & "  " & X.Value.flag)
        Next
        Console.Read()
    End Sub
End Module


3

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_gbern Messages postés 5 Date d'inscription jeudi 15 mai 2003 Statut Membre Dernière intervention 8 décembre 2010
8 déc. 2010 à 23:18
Un grand merci,
c'est tout a fait le mode de fonctionnement que je recherchais
Je vais pouvoir simplifier mon appli
Bernard
3
Rejoignez-nous