Jak to jest z przekazywaniem tablic do funkcji ?

0

Od razu zaznaczam, że z Javą mam do czynienia od niedawna - dopiero 2 semestr piszemy w niej na studiach. Przedtem pisałem w C++.

Mam taki problem:

Z kilku tutoriali dowiedziałem się, że przekazywanie parametrów do funkcji w Javie odbywa się tylko przez wartość. Trochę mnie to zdziwiło, bo w c++ miałem aż 3 możliwości na przekazanie argumentu, no ale co tam.
Już się do tego przyzwyczaiłem, ale pisząc pewien program napotkałem coś co mnie zdziwiło.
Ten dziw demonstruje poniższy programik:

public class test {

    public test() {
    	
    }
    
    public void funkcja1(){
    	
    	int [][]tab2D = new int [2][2]; // to jest tablica testowa, dwuwymiarowa
    	int x=1;
    	int i,j;
    		
    	for(i=0; i<2; ++i){
    		
    		for(j=0; j<2; ++j){
    			
    			tab2D[i][j]=1;		// wypełniam ją jakimiś wartościami
    		}
    	}
    	
    	System.out.println("Początkowo x=" + x);
    	System.out.println("Tablica na początku");
    	wypisz(tab2D);
    	
    	funkcja2(tab2D[0],x);	// zerowy wiersz tej tablicy do funkcji, która go zmodyfikuje
    	
    	System.out.println("Po zakończeniu funkcji2, x=" + x);
    	System.out.println("Tablica po wykonaniu funkcji2");
    	wypisz(tab2D);
    	
    }


    public void funkcja2(int tabl[], int w){
    	 
    	int i;
    		
    	for(i=0; i<2; ++i){
    			
    			tabl[i]=2;	// modyfikacja wartości w tablicy
    	}
  
    	w=2;
    }    
    	
    	
    public void wypisz(int tabl[][]){
    	
    	int i,j;
    		
    	for(i=0; i<2; ++i){
    		
    		for(j=0; j<2; ++j){
    			
    			System.out.println(tabl[i][j]);
    		}
    	}
    }
    
    
    static public void main( String arg[] ){
    	
    	test foo = new test();
    	foo.funkcja1();
    }
    
}

Wynik działania tego programu to:

Początkowo x=1
Tablica na początku
1
1
1
1
Po zakończeniu funkcji2, x=1
Tablica po wykonaniu funkcji2
2
2
1
1

Tak więc funkcja2 zmodyfikowała fragment tablicy, który jej przesłałem i wynik tych modyfikacji
jest widoczny "z zewnątrz".

O co chodzi ?
Dlaczego tak się stało, skoro parametry w Javie mają być przekazywane przez wartość ?

Przekazana do funkcji2 zmienna x zachowuje się tak jak podejrzewałem, nie zmienia wartości poza ciałem funkcji, no ale tablica została zaalokowana dynamicznie przy użyciu new (myślę, że tu jest pies pogrzebany).

Jak zmienić ten program, by funkcja2 nie modyfikowała przekazanej jej tablicy ?

W tej chwili omijam ten problem kopiując w funkcji2 tablicę przekazaną do niej jako argument i wykonując wszystkie operacje na tej kopii, ale jest to czasochłonne a ja potrzebuję szybko działającego programu.
( problem napotkałem pisząc midlet a wiadomo jak to jest z mocą obliczeniową komórek ).

Pomóżcie.

0

W Javie typy podstawowe są przekazywane przez wartość, a obiekty (czyli także tablice) przez referencję.

0

Tablica jest obiektem, wartością każdej zmiennej obiektowej jest wskaźnik do niej i on jest przekazany do funkcji funkcja2().
pozdrawiam

0

No to mnie wyprowadziliście z błędu [wstyd] .
Dzięki.

Czyli nie ma sposobu, poza pracą w obrębie funkcji na kopii, aby przekazana
przeze mnie tablica nie zmieniła się ??

0

Oczekujesz czegoś takiego:

  • jest sobie tablica t1
  • wewnątrz funkcji funkcja2 jest tablica t2, która ma takie same elementy jak t1
  • zmiany w tablicy t2 nie mają wpływu na zawartość tablicy t1
  • tablica t2 nie powstaje z tablicy t1 przez kopiowanie wyraz po wyrazie.
    Bez ingerencji boskiej (nazywanej cudem), to się uda.
    pozdrawiam
0

Hehe, ok.
Czyli muszę zostać przy tworzeniu kopii tablicy w funkcji.

Dzięki, temat zamknięty.
Pozdrawiam.

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