| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Общие вопросы > Динамические массивы на C++Builder... |
| Автор: Kurt 10.9.2003, 16:31 |
| Обычно я работаю с Delphi, но тут пришлось использовать C++Builder. Подскажите, пожалуйста, есть ли в C++Builder динамические массивы? Если можно, приведите простенький пример как с ними работать. Особенно нужен пример работы с аналогом Дельфового SetLength (если в C++Builder есть аналог такой функции). Заранее спасибо. |
| Автор: Vyacheslav 10.9.2003, 16:40 |
| см. STL: vector |
| Автор: Kurt 10.9.2003, 21:06 |
| Признаю свою непонятливость, но как с вектором работать я не сообразил. Ладно, а если мне не недо сохранять данные перед изменением размера? В общем задача в простой форме: нужно выделить память под массив байтов, размер массива определяется run-time. Знаю есть API-функции для этого (VirtualAlloc & GlobalAlloc.. кстати, какая разница?). Но хотелось бы средствами C++... |
| Автор: RAN 10.9.2003, 21:39 |
| Конечно, 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 10.9.2003, 22:51 |
| Извини, а это n должно быть константой? Или можно во время работы проги назначать? Типа: int n=10; int *arr = new int[n]; Или?... Просто в данный момент у меня нет доступа к C++Builder и я не могу проверить... |
| Автор: mr.DUDA 10.9.2003, 22:54 | ||||
Не советовал бы злоупотреблять VirtualAlloc, т.к. память выделяется целыми страницами по 4Кб. Используй "кучу" (heap), и если не догоняешь "new/delete", но зато знаешь что такое Alloc, пользуйся парой функций "malloc/free" (кстати, оператор "new" в конечном итоге всё равно вызывает функцию malloc).
Можно ставить значение в run-time. |
| Автор: RAN 10.9.2003, 22:57 |
| n - не константа. |
| Автор: Vyacheslav 11.9.2003, 09:23 | ||||
| Уточни тогда вопрос:что ты понимашь под динмическим массивом: массив, созданный динамически, или массив с динамически изменяемой длинной? В качестве массива байтов можно использовать string примеры использования
|
| Автор: Fantasist 11.9.2003, 19:10 | ||
Такие реализации STL выбрасывать надо сразу. Такое поведение допустимо только для valarray, ну и bitset (может еще чего забыл). В других контейнерах должен использоваться operator=, а не CopyMemory. |
| Автор: RAN 11.9.2003, 19:13 |
| Fantasist, смысл-то не в CopyMemory, а в том что, чтобы увеличить размерность STL создаёт новый массив и копирует в него новый. Для стандартных типов (int и т.д.) копировать можно, это же не классы. |
| Автор: Nastya 11.9.2003, 20:04 |
| Существует несколько способов динамически работать с массива 1. Используя шаблон классов vector 2. Используя операторы new и delete, при этом подходе ты сам "вручную " пишешь функцию изменения размера массива и на твоей совести ее корректная работа 3. Использовать функции alloc, free, или их WinApi-шные при это ты не только следишь за тем что описанно в п.2, но если речь идет об массиве объектов, то и за корректным вызовом конструкторов и деструкторов. Наиболее предпочтительный вариант 1. В форуме не раз заходила речь об STL и даже где-то были ссылки на учебники идоки. Если проблема более конкретная опиши. |
| Автор: podval 12.9.2003, 07:43 | ||||
Ребята, обратите внимание на вопрос:
В Дельфи динамические массивы - это особый тип. Вот что сделано в Билдере (см. help):
|
| Автор: podval 12.9.2003, 07:45 | ||
| Вот, кстати, с того же help'a: C++ DynamicArray example
© Borland |
| Автор: DENNN 12.9.2003, 11:57 | ||
Вот и надо было так написать |
| Автор: B2_Russia 15.9.2003, 12:12 |
| Ничего не читал кроме вопроса топика, и давно не писал ничего ни на Делфях ни на Билдере, но по-моему очень удобно использовать CList гы Хотя уже не помню что это такое... |