Logo Море(!) аналитической информации!
IT-консалтинг Software Engineering Программирование СУБД Безопасность Internet Сети Операционные системы Hardware
Архив форумов ЦИТФорума
Море(!) вопросов - Море(!) ответов
 
 FAQFAQ   ПоискПоиск   ПользователиПользователи   ГруппыГруппы   РегистрацияРегистрация 
 ПрофильПрофиль   Войти и проверить личные сообщенияВойти и проверить личные сообщения   ВходВход 
Как правильно задавать вопросы

Еще раз о динамических масивах в С++

 
Перейти:  
Этот форум закрыт, вы не можете писать новые сообщения и редактировать старые.   Эта тема закрыта, вы не можете писать ответы и редактировать сообщения.    Список форумов Архив форумов ЦИТФорума -> Программирование
Предыдущая тема :: Следующая тема  
Автор Сообщение
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, просто лень мой старый исходник редактировать Very Happy
Если всё равно не понял, попробую обьянить по другому Shocked Ты только спрашивай, всегда рад помоч Smile
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Отправить e-mail Посетить сайт автора
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    Заголовок сообщения: тему можно закрывать Ответить с цитатой

Спасибо, ребята, идею поняла. Оказывается все просто=) А главное красиво! (с точки зрения красоты кода Wink ) И что еще лучше, задачу сделала!
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Kefir



Зарегистрирован: 16.04.2005
Сообщения: 443
Откуда: Пермь

СообщениеДобавлено: Пт Мар 10 2006 16:15    Заголовок сообщения: Ответить с цитатой

Есть еще realloc... И книжки... И документации всякой много... Читать надо иногда...
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Отправить e-mail
Wladimir



Зарегистрирован: 02.03.2005
Сообщения: 150
Откуда: Ставропольский край

СообщениеДобавлено: Пт Мар 10 2006 21:13    Заголовок сообщения: Ответить с цитатой

А вообще надо использовать std :: vector и не забивать голову антиквариатом без необходимости.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Kefir



Зарегистрирован: 16.04.2005
Сообщения: 443
Откуда: Пермь

СообщениеДобавлено: Сб Мар 11 2006 10:11    Заголовок сообщения: Ответить с цитатой

Оне, не соизвоили снизойти до чтения описания функций Си, а вы говорите Vector... Это ж надо читать дорогущую книгу по STL или, боже упаси, документацию на английском языке...
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Отправить e-mail
Показать сообщения:   
Этот форум закрыт, вы не можете писать новые сообщения и редактировать старые.   Эта тема закрыта, вы не можете писать ответы и редактировать сообщения.    Список форумов Архив форумов ЦИТФорума -> Программирование Часовой пояс: GMT + 3
Страница 1 из 1

 
Перейти:  
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах


Powered by phpBB © 2001, 2002 phpBB Group
Русская поддержка phpBB

 

IT-консалтинг Software Engineering Программирование СУБД Безопасность Internet Сети Операционные системы Hardware

Информация для рекламодателей PR-акции, размещение рекламы — adv@citforum.ru,
тел. +7 495 6608306, ICQ 232284597
Пресс-релизы — pr@citforum.ru
Послать комментарий
Информация для авторов
This Web server launched on February 24, 1997
Copyright © 1997-2000 CIT, © 2001-2006 CIT Forum
Внимание! Любой из материалов, опубликованных на этом сервере, не может быть воспроизведен в какой бы то ни было форме и какими бы то ни было средствами без письменного разрешения владельцев авторских прав. Подробнее...