![]() |
Модераторы: Partizan, gambit |
![]() ![]() ![]() |
|
LamerTM |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 97 Регистрация: 11.3.2006 Репутация: нет Всего: 0 |
Как сделать структуру с индексируемыми полями. Ну или ее аналог.
Например, структура должна содержать массив других структур. В делфи это пишется так:
Массив arr получается статическим. Находится в самой структуре ("записи" по-паскалевски). К его элементам можно обращаться в цикле перебирая индекс. Есть огромный массив из таких rec, из-за чего, как мне кажется, выгоднее чтобы массив arr находился весь в структуре, а не чтобы она содержала ссылку на динамический массив. Как делают такие вещи на C#? (насколько я понимаю, в C# массив всегда является ссылкой) |
|||
|
||||
Экскалупатор |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1746 Регистрация: 1.4.2009 Где: г. Минск Репутация: 11 Всего: 24 |
да в общем все тривиально:
делал такую структуру для задания в контрольной, тут типа есть структура, содержащая данные о студенте, и в этой структуре есть массив оценок этого студента, если надо то можно объявить этот массив статическим. ну соответственно есть вместо public int[] Point; написать public MyStruct[] Point; то получим массив структур. я думаю принцип должен быть понятен. |
|||
|
||||
LamerTM |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 97 Регистрация: 11.3.2006 Репутация: нет Всего: 0 |
Да нет, тут немного не так. В структуре содержится только ссылка на массив, а не весь он сам. Похоже, как я хочу, в C# так сделать в принципе нельзя.
Единственный вариант, что я вижу, это в моём случае написать наподобие такого:
Где Arr1 хранят первое поле из записи, а Arr2 - второе. Ну или в один массив их поместить можно. Короче, структуру фактически придется организовывать вручную. Может кто другие варианты знает? |
|||
|
||||
diadiavova |
|
|||
![]() Доктор Зло(диагност, настоящий, с лицензией и полномочиями) ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 5821 Регистрация: 14.8.2008 Где: В Коньфпольте Репутация: 31 Всего: 142 |
LamerTM, лично я не понял что ты хочешь сделать. Приведи пример, как должна работать твоя структура.
Добавлено через 7 минут и 8 секунд И кстати, об этом ты знаешь? http://msdn.microsoft.com/ru-ru/library/2yd9wwz4.aspx Добавлено через 8 минут и 3 секунды А об этом? http://msdn.microsoft.com/ru-ru/library/2s05feca.aspx -------------------- Хочешь получить мудрый совет - читай подписи участников форумов. Злой доктор Щасзаболит ![]() |
|||
|
||||
LamerTM |
|
||||
Шустрый ![]() Профиль Группа: Участник Сообщений: 97 Регистрация: 11.3.2006 Репутация: нет Всего: 0 |
Есть структура Rec1, буквально такая:
Хочется структуру Rec, которая содержит 2 массива из структур Rec1. Массивы фиксированной длины, по 10 элементов. Сткруктура должна содержать в себе весь массив, а не только ссылку на него. Потом я создам большой массив из Rec, куда будет загружен файл. Можно сделать аналог:
Вот хочется чтобы было не так, а через массивы. Тогда эти поля можно было бы перебирать по индексу. |
||||
|
|||||
diadiavova |
|
||||
![]() Доктор Зло(диагност, настоящий, с лицензией и полномочиями) ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 5821 Регистрация: 14.8.2008 Где: В Коньфпольте Репутация: 31 Всего: 142 |
Здесь не вижу проблем.
Массив - ссылочный объект и структура его не может содержать, только ссылку. Другой вопрос: "А какое вообще в данном случае имеет значение, как организована память структуры?". Допустим, то что тебе надо возможно. Какие выгоды ты собираешься из этого извлечь? Что такого можно сделать со структурой, когда она "содержит массив, а не ссылку"? Ну это и сейчас возможно, просто добавь метод, который по индексу будет нужное поле возвращать. -------------------- Хочешь получить мудрый совет - читай подписи участников форумов. Злой доктор Щасзаболит ![]() |
||||
|
|||||
LamerTM |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 97 Регистрация: 11.3.2006 Репутация: нет Всего: 0 |
Я всегда так делал на делфи, и поэтому чисто по привычке хотел реализовать именно так. Я собираюсь иметь большой массив таких структур, куда будет заргужен файл. Если структура содержит ссылки на массив, то это приводит к большему расходу памяти, т.к. нужно отводить память под ссылку. Но сейчас память для меня не очень важна, эта ссылка много не займет. Меня пугает что если я выделю массив в 100 000 структур Rec, то потом надо будет выделить еще 200 000 массивов по 10 структур Rec1. Не будет ли на этой операции грандиозного тормоза, расхода памяти и так далее. Да и выглядит кривовато это. Т.к. тестить лень, то хочется сделать сразу заведомо без этих операций. Надо будет попробовать сделать по-разному и сравнить. Может и не стоит оно того. |
|||
|
||||
diadiavova |
|
|||
![]() Доктор Зло(диагност, настоящий, с лицензией и полномочиями) ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 5821 Регистрация: 14.8.2008 Где: В Коньфпольте Репутация: 31 Всего: 142 |
Об экономии памяти на ссылках слышу(точнее читаю) впервые. Возможно я чего-то не догоняю, но ИМХО, ты не туда копаешь.
-------------------- Хочешь получить мудрый совет - читай подписи участников форумов. Злой доктор Щасзаболит ![]() |
|||
|
||||
PashaPash |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1233 Регистрация: 3.1.2008 Репутация: 13 Всего: 49 |
LamerTM, Буферы фиксированного размера. Но в целом - не советую. Выделение одного здорового буффера на 100 000 структур с fixed-массивами - это почти гарантированно OutOfMemoryException. Лучше куча мелких объектов, чем один большой.
|
|||
|
||||
mr.DUDA |
|
|||
![]() 3D-маньяк ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 8244 Регистрация: 27.7.2003 Где: город-герой Минск Репутация: 110 Всего: 232 |
Есть ещё такая штука в дотнете как Large Object Heap. Если пытаться пихать все свои мелкие объекты имба-массивы то можно упереться в OutOfMemoryException, как справедливо заметил PashaPash, т.к. аллокации даже 30-50кб будут упираться в полностью занятый LOH (даже при наличии свободной памяти и файла подкачки ещё на 4-10 гигов).
-------------------- ![]() |
|||
|
||||
Scatman |
|
|||
Новичок Профиль Группа: Участник Сообщений: 36 Регистрация: 14.3.2006 Репутация: нет Всего: нет |
а так и делай хоть какой массив
|
|||
|
||||
LamerTM |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 97 Регистрация: 11.3.2006 Репутация: нет Всего: 0 |
Более высокая скорость выделения памяти. Потестил, и сделал на буферах фиксированного размера. Если делать структуры с обычным ссылочным массивом, то торможение феерическое (при выделении массива из 1млн таких структур). |
|||
|
||||
![]() ![]() ![]() |
Прежде чем создать тему, посмотрите сюда: | |
|
Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов. Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :) Так же не забывайте отмечать свой вопрос решенным, если он таковым является :) Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |