Autor Wątek: kopiowanie tablic  (Przeczytany 2410 razy)

Offline Edwin

  • Użytkownik

# Listopad 26, 2007, 23:10:40
Mam stringa o nazwie line, chce go podzielic na krótsze stringi metodą Split. Jeżeli zrobie to do tablicy 1 wymiarowej to jest wszystko ok, natomiast jeżeli chce do 2 wymiatowej to kompilator zgłasza błąd. Kod wygląda tak:

tab[licznik]=line.Split(separator);

albo tak:

tab[licznik, ]=line.Split(separator);

Ewentualnie jak się tego nie da zrobić, to powiedzcie mi jak przekopiować tablicę 1 wymiarową do 2 wymiatowej na i-ty poziom. Tzn coś co w c++ wyglądało by tak:

int tab[3][3];
int tab2[2]={1,2,3};
tab=tab2;

Offline Mr. Spam

  • Miłośnik przetworów mięsnych

Offline Kamil Trzciński

  • Użytkownik

# Listopad 26, 2007, 23:53:13
Witam,

Ja nie widzę problemu:
int[][] tab = new int[3][];
tab[2] = line.Split(separator);
(Powinno działać :P)

Cytuj
int tab[3][3];
int tab2[2]={1,2,3};
tab=tab2;
Kompilowałeś to na MSVC++ lub jakimś innym dowolnym kompilatorze? :P

Pozdrawiam, KT.
« Ostatnia zmiana: Listopad 27, 2007, 13:57:37 wysłana przez Kamil Trzciński »

Offline Edwin

  • Użytkownik

# Listopad 27, 2007, 00:01:00
To jest C# tutaj sie tablice dwuwymiatorowe robi tak:

string tab[3,3];

Oczywiście do 3 to tylko przykład bo potrzebyje dynamicznych. I probowalem tak zrobic, ale sie nie da.

Offline Xion

  • Moderator
    • xion.log

# Listopad 27, 2007, 00:06:30
Deklarować tablice jako string tab[][] też jak najbardziej można. Różnica jest taka, że wtedy tablica jest nieregularna, czyli może mieć wiersza różnej długości, bo jest tak naprawdę tablicą tablic. I wygląda na to, że to jest właśnie to czego potrzebujesz.

Offline revo

  • Użytkownik

# Listopad 27, 2007, 00:17:27
int[][] tab = new int[][3];
tab[2] = line.Split(separator);
(Powinno działać :P)

Trochę inaczej:

string line = "a b c";
string[][] tab = new string[3][];
tab[2] = line.Split(new char[]{' '});

foreach (string a in tab[2]) MessageBox.Show(a);

To jest C# tutaj sie tablice dwuwymiatorowe robi tak:

string tab[3,3];

Kto jak kto, ale Kamil akurat C# zna dobrze ;)

Offline Edwin

  • Użytkownik

# Listopad 27, 2007, 01:07:45
W sumie to nie wiem, moze ja jakis ulomny jestem, albo to C# jest jakies nidorobione. Zawsze pisalem programy w C++ i bylo dobrze, nie wiem co mnie podkusilo zeby ten w C# npisac.

Problem wygląda tak, że chce z pliku wczytać sobie do 2 wymiarowej tablicy intów macierz, ale jak bym kombinował to i tak nie działa, być może źle myśle czy coś, za bardzo wskaźnikowo...

namespace Program
{
    public partial class Form1 : Form
    {
        public int wym=0;
        int[,] matA
        string[,] tab;
        public void cpstr(ref int [,] tab1,string[] tab2, int licz)
        {
            for (int i = 0; i < wym-1; i++)
            tab1[licz, i] = Convert.ToInt16(tab2[i]);
        }
        public void MatrixLoad(int [,]tab1,string patch)
        {
            string mat="";
            using (FileStream fs = File.OpenRead(patch))
            {
                byte[] b = new byte[1024];
                UTF8Encoding temp = new UTF8Encoding(true);
                int i=0;
                while((i<wym) && (fs.Read(b, 0, b.Length) > 0))
                {
                    mat=temp.GetString(b);
                }
            }
            string line;
            StringReader sr = new StringReader(mat);
            int licznik=0;
            string [] tab2 = new string[wym];
            while((licznik<wym) && (line=sr.ReadLine() )!= null)
            {
                if(line.StartsWith("#")) {}
                else
                {
                    char separator = ' ';
                    tab2=line.Split(separator);
                    licznik += 1;
                    cpstr(ref tab1, tab2, licznik);
                }
            }
                    foreach (int element in tab1)
                    {
                        MessageBox.Show(Convert.ToString(element));
                    }
        }

        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            tab=new string[wym,wym];
            matA = new int[wym, wym];
            wym = Convert.ToInt16(TBwym.Text);
            openFileDialog1.ShowDialog();
            MatrixLoad(matA,openFileDialog1.FileName);
        }
    }
}


Niby sie kompiluje, ale podczas wczytywania wywala mi bład.

// edit by revo - formatowanie posta, istnieje coś takiego jak [code ][/code ]
« Ostatnia zmiana: Listopad 27, 2007, 01:14:21 wysłana przez revo »

Offline revo

  • Użytkownik

# Listopad 27, 2007, 01:24:44
Edwin, po pierwsze - istnieje taki boski klawisz jak F5. Naucz się go używać (zakładam, że używasz środowiska od M$).

A co do błędu, mimo, strasznie noobowego problemu:

Może miało być:
wym = Convert.ToInt16(TBwym.Text);
tab=new string[wym,wym];
matA = new int[wym, wym];

Zamiast:
tab=new string[wym,wym];
matA = new int[wym, wym];
wym = Convert.ToInt16(TBwym.Text);

i

cpstr(ref tab1, tab2, licznik);
licznik += 1;

Zamiast:

licznik += 1;
cpstr(ref tab1, tab2, licznik);

W ten sposób przynajmniej się nie wywala. Na sensowność działania już nie zwracałem uwagi.

Radzę Ci potrenować kodzenie, bo błędy jakie popełniłeś nie wynikają z tego, że piszesz w C#, a z tego, że masz bardzo małe doświadczenie z programowaniem - a przynajmniej to widać z kawałka kodu, który zapostowałeś. Na przyszłość postaraj się wykazać więcej własnej inicjatywy i nie wklejaj tony kodu na forum, bo przerzucę do Podejrzanie o lamerstwo.
« Ostatnia zmiana: Listopad 27, 2007, 01:26:38 wysłana przez revo »

Offline Edwin

  • Użytkownik

# Listopad 27, 2007, 01:34:35
He he dzięki, już sobie poprawiłem wszystko, bo tam jeszcze kilka błedów było.

Ale kurde mnie zamuliło z tym wczytaniem wymiaru, nie wiem jak moglem nie zauwazyc ze wczytuje sie pozniej, ale kurde myslalem ze to wina C# i cos zle kombinuje.

Wielkie dzieki za pomoc.

//----------------

A nie wiecie jak sprawdzić na ile kawałków split pocioł tego stringa ?
« Ostatnia zmiana: Listopad 28, 2007, 00:00:07 wysłana przez Edwin »