Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / трехзвездночный массив / 17 сообщений из 17, страница 1 из 1
20.02.2013, 01:06
    #38158247
MaximuS_G
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
трехзвездночный массив
Всем привет!
У меня есть инициализированный трехзвездночный массив (массив указателей на указатели):
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
int *** objects;
objects = new int ** [3];
for (int i=0;i<3;i++)
	objects[i] = new int*;

for (int i=0;i<3;i++)
	for (int j=0;j<3;j++)
		objects[i][j] = NULL;


По нему есть 2 вопроса:
1) Какой размер массива?
Вот эта строчка - objects[i] = new int* - выделяет 4 байта, или выделяет один байт (по идее один байт)?
2) Как правильно удалить такой массив?
Вот так не получается, получаю свал на втором блоке for:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
for (int i=0;i<3;i++)
	for (int j=0;j<3;j++)
		delete objects[i][j];

for (int i=0;i<3;i++)
	delete objects[i];

delete objects;


Заранее спасибо!
...
Рейтинг: 0 / 0
20.02.2013, 01:45
    #38158260
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
трехзвездночный массив
int *** objects;
objects = new int ** [3];

По нему есть 2 вопроса:
1) Какой размер массива?

3*sized(void*)


Вот эта строчка -

objects[i] = new int*
- выделяет 4 байта, или выделяет один байт (по идее один байт)?

1*sizeof(void*)

2) Как правильно удалить такой массив?
Вот так не получается, получаю свал на втором блоке for:

А ты его неправильно выделяешь.
...
Рейтинг: 0 / 0
20.02.2013, 12:28
    #38158737
MaximuS_G
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
трехзвездночный массив
Спасибо!
А где именно не правильно?
Если такое попробовать, то все правильно выводит - девять единиц:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
int* a = new int;
*a = 1;
int *** objects;

objects = new int ** [3];
for (int i=0;i<3;i++)
	objects[i] = new int*;

for (int i=0;i<3;i++)
	for (int j=0;j<3;j++)
		objects[i][j] = a;

for (int i=0;i<3;i++)
	for (int j=0;j<3;j++)
		cout<<*objects[i][j]<<endl;
...
Рейтинг: 0 / 0
20.02.2013, 12:57
    #38158809
Vadddddd
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
трехзвездночный массив
MaximuS_G,
если двухмерный массив указателей

создание:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
int   height   = 20;
int   width    = 80;

pField = new int** [height];
for (int i = 0; i < height; ++i)
{
    pField[i] = new int* [width];
    memset (pField[i], 0, width * 4);  // инициализация нулями
}



удаление:
Код: plaintext
1.
2.
3.
for (int i = 0; i < height; ++i)
    delete [] pField[i];
delete [] pField;
...
Рейтинг: 0 / 0
20.02.2013, 12:59
    #38158814
Vadddddd
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
трехзвездночный массив
пропустил в начале
Код: plaintext
1.
pField = new int** [height];
...
Рейтинг: 0 / 0
20.02.2013, 13:02
    #38158821
Vadddddd
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
трехзвездночный массив
сорри, в начале
Код: plaintext
1.
int *** pField;
...
Рейтинг: 0 / 0
20.02.2013, 13:52
    #38158962
MaximuS_G
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
трехзвездночный массив
Ага, я понял, спс! Получается моя ошибка была вот здесь:
Код: plaintext
1.
objects[i] = new int*;


Вместо массива указателей, выделял только один указатель.

Здесь
Vaddddddmemset (pField[i], 0, width * 4); // инициализация нулями
как я понял сразу выделяется память под int на все элементы. И если элементов будет только 2 из 160 (20x80), то зря получается израсходовали кучу памяти. Может быть лучше не выделять сразу память, а выделять когда она нужна?
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
for (int i = 0; i < height; ++i)
{
    pField[i] = new int* [width];
}
for (int i=0;i<height;i++)
	for (int j=0;j<width;j++)
		objects[i][j] = NULL;

objects[1][2] = new int(7);
...
Рейтинг: 0 / 0
20.02.2013, 14:20
    #38159018
?
?
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
трехзвездночный массив
MaximuS_G, ну указатель занимает не меньше памяти чем int
...
Рейтинг: 0 / 0
20.02.2013, 14:23
    #38159023
MaximuS_G
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
трехзвездночный массив
?MaximuS_G, ну указатель занимает не меньше памяти чем int
А, ну тогда да. Я просто думал, что указатель занимает один байт, так как содержит в себе только адрес.
...
Рейтинг: 0 / 0
20.02.2013, 14:46
    #38159076
Vadddddd
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
трехзвездночный массив
память оператор new выделяет
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
int   height   = 20;
int   width    = 80;

int *** pField;
pField = new int** [height];       // выделется память для 20 указателей
for (int i = 0; i < height; ++i)
{
    pField[i] = new int* [width];       //  20 раз выделяется память для 80-ти указателей
    memset (pField[i], 0, width * 4);  // и заполняется  нулями
}



memset памяти не выделяет.

строка -
Код: sql
1.
memset (pField[i], 0, width * 4);


эквивалентна
Код: sql
1.
2.
	for (int j=0;j<width;j++)
		objects[i][j] = NULL;



можно и так:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
int   height   = 20;
int   width    = 80;

int *** pField;
pField = new int** [height];       // выделется память для 20 указателей
for (int i = 0; i < height; ++i)
{
    pField[i] = new int* [width];       //  20 раз выделяется память для 80-ти указателей
}

for (int i=0;i<height;i++)              // и заполняется  нулями
	for (int j=0;j<width;j++)
		objects[i][j] = NULL;



это только массив указателей создали,
сами обьекты на которые указатели ссылаются еще нужно создать:
Код: sql
1.
 pField[i][j] = new int;
...
Рейтинг: 0 / 0
20.02.2013, 15:10
    #38159123
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
трехзвездночный массив
MaximuS_G, А где именно не правильно?

так:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
int ** objects;
objects = new int* [3];
for (int i=0;i<3;i++)
	objects[i] = new int[200];

for (int i=0;i<3;i++)
	for (int j=0;j<200;j++)
		objects[i][j] = 42;
...
Рейтинг: 0 / 0
20.02.2013, 15:11
    #38159127
MaximuS_G
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
трехзвездночный массив
Я понял, спасибо
memset памяти не выделяет.
Интересно, зачем ей тогда передавать размер памяти 3м параметром?
...
Рейтинг: 0 / 0
20.02.2013, 15:12
    #38159131
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
трехзвездночный массив
MaximuS_G?MaximuS_G, ну указатель занимает не меньше памяти чем int
А, ну тогда да. Я просто думал, что указатель занимает один байт, так как содержит в себе только адрес.

Ага, а адрес всегда 8-мибитовый :-)
...
Рейтинг: 0 / 0
20.02.2013, 15:12
    #38159134
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
трехзвездночный массив
MaximuS_GЯ понял, спасибо
memset памяти не выделяет.
Интересно, зачем ей тогда передавать размер памяти 3м параметром?

Чтобы ей знать этот размер памяти.
...
Рейтинг: 0 / 0
20.02.2013, 15:51
    #38159235
MaximuS_G
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
трехзвездночный массив
MasterZivMaximuS_Gпропущено...

А, ну тогда да. Я просто думал, что указатель занимает один байт, так как содержит в себе только адрес.

Ага, а адрес всегда 8-мибитовый :-)

The value stored in the pointer is an address to memory. If you're on a 32-bit system, that pointer into memory is going to be 32 bits (or four bytes) long. If you're on a 64-bit system, that pointer into memory is going to be 64 bits (or eight bytes) long.
The size of the data that holds the location in memory has nothing to do with the size of the data represented at that location in memory.
Теперь все ясно.

MasterZivЧтобы ей знать этот размер памяти.
То есть память не выделиться?
...
Рейтинг: 0 / 0
20.02.2013, 16:30
    #38159333
MaximuS_G
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
трехзвездночный массив
MasterZivЧтобы ей знать этот размер памяти.
Кажется здесь указана другая причина
авторThe memset function takes three arguments. The first argument is a pointer (notice the void *) to whatever data type you are planning to set, the second argument is the specific value you are going to set your data with; there is however a catch in that memset will convert your integer value into an unsigned char when writing the data. The third argument is how many of those specific values are needed.
...
Рейтинг: 0 / 0
20.02.2013, 16:54
    #38159404
MaximuS_G
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
трехзвездночный массив
И правда задает количество элементов, вот проверка:
Код: plaintext
1.
2.
3.
4.
5.
int* a = new int[3];
memset(a,0,2*sizeof(int)); // только двум элементам из 3х проставляем 0
cout<<a[0]; // 0
cout<<a[1]; // 0 
cout<<a[2]; // не ноль
...
Рейтинг: 0 / 0
Форумы / C++ [игнор отключен] [закрыт для гостей] / трехзвездночный массив / 17 сообщений из 17, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]