URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID9
Нить номер: 4679
[ Назад ]

Исходное сообщение
"Динамический массив"

Отправлено sandy , 23-Сен-05 21:03 
Есть массив

char** array;
array=new char*[10];

Могу ли я его увеличить, не повреждая хранящихся в нем данных?


Содержание

Сообщения в этом обсуждении
"Динамический массив"
Отправлено DeadMustdie , 23-Сен-05 21:48 
>Есть массив
>
>char** array;
>array=new char*[10];
>
>Могу ли я его увеличить, не повреждая хранящихся в нем данных?

Можно скопировать в новый массив. Увеличить размер существующего нельзя.
И вообще подобная конструкция дурно пахнет - утечками памяти, например.
STL forever и всё такое.


"Динамический массив"
Отправлено chip , 24-Сен-05 09:46 
>Есть массив
>
>char** array;
>array=new char*[10];
>
>Могу ли я его увеличить, не повреждая хранящихся в нем данных?

можно использовать realloc():

The realloc() function changes the size of the previously allocated mem-
ory referenced by ptr to size bytes.  The contents of the memory are
unchanged up to the lesser of the new and old sizes.  If the new size is
larger, the value of the newly allocated portion of the memory is unde-
fined.  If the requested memory cannot be allocated, NULL is returned and
the memory referenced by ptr is valid and unchanged.  If memory can be
allocated, the memory referenced by ptr is freed and a pointer to the
newly allocated memory is returned.  Note that realloc() and reallocf()
may move the memory allocation resulting in a different return value than
ptr.  If ptr is NULL, the realloc() function behaves identically to
malloc() for the specified size.

Однако, для CPP более красивое решение указал DeadMustdie



"Динамический массив"
Отправлено sas , 24-Сен-05 11:18 
>>Есть массив
>>
>>char** array;
>>array=new char*[10];
>>
>>Могу ли я его увеличить, не повреждая хранящихся в нем данных?
>
>можно использовать realloc():
>
>The realloc() function changes the size of the previously allocated mem-
>ory referenced by ptr to size bytes.  The contents of the
>memory are
>unchanged up to the lesser of the new and old sizes.  
>If the new size is
>larger, the value of the newly allocated portion of the memory is
>unde-
>fined.  If the requested memory cannot be allocated, NULL is returned
>and
>the memory referenced by ptr is valid and unchanged.  If memory
>can be
>allocated, the memory referenced by ptr is freed and a pointer to
>the
>newly allocated memory is returned.  Note that realloc() and reallocf()
>may move the memory allocation resulting in a different return value than
>
>ptr.  If ptr is NULL, the realloc() function behaves identically to
>
>malloc() for the specified size.
>
>Однако, для CPP более красивое решение указал DeadMustdie

Malen'koe utochnenie: Reshenie s realloc trebuet ne ispol'zovat' operatori new/delete, a funkcii C dlya videlenia pamjati.

Udachi
--- sas


"Динамический массив"
Отправлено sandy , 26-Сен-05 11:24 
>Malen'koe utochnenie: Reshenie s realloc trebuet ne ispol'zovat' operatori new/delete, a funkcii
>C dlya videlenia pamjati.

В том то и дело, что в программе еже задействованы операторы new/delete, и лень, знаете ли, переписывать это на С.
Кроме того, этот массив - член структуры, а структура - член вектора. Была мысль воспользоваться вектором. Но получается что-то вроде этого:

struct STR {
/*  */
std::vector<char*> v;
// char** v; // альтернативный вариант
};

std::vector<STR> sv(10);

В случае с массивом (определить его размер) просто:
sv[0].v=new char*[10];

А вот sv[0].v.resize(10); - не получается пока


"Динамический массив"
Отправлено Profic , 27-Сен-05 04:21 
std::vector<std::string> sv(10);
?

"Динамический массив"
Отправлено sandy , 27-Сен-05 10:37 
>std::vector<std::string> sv(10);
>?

Допустим. Тогда:
struct STR {
/*  */
std::vector<std::string>sv;
};

std::vector<STR> sv(10);

Размер вектора заранее не известен
Увеличить его конструкцией: sv[0].v.resize(10); не получается


"Динамический массив"
Отправлено sas , 28-Сен-05 03:33 
>>std::vector<std::string> sv(10);
>>?
>
>Допустим. Тогда:
>struct STR {
>/*  */
>std::vector<std::string>sv;
>};
>
>std::vector<STR> sv(10);
>
>Размер вектора заранее не известен
>Увеличить его конструкцией: sv[0].v.resize(10); не получается  

Prochitojte documentaciju po vectoru i vse stanet yasno.

Udachi
--- sas



"Динамический массив"
Отправлено sinus , 28-Сен-05 01:16 
>Есть массив
>
>char** array;
>array=new char*[10];
>
>Могу ли я его увеличить, не повреждая хранящихся в нем данных?

НОРМАЛЬНЫХ решиний только два:
1 односвязный\многосвязный список
2 STL (vector,list...)