Nadpisywanie zmiennych?

0

Witam serdecznie, od wielu dni męczę się z jednym problemem - mam kod w Javie - podaję urywek:

 float[][][]PD = new float[9][9][9];
        float[][][]RD = new float[9][9][9];
        float[][][]PC4 = new float[9][9][9];
        float[][][]Z_polowa = new float[9][9][9];
        float[][][]Z = new float[9][9][9];

        PD = this.projekcjaNaD(Z1, Z2, Z3, Z4);
        RD = this.odbicie(PD, Z4);
        PC4 = this.projekcjaNaC4(RD, oryginalna_plansza);

Problem jest niewytłumaczalny: do zmiennej PD jest przypisywana tablica 9x9x9 - jest OK. Do zmiennej RD też jest przypisywana tablica 9x9x9. Natomiast w momencie wykonywania kolejnej linii kodu (w momencie przypisywania wartosci do zmiennej PC4) nie wiem jakim cudem, ale zmienna RD zmienia wartość! Macie jakieś pomysły dlaczego tak się dzieje? zmienna oryginalna_plansza jest przekazywana z innej klasy i jest to zwykła tablica 9x9...Dodam, że jak w kodzie funkcji projekcjaNaC4 usunę parametr oryginalna_plansza, wtedy zmienna RD nie zmienia wartości...Błagam o pomoc!

0

Idź do wróżki albo podaj kod funkcji projekcjaNaC4().</b>

0

Po mojemu to funkcja zmienia ci wartość zmiennej która pewnie jest globalna.

Oczywiście to jest strzał, ale nic więcej bez kodu funkcji powiedzieć nie można.

0
Karton - niezalogowany napisał(a)

Po mojemu to funkcja zmienia ci wartość zmiennej która pewnie jest globalna.

Oczywiście to jest strzał, ale nic więcej bez kodu funkcji powiedzieć nie można.

Oto kod funkcji projekcjaNaC4:

public float[][][] projekcjaNaC4(float[][][] szescian, float[][] planszunia) throws Exception   //Projekcja na zbior C4
     {
        float[]tempw=new float[9];
        float[]tempv=new float[9];
        float[][][] Pc4 = new float[9][9][9];
        Pc4=szescian;

        for(int i=0; i<9; i++) //piętra
        {
            for(int j=0; j<9; j++) //wiersze
            {
                if(planszunia[i][j]>0)
                {
                    tempw=makeunit((int) planszunia[i][j]);
                    for (int k=0; k<9; k++)
                    {
                        Pc4[k][i][j]=tempw[k];
                    }
                }
                if(planszunia[i][j]==0)
                {
                    for (int k=0; k<9; k++)
                                {
					tempv[k]= szescian[k][i][j];
				}
				tempw=unitproj(tempv);
				for (int k=0; k<9; k++)
                                {
					Pc4[k][i][j]=tempw[k];
				}
                }

            }
        }
        return Pc4;
     }

Dodam, że mam 3 inne prawie identyczne funkcje takie jak ta z mojego pierwszego listingu z ta roznica ze wywolywana jest funkcja projekcjanaC4, która ma dodatkowy parametr "oryginalna_plansza" - jeśli ten parametr usunę, zmienna nie zmienia swej wartości... Pytanie zatem co ma tablica oryginalna_plansza do zmiennej RD?

0

też miałem z czymś takim problem, nie znalazłem nigdzie dokładnej odpowiedzi 'dlaczego tak się dzieje', ale stworzyłem w miare własnych możliwości 'własną wizję' ;). No mniejsza jak to nazwiesz (możliwe, że w Javie tak już po prostu jest, a nigdzie wcześniej o tym nie wyczytałem), powiem Ci co pokazały moje własne testy (jak już doszedłem 'co może się dziać').

O ile nadawanie wartości danemu POLU (zmiennej danego obiektu) na podstawie wartości innego POLA, daje oczekiwany rezultat (bez udziwnień), wszystko jest proste, czyli:

int a=5,b=7; System.out.println(a+" "+b);
a=b; System.out.println(a+"  "+b);
a=65; System.out.println(a+"  "+b);
b=32; System.out.println(a+"  "+b);
a=54; System.out.println(a+"  "+b);

taki fragment kodu, dałby Output:

5 7
7 7
65 7
65 32
54 32

wszystko fajnie, wszystko się miło układa. Ale zauważyłem, że w przypadku wykonywania operacji nie na pojedynczym polu, ale na całym obiekcie (albo chociażby tablicy), nie tylko 'nadajemy wartości', ale 'bindujemy' obiekty. Fragment kodu: 'a=b', gdzie a i b to nie 'pola', tylko obiekty, nie nadaje obiektowi a wartości b (czyli innymisłowy, nie nadpisuje wszystkich pól obiektu a wartościami pól obiektu b), tylko wtedy: mamy już jakby (tak to nazwałem): 'jeden obiekt z dwiema referencjami'. Czyli po prostu obiekty są zbindowane, zmieniająć wartości obiektu b, zmienią się wartości obiektu a i na odwrót. Zrobiłem dalszy test (na podstawie tego wyżej, to już dawno było, w każdym razie, wyszło coś takiego):

int[] a={5},b={7}; System.out.println(a[0]+"  "+b[0]);
a=b; System.out.println(a[0]+"  "+b[0]);
a[0]=65; System.out.println(a[0]+"  "+b[0]);
b[0]=32; System.out.println(a[0]+"  "+b[0]);
a[0]=54; System.out.println(a[0]+"  "+b[0]);

to dałoby Output:

5  7
7  7
65  65
32  32
54  54

, co potwierdziło moją hipotezę ;D. Miłoby było, gdyby odezwał się ktoś kto wie coś w tym temacie więcej niż 'z autopsji', po własnych testach (jak chociażby ta moja odpowiedź).

Nawiązując do Twojego kodu: metoda pobiera tablice 'RD' jako parametr 'szescian', dla którego potem stosujesz 'Pc4 = szescian'. Innymi słowy, bindujesz 'szescian' (czyli tak na prawdę 'RD') z inną tablicą, na której wykonujesz w tej metodzie jakieś działania. Jak to ominąć? Stwórz nową tablicę na podstawie tej 'szescian' (nie Pc4 = szescian, tylko potrójnym 'for'em' przeleć przez wszystkie elementy 'szescian'u' z Pc4[i][j][k] = szescian[i][j][k]) i dopiero na niej działaj.

pozdrawiam

0

Kufa no panowie przeciez ta metoda zmienia ten szescian:

public float[][][] projekcjaNaC4(float[][][] szescian, float[][] planszunia) throws Exception   //Projekcja na zbior C4
     {
        float[]tempw=new float[9];
        float[]tempv=new float[9];
        float[][][] Pc4 = new float[9][9][9]; // bez sensu tworzenie nowej skoro w nastepnej linijce jest zapominana
        Pc4=szescian; // od teraz tablica na ktora pokazuje szescian rowniez jest dostepna przez referencje o nazwie Pc4 - obie referencje pokazuja ta sama tablice, zatem zmiana przez Pc4 bedzie widoczna w szescian - cala tajemnica

        for(int i=0; i<9; i++) //piętra
        {
            for(int j=0; j<9; j++) //wiersze
            {
                if(planszunia[i][j]>0)
                {
                    tempw=makeunit((int) planszunia[i][j]);
                    for (int k=0; k<9; k++)
                    {
                        Pc4[k][i][j]=tempw[k]; // zmiana Pc4 a wiec i szescian
                    }
                }
                if(planszunia[i][j]==0)
                {
                    for (int k=0; k<9; k++)
                                {
                                        tempv[k]= szescian[k][i][j];
                                }
                                tempw=unitproj(tempv);
                                for (int k=0; k<9; k++)
                                {
                                        Pc4[k][i][j]=tempw[k]; // zmiana Pc4 a wiec i szescian
                                }
                }

            }
        }
        return Pc4;
     }

Przeczytajcie komentarze, a pozniej Maletula przeczytaj o sposobie przekazywania parametrow w javie, przyda Ci sie to na pewno.

0
::. napisał(a)

Kufa no panowie przeciez ta metoda zmienia ten szescian:

public float[][][] projekcjaNaC4(float[][][] szescian, float[][] planszunia) throws Exception   //Projekcja na zbior C4
     {
        float[]tempw=new float[9];
        float[]tempv=new float[9];
        float[][][] Pc4 = new float[9][9][9]; // bez sensu tworzenie nowej skoro w nastepnej linijce jest zapominana
        Pc4=szescian; // od teraz tablica na ktora pokazuje szescian rowniez jest dostepna przez referencje o nazwie Pc4 - obie referencje pokazuja ta sama tablice, zatem zmiana przez Pc4 bedzie widoczna w szescian - cala tajemnica

        for(int i=0; i<9; i++) //piętra
        {
            for(int j=0; j<9; j++) //wiersze
            {
                if(planszunia[i][j]>0)
                {
                    tempw=makeunit((int) planszunia[i][j]);
                    for (int k=0; k<9; k++)
                    {
                        Pc4[k][i][j]=tempw[k]; // zmiana Pc4 a wiec i szescian
                    }
                }
                if(planszunia[i][j]==0)
                {
                    for (int k=0; k<9; k++)
                                {
                                        tempv[k]= szescian[k][i][j];
                                }
                                tempw=unitproj(tempv);
                                for (int k=0; k<9; k++)
                                {
                                        Pc4[k][i][j]=tempw[k]; // zmiana Pc4 a wiec i szescian
                                }
                }

            }
        }
        return Pc4;
     }

Przeczytajcie komentarze, a pozniej Maletula przeczytaj o sposobie przekazywania parametrow w javie, przyda Ci sie to na pewno.

Eh eh, czlowiek różne głupoty pisze... Już wszystko śmiga... po prostu usunąłem PC4=szescian... I po sprawie... Dzięki za pomoc!

1 użytkowników online, w tym zalogowanych: 0, gości: 1