![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| Kurt |
|
|||
|
Увлеченный ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1662 Регистрация: 22.8.2003 Где: Краснодар Репутация: нет Всего: 36 |
Обычно я работаю с Delphi, но тут пришлось использовать C++Builder.
Подскажите, пожалуйста, есть ли в C++Builder динамические массивы? Если можно, приведите простенький пример как с ними работать. Особенно нужен пример работы с аналогом Дельфового SetLength (если в C++Builder есть аналог такой функции). Заранее спасибо. -------------------- Для корабля, который не знает куда плыть, нет попутного ветра... ((С) Архимед) ... Все знают, что это невозможно. Но случайно находится невежда, который этого не знает. Он-то и делает открытие.. ((С) А. Эйнштейн) |
|||
|
||||
| Vyacheslav |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 2124 Регистрация: 25.3.2002 Где: Москва Репутация: 9 Всего: 59 |
см. STL: vector
-------------------- С уважением, Вячеслав Ермолаев |
|||
|
||||
| Kurt |
|
|||
|
Увлеченный ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1662 Регистрация: 22.8.2003 Где: Краснодар Репутация: нет Всего: 36 |
Признаю свою непонятливость, но как с вектором работать я не сообразил.
Ладно, а если мне не недо сохранять данные перед изменением размера? В общем задача в простой форме: нужно выделить память под массив байтов, размер массива определяется run-time. Знаю есть API-функции для этого (VirtualAlloc & GlobalAlloc.. кстати, какая разница?). Но хотелось бы средствами C++... -------------------- Для корабля, который не знает куда плыть, нет попутного ветра... ((С) Архимед) ... Все знают, что это невозможно. Но случайно находится невежда, который этого не знает. Он-то и делает открытие.. ((С) А. Эйнштейн) |
|||
|
||||
| RAN |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 709 Регистрация: 14.3.2003 Где: Щёлково Моск.обл. Репутация: 5 Всего: 6 |
Конечно, C++. new и delete.
int *arr = new int[n]; //выделить n*sizeof(int) байт под массив. Теперь пользуйся arr[0], arr[1], ... arr[n] ................ delete[] arr; //освободить память Чтоб изменить размер массива делают так: (так делают известные мне реализации STL): int *arr = new int[n]; ...................... { int *temp = 0; //Объявить временную переменную под новый блок памяти temp = new int[new_size]; //создать новый массив if(temp) CopyMemory(temp, arr, n * sizeof(int)); //скопировать содержимое старого массива в новый delete[] arr; //освободить память, занятую старым массивом arr = temp; //присвоить указатель на новый массив arr } ...................... delete[] arr; |
|||
|
||||
| Kurt |
|
|||
|
Увлеченный ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1662 Регистрация: 22.8.2003 Где: Краснодар Репутация: нет Всего: 36 |
Извини, а это n должно быть константой?
Или можно во время работы проги назначать? Типа: int n=10; int *arr = new int[n]; Или?... Просто в данный момент у меня нет доступа к C++Builder и я не могу проверить... -------------------- Для корабля, который не знает куда плыть, нет попутного ветра... ((С) Архимед) ... Все знают, что это невозможно. Но случайно находится невежда, который этого не знает. Он-то и делает открытие.. ((С) А. Эйнштейн) |
|||
|
||||
| mr.DUDA |
|
||||
|
3D-маньяк ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 8244 Регистрация: 27.7.2003 Где: город-герой Минск Репутация: 25 Всего: 232 |
Не советовал бы злоупотреблять VirtualAlloc, т.к. память выделяется целыми страницами по 4Кб. Используй "кучу" (heap), и если не догоняешь "new/delete", но зато знаешь что такое Alloc, пользуйся парой функций "malloc/free" (кстати, оператор "new" в конечном итоге всё равно вызывает функцию malloc).
Можно ставить значение в run-time. Это сообщение отредактировал(а) mr.DUDA - 10.9.2003, 22:55 -------------------- ![]() |
||||
|
|||||
| RAN |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 709 Регистрация: 14.3.2003 Где: Щёлково Моск.обл. Репутация: 5 Всего: 6 |
n - не константа.
|
|||
|
||||
| Vyacheslav |
|
||||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 2124 Регистрация: 25.3.2002 Где: Москва Репутация: 9 Всего: 59 |
Уточни тогда вопрос:что ты понимашь под динмическим массивом: массив, созданный динамически, или массив с динамически изменяемой длинной?
В качестве массива байтов можно использовать string примеры использования
-------------------- С уважением, Вячеслав Ермолаев |
||||
|
|||||
| Fantasist |
|
|||
|
Лентяй ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1517 Регистрация: 24.3.2002 Репутация: 4 Всего: 41 |
Такие реализации STL выбрасывать надо сразу. Такое поведение допустимо только для valarray, ну и bitset (может еще чего забыл). В других контейнерах должен использоваться operator=, а не CopyMemory. -------------------- Волны гасят ветер... |
|||
|
||||
| RAN |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 709 Регистрация: 14.3.2003 Где: Щёлково Моск.обл. Репутация: 5 Всего: 6 |
Fantasist, смысл-то не в CopyMemory, а в том что, чтобы увеличить размерность STL создаёт новый массив и копирует в него новый. Для стандартных типов (int и т.д.) копировать можно, это же не классы.
|
|||
|
||||
| Nastya |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 1287 Регистрация: 27.3.2002 Где: Мариуполь Репутация: 5 Всего: 44 |
Существует несколько способов динамически работать с массива
1. Используя шаблон классов vector 2. Используя операторы new и delete, при этом подходе ты сам "вручную " пишешь функцию изменения размера массива и на твоей совести ее корректная работа 3. Использовать функции alloc, free, или их WinApi-шные при это ты не только следишь за тем что описанно в п.2, но если речь идет об массиве объектов, то и за корректным вызовом конструкторов и деструкторов. Наиболее предпочтительный вариант 1. В форуме не раз заходила речь об STL и даже где-то были ссылки на учебники идоки. Если проблема более конкретная опиши. -------------------- Что бы понять рекурсию, надо понять рекурсию "Профессионал - это человек сделавший все возможные ошибки в очень узкой области". Н.Бор |
|||
|
||||
| podval |
|
||||
![]() Где я? Кто я? ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 3094 Регистрация: 25.3.2002 Где: СПб Репутация: 1 Всего: 62 |
Ребята, обратите внимание на вопрос:
В Дельфи динамические массивы - это особый тип. Вот что сделано в Билдере (см. help):
|
||||
|
|||||
| podval |
|
|||
![]() Где я? Кто я? ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 3094 Регистрация: 25.3.2002 Где: СПб Репутация: 1 Всего: 62 |
Вот, кстати, с того же help'a:
C++ DynamicArray example
© Borland |
|||
|
||||
| DENNN |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 3878 Регистрация: 27.3.2002 Где: Москва Репутация: 1 Всего: 43 |
Вот и надо было так написать |
|||
|
||||
| B2_Russia |
|
|||
![]() В доску свой :) ![]() ![]() Профиль Группа: Участник Сообщений: 344 Регистрация: 3.7.2003 Где: Тверь Репутация: нет Всего: 1 |
Ничего не читал кроме вопроса топика, и давно не писал ничего ни на Делфях ни на Билдере, но по-моему очень удобно использовать CList гы Хотя уже не помню что это такое...
|
|||
|
||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |