Partage
  • Partager sur Facebook
  • Partager sur Twitter

a.copy et a.clone

a.copy et a.clone

Sujet résolu
    17 octobre 2020 à 12:26:18

    voici ce code 
    Sub Main()
            Dim a(3) As String
            Dim b(3) As String
    
            a(0) = "oui"
            a(1) = "non"
            a(2) = "yes"
            a(3) = "not"
            For i = 0 To 3
    
                Console.WriteLine(a(i))
    
            Next
            b(0) = "ya"
            b(1) = "nein"
            b(2) = "si"
            b(3) = "no"
    
            For i = 0 To 3
    
                Console.WriteLine(b(i))
            Next
    
            b = a
            For i = 0 To 3
                Console.WriteLine(a(i))
                Console.WriteLine(b(i))
            Next
    
    
            b(0) = "ya"
            b(1) = "nein"
            b(2) = "si"
            b(3) = "none"
    
            b = a
            For i = 0 To 3
                Console.WriteLine(a(i))
                Console.WriteLine(b(i))
            Next
    
    
            Console.ReadLine()
    
        End Sub
    

    il m'affiche cela 

    Oui

    non

    yes

    not

    ya

    nein

    si

    no

    oui

    oui

    non

    non

    yes

    yes

    not

    not

    ya

    ya

    nein

    nein

    si

    si

    none

    none

    comme j'ai mis a dans b au début je comprends 

    après je modifie b mais je ne modifie pas a qui est resté le même qu'au départ 

    et je lui demande de m'afficher que j'ai mis a dans b : c'est à dire b=a je ne lui ai pas dit a=b pourquoi m'affiche t il deux fois b modifié

    à l'avance merci 

    -
    Edité par FrancisPartouche 17 octobre 2020 à 12:27:08

    • Partager sur Facebook
    • Partager sur Twitter
      19 octobre 2020 à 11:44:17

      "a" et "b" sont des tableaux de String, donc des "Reference Type" et non des "Value Type" (int, double, etc...).

      En ligne 24, c'est les références que vous affectez. Donc, à partir de là, "a" et "b" sont synonymes.

      Tous ce que vous faites sur l'objet référencé par "a" ce voit aussi sur l'objet référencé par "b", car c'est le même (et vis-versa).

      • Partager sur Facebook
      • Partager sur Twitter
      Je recherche un CDI/CDD/mission freelance comme Architecte Logiciel/ Expert Technique sur technologies Microsoft.
        19 octobre 2020 à 13:54:45

        désolé toujours mais je ne comprends pas 

        je reprends le code différemment 

        Sub Main()
                Dim a(3) As String
                Dim b(3) As String
                Dim i, j As Integer
                a(0) = "oui"
                a(1) = "non"
                a(2) = "yes"
                a(3) = "not"
                For i = 0 To 3
        
                    Console.WriteLine(a(i))
        
                Next
                b(0) = "ya"
                b(1) = "nein"
                b(2) = "si"
                b(3) = "no"
        
                For i = 0 To 3
        
                    Console.WriteLine(b(i))
                Next
        
                b = a
                For i = 0 To 3
                    Console.WriteLine(a(i))
                    Console.WriteLine(b(i))
                Next
        
                a(0) = "oui"
                a(1) = "non"
                a(2) = "yes"
                a(3) = "not"
        
                b(0) = "ya"
                b(1) = "nein"
                b(2) = "si"
                b(3) = "none"
        
                b = a
                For i = 0 To 3
                    Console.WriteLine(a(i))
                    Console.WriteLine(b(i))
                Next

        voilà ce qu'il m'affiche:

        oui

        non

        yes

        not

        ya

        nein

        si

        no

        oui

        oui

        non

        non

        yes

        yes

        not

        not

        ya

        ya

        nein

        nein

        si

        si

        none

        none

        dans les lignes 28 à 32 et 44à 48 je lui demande la même chose 

        dans le premier cas il m'affiche deux fois les valeurs de a

        dans le deuxième cas il m'affiche deux fois les valeurs de b 

        pourquoi ??????

        je rajoute 

        quand je lui dis b=a pour moi c'est sous en tendu que je lui dis mets la valeur d'indice a(0) dans b(o) et ainsi de suite ce qu'il fait dans les lignes 28 à 32

        puisque il m'affiche deux fois les valeurs de a quand je lui dis console.writeline(a(i)) et console.writeline(b(i)) et quand je lui redemande la même chose dans les lignes 44 à 48 il m'affiche deux fois les valeurs de b 

        j'avoue que cela ne me parait pas logique

        a l'avance merci

        -
        Edité par FrancisPartouche 19 octobre 2020 à 14:19:04

        • Partager sur Facebook
        • Partager sur Twitter
          19 octobre 2020 à 14:37:19

          Comme bachelar l'a dit; à partir du moment où tu fais b=a ici, tu indiques que a et b sont le même tableau (b va "pointer" sur le tableau a; donc a et b ont la même adresse, c'est le même objet); donc que tu changes a(1) ou b(1) tu fais la même chose, tu agis sur le même élément, d'où le fait que tu te retrouves avec les derniers éléments entrés dans le tableau (que tu peux appeler a ou b indifféremment).
          • Partager sur Facebook
          • Partager sur Twitter
            19 octobre 2020 à 15:15:34

            j'intervertis , je mets b dans a en écrivant a=b

            Sub Main()
                    Dim a(3) As String
                    Dim b(3) As String
                    Dim i, j As Integer
                    a(0) = "oui"
                    a(1) = "non"
                    a(2) = "yes"
                    a(3) = "not"
                    For i = 0 To 3
            
                        Console.WriteLine(a(i))
            
                    Next
                    b(0) = "ya"
                    b(1) = "nein"
                    b(2) = "si"
                    b(3) = "no"
            
                    For i = 0 To 3
            
                        Console.WriteLine(b(i))
                    Next
            
                    a = b
                    For i = 0 To 3
                        Console.WriteLine(a(i))
                        Console.WriteLine(b(i))
                    Next
            
                    a(0) = "oui"
                    a(1) = "non"
                    a(2) = "yes"
                    a(3) = "not"
            
                    b(0) = "ya"
                    b(1) = "nein"
                    b(2) = "si"
                    b(3) = "none"
            
                    a = b
                    For i = 0 To 3
                        Console.WriteLine(a(i))
                        Console.WriteLine(b(i))
                    Next
            
            

            oui

            non

            yes

            not

            ya

            nein

            si

            no

            ya

            ya

            nein

            nein

            si

            si

            no

            no

            ya

            ya

            nein

            nein

            si

            si

            none

            none

            et là il m'affiche que du b ce qui est logique pour moi en tout cas alors pourquoi dans un cas il reproduit deux fois b  et dans le cas précisé dans le précédent message il ne m'affiche pas deux fois a 

            les deux réponses selon que j'ai mis b=a ou a=b ne répondent pas à la même logique pourquoi 

            quand je mets b=a il devrait m'afficher après le code des lignes 44à48 deux fois les valeurs de a 

            et quand je mets a=b il devrait m'afficher après toujours les mêmes lignes de code deux fois les valeurs de b

            en tout cas la réponse devrait répondre à la même logique dans les deux cas , ce qui ne me parait pas être ce qu'il fait 

            je suis chiant je peux le comprendre mais cela ne me parait pas logique

            cordialement 

            je fais ce code:

             Sub Main()
                    Dim a(3) As String
                    Dim b(3) As String
                    Dim i, j As Integer
                    a(0) = "oui"
                    a(1) = "non"
                    a(2) = "yes"
                    a(3) = "not"
                    For i = 0 To 3
            
                        Console.WriteLine(a(i))
            
                    Next
                    b(0) = "ya"
                    b(1) = "nein"
                    b(2) = "si"
                    b(3) = "no"
            
                    For i = 0 To 3
            
                        Console.WriteLine(b(i))
                    Next
            
                    Array.Copy(a, b, 4)
                    For i = 0 To 3
                        Console.WriteLine(a(i))
                        Console.WriteLine(b(i))
                    Next
            
                    a(0) = "oui"
                    a(1) = "non"
                    a(2) = "yes"
                    a(3) = "not"
            
                    b(0) = "ya"
                    b(1) = "nein"
                    b(2) = "si"
                    b(3) = "none"
            
                    Array.Copy(a, b, 4)
                    For i = 0 To 3
                        Console.WriteLine(a(i))
                        Console.WriteLine(b(i))
                    Next
            

            il m'affiche : 

            oui

            non

            yes

            not

            ya

            nein

            si

            no

            oui

            oui

            non

            non

            yes

            yes

            not

            not

            oui

            oui

            non

            non

            yes

            yes

            not

            not

            là c'est logique

            -
            Edité par FrancisPartouche 19 octobre 2020 à 15:43:01

            • Partager sur Facebook
            • Partager sur Twitter
              19 octobre 2020 à 17:54:11

              Tant que vous ne comprendrez pas que "a" et "b" sont des références à des objets (comme en JAVA) et pas les objets "eux-même" (comme en C++ pour les classes de type valeur (et pas de type entité)), vous tournerez en rond.

              "a=b" et "b=a" ne sont pas équivalent car après "a=b", c'est "a" qui est un alias sur l'objet référencé par "b" donc "avec les valeurs de b avant l'affectation" alors que pour "b=a", c'est l'inverse, b est un alias l'objet référencé par "a" donc "avec les valeurs de a avant l'affectation".

              Après l'affectation, "a(0)=toto" ou "b(0)=toto", là c'est pareil, car "a" ET "b" référence le même objet APRES l'affectation.

              • Partager sur Facebook
              • Partager sur Twitter
              Je recherche un CDI/CDD/mission freelance comme Architecte Logiciel/ Expert Technique sur technologies Microsoft.
                19 octobre 2020 à 18:15:30

                désolé mais je ne comprends pas personnellement je n'ai jamais dit que a=b équivalait à b= a 

                donc il faut que je trouve un forum pour débutant qui m'explique comment cela marche car même en faisant le débogage point par point je ne comprends pas , je fais les deux mêmes opérations et je n'obtiens pas un résultat équivalent alors que avec array,copy le résultat me semble logique

                cordialement 

                • Partager sur Facebook
                • Partager sur Twitter
                  19 octobre 2020 à 18:26:48

                  quand tu fais a(0)="oui" puis b(0)="yes", alors a(0)=b(0)="yes" (la dernière valeur entrée dans l'indice 0 du tableau,que tu fasses a=b ou b=a avant, puisqu'à partir du moment où tu fais ça, tu pointes sur un seul et même tableau (le b d'origine si tu fais a=b; ou le a d'origine si tu fais b=a; l'autre est "oublié", "perdu")

                  Si tu fais à l'inverse b(0)"yes" puis a(0)="oui" alors a(0)=b(0)="oui" (toujours la dernière valeur affectée à l'indice 0 du tableau) (que tu fasses a=b ou b=a).

                  dans ton exemple avec Arry.copy(a,b,4) tu fais une copies des valeurs; si après cette copie, tu fais b(0)="toto" tu verras "toto" dans l'affichage, puisque là a et b ne pointent pas (ne représente pas) le même tableau

                  -
                  Edité par umfred 19 octobre 2020 à 18:29:40

                  • Partager sur Facebook
                  • Partager sur Twitter
                    19 octobre 2020 à 20:38:59

                    bonjour 

                    si tu reprends mon code de mon premier message datant du 17/10/2020

                    de la ligne 31 à 34 c'est b de 0 à 3 qui est affiché le dernier donc selon toi on ne retient que les valeurs de b celles de a ne sont plus pris en compte et on affiche deux fois les lignes de b à partir du code des lignes 36 à 39 puisque a est perdu comme tu dis 

                    mais si on remonte aux lignes 14 à 17 c'est bien les valeurs de b qui sont affichées en dernier donc on devrait avoir deux fois les valeurs de b à partir du code des lignes 24 à 28 puisque tu dis que a est oublié ; or ce n'est pas le cas c'est les valeurs de a qui sont affichées

                    désolé ou est la logique

                    je ne comprends toujours pas 

                    je veux bien qu'on donne des règles mais ce n'est pas les mêmes à mon sens qui régissent le début du code et la fin 

                    bacelar me dit que je tourne en rond mais expliquez moi ce que je viens d'essayer de vous décortiquer dans ce dernier message

                    cordialement

                    • Partager sur Facebook
                    • Partager sur Twitter
                      19 octobre 2020 à 22:07:56

                      Il faut que vous compreniez que "a=b" ne veut pas dire la même chose si "a" et "b" sont des int ou des double (des Value Type) ou si "a" et "b" sont des objets "complexes", comme l'est un tableau.

                      Dans le premier cas (Value Type) "a" et "b" sont des noms qui représentent chacun une case mémoire précise. Quand vous affectez l'un à l'autre, c'est le contenu de ces cases mémoire que vous transférez/écrasez.

                      Dans le second cas (Reference Type) "a" et "b" ne sont que des références/pointeurs/"flèche" vers des objets bien plus complexe (comme des tableaux). Quand vous affectez l'un à l'autre, ce n'est que la "flèche" que vous écrasez, les objets référencés ne sont pas copiés les uns dans les autres.

                      >de la ligne 31 à 34 c'est b de 0 à 3

                      Ligne 24 : "b = a"

                      Donc, depuis la ligne 24, "a" et "b" référencent le même objet.

                      APRES LA ligne 24, modifier l'objet référencé par "b" modifiera aussi l'objet référencé par "a" CAR C'EST LE MEME.

                      "b(0)" n'est pas la première case de "b", c'est la première case de l'objet référencé par "b", donc aussi par "a" APRES la ligne 24.

                      >on ne retient que les valeurs de b

                      Après la ligne 24, l'objet référencé par "b" et par "a" est le même. Les modifications faites via "b" sont visibles en passant par "a".

                      L'objet référencé par "a" AVANT la ligne 24 n'est plus accessible par aucune autre variable référence, il sera donc "détruit" automatiquement par le garbage-collector à la prochaine "collection" (~quelques secondes en fonction de la pression sur la mémoire).

                      >celles de a ne sont plus pris en compte

                      Si, "a" et "b" référence le même objet. Les modifications faites via "b" sont aussi visible quand on passe par "a". "a" et "b" sont des flèches qui pointent sur le même objet. Si vous modifiez l'objet via "a" mais quand suite vous remodifiez l'objet via "b", c'est ces DERNIÈRES qui seront visibles, parce que c'est les dernières, qu'elles aient été faites via "a" ou "b" ON S'EN COGNE.

                      >on affiche deux fois les lignes de b à partir du code des lignes 36 à 39

                      La ligne 36 n'a aucun effet, "a" et "b" référence déjà le même objet depuis la ligne 24.

                      La boucle des lignes 37 à 40 affiche 2 fois le même objet, une fois en passant pas "a" et une autre fois en passant par "b".

                      >mais si on remonte aux lignes 14 à 17 c'est bien les valeurs de b...

                      Avant la ligne 24, "a" et "b" référencent des objets DISTINCTS. Dernier ou pas, on s'en fout. 

                      >donc on devrait avoir deux fois les valeurs de b à partir du code des lignes 24 à 28

                      Pouvez-vous être plus précis, SVP ? à partir de la ligne 24 "a" et "b" référencent le même objet, il n'a pas de "copie" de l'un dans l'autre.

                      "a" et "b" ne sont pas des tableaux, mais des références/flèches vers des tableaux.

                      Tant que vous ne distinguerez pas les 2 types de classe (Value Type VS Reference Type) vous serez bloqué.

                      Je trouve que la syntaxe de VB.NET, tout droit sortie de cette horreur qu'était Visual Basic (qui n'était même pas objet) est une chose qui complexifie la moindre chose, C# est plus carré là-dessus.

                      "a(x)" en VB.NET est en fait un raccourci d'écriture (syntaxical sugar) et devrait s'écrire "a.Item(0)".

                      "a" est la référence (la variable), le "." pour indiquer qu'on suit la flèche stockée dans "a", "Item" est la propriété d'un tableau qui contient tous les éléments du tableau, et comme Item est une collection, on précise l'indice qui nous intéresse.

                      Comme vos tableaux sont des tableaux de String et qu'une String est un type Reference, "a.Item(0)" renvoie une référence vers une "String" est non une String. Quand vous faites 'a.Item(0) = "toto"' vous ne faites que remplacer la flèche/référence stockée dans la première cellule du tableau par une autre flèche/référence qui pointe vers un objet de type String qui contient "toto". Les String vont jusqu'à avoir une zone mémoire qui leur est totalement réservées. Les tableaux de string ne contiennent pas de string mais des références/flèches vers des strings. Ces flèches pointant donc vers des éléments/objets contenus dans cette zone réservées aux "String".

                      • Partager sur Facebook
                      • Partager sur Twitter
                      Je recherche un CDI/CDD/mission freelance comme Architecte Logiciel/ Expert Technique sur technologies Microsoft.
                        20 octobre 2020 à 9:49:06

                        Sub Main()
                                Dim a(3) As String
                                Dim b(3) As String
                        
                                a(0) = "oui"
                                a(1) = "non"
                                a(2) = "yes"
                                a(3) = "not"
                                For i = 0 To 3
                                    Console.WriteLine(a(i))
                        
                        
                                Next
                                b(0) = "ya"
                                b(1) = "nein"
                                b(2) = "si"
                                b(3) = "no"
                        
                                For i = 0 To 3
                        
                                    Console.WriteLine(b(i))
                                Next
                        
                                b = a
                                For i = 0 To 3
                                    Console.WriteLine(a(i))
                                    Console.WriteLine(b(i))
                                Next
                        
                                a(0) = "oui"
                                a(1) = "non"
                                a(2) = "yes"
                                a(3) = "not"
                        
                                b(0) = "ya"
                                b(1) = "nein"
                                b(2) = "si"
                                b(3) = "none"
                        
                                b = a
                                For i = 0 To 3
                                    Console.WriteLine(a(i))
                                    Console.WriteLine(b(i))
                                Next

                        il m'affiche:

                        oui

                        non

                        yes

                        not

                        ya

                        nein

                        si

                        no

                        oui

                        oui

                        non

                        non

                        yes

                        yes

                        not

                        not

                        ya

                        ya

                        nein

                        nein

                        si

                        si

                        none

                        none

                        a la ligne 31 je repars à zéro puisque je lui remets les deux tableaux donc a existe toujours 

                        pourquoi m'affiche t il deux fois le b alors que dans le premier cas il m'affiche deux fois a ; là je lui ai remis a et je lui ai redit b=a donc je suis reparti de zéro 

                        ou je suis complètement obtus ou je n'arrive pas à comprendre ce que vous voulez me transmettre malgré le temps que vous y passez 

                        j'ai bien compris ce que sont  les variables par rapport au tableau mais là j'ai l'impression que j'écris deux fois la même chose et qu'il me répond deux choses différentes

                        admettons que dans la première partie du code après avoir dit b=a tout pointe vers a ou vers b puisque c'est la même chose  il m'affiche deux fois

                        les valeurs de a ou de b d'ailleurs puisque désormais b pointe aussi vers les valeurs de a 

                        pourquoi dans la seconde partie du code ou j'ai tout remis à zéro en quelque sorte   le fait de faire b=a donc je repars avec un nouveau a qui n'a plus disparu il m'affiche les valeurs de b 

                        pour moi je n'avance pas 

                        quant aux docs de microsoft qui commencent une phrase en francais et finissent en anglais et donnent des exemples tellement compliqués qu'on n'y comprend rien

                        cordialement 

                        • Partager sur Facebook
                        • Partager sur Twitter
                          20 octobre 2020 à 11:20:08

                          non tu ne repars pas de zéro à la ligne 30, a et b sont toujours le même objet puisqu'on ne leur dit pas qu'il sont autre chose que ce qu'ils sont, on ne fait que changer les valeurs que le tableau contient.

                          Pour repartir à zéro, il faut explicitement leur dire que ce sont de nouveaux tableaux (du moins pour l'un des deux) et leur affecter un nouveau tableau:

                          a= new String(3)

                          b=new String(3)

                          Quand tu crées le tableau (dim a(3) as String), a contient l'adresse d'une zone mémoire qui va contenir le tableau que l'on va parcourir avec leur index donc il seront à (adresse contenue par a)+index; idem pour b qui aura l'adresse d'une autre zone mémoire pour son tableau.

                          Quand on fait b=a, on donne à b la valeur de a, soit l'adresse de la zone mémoire du tableau de a (c'est pour ça que l'on perd le tableau initial de b); donc que l'on fasse a(1) ou b(1) on ira toujours au même endroit (adresse contenue par a) +1 

                          Donc la seule façon de repartir à 0, c'est de réaffecter à b l'adresse d'une nouvelle zone mémoire pouvant contenir un tableau, via new String(3).

                          (Un ReDim n'aurait pas marcher non plus, il redimensionnera simplement le tableau)

                          • Partager sur Facebook
                          • Partager sur Twitter
                            20 octobre 2020 à 12:11:09

                            donc si je te comprends bien quand dans le premier code à la ligne 24 : b=a je fais :

                            pour te citer on donne à b la valeur de a, soit l'adresse de la zone mémoire du tableau de a (c'est pour ça que l'on perd le tableau initial de b);donc le tableau b disparait donc quand je lui dis console.writeline(a(i)) et console.writeline(b(i)) il m'affiche deux fois a puisque b n'existe plus 

                            puis à la ligne 40 on fait b=a que se passe t il puisque b est toujours disparu , à mon sens en faisant b=a je repointe vers a puisque tu dis que b a disparu , pourquoi m'affiche t il les valeurs de b ?

                            cordialement 

                            • Partager sur Facebook
                            • Partager sur Twitter
                              20 octobre 2020 à 12:55:23

                              les tableaux sont des zones mémoires, dont le nom correspond à leur adresse, donc au début a et b contiennent 2 adresses différentes, quand tu fais b=a, b contient la même adresse que a donc redirige vers la même zone mémoire, donc a(i) et b(i) c'est la même chose (on a oublié où se trouve la précédente zone qui était utilisé par b)

                              tu refais exactement la même chose (pourquoi en serait-il autrement ?) sauf que au final, ça ne change rien, les 2 ayants la même valeurs avant l'opération.

                              ça affiche le résultat des affectations que tu fais par b(i) puisque ce sont les dernières que tu fais avant l'affichage. pour se répéter encore, que tu fasses b(1) ou a(1) ça revient strictement au même après que tu ai fait b=a puisque c'est le même objet. Quand tu fais a(0)="oui"  puis après b(0)="ya" tu écris au même endroit, donc c'est comme si a(0)="oui" n'avait pas été fait (et tu aurais écrit b(0)="oui" puis a(0)="ya", tu auras toujours "ya", la dernière valeur affectée à l'indice 0 du tableau d'adresse a (ou b))

                              On ne fait que répéter la même réponse depuis le début.

                              On peut essayer une autre analogie (pas forcément strictement correcte ni parfait) mais bon:

                              Mr A habite "rue des ours", Mme B habite "rue des oeillets". chacun dispose d'un casier de bouteilles de lait, donc pour remplir chacun des casiers, on doit se rendre à chacune des adresses (chaque habitant n'a accès qu'au casier de son habitation).

                              Mme B décide de vivre avec Mr A, ils ont donc la même adresse (b=a) et partage alors le même casier de bouteilles de lait (1 seul casier par adresse); donc pour remplir le casier, il faut se rendre à une seule adresse (celle de Mr A ou celle de Mme B puisque c'est la même). Donc si Mr A mets une bouteille de lait chocolaté dans la 1ère case du casier, et qu'ensuite Mme B y met une bouteille de lait à la fraise, au final, il y aura dans cette 1ère case, une bouteille de lait à la fraise.

                              Une fois qu'ils habitent ensemble dire que Mr A habite à l'adresse de Mme B (a=b) ou dire que Mme B habite à l'adresse de Mr A (b=a), ça revient au même.

                              ça se passe mal, Mme B habite un nouveau logement, donc a une nouvelle adresse (new String(3)) et a donc son propre casier de bouteilles de lait. Donc si Mr A place une bouteille de lait chocolaté dans la 1ère case de son casier, Mme B ne l'aura pas (sauf elle fait de même).

                              • Partager sur Facebook
                              • Partager sur Twitter
                                20 octobre 2020 à 16:29:39

                                Merci

                                 cette fois ci j’ai compris grace aux bouteilles de lait

                                merci à tous pour le temps passé

                                cordialement

                                • Partager sur Facebook
                                • Partager sur Twitter

                                a.copy et a.clone

                                × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                                × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                                • Editeur
                                • Markdown