1

Тема: Я не можу зчитати масив байт у двовимірний масив...

Хай. От дивіться, є матриця (квадратна) з однотипними даними. Я записую неї в бінарний файл. А як потім зчитати ці дані назад в матрицю?
Деякі дані, матриця повинна бути 400х400 елементів, кожен з елементів займає 2 байти. Ось мій варіант.

 class Program
    {
        private static ushort[,] map;
        static void Main(string[] args)
        {
            byte[] buff = File.ReadAllBytes(Directory.GetCurrentDirectory()+"\\map.map");
            Console.WriteLine(buff.Length);
            int max = int.MinValue;
            int height = 0, i1 = 0, j1 = 0;
            map = new ushort[400,400];
            for (int i = 0; i < 400; i++)
            {
                for (int j = 0; j < 400; j++)
                {
                    map[i, j] = BitConverter.ToUInt16(buff, i*400 + j*2);
                }  
            }

            while (true)
            {
                Show();
            }

            Console.Read();
        }

        private static void Show()
        {
            Console.Write("Insert x: ");
             int x = int.Parse(Console.ReadLine());
             Console.Write("Insert z: ");
             int z = int.Parse(Console.ReadLine());
            Console.WriteLine(map[x,z]);
        }
    }

І він не працює. Скажу навіть більше, коли я перебрав всі елементи цієї матриці з метою знайти найбільший. То знайдене значення не було найбільшим насправді. Але коли я просто перебирав байти в одному циклі, переводив в число і порівнював, то знайшлося вірне максимальне значення. Одже проблема в занесенні даних в двовимірний масив. Але я не зовсім розумію, в чому проблема.

Говоріть українською! Живіть українською! Відчувайте українською!

2

Re: Я не можу зчитати масив байт у двовимірний масив...

Щоб зрозуміти, як щось читати, треба побачити, як ви його писали, правда?

3

Re: Я не можу зчитати масив байт у двовимірний масив...

koala написав:

Щоб зрозуміти, як щось читати, треба побачити, як ви його писали, правда?

Я теж так думаю, і просто чекав на це питання.

 Vector3 maxv3=new Vector3();
        FileStream stream = new FileStream(Directory.GetCurrentDirectory()+"\\map.map",FileMode.Create);
        for (int i = (int)start.x; i < end.x; i+=step)
        {
            for (int j = (int)start.z; j < end.z; j+=step)
            {
                
               // Debug.Log("i = "+i+" j = "+j);
                go1.transform.position = v3;
                ray = new Ray(v3, Vector3.down);
                if (Physics.Raycast(ray, out raycastHit, 500))
                {
                    //Debug.Log(raycastHit.distance);
                    float height = end.y - raycastHit.distance;
                    if (height > max)
                    {
                        max = height;
                        maxv3 = v3;
                    }
                    ushort heightUshort = Convert.ToUInt16(height.ToString("F").Replace(".", ""));
                    stream.Write(BitConverter.GetBytes(heightUshort),0,sizeof(ushort));
                }
                else
                {
                    Debug.Log("no");
                }
                   
                v3.z+=step;
                jj += step;
               // yield return new WaitForSeconds(0.001f);
            }
            ii += i;
            v3.z = start.z;
            v3.x+=step;
        }
        Debug.Log(stream.Length);
        Debug.Log("max: "+max+" maxv3: "+maxv3);
        stream.Close();
Говоріть українською! Живіть українською! Відчувайте українською!

4 Востаннє редагувалося koala (28.05.2014 13:03:30)

Re: Я не можу зчитати масив байт у двовимірний масив...

1. Які гарантії того, що (end.x - start.x) / step == 400?
2.

ushort heightUshort = Convert.ToUInt16(height.ToString("F").Replace(".", ""));
ushort heightUshort = Math.Round( height * 100 );

нє?
3. Можете ще записати перші два числа та останні два числа чимось типу 0xF00F 0xA55A і подивитися, що там в файлі і в масиві? Може, байти десь плутаються чи що...
4. Наступного разу не чекайте, поки спитають.

5

Re: Я не можу зчитати масив байт у двовимірний масив...

koala написав:

1. Які гарантії того, що (end.x - start.x) / step == 400?
2.

ushort heightUshort = Convert.ToUInt16(height.ToString("F").Replace(".", ""));
ushort heightUshort = Math.Round( height * 100 );

нє?
3. Можете ще записати перші два числа та останні два числа чимось типу 0xF00F 0xA55A і подивитися, що там в файлі і в масиві? Може, байти десь плутаються чи що...
4. Наступного разу не чекайте, поки спитають.

1)

GameObject go = GameObject.Find("Terrain");
        terrain = go.GetComponent<Terrain>();
        Texture2D map = new Texture2D((int)terrain.terrainData.size.x, (int)terrain.terrainData.size.z);
        start = go.transform.position;
        end = start + terrain.terrainData.size;
        step = 1;

400х400 це розміри карти, просто я відразу писав там 400, а можна було б взяти sqrt(довжина байт/2), і отакого розміру створювати матрицю, аби запихати в неї дані
2) угу хД
3) так і зробив, все чітко
4) ок

Говоріть українською! Живіть українською! Відчувайте українською!

6

Re: Я не можу зчитати масив байт у двовимірний масив...

Ну, якщо все чітко, то й добре, що проблема вирішился... чи все ж таки після зчитування не все чітко?

7

Re: Я не можу зчитати масив байт у двовимірний масив...

koala написав:

Ну, якщо все чітко, то й добре, що проблема вирішился... чи все ж таки після зчитування не все чітко?

не все. Початок і кінець співпадають, але як звертатись до елементів за допомогою двох індексів (як до матриці) - я не знаю, і так і так пробував, але всеодно якась фігня неправильна виходить.

Говоріть українською! Живіть українською! Відчувайте українською!

8

Re: Я не можу зчитати масив байт у двовимірний масив...

То, може, неправильно звертаєтеся? Викладіть мінімальний приклад для відтворення проблеми.

9 Востаннє редагувалося FakiNyan (28.05.2014 15:11:32)

Re: Я не можу зчитати масив байт у двовимірний масив...

koala написав:

То, може, неправильно звертаєтеся? Викладіть мінімальний приклад для відтворення проблеми.

Я ж в першому пості все виклав. Бачете там map? так от до цього масиву тре звертатися і отримувати висоту в потрібній позиції. map[200,200] має повертати висоту рельєфу в точці 200,200 (це в ігровому рушії). Так от я заходжу в ігровий отой рушій. Обираю позицію, де висота має бути найбільшою, вводжу ці дані в програмку, і вона мені показує якусь зовсім не ту висоту. От тримайте файлик цей.

Post's attachments

map.map 312.5 kb, 151 downloads since 2014-05-28 

Говоріть українською! Живіть українською! Відчувайте українською!

10

Re: Я не можу зчитати масив байт у двовимірний масив...

зробив

 byte[] buff = File.ReadAllBytes(Directory.GetCurrentDirectory()+"\\map.map");
            Console.WriteLine(buff.Length);
            ushort max = ushort.MinValue;
            int height = 0, i1 = 0, j1 = 0;
            map = new ushort[400,400];
            int count = 0, count1 = 0;
           
            ushort[] map1 = new ushort[160000];
            for (int i = 0; i < buff.Length; i+=2)
            {
                map1[i/2] = BitConverter.ToUInt16(buff, i);
            }

            for (int i = 0; i < 400; i++)
            {
                for (int j = 0; j < 400; j++)
                {
                    map[i, j] = map1[count1];
                    count1++;
                }
            }
             


            Console.WriteLine(map[299,313]);
Говоріть українською! Живіть українською! Відчувайте українською!