Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Изменение размеров массива во время исполнения, аналог setlength() в делфи 
:(
    Опции темы
Sep.
Дата 27.4.2005, 02:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 109
Регистрация: 22.7.2004

Репутация: нет
Всего: 6



Если во время заполнения динамического массива не известно какова будет его длинна, как поступить?
New() выделяет место, и потом к этому месту уже не добавить, как я понял?
И как уменьшить массив, например вернуть его вторую половину в кучу?
Спасибо.
--------------------
Syn - TotalCommander lister plugin |  SynTree - coders sourcebook  
PM MAIL   Вверх
sergejzr
Дата 27.4.2005, 03:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Un salsero
Group Icon


Профиль
Группа: Админ
Сообщений: 13285
Регистрация: 10.2.2004
Где: Германия г .Ганновер

Репутация: 19
Всего: 360



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

Вот этот код например увеличит длинну массива и скоирует в новый старый.
Но для этого есть STL конечною
Код

#include <iostream.h>
#include <cstring>


template<class T>
void resize (T *&massiv, unsigned old_size, unsigned new_size) ;

 
void main () 
{
    
char* x=new char[19];

char *test="Privets djskfsjdfk";
int len=strlen(test);

memcpy(x,test,len+1);
resize(x,len+1,128);
cout<< x;  
}

template<class T>
void resize (T *&massiv, unsigned old_size, unsigned new_size) 
{
    T* new_massiv=new T[new_size];

    memcpy(new_massiv,massiv,old_size);
    T* tmp=massiv;
    massiv=new_massiv;
    delete [] tmp;
}



--------------------
PM WWW IM ICQ Skype GTalk Jabber AOL YIM MSN   Вверх
Fire-Plug
Дата 27.4.2005, 07:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 102
Регистрация: 15.3.2005

Репутация: -1
Всего: 0



Цитата(Sep @ 27.4.2005, 02:36)
Если во время заполнения динамического массива не известно какова будет его длинна, как поступить?

Если пользовать не new, а ф-цию CRTL calloc (или malloc), то затем изменить размер выделенного ранее блока памяти можно с помощью CRTL-ф-ции realloc:
Код

void *realloc(void *memblock, size_t size );
// memblock - указатель на блок памяти распределенный  ранее

Содержимое блока памяти остается тем же. Если размер блока уменьшается, т.е. NewSize < OldSize, то остаются естесс-но, первые NewSize байт.

Можно предложить для твоей ситуации более современный подход.
Известно ли тебе что-либо об STL, в частности, о таком контейнере в STL как vector?
vector - как раз реализует динамический массив, к-рый позволяет добавлять к нему новые эл-ты по мере их получения. Если не известно, то вот примитивный пример - вектор целых чисел:
Код

#include <vector>
using std::vector;
...
vector<int>  myVect;

while( !isEnd )
{
   int newValue= ... // откуда-то получаем
   myVect.push_back(newValue);
}
...
// Доступ к элементам вектора - как в обычном массиве
for(size_t n= 0; n < myVect.size(); n++)
{
    std::cout << myVect[n] << std::endl; // просто выводим
}


Добавлено @ 07:26
По поводу realloc: думается, что в качестве void *memblock прокатит также указатель на блок памяти, к-рый вернет оператор new, т.к. реализация new - обертка вокруг malloc.
--------------------
Объясни другому - поймешь сам (Народная примета)
PM MAIL   Вверх
Sep.
Дата 29.4.2005, 09:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 109
Регистрация: 22.7.2004

Репутация: нет
Всего: 6



Да vector = сила!
Можно даже стирать отдельные элементы за одно действие.
Спасибо за инфу.
--------------------
Syn - TotalCommander lister plugin |  SynTree - coders sourcebook  
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0486 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.