Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Visual C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 27.01.2011, 10:18   #1
xapiton
 
Регистрация: 25.10.2009
Сообщений: 8
По умолчанию Класс для работы с большими массивами

Задали задание, написать класс который позволит работать с большими массивами, т.е. конструктор класса должен позволять создавать массив нужного (любого размера). Класс должен быть шаблонным. Должен уметь добавлять элементы в созданный массив. Получение доступа к элементам массива через индекс. Получение длины массива. Удаление текущего массива. И деструктор класса должен освобождать всю память.
Вот что у меня получилось :

Код:
template <typename Type> class CLargeData
{
private:
	Type* m_ptr;
	int m_size;
public:
	void Display()
	{
		for( int i = 0; i < m_size; i++ )
		{
			cout << m_ptr[ i ];
		}
		cout << endl;
	}
	Type* Pop( int pos )
	{
		Type* ptr = &m_ptr[ pos ];
		return ptr;
	}
	void Push( Type* var, int pos )
	{
		int i = 0;
		while( var[ i ] != NULL )
		{
			m_ptr[ pos ] = var[ i ];
			i++;
			pos++;
		}
	}
	CLargeData ( int size ) 
	{
		m_size = size;
		m_ptr = (Type*) VirtualAlloc( 0, m_size, MEM_COMMIT, PAGE_READWRITE );
		cout << "constr" << endl;
	}
	~CLargeData () 
	{
		VirtualFree( m_ptr, m_size, MEM_RELEASE );
		cout << "destr" << endl;

	}
};
А вот с определением длины выделяемой памяти не получается и с получением доступа через индекс ( наверно так надо [index] ) тоже не выходит.
xapiton вне форума Ответить с цитированием
Старый 27.01.2011, 11:10   #2
S1av0k
Пользователь
 
Регистрация: 26.11.2009
Сообщений: 87
По умолчанию

А собственно чем отличается это шаблонный класс от других классов для работы с массивами? Где играет роль то, что он большой?
Помог - жми весы
S1av0k вне форума Ответить с цитированием
Старый 27.01.2011, 11:38   #3
xapiton
 
Регистрация: 25.10.2009
Сообщений: 8
По умолчанию

Цитата:
Сообщение от S1av0k Посмотреть сообщение
А собственно чем отличается это шаблонный класс от других классов для работы с массивами? Где играет роль то, что он большой?
Ну с помощью VirtualAlloc можно выделить, зарезервировать много разной памяти и с разными параметрами. Правда я не совсем еще понимаю зачем это нужно. Мы учим это в курсе Visual C++ WinAPI, а в курсе C++ учили new, delete как по мне это одно и тоже (new и VirtualAlloc).
Поэтому и спрашиваю, может я думаю по старому(new, delete) а надо думать по новому (VirtualAlloc,VirtualFree), думать в соответствии с Visual C++ WinAPI.
xapiton вне форума Ответить с цитированием
Старый 27.01.2011, 12:23   #4
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Цитата:
А собственно чем отличается это шаблонный класс от других классов для работы с массивами? Где играет роль то, что он большой?
тем что память выделяется не в куче, и чисто теоритически этот класс может вместить массив в гиг.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 27.01.2011, 12:26   #5
Obey-Kun
Линуксоид
Участник клуба
 
Аватар для Obey-Kun
 
Регистрация: 31.07.2009
Сообщений: 1,403
По умолчанию

Нахрена? new что лидля больших размеров не годится?
Я схожу с ума или это глючит реальность?
Jabber ID: obey@obey.su

Последний раз редактировалось Obey-Kun; 27.01.2011 в 13:42.
Obey-Kun вне форума Ответить с цитированием
Старый 27.01.2011, 13:39   #6
S1av0k
Пользователь
 
Регистрация: 26.11.2009
Сообщений: 87
По умолчанию

Действительно, разве объём, выделяемый при помощи new чем-то ограничен?
Помог - жми весы
S1av0k вне форума Ответить с цитированием
Старый 27.01.2011, 14:45   #7
kaljan775
:D
Форумчанин
 
Аватар для kaljan775
 
Регистрация: 26.09.2010
Сообщений: 570
По умолчанию

вообще, если не ошибаюсь new может не сработать
вот, нарыл на википедии )
Цитата:
new пытается выделить достаточно памяти в куче для размещения новых данных и, в случае успеха, возвращает адрес свежевыделенной памяти. Однако, если new не может выделить память в куче, то он передаст (throw) исключение типа std::bad_alloc.
Цитата:
В компиляторах, придерживающихся стандарта ISO C++, в случае если недостаточно памяти для выделения, то генерируется исключение типа std::bad_alloc. Выполнение всего последующего кода прекращается, пока ошибка не будет обработана в блоке try-catch или произойдет экстренное завершение программы
Пишу ПО, создаю сайты, делаю курсовые работы, за деньги
C#, .NET, MS SQL, AngularJS, HTML, jQuery
kaljan775 вне форума Ответить с цитированием
Старый 27.01.2011, 17:00   #8
netrino
Участник клуба
 
Аватар для netrino
 
Регистрация: 15.07.2008
Сообщений: 1,933
По умолчанию

2kaljan775, В таком случае и VirtualAlloc не сработает)
Вообще это более низкоуровневая функция и даёт больший контроль над выделением памяти. Сам же оператор new может быть реализован с использованием VirtualAlloc. Более подробно про VirtualAlloc можно на MSDN почитать
netrino вне форума Ответить с цитированием
Старый 27.01.2011, 17:16   #9
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Цитата:
Нахрена? new что лидля больших размеров не годится?
стандартный new выделяет в куче.
Цитата:
В таком случае и VirtualAlloc не сработает)
она работает вне кучи, поэтому и да и нет.
Цитата:
Действительно, разве объём, выделяемый при помощи new чем-то ограничен?
да, максимальным размером свободного блока в куче.

ЗЫ: напоминаю, что говорю про стандартный new
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 27.01.2011, 17:24   #10
kaljan775
:D
Форумчанин
 
Аватар для kaljan775
 
Регистрация: 26.09.2010
Сообщений: 570
По умолчанию

все равно совсем большой массив не уместится на жестком диске
Пишу ПО, создаю сайты, делаю курсовые работы, за деньги
C#, .NET, MS SQL, AngularJS, HTML, jQuery
kaljan775 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Функции для работы с динамическими массивами iiunbreakableii Общие вопросы Delphi 8 17.07.2012 14:04
Построить класс для работы со списком Васильева Зинаида Помощь студентам 4 30.10.2010 21:10
Класс для работы со стеком(C++).элемент стека-символ. Marusechka Помощь студентам 1 26.09.2010 19:04
класс для работы с обьектом множества Kreaman Помощь студентам 3 26.11.2008 01:02