Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
 Аватар для belalugoci
475 / 294 / 29
Регистрация: 01.06.2018
Сообщений: 3,676

Вложенный массив в классе

11.04.2025, 11:34. Показов 2435. Ответов 24
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Создал вот такую конструкцию
C#
1
2
3
4
5
6
7
8
9
public class bytesArray
{
    public bytesArray[] bytes { get; set; }
    public int temp { get; set; }
    public bytesArray()
    {
        bytes = new bytesArray[256];
    }
}
как бы понятно что экземпляр класса bytesArray будет содержать 256 элементов таких же экземпляров. Вопрос в том как будет происходить инициализация экземпляров? и второе - на каком уровне это всё остановится и как обращаться к эелементу например на 4-ом уровне?
Например
C#
1
bytesArray ba = new bytesArray();
Я получаю доступ к
C#
1
ba.bytes[i]
и к
C#
1
ba.bytes[i].bytes[j]
и т.д.
Я очень плохо понимаю многомерности и массивы, так что ожидаемо запутался.
Сама задача: у меня есть потребность хранить дерево из 256 элементов, как выше это "ba" и каждый элемент должен быть листом и так на 16 уровней вниз. Как правильно это организовать?
PS: видимо чтобы не городить
C#
1
ba.bytes[i].bytes[j]
нужно делать как-то так?
C#
1
2
3
4
5
var current = ba;
while (current != null)
{
    current = current.bytes[data[i++]];
}
где в data[i] хранятся индексы для каждого уровня.

Добавлено через 10 минут
даже так наверное:
C#
1
2
3
4
5
6
7
8
var current = ba;
int level = 0;
int pos = 0;
while (current != null)
{
    current = current.bytes[data[level * 256 + pos]];
    // ну и тут какая-то логика по изменению значений level и pos
}
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
11.04.2025, 11:34
Ответы с готовыми решениями:

В одном классе нужно создать массив, а в классе program его вывести. "Не все ветви кода возвращают значение"
В одном классе нужно создать массив, а в классе program его вывести, помогите, как разобраться ...

В базовом классе: массив и абстрактный метод суммы его элементов. В производном классе реализовать метод.
Базовым классом является СИ. В базовом классе: причитать защищенный целочнеельный одномерный маст...

json массив вложенный в json массив Как можно распарить?
Доброго дня, извините что лезу с нубским вопросом. Но никак не могу найти информацию по моему...

24
2282 / 1598 / 400
Регистрация: 26.06.2017
Сообщений: 4,737
Записей в блоге: 1
11.04.2025, 12:15
Цитата Сообщение от belalugoci Посмотреть сообщение
Вопрос в том как будет происходить инициализация экземпляров?
Она будет делаться в коде на уровень выше. Будет что-то типа
C#
1
var b = new bytesArray();
Цитата Сообщение от belalugoci Посмотреть сообщение
на каком уровне это всё остановится
Создание объекта остановится ровно на создании единственного экземпляра, вглубь ничего не пойдёт, если вы об этом.
Цитата Сообщение от belalugoci Посмотреть сообщение
как обращаться к эелементу например на 4-ом уровне?
Для начала надо понять как на первом уровне выбрать дочерний элемент среди 256-ти. Затем повторить ответ на каждом уровне.
0
 Аватар для belalugoci
475 / 294 / 29
Регистрация: 01.06.2018
Сообщений: 3,676
11.04.2025, 12:42  [ТС]
Цитата Сообщение от Uswer Посмотреть сообщение
Создание объекта остановится ровно на создании единственного экземпляра, вглубь ничего не пойдёт, если вы об этом.
получается после
C#
1
bytes = new bytesArray[256];
нужно еще для каждого сделать
C#
1
2
3
4
for (int i =0; i < 256; i++)
{
    bytes[i] = new bytesArray();
}
?

Цитата Сообщение от Uswer Посмотреть сообщение
Для начала надо понять как на первом уровне выбрать дочерний элемент среди 256-ти
C#
1
2
var ba = new bytesArray();
ba.bytes[0].temp = 10;
это я написал еще в первом сообщении. Значит смысл понятен.

