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

Как выделить память в процессе

 
Перейти:  
Этот форум закрыт, вы не можете писать новые сообщения и редактировать старые.   Эта тема закрыта, вы не можете писать ответы и редактировать сообщения.    Список форумов Архив форумов ЦИТФорума -> Программирование
Предыдущая тема :: Следующая тема  
Автор Сообщение
alesha
Гость





СообщениеДобавлено: Чт Сен 16 2004 15:41    Заголовок сообщения: Как выделить память в процессе Ответить с цитатой

Всем привет!
Есть массив типа float, но заранее нельзя сказать, какой будет его размер. Например как сделать так, чтобы память выделялась по мере появления элемента массива т.е. появилось значение память под одно значение дополнительно выделилась, при этом сохранив, всё, что было в массиве до этого.
Вернуться к началу
droopy



Зарегистрирован: 28.07.2004
Сообщения: 168

СообщениеДобавлено: Чт Сен 16 2004 15:52    Заголовок сообщения: Ответить с цитатой

используй vector<float>
в случае с си malloc realloc
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Отправить e-mail Посетить сайт автора
SergeyL



Зарегистрирован: 15.09.2004
Сообщения: 123
Откуда: Н.Новгород

СообщениеДобавлено: Чт Сен 16 2004 18:04    Заголовок сообщения: Ответить с цитатой

На каком языке пишешь прогу?

можно new и delet в с.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
alesha
Гость





СообщениеДобавлено: Пт Сен 17 2004 07:01    Заголовок сообщения: Как выделить память в процессе Ответить с цитатой

SergeyL писал(а):
На каком языке пишешь прогу?

можно new и delet в с.

Пишу на С++ Builder...
Если можно поконкретнее написать, а то я только первые шаги делаю в программировании...
Вернуться к началу
droopy



Зарегистрирован: 28.07.2004
Сообщения: 168

СообщениеДобавлено: Пт Сен 17 2004 09:20    Заголовок сообщения: Ответить с цитатой

Есть такая вещь как стандартная библиотека шаблонов. Туда
входит и вектор.
#include <vector>
main()
{
vector<float> v(10);
v.resize(20); понятно?
}
или так
#include <stldib.h>
main()
{
float *p;
p = (float *) malloc( 10 * sizeof( float ) );
p = (float *) realloc( p, 20 * sizeof( float ) );
}
с new delete придется все делать ручками.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Отправить e-mail Посетить сайт автора
SergeyL



Зарегистрирован: 15.09.2004
Сообщения: 123
Откуда: Н.Новгород

СообщениеДобавлено: Пт Сен 17 2004 10:40    Заголовок сообщения: Ответить с цитатой

Если понадобится с new и delete:

char *q = new int[10];
delete[10] q; //освобождает выделенную память.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
совсем незнакомый



Зарегистрирован: 24.12.2003
Сообщения: 183
Откуда: Israel

СообщениеДобавлено: Пт Сен 17 2004 11:22    Заголовок сообщения: Ответить с цитатой

массив - статическая структура данных.
[ кусок памяти разделенный виртуально на ячейки.]
когда ты создаёшь массив - ты заставляешь систему выдать тебе
_сплошной_ к усок памяти. т.е. чтобы "изменить величину массива" - нужно на самом деле:
а) создать новый и больший массив
б) переписать данные старого в новый
в) стереть старый
всё это дорогое удовольствие, и не всегда есть возможность делать так.
вам нужно реализовать/использовать какую нибудь динамическую структуру - напр. List или Set.
в данном случае советую использовать вектор из STL как вам и посоветовал droopy.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
FUKS



Зарегистрирован: 14.04.2002
Сообщения: 148
Откуда: Москва

СообщениеДобавлено: Пт Сен 17 2004 13:08    Заголовок сообщения: Ответить с цитатой

совсем незнакомый писал(а):
массив - статическая структура данных.
[ кусок памяти разделенный виртуально на ячейки.]
когда ты создаёшь массив - ты заставляешь систему выдать тебе
_сплошной_ к усок памяти. т.е. чтобы "изменить величину массива" - нужно на самом деле:
а) создать новый и больший массив
б) переписать данные старого в новый
в) стереть старый

Ну зачем же так жестоко. Как виртуально массив разделён на ячейки, так же виртуально он и сплошной - ОСь сама заботится о том, чтобы массив был сплошным с точки зрения пользователя (программы). Конечно в ДОСе и других ОСях незащищённого режима такой виртуализаци нет, там система в случае невозможности увеличить размер блока памяти вынуждена искать другой сплошной свободный блок и переписывать всё туда, иначе выдавать отказ. Но в ОСях защищённого режима типа Unix/Windows существует трансляция адресов памяти (paging, хотя вроде и без него тоже), когда запрошенный адрес памяти рассматривается как виртуальный и транслируется в реальный физический адрес, при этом виртуальные адреса, которыми оперирует программа, образуют сплошной блок, а физические могут быть разбросаны как угодно, навроде кластеров файла на диске. При включённом page mode (страничном режиме) минимальный блок физической памяти ("кластер") имеет размер 4 кб.
В общем, программе об этом заботиться не надо, достаточно говорить системе функциями malloc/realloc что требуется, она сама сообразит что и как сделать с минимальными затратами времени.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Показать сообщения:   
Этот форум закрыт, вы не можете писать новые сообщения и редактировать старые.   Эта тема закрыта, вы не можете писать ответы и редактировать сообщения.    Список форумов Архив форумов ЦИТФорума -> Программирование Часовой пояс: 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
Внимание! Любой из материалов, опубликованных на этом сервере, не может быть воспроизведен в какой бы то ни было форме и какими бы то ни было средствами без письменного разрешения владельцев авторских прав. Подробнее...