Visualizzazione dei risultati da 1 a 4 su 4
  1. #1

    [VB 2008] - (AGGIUNTO CODICE) Passaggio di una Matrice come parametro in una Sub

    Mi aiutate a capire perchè succede questo???

    1) creo una matrice
    2) La carico con tutti gli elementi pari a 5
    3) Trasferisco alla Sub la matrice come parametro [passaggio(matrix)]
    4) Il trasferimento avviene per valore [ByVal temp(,) As Single]
    5) Nella Sub cambio tutti i valori a 20 alla matrice "temp"

    Ora se vado a vedere gli elementi della matrice "matrix" (quella iniziale per intenderci) hanno tutti valore 20.

    DOMANDA?
    Perchè succede questo? Ho passato i valori come ByVal e quindi non dovevano modificarsi.
    Rifacendo il tutto con un numero invece che con una matrice effettivamente il valore iniziale resta corretto.

    Perchè questa differenza di comportamento???

    Grazie in anticipo e ciao


    codice:
    'Nota: Servono 1 Button e 2 ListBox (se desiderate provarlo)
    
        Dim matrix(2, 1) As Single    'Definisco la matrice
    
    
        Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    
            matrix(0, 0) = 5
            matrix(1, 0) = 5
            matrix(2, 0) = 5
    
            matrix(0, 1) = 5
            matrix(1, 1) = 5
            matrix(2, 1) = 5
    
    
    
            'Visualizza i valori iniziali della matrice
            For q As Integer = 0 To 2
                ListBox1.Items.Add(matrix(q, 0) & vbTab & matrix(q, 1))
            Next
    
            'Chiamata al Sub
            passaggio(matrix)
    
            'Visualizza i valori della matrice DOPO L'ORDINAMENTO
            For q As Integer = 0 To 2
                ListBox2.Items.Add(matrix(q, 0) & vbTab & matrix(q, 1))
            Next
    
    
        End Sub
    
    
        Sub passaggio(ByVal temp(,) As Single)
    
            For k As Integer = 0 To 2
                For m As Integer = 0 To 1
                    temp(k, m) = 20
                Next
            Next
        End Sub

  2. #2
    Utente di HTML.it
    Registrato dal
    Apr 2009
    Messaggi
    970
    Perchè gli array sono di tipo Riferimento.
    Per cui una variabile di tipo array è solo un riferimento o puntatore all'area di memoria dove viene allocato l'array, indi per cui quando tu passi come parametro un'array in realtà tu passi un riferimento all'array originale e le modifiche successive si ripercuotono anche sull'array di origine.
    Sbagliare è umano, perseverare è diabolico.

  3. #3
    Quindi la dichiarazione:
    Sub passaggio(ByVal temp(,) As Single)
    con ByVal è errata? e deve essere sempre sostituita con ByRef????

    Grazie per il chiarimento

  4. #4
    Utente di HTML.it
    Registrato dal
    Apr 2009
    Messaggi
    970
    Quindi la dichiarazione:
    Sub passaggio(ByVal temp(,) As Single) con ByVal è errata?
    No, assolutamente.

    e deve essere sempre sostituita con ByRef????
    No assolutamente, forse mettendo ByRef è più intuitivo pensare a come viene trasformata la matrice.

    Se hai la necessità di mantenere una copia originale, l'array espone il metodo .Clone.

    Forse quest'esempio ti potrebbe togliere qualche dubbio:

    codice:
     Dim array1() As Single = {7, 8}
            Dim array2() As Single
            Dim array3() As Single
            array2 = array1
            array3 = CType(array1.Clone, Single())
            array1(0) = 0
            Console.WriteLine(array2(0))
            Console.WriteLine(array3(0))
    Vedrai che l'array 'array2' è stato modificato mentre l'array 'array3' rimane inalterato.
    Sbagliare è umano, perseverare è diabolico.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.