Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > .NET Frameworks (точка нет фреймворки) > Общие вопросы .NET
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 20.10.2015, 15:49   #1
Krasi
Форумчанин
 
Регистрация: 12.02.2010
Сообщений: 787
По умолчанию Как расширить массив в ходе выполнения программы

Нужно сделать динамический массив. Мне уже предлагали list и тп, но у меня сейчас такая ситуация.

Есть длинный текст, его длина, пускай так будет, 1800+1800+1080 символов и может измениться по желанию пользователя.

В переменную B нужно бы отправлять лишь первые 1800 элементов массива А. Но мне нужны и первые 1800 символов, и вторые 1800 символов и третьи 1080 символов... Причем 1080 дополняется все-равно до 1800, но не в этом дело.

В итоге надо сделать так:
B = {string 1 длинной 1800, string 2 длинной 1800, string 3 длинной 1800}
Я так и сделал, string[] B = new string[3].
Пользователь уменьшит число символов в тексте - ничего страшного, но у меня в массиве B будут лишние пустые строки, а они мне не нужны.
А вот случай 2 - пользователь вводит больше символов, чем можно разместить на 3 строчках.

Тогда массив B надо в реальном времени расширить. Я подумал, можно сделать B как массив размерностью 1, а потом расширять его... Но возможно ли это?

Если нет, предлагайте, как я могу решить эту задачу?
Krasi вне форума Ответить с цитированием
Старый 20.10.2015, 15:51   #2
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Цитата:
Сообщение от Krasi
Причем 1080 дополняется все-равно до 1800

B = {string 1 длинной 1800, string 2 длинной 1800, string 3 длинной 1800}
List массивов сделайте.
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 20.10.2015, 17:59   #3
Krasi
Форумчанин
 
Регистрация: 12.02.2010
Сообщений: 787
По умолчанию

А я читал про этот лист, но пока до меня не доходит, как он поможет?
Krasi вне форума Ответить с цитированием
Старый 21.10.2015, 19:50   #4
rrrFer
Санитар
Старожил
 
Аватар для rrrFer
 
Регистрация: 04.10.2008
Сообщений: 2,577
По умолчанию

Расширить массив эффективно невозможно, т.к. его элементы хранятся последовательно. Когда ты создаешь массив - обязательно задаешь его размер (N) и тип элемента (T). Менеджер памяти ищет в памяти свободный кусок на N*sizeof(T) байт.
Чтобы расширить - тебе надо еще какое-то количество байт, которые должны быть свободны прямо следом за твоим массивом. Очевидно, что менеджер не знал что тебе это понадобится и мог занять эту память чем-то другим.

Помогут тебе связные структуры данных - любой список, т.к. элементы списка могут храниться не последовательно, а значит, если тебе потребуется еще 1800 байт - ты выделяешь под них память где угодно и добавляешь указатель на эту память к себе в список.
Код:
std::list<char*> list;
Ну типа того. Хотя задачу ты сформулировал более чем расплывчато, МБ есть более эффективное решение.
rrrFer вне форума Ответить с цитированием
Старый 23.10.2015, 09:53   #5
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Дык никто и не спрашивал про эффективность.
И например если нужен произвольный доступ (random access) по индексу элемента, то связный список явно не будет эффективнее.

Ну и std::vector же тоже вполне эффективный. Просто он не перевыделяет память на каждое добавление, а заранее выделяет больше памяти.

Обычно "по умолчанию" все используют std::vector, а связный список только если необходимость в оптимизации (много добавлений, добавления в середину списка и т.п.)

Вопрос про C# был, а не С++. Там List это как std::vector, а LinkedList как std::list
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 23.10.2015, 10:25   #6
Krasi
Форумчанин
 
Регистрация: 12.02.2010
Сообщений: 787
По умолчанию

Ну вроде все ок, Лист рулит.
Krasi вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Ошибка в ходе программы, язык Си. East Undia Trading Помощь студентам 40 25.04.2014 19:42
Написать программу, в ходе выполнения которой... AzaroffV Фриланс 7 21.01.2011 15:02
Ошибка в ходе программы, требуется пояснение... kotzzz Мультимедиа в Delphi 2 14.04.2010 14:31
как в цикле создавать массив с одним и тем же именем!?ошибка в ходе выполнения -access violation at addr sleevman Помощь студентам 2 28.10.2009 19:06
Как очистить Bitmap в ходе выполнения програмы SeRhy Помощь студентам 1 06.12.2007 21:47