Добавлено через 8 минут
Uswer,
вот написал такой кусок, он конечно не реализует необходимую логику обхода:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
bytesArray root = new bytesArray();
var current = root;
int level = 0;
int pos = 0;
while (level < 16)
{
    for (int i = 0; i < 256; i++)
    {
        var child = current.bytes[i];
        for (int j = 0; j < 256; j++)
        {
            child.bytes[j] = new bytesArray();
        }
    }
}
но я пока не могу осилить как именно её сделать.

Добавлено через 7 минут
я тут посчитал что на 16 уровне будет
256 * 256 * 256 * 256 * 256 * 256 * 256 * 256 * 256 * 256 * 256 * 256 * 256 * 256 * 256 * 256
элементов и загрустил )))))
0
Эксперт JavaЭксперт по электроникеЭксперт .NET
 Аватар для wizard41
3414 / 2735 / 575
Регистрация: 04.09.2018
Сообщений: 8,587
Записей в блоге: 3
11.04.2025, 12:51
Не совсем ясно про "уровни", может что-то типа такого:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
class bytesArray
{
    public bytesArray[] bytes { get; set; }
    public int temp { get; set; }
    public bytesArray() =>
        bytes = new bytesArray[16];
}
 
class bytesArrayThree : List<bytesArray>
{
    public bytesArrayThree() =>
        this.AddRange(new bytesArray[256]);
}
C#
1
2
3
4
bytesArrayThree three = new bytesArrayThree();
three[4].temp = 10;
three[100].bytes[10].temp = 11;
Console.ReadLine();
0
 Аватар для belalugoci
475 / 294 / 29
Регистрация: 01.06.2018
Сообщений: 3,676
11.04.2025, 12:58  [ТС]
Цитата Сообщение от wizard41 Посмотреть сообщение
Не совсем ясно про "уровни", может что-то типа такого
уровни - просто у каждого из 256 элементов есть свои 256 элементов и так 16 этажей. Но там оперативки не хватит всё это сделать.
216 даёт 64К
25616 даёт МНОГО
0
Эксперт JavaЭксперт по электроникеЭксперт .NET
 Аватар для wizard41
3414 / 2735 / 575
Регистрация: 04.09.2018
Сообщений: 8,587
Записей в блоге: 3
11.04.2025, 13:07
ну почему не хватит... Это же получается массив [M x N x K] = (256 * 256 * 16) * 256 = 1048576 * 256 = 16 777 216 элементов..
0
2282 / 1598 / 400
Регистрация: 26.06.2017
Сообщений: 4,737
Записей в блоге: 1
11.04.2025, 13:47
belalugoci, то что вы делаете очень похоже на узел дерева TreeNode.
Цитата Сообщение от belalugoci Посмотреть сообщение
я пока не могу осилить как именно её сделать.
Рекурсивно.
C#
1
2
3
4
5
6
7
8
9
10
11
void CreateSubItem(bytesArray ba, int levelsCount)
{
  for (int i = 0; i < 256; i++)
  {
    bytesArray newByteArr = new bytesArray();
    ba.bytes[i] = newByteArr;
 
    if (levelCount > 0)
       CreateSubItem(newByteArr, levelsCount--);
  }
}
Добавлено через 1 минуту
Использование
C#
1
2
var b = new bytesArray();
CreateSubItem(b, 16);
1
 Аватар для belalugoci
475 / 294 / 29
Регистрация: 01.06.2018
Сообщений: 3,676
11.04.2025, 14:45  [ТС]
Цитата Сообщение от wizard41 Посмотреть сообщение
ну почему не хватит... Это же получается массив [M x N x K] = (256 * 256 * 16) * 256 = 1048576 * 256 = 16 777 216 элементов..
как-то не так вы считаете, на первом уровне 256 элементов, на втором 256*256, на третьем 256*256*256 и т.д. до 25616.

Uswer, Как я понимаю levelsCount-- понизит уровень на нулевом же элементе, то есть для ba.bytes[i] = newByteArr; на следующей итерации уровень будет на 1 ниже, что уже неверно. Или я не так понял код?

Добавлено через 1 минуту
наверно лучше сделать так:
C#
1
2
3
4
5
6
7
8
9
10
11
12
void CreateSubItem(bytesArray ba, int levelsCount)
{
  levelsCount--;
  for (int i = 0; i < 256; i++)
  {
    bytesArray newByteArr = new bytesArray();
    ba.bytes[i] = newByteArr;
 
    if (levelCount > 0)
       CreateSubItem(newByteArr, levelsCount);
  }
}
тогда будет 256 итераций на одном уровне.
0
Эксперт JavaЭксперт по электроникеЭксперт .NET
 Аватар для wizard41
3414 / 2735 / 575
Регистрация: 04.09.2018
Сообщений: 8,587
Записей в блоге: 3
11.04.2025, 14:49
Цитата Сообщение от belalugoci Посмотреть сообщение
как-то не так вы считаете, на первом уровне 256 элементов, на втором 256*256
Значит структура класса как-то не так описана. Если каждый класс порождает 256 таких же внутри себя, то на след "уровне" кол-во таких родительских классов увеличивается на +1?
0
 Аватар для belalugoci
475 / 294 / 29
Регистрация: 01.06.2018
Сообщений: 3,676
11.04.2025, 14:57  [ТС]
Цитата Сообщение от wizard41 Посмотреть сообщение
Значит структура класса как-то не так описана
что именно не так?
C#
1
bytes = new bytesArray[256];
то есть каждый экземпляр класса порождает 256 новых экземпляров

Цитата Сообщение от wizard41 Посмотреть сообщение
Если каждый класс порождает 256 таких же внутри себя, то на след "уровне" кол-во таких родительских классов увеличивается на +1?
пардон, фразу не могу переварить.
на каждом уровне мы получаем 256 новых потомков от одного родителя, то есть 25616 для 16 уровней. Если 256 вводит в заблуждение - представьте двоичное дерево, там каждый родитель порождает 2 потомка, соответственно для 16 уровней будет 216
0
Эксперт JavaЭксперт по электроникеЭксперт .NET
 Аватар для wizard41
3414 / 2735 / 575
Регистрация: 04.09.2018
Сообщений: 8,587
Записей в блоге: 3
11.04.2025, 15:04
Цитата Сообщение от belalugoci Посмотреть сообщение
представьте двоичное дерево
Ну это я хорошо себе представляю. Просто сначала из ваших слов было похоже на 3-мерный массив, затем уже на пирамиду..
Теперь ясно что имеется в виду.
1
 Аватар для belalugoci
475 / 294 / 29
Регистрация: 01.06.2018
Сообщений: 3,676
11.04.2025, 15:10  [ТС]
Цитата Сообщение от wizard41 Посмотреть сообщение
Ну это я хорошо себе представляю. Просто сначала из ваших слов было похоже на 3-мерный массив, затем уже на пирамиду..
Теперь ясно что имеется в виду.
пардон за косноязычность многомерностей, для меня сложная тема. спасибо за отклик.
0
2282 / 1598 / 400
Регистрация: 26.06.2017
Сообщений: 4,737
Записей в блоге: 1
11.04.2025, 16:12
Цитата Сообщение от belalugoci Посмотреть сообщение
наверно лучше сделать так:
Да так лучше, я не досмотрел.
0
Эксперт JavaЭксперт по электроникеЭксперт .NET
 Аватар для wizard41
3414 / 2735 / 575
Регистрация: 04.09.2018
Сообщений: 8,587
Записей в блоге: 3
11.04.2025, 22:14
Цитата Сообщение от belalugoci Посмотреть сообщение
наверно лучше сделать так:
Все же, наверное, так лучше не делать.
Здесь инициируется только первый [0] элемент текущего уровня переданного bytesArray, а затем, так как levelsCount > 0 произойдет выход из цикла и рекурсивное создание следующего уровня. Оставшиеся 255 элементов уровней будут пустыми (null).
0
2282 / 1598 / 400
Регистрация: 26.06.2017
Сообщений: 4,737
Записей в блоге: 1
12.04.2025, 00:28
Цитата Сообщение от wizard41 Посмотреть сообщение
Здесь инициируется только первый [0] элемент текущего уровня переданного bytesArray, а затем, так как levelsCount > 0 произойдет выход из цикла и рекурсивное создание следующего уровня. Оставшиеся 255 элементов уровней будут пустыми (null).
ГыГы. Ну нет же - всё будет норм, это же рекурсия! Пятница, вечер понимаю!
0
Эксперт JavaЭксперт по электроникеЭксперт .NET
 Аватар для wizard41
3414 / 2735 / 575
Регистрация: 04.09.2018
Сообщений: 8,587
Записей в блоге: 3
12.04.2025, 00:51
Цитата Сообщение от Uswer Посмотреть сообщение
ГыГы. Ну нет же - всё будет норм, это же рекурсия! Пятница, вечер понимаю!
Ну на вскидку... )) А так то да, пятница свое дело знает
Все равно метод не оптимальный..
0
Эксперт JavaЭксперт по электроникеЭксперт .NET
 Аватар для wizard41
3414 / 2735 / 575
Регистрация: 04.09.2018
Сообщений: 8,587
Записей в блоге: 3
12.04.2025, 01:42
Uswer, хе-хе, все последние элементы bytes в уровнях будут null. Т.е. пустые классы bytesArray:

Я говорил belalugoci, что структура неверная. Это и не дерево и не матрица... Тут надо графически посмотреть на нужный результат - что должно то в итоге получится..
0
Эксперт JavaЭксперт по электроникеЭксперт .NET
 Аватар для wizard41
3414 / 2735 / 575
Регистрация: 04.09.2018
Сообщений: 8,587
Записей в блоге: 3
12.04.2025, 02:18
Если класс bytesArray содержит в себе себя самого в кол-ве 256 штук, то их надо все инициировать. Это будет происходить до бесконечности. Иначе последние будут нуллами, когда закончатся "уровни".
Надо пересматривать структуру.

Добавлено через 17 минут
Если действительно предполагалось двоичное дерево, то в структуру нужно ввести понятие Узла, в котором должно быть некоторое свойство, по которому можно определять (сравнивать) их между собой и располагать их справа/слева от родительского.
В данном классе, в качестве такого свойства узла можно применить свойство класса temp, например. Но пока таких намеков и близко нет, поэтому никакого дерева тут не построить.
А вот 3D массив можно.

Добавлено через 14 минут
belalugoci, если не трудно, нарисуйте на бумажке что должно получится из всего этого. Если дерево - то должны быть связи (ребра), если матрица - то какие-то размерности...
Пока из данного класса bytesArray в таком виде трудно извлечь какую-л. практическую пользу.
0
 Аватар для roach1967
