Russian Qt Forum

Qt => Вопросы новичков => Тема начата: Zeka13 от Май 13, 2012, 19:35



Название: ручное распределение памяти для массива объектов класса Qt
Отправлено: Zeka13 от Май 13, 2012, 19:35
Всем доброго времени суток, умею в ручную распределять и освобождать память для массивов стандартных типов


Код
C++ (Qt)
//выделиние памяти под массивы
a = new int* [xSize];
for(i = 0; i < xSize; ++i)
a[i] = new int [ySize];

Код
C++ (Qt)
//осбобождение памяти
   for(int i = 0; i < xSize; ++i)
   delete[] a[i];
                   delete[] a;
 
в классе массив описан как    int** a;

у меня есть некий массив в классе

QGraphicsPixmapItem  *pPixmapItem[100][100];
хочу точно так же выделять для него вручную память, но ничего не получилось у меня, помогите пожалуйста ежить эту задачу, заранее спасибо!


Название: Re: ручное распределение памяти для массива объектов класса Qt
Отправлено: kambala от Май 13, 2012, 20:26
но ничего не получилось у меня
а где код как у тебя не получилось?

имей в виду, что в данном случае у тебя, проводя аналогию с твоим примером, тип int ***, а не int **


Название: Re: ручное распределение памяти для массива объектов класса Qt
Отправлено: Zeka13 от Май 13, 2012, 20:49
Цитировать
тип int ***, а не int **
kambala, не понял совсем вас

Цитировать
а где код как у тебя не получилось?
зачем вам нерабочий код? Или вы мне не верите?


Название: Re: ручное распределение памяти для массива объектов класса Qt
Отправлено: kambala от Май 13, 2012, 21:04
Цитировать
тип int ***, а не int **
kambala, не понял совсем вас
массив - это тот же указатель, двумерный массив - указатель на указатель.

ты хочешь создать двумерный массив указателей на QGraphicsPixmapItem, что по сути является указателем на указатель на указатель. логика тут абсолютно такая же, просто добавится еще одно вложение цикла for.
зачем вам нерабочий код? Или вы мне не верите?
чтобы указать на ошибку


Название: Re: ручное распределение памяти для массива объектов класса Qt
Отправлено: Zeka13 от Май 13, 2012, 21:26
как то так получается?

Код
C++ (Qt)
QGraphicsPixmapItem **pPixmapItem[100][100];
for (int i = 0; i < 100; ++i)
{
   for (int j = 0; j < 100; ++j)
   {
        pPixmapItem[i][j] = new QGraphicsPixmapItem* [100]();
        for (int k = 0; k < 100; ++k)
        {
           pPixmapItem[i][j][k] = new QGraphicsPixmapItem();
        }
   }
}


Название: Re: ручное распределение памяти для массива объектов класса Qt
Отправлено: kambala от Май 13, 2012, 23:14
это у тебя 3-х мерный массив вышел :)

если ты хочешь полностью управлять памятью руками, то надо объявлять свою матрицу как QGraphicsPixmapItem ***pPixmapItem и убрать один внутренний for из предыдущего кода (ну и индексы подрихтовать соответственно); если же нужно использовать то, что написано в первом посте, то у тебя память уже выделена под 10 тысяч элементов типа QGraphicsPixmapItem *, но присваивать в матрицу надо в виде
Код
C++ (Qt)
pPixmapItem[i][j] = new QGraphicsPixmapItem


Название: Re: ручное распределение памяти для массива объектов класса Qt
Отправлено: Igors от Май 14, 2012, 00:13
Здесь хорошо typedef напр
Код
C++ (Qt)
typedef QGraphicsPixmapItem * QGPixmapItemPtr;
 
// дальше все как в примере c int, только вместо него QGPixmapItemPtr;
a = new QGPixmapItemPtr * [xSize];
// и.т.д.
 

Код
C++ (Qt)
 
QGraphicsPixmapItem  *pPixmapItem[100][100];
 
Эта конструкция весьма неудачна и совсем не равна предыдущей. Теперь уже можно выделить только 100х100 - ни больше, ни меньше. Утеряна важная возможность переставлять указатели на строки - теперь для этого придется копировать в буфер - целое дело. Двумерный массив хорош когда размер железно не меняется - напр матрица 4х4

По поводу использования ++ контейнеров разговор уже был. Подход "сначала сделать базовыми средствами языка" возможен и имеет смысл, но требует большей аккуратности
Код
C++ (Qt)
//выделиние памяти под массивы
a = new int* [xSize];
...
//осбобождение памяти
       for(int i = 0; i < xSize+1; ++i)
   delete[] a[i];
 
Чего же выделяем xSize а освобождаем xSize+1 ?


Название: Re: ручное распределение памяти для массива объектов класса Qt
Отправлено: Zeka13 от Май 14, 2012, 09:52
Цитировать
Чего же выделяем xSize а освобождаем xSize+1 ?

ачепятка, у меня везде просто xSize+1


Название: Re: ручное распределение памяти для массива объектов класса Qt
Отправлено: Zeka13 от Май 14, 2012, 09:53
вот тако в итоге?

Код
C++ (Qt)
QGraphicsPixmapItem **pPixmapItem[xSize][ySize];
for (int i = 0; i < 100; ++i)
   for (int j = 0; j < 100; ++j)
        pPixmapItem[i][j] = new QGraphicsPixmapItem;


Название: Re: ручное распределение памяти для массива объектов класса Qt
Отправлено: Igors от Май 14, 2012, 14:35
вот тако в итоге?
Тако компилиться не будет :)



Название: Re: ручное распределение памяти для массива объектов класса Qt
Отправлено: Пантер от Май 14, 2012, 14:44
Используй вектор векторов указателей.


Название: Re: ручное распределение памяти для массива объектов класса Qt
Отправлено: Zeka13 от Май 14, 2012, 14:44
тогда я не понимаю как сделать


Название: Re: ручное распределение памяти для массива объектов класса Qt
Отправлено: Igors от Май 14, 2012, 14:53
тогда я не понимаю как сделать
Аккуратно

Код
C++ (Qt)
const int xSize = 100;
const int ySize = 100;
..
QGraphicsPixmapItem * pPixmapItem[xSize][ySize];
memset(pPixmapItem, 0, sizeof(pPixmapItem));