Visualizzazione dei risultati da 1 a 5 su 5

Discussione: problemi con matrice

  1. #1

    problemi con matrice

    Ciao a tutti.
    Ho un problema con una matrice di 90 linee x 12 colonne, le prime 45 linee le ho scritte manualmente ma le altre sono copie delle prime esclusa la colonna 11. Se ne altero il contenuto nelle ultime 45 linee mi altera anche le prime. Come mai e come risolverlo?

    premesso che le prime 45 linee contengono:
    matrice[indice][11] = "images/dorsi/dorso1.jpg";

    le altre le modifico così:

    for( cicloMatri = 46; cicloMatri < 91; cicloMatri ++){
    matrice[ cicloMatri ] = matrice[ cicloMatri - 45 ];
    matrice[ cicloMatri ][11] = "images/dorsi/dorso2.jpg";
    };

    grazie.

  2. #2
    Moderatore di CSS L'avatar di KillerWorm
    Registrato dal
    Apr 2004
    Messaggi
    5,771
    Ciao e benvenuto, in JavaScript gli array e gli oggetti vengono "passati" sempre per riferimento, mai per valore.

    Tu hai un array di array, cioè ogni voce dell'array esterno è a sua volta un array, per cui quando fai questo matrice[46] = matrice[0] stai assegnando il riferimento di matrice[0] (che è di per sé un array) su matrice[46]; per tale motivo, modificando matrice[46] stai sostanzialmente modificando l'array originale definito su matrice[0].

    Per forzare il passaggio del valore si può fare in vari modi; il metodo più comune è quello di usare slice() perché questo preleva il contenuto dell'array e lo restituisce come nuovo valore.

    Puoi fare quindi una cosa del genere:
    codice:
    for( cicloMatri = 46; cicloMatri < 91; cicloMatri ++){
      matrice[ cicloMatri ] = matrice[ cicloMatri - 45 ].slice();
      matrice[ cicloMatri ][11] = "images/dorsi/dorso2.jpg";
    };
    .
    Ovviamente se all'interno degli array interni hai degli ulteriori array o oggetti, questi saranno comunque passati sempre per riferimento.

    Cioè se, ad esempio, il tuo matrice[0][0] è uguale a ['pippo','topolino], cioè un array a 3 dimensioni, in questo caso il semplice slice() sulla seconda dimensione passerà comunque per riferimento l'array della terza dimensione.

    Se questo è il tuo caso, e se hai bisogno di passare tutte le dimensioni per valore, dovrai adoperare un altro metodo.

    Fai sapere
    Installa Forum HTML.it Toolset per una fruizione ottimale del Forum

  3. #3
    Grazie KillerWorm.
    Ho risolto scrivendo manualmente le altre 45 linee.
    Da quel che ho capito il problema mi si è proposto perchè sono all'interno della stessa matrice, se dovessi usare il valore di una matrice in un'altra questo non succederebbe, vero?

  4. #4
    Moderatore di CSS L'avatar di KillerWorm
    Registrato dal
    Apr 2004
    Messaggi
    5,771
    Ho risolto scrivendo manualmente le altre 45 linee.
    A mali estremi, estremi rimedi

    Da quel che ho capito il problema mi si è proposto perchè sono all'interno della stessa matrice
    Non esattamente. Il problema sta proprio nella definizione degli array che di fatto sono gestiti per riferimento.

    Il tuo caso è particolare perché stai lavorando con un array bidimensionale, sostanzialmente un array di array.

    Analizzando però un caso più semplice forse riesco a porlo in maniera più semplice.

    Considera questo esempio:
    codice:
    // Definisco un array
    var arrX = ['a','b','c'];
    
    // Passo l'array ad una seconda variabile.
    // Questo passaggio avviene sempre per riferimento
    var arrY = arrX;
    
    // Ora modifico un elemento della seconda variabile.
    arrY[0] = 'pippo';
    
    // Faccio un output del primo array
    alert(arrX); // output: ['pippo','b','c']
    Da notare che nonostante abbia modificato l'array della seconda variabile (arrY) è stato modificato anche l'array della prima variabile (arrX); questo perché alla seconda variabile (arrY) è stato assegnato un riferimento dell'array definito nella prima variabile, non il suo valore.

    Il discorso non cambia nel caso di array a più dimensioni.

    Gli array interni sono a loro volta degli oggetti array in tutto e per tutto, quindi puoi passarli a qualsiasi altra variabile (che sia questa una semplice variabile o un elemento di un array); questo passaggio avviene sempre per riferimento.

    Considera questo esempio, analogo al precedente ma in cui ho usato un array bidimensionale:
    codice:
    // Array principale
    var arr = [];
    
    // Definisco un array secondario assegnandolo all'elemento 0 dell'array principale
    arr[0] = ['a','b','c'];
    
    // Passo l'array secondario all'elemento 1 dell'array principale.
    // Questo passaggio avviene sempre per riferimento dal momento che sto passando un array.
    arr[1] = arr[0];
    
    // Ora modifico un elemento dell'array secondario definito nell'elemento 1 dell'array principale
    arr[1][0] = 'pippo';
    
    // Faccio un output dell'elemento 0 dell'array principale
    alert(arr[0]); // output: ['pippo','b','c']
    .
    Anche in questo caso il risultato è uguale al precedente, con la sola differenza che ho usato degli elementi di un array anziché delle semplici variabili, esattamente come il tuo caso.

    Per cui, il fatto che tu sia all'interno della stessa matrice è irrilevante, conta solo il fatto che stai passando le matrici interne ad un'altra variabile (che sia una semplice variabile o un elemento della matrice principale), e questo avviene per riferimento.

    Spero di aver chiarito o, quantomeno, di non averti confuso maggiormente le idee
    Installa Forum HTML.it Toolset per una fruizione ottimale del Forum

  5. #5
    OK. Grazie, sei stato molto chiaro. Ho capito così di avere dei problemi anche in altre parti del programma.

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.