983 / 463 / 233
Регистрация: 27.06.2014
Сообщений: 1,033
12.04.2025, 03:51
belalugoci, насколько понял, то нужно создать класс для шестнадцатимерного массива.
(Где-то встречал, что ограничение на количество мерностей в C# - 32. На количество параметров метода не может превышать 255.)
Однако было указано, что инициализировать нужно только первую мерность (256 объектов). А при указании конкретных элементов остальных мерность для изначального будет возвращать null. (наверно для начала пока так).
Затем должен быть механизм инициализации/добавления одного определённого объекта с конкретным указанием значений всех 16-ти индексов мерностей массива. Т.е. не нужно будет хранить значения всех 340282366920938463463374607431768211456 ячеек. Понадобится только хранить значения только для определённых наборов указанных индексов (16 чисел) и сам объект (байт, целое, картинка?). И возвращать объект только в случае совпадения с существующим набором из шестнадцати индексов. В остальном случае - возврат null
0
 Аватар для belalugoci
475 / 294 / 29
Регистрация: 01.06.2018
Сообщений: 3,676
12.04.2025, 09:02  [ТС]
Цитата Сообщение от wizard41 Посмотреть сообщение
Если класс bytesArray содержит в себе себя самого в кол-ве 256 штук, то их надо все инициировать
Я думаю что этот код
C#
1
2
3
4
5
6
7
8
9
10
11
12
void CreateSubItem(bytesArray ba, int levelsCount)
{
  levelsCount--;
  for (int i = 0; i < 256; i++)
  {
    bytesArray newByteArr = new bytesArray();
    ba.bytes[i] = newByteArr;
 
    if (levelCount > 0)
       CreateSubItem(newByteArr, levelsCount);
  }
}
этим и занимается.

Цитата Сообщение от wizard41 Посмотреть сообщение
Это будет происходить до бесконечности
нет, только до levelCount == 0

Цитата Сообщение от wizard41 Посмотреть сообщение
Если действительно предполагалось двоичное дерево
скорее 256-ичное дерево

Цитата Сообщение от wizard41 Посмотреть сообщение
если не трудно, нарисуйте на бумажке что должно получится из всего этого
будет пирамида, наверху 256 элементов, ниже на один уровень у каждого еще 256 элементов и т.д.
нарисовать такое физически невозможно в силу огромного числа элементов.

Цитата Сообщение от wizard41 Посмотреть сообщение
Если дерево - то должны быть связи (ребра)
так они же заложены в структуре
C#
1
var ba = new bytesArray();
а потом обращайтесь к любому уровню
C#
1
2
ba.bytes[i]
be.bytes[i].bytes[j]
и т.д.

Цитата Сообщение от wizard41 Посмотреть сообщение
если матрица - то какие-то размерности...
как я уже писал, я весьма туп с многомерностями, вполне вероятно эту рекурсивную структуру можно реализовать через матрицу, но как именно - это не ко мне )

Цитата Сообщение от wizard41 Посмотреть сообщение
Пока из данного класса bytesArray в таком виде трудно извлечь какую-л. практическую пользу.
ну для моей задачи этого достаточно, правда я 16 уровней реализовать не смогу, ОЗУ столько нет. Так что практическая польза есть, но она нереализуема.

Цитата Сообщение от roach1967 Посмотреть сообщение
насколько понял, то нужно создать класс для шестнадцатимерного массива
вероятно, я в таком плохо соображаю

Цитата Сообщение от roach1967 Посмотреть сообщение
Однако было указано, что инициализировать нужно только первую мерность (256 объектов)
в C# придется всё инициализировать, иначе не получится использовать, хотя можно вставить проверку, если null, то создавать. Но даже в случае если на null тратится 1 байт, то не хватит ОЗУ для этого.

Цитата Сообщение от roach1967 Посмотреть сообщение
Понадобится только хранить значения только для определённых наборов указанных индексов (16 чисел) и сам объект (байт, целое, картинка?). И возвращать объект только в случае совпадения с существующим набором из шестнадцати индексов. В остальном случае - возврат null
Вероятно можно использовать Dictionary для хранения тех элементов, которые реально были использованы
Тогда будет вместо
256
256 ... 256

3
5, 7, 2
то есть на первом уровне три элемента, а не все 256 и т.д.
А Dictionary позволяет индексировать существующее или создавать несуществующие. Это идея.

Добавлено через 1 минуту
roach1967, только пока в голове не могу всё это оформить )
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
12.04.2025, 09:02
Помогаю со студенческими работами здесь

Как использовать информацию парсированую в 1 классе в другом классе
имеются 2 класса , объясните плз в чём ошибка using System; using System.Collections.Generic;...

Как использовать объект класса, созданого в определеном классе, в другом классе
У меня такой вопрос,как использовать объект класса,созданого в определеном классе,в другом классе.У...

Переменная изменилась в одном классе, куда "воткнуть" код в другом классе
Привет всем, Достало это событийное программирование. :wall: Я не делаю событийные &quot;калькуляторы&quot;...

Добрый день, подскажите пожалуйста как вызвать Esep1() в другом классе, ошибка в классе Program при вызове Esep1()
using System; namespace X { class Vertolet { public string nomer, marka; ...

Само сообщение или вложенный файл?
Привет всем. Делаю что-то типа обмена сообщениями. Клиент отправляет xml-сообщение -&gt; Сервер...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек: SDL3, Box2D, FreeType, SDL3_ttf, SDL3_mixer и SDL3_image из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru