Предыдущая тема :: Следующая тема |
Автор |
Сообщение |
Rizhaya
Зарегистрирован: 07.03.2006 Сообщения: 3
|
Добавлено: Вт Мар 07 2006 13:29 Заголовок сообщения: Еще раз о динамических масивах в С++ |
|
|
Есть задача, мне нужно по ходу программы создать массив структур. При этом я никоим образом зарание не могу знать количество елементов массива, то есть задать массив таким образом :
Код: | type_strukture *ukazatel = type_strukture[N] |
не удастся.
То есть мне нужно динамически добавлять елементы в массив.
Надеюсь проблему обьяснила более менее понятно... Мне нужно, что бы кто-то обьяснил как это можно реализовать на cpp и можно ли вообще? Если нет, то посоветуйте, что в таком случае делать? |
|
Вернуться к началу |
|
|
Feniksa
Зарегистрирован: 28.08.2005 Сообщения: 122 Откуда: Чернобыль
|
Добавлено: Вт Мар 07 2006 15:11 Заголовок сообщения: |
|
|
Если я всё правильно понял, тебе надо просто создать динамический массив.
Для етого тебе надо всего лиш знать размер данных.
Вот пример создания массива типа int (для структуры данных практически так жеш создаёться)
#include <malloc.h> // Нужная библиотека
int col_elementov;
int *Ykazatel;
Ykazatel = (int*) malloc(sizeof(int)*col_elementov); // Создаём массив
// Какие небуть действия с массивом
free(Ykazatel); // Удаляем массив
//А ето пример создания структуры
typedef _Str
{
// Какие нибуть переменные
}Str;
int *Ykazatel;
int Col_Elementov;
Ykazatel=(Str*) malloc (sizeof(Str)*Col_Elementov);
free(Ykazatel);
Извини, что я использовал typedef, просто лень мой старый исходник редактировать
Если всё равно не понял, попробую обьянить по другому Ты только спрашивай, всегда рад помоч |
|
Вернуться к началу |
|
|
Rizhaya
Зарегистрирован: 07.03.2006 Сообщения: 3
|
Добавлено: Вт Мар 07 2006 15:23 Заголовок сообщения: |
|
|
хм... хм... хм..
На сколько я поняла вот из этой строки Код: | Ykazatel = (int*) malloc(sizeof(int)*col_elementov); | , то знать количество елементов мне все равно надо? Или можно это количество по ходу дела изменять? То есть я в принципе могу изменить вот это col_elementov и в новый выделеный кусок памяти записать то, что мне надо, а то, что было уже записанно при этом сохранится? так? |
|
Вернуться к началу |
|
|
Aragaer
Зарегистрирован: 28.03.2005 Сообщения: 164
|
Добавлено: Вт Мар 07 2006 17:01 Заголовок сообщения: |
|
|
То, что было записано, не сохранится.
Код: | int *p;
int array_length;
scanf("%d", &array_length);
p = malloc(sizeof(int)*array_length); | чем-то заполняем массив, а потом надо его увеличить Код: | int *tmp = malloc(sizeof(int)*new_size);
for (int i=0; i<sizeof(p)/sizeof(*p); i++)
tmp[i] = p[i];
free(p);
p = tmp; | Конструкция sizeof(p)/sizeof(*p) приводится у Кернигана и Пайка как пример достаточно надежного способа определить количество элементов массива. В данном случае вместо sizeof(*p) сойдет и sizeof(int).
А еще лучше вместо копирования поэлементно использовать memcpy:
Код: | memcpy(tmp, p, sizeof(p)) |
_________________ Open your eyes.
And Awaken. |
|
Вернуться к началу |
|
|
Rizhaya
Зарегистрирован: 07.03.2006 Сообщения: 3
|
Добавлено: Вт Мар 07 2006 18:49 Заголовок сообщения: тему можно закрывать |
|
|
Спасибо, ребята, идею поняла. Оказывается все просто=) А главное красиво! (с точки зрения красоты кода ) И что еще лучше, задачу сделала! |
|
Вернуться к началу |
|
|
Kefir
Зарегистрирован: 16.04.2005 Сообщения: 443 Откуда: Пермь
|
Добавлено: Пт Мар 10 2006 16:15 Заголовок сообщения: |
|
|
Есть еще realloc... И книжки... И документации всякой много... Читать надо иногда... |
|
Вернуться к началу |
|
|
Wladimir
Зарегистрирован: 02.03.2005 Сообщения: 150 Откуда: Ставропольский край
|
Добавлено: Пт Мар 10 2006 21:13 Заголовок сообщения: |
|
|
А вообще надо использовать std :: vector и не забивать голову антиквариатом без необходимости. |
|
Вернуться к началу |
|
|
Kefir
Зарегистрирован: 16.04.2005 Сообщения: 443 Откуда: Пермь
|
Добавлено: Сб Мар 11 2006 10:11 Заголовок сообщения: |
|
|
Оне, не соизвоили снизойти до чтения описания функций Си, а вы говорите Vector... Это ж надо читать дорогущую книгу по STL или, боже упаси, документацию на английском языке... |
|
Вернуться к началу |
|
|
|