Wątek przeniesiony 2014-06-08 19:28 z Java przez bogdans.

Kopiowanie elementow z tab1[][] do tab2[][], aż do wybranego momentu

0

Witam przewertowałem 2 książki( Java kompednium programisty i jeszcze podstawy programowania w Javie), i wiele stron lecz natrafiałem na inne przypadki niż mój.

Próbowałem starego dobrego sposobu z języka C++,

   for(int i = 0; i < w; i++)
        {
            for(int j = 0; j <k; j++)
            {  System.out.println("koduje...\n" ); 
                bin[i][j] = q1[i][j];

            }
        }

No ale potem wyczytałem, że nie da rady i trzeba uzyć funkcji wbudowanej:
System.arraycopy(q1, 0, bin, 0, 7);

Jak dla jednowymiarowej tablicy działa, tak dla dwuwymiarowej już nie. Proszę o radę za wszystkie odpowiedzi uprzejmie dziękuję :)
Pozdrawiam
darthachill

1

A jaki jest problem? Tzn. czego oczekiwałeś, a co otrzymałeś?

0
  1. Napisz dokładnie co masz na wejściu i co masz mieć na wyjściu.
  2. Użyj jakiejś bardziej obiektowej struktury dostępnej w Javie - np. List lub HashMap.
1
darthachill napisał(a):

(...)
No ale potem wyczytałem, że nie da rady i trzeba uzyć funkcji wbudowanej

Co to znaczy "nie da rady"?
Tablice jakich typow chcesz kopiowac?
Pamietaj, ze dla tablicy obiektow jesli chcesz otrzymac deep copy, musisz jeszcze (dowolna) metoda skopiowac kazdy element z osobna. Inaczej otrzymasz tablice referencji do tych samych obiektow. Masz jeszcze Arrays.copyOf() ale poza tym ze nie wymaga tablicy docelowej, metoda obciazona jest tym samym ograniczeniem.

darthachill napisał(a):

Jak dla jednowymiarowej tablicy działa, tak dla dwuwymiarowej już nie.

Java nie posiada tablic wielowymiarowych. Kiedy deklarujesz tablice jako dwuwymiarowa tak na prawde otrzymujesz 1-wymiarowa tablice 1-wymiarowych tablic.
Z tego wzgledu jedyne co mozesz zrobic to:

void copyArray(int[][] src, int[][] target) {
    for (int i = 0; i < src.length; i++) 
        System.arraycopy(src[i], 0, target[i], 0, src[i].length);
}

Z punktu widzenia wydajnosci byla to bardzo zla decyzja ze strony projektantow Javy. Wynikajacy z tego brak lokalnosci referencji i zbedny pointer chasing prowadzi np do tego ze procesor nie jest w stanie prefetchowac kolejnych elementow. Poza tym przy wielowymiarowych tablicach zawartość często zostaje rozstrzelona po wielu stronach wiec skanowanie często zalicza kosztowny TLB miss.

0

Dziękuję Ci bardzo Wojciechu bardzo mi pomogłeś, niestety natrafiłem na kolejny problem, dotyczy on dynamicznego tworzenia tablic. Problem pojawia się przy kompilowaniu na lini System.out.print(" " + bin[w][k]); w metodzie public void tablice()
otrzymuję błąd: java.lang.ArrayIndexOutOfBoundsException: 4. Niestety sam nie potrafię sobie poradzić z tym problemem nawet przy pomocy literatury, nie ukrywam, że brak mi doświadczenia dlatego zwracam się z prośbą o wytłumaczenie w czym tkwi problem i jaki głupi błąd zrobiłem.
Bardzo dziękuję za pouczające odpowiedzi.

import java.util.Scanner; // gotowa fusdsdnkcja pobierajaca dane na wejsciu
import static java.lang.Math.*; // pomijamy przedrostmki math dzieki static
import java.util.*;

public class test{ 

    Scanner in = new Scanner(System.in);
    int w, k, y=16, x=4;
    char kod[][] = new char[w][k];
    char bin[][] = new char[w][k];
    public void main()
    {
        Wybor_modulo();
        Kolumna();
        tablice();
    }

    public void Wybor_modulo()
    {       
        System.out.println("Podaj modulo licznika?\n");
        int modulo = in.nextInt(); 
        if ( modulo < 2)
            System.out.println(" Modulo przynajmniej równe 2! ");  
        else if ( modulo > 16)
            System.out.println(" Modulo nie może być wieksze od 16! "); 

        w = modulo; // ilsoc wierszy odpowiada modulo
    }

    public void Kolumna() //  na podstawie ilośći wierszy określam ilosc kolumn
    {
        if( w == 2 )
            k = 1;
        else if( w <= 4)
            k = 2;
        else if( w <= 8)
            k = 3;
        else if( w <= 16)
            k = 4;            
    }

    public void tablice() // Na podstawie okreslonego Modulo koduje binarnie tablice
    {
        char q1[][] = { // 2x1 1 Przerzutnik
                {  '0' },
                {  '1' }
            }; 
        char q2[][] = { // 4x2 2 przerzutniki
                { '0', '0' },
                { '0', '1' },
                { '1', '0' },
                { '1', '1' }
            };
        char q3[][] = { // 8x3 3 przerzutniki
                { '0', '0', '0' },
                { '0', '0', '1' },
                { '0', '1', '0' },
                { '0', '1', '1' },
                { '1', '0', '0' },
                { '1', '0', '1' },
                { '1', '1', '0' },
                { '1', '1', '1' } 
            };
        char q4[][] = { // 16x4 4 przerzutniki
                { '0', '0', '0', '0' },
                { '0', '0', '0', '1' },
                { '0', '0', '1', '0' },
                { '0', '0', '1', '1' },
                { '0', '1', '0', '0' },
                { '0', '1', '0', '1' },
                { '0', '1', '1', '0' },
                { '0', '1', '1', '1' },
                { '1', '0', '0', '0' },
                { '1', '0', '0', '1' },
                { '1', '0', '1', '0' },
                { '1', '0', '1', '1' },
                { '1', '1', '0', '0' },
                { '1', '1', '0', '1' },
                { '1', '1', '1', '0' },
                { '1', '1', '1', '1' }
            };



        if( w == 2)
        {
            for (int i = 0; i < bin.length; i++) 
                System.arraycopy(q1[i], 0, bin[i], 0, bin[i].length); // funkcja kopiuje z jednej tab do 2giej do danego bin[i].lengthiersza
        }
        else if( w <= 4)
        {
            for (int i = 0; i < bin.length; i++) 
                System.arraycopy(q2[i], 0, bin[i], 0, bin[i].length);
        }
        else if( w <= 8)   
        {
            for (int i = 0; i < bin.length; i++) 
                System.arraycopy(q3[i], 0, bin[i], 0, bin[i].length);   
        }         
        else if( w <= 16)  
        {
            for (int i = 0; i < bin.length; i++) 
                System.arraycopy(q4[i], 0, bin[i], 0, bin[i].length); 
        }

        System.out.println("Utworzona tablica stanów licznika: "); 

        for(int i = 0; i < w; i++)
        {
            for(int j = 0; j < k; j++)
            {
                System.out.print(" " + bin[w][k]); 
            }
            System.out.println(); 
        }
        System.out.println("Koniec tworzenia stanow "); 
    };
}
1

Prawie na pewno chciałeś we wspomnianym wierszu napisać

System.out.print(" " + bin[i][j]);

Odróżniasz kompilację programu od jego wykonywania?

0

Tak też było napisane, tylko potem zacząłem kombinować i omyłkowo wkleiłem na forum, przepraszam za wprowadzenie w błąd.
Wracając do problemu, nie ważne do którego elementu tablicy się odwołam podczas wykonywania programu wyskoczy mi komunikat:

java.lang.ArrayIndexOutOfBoundsException: 0
Domyślam się, że błąd może znajdować się w funkcji kopiującej elementy z jednej tablicy do drugiej, albo problem leży przy tworzeniu dynamicznej tablicy.

2

Po takim kodzie:

int w,k;
char[][] bin = new char[w][k];

tablica bin ma rozmiar 0x0 i żadne późniejsze zmiany wartości zmiennych w i k nie zwiększą tej tablicy. Twórz tablicę dopiero po odpytaniu użytkownika o wartości w i k.

1

Jesli chcesz dynamicznych struktur użyj list. Jesli potrzebujesz 2 wymiarow mozesz zrobic liste list. ;)
Brzmi groźnie, ale przy bliższym poznaniu są łatwe do okiełznania, a dobrze wykorzystane mają większe mozliwosci niz zwykle tablice.

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