Russian Qt Forum
Ноябрь 24, 2024, 20:20 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: ручное распределение памяти для массива объектов класса Qt  (Прочитано 6743 раз)
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];
хочу точно так же выделять для него вручную память, но ничего не получилось у меня, помогите пожалуйста ежить эту задачу, заранее спасибо!
« Последнее редактирование: Май 14, 2012, 09:52 от Zeka13 » Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #1 : Май 13, 2012, 20:26 »

но ничего не получилось у меня
а где код как у тебя не получилось?

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

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
Zeka13
Гость
« Ответ #2 : Май 13, 2012, 20:49 »

Цитировать
тип int ***, а не int **
kambala, не понял совсем вас

Цитировать
а где код как у тебя не получилось?
зачем вам нерабочий код? Или вы мне не верите?
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #3 : Май 13, 2012, 21:04 »

Цитировать
тип int ***, а не int **
kambala, не понял совсем вас
массив - это тот же указатель, двумерный массив - указатель на указатель.

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

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
Zeka13
Гость
« Ответ #4 : Май 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();
        }
   }
}
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #5 : Май 13, 2012, 23:14 »

это у тебя 3-х мерный массив вышел Улыбающийся

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

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #6 : Май 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 ?
Записан
Zeka13
Гость
« Ответ #7 : Май 14, 2012, 09:52 »

Цитировать
Чего же выделяем xSize а освобождаем xSize+1 ?

ачепятка, у меня везде просто xSize+1
Записан
Zeka13
Гость
« Ответ #8 : Май 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;
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #9 : Май 14, 2012, 14:35 »

вот тако в итоге?
Тако компилиться не будет Улыбающийся

Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #10 : Май 14, 2012, 14:44 »

Используй вектор векторов указателей.
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
Zeka13
Гость
« Ответ #11 : Май 14, 2012, 14:44 »

тогда я не понимаю как сделать
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #12 : Май 14, 2012, 14:53 »

тогда я не понимаю как сделать
Аккуратно

Код
C++ (Qt)
const int xSize = 100;
const int ySize = 100;
..
QGraphicsPixmapItem * pPixmapItem[xSize][ySize];
memset(pPixmapItem, 0, sizeof(pPixmapItem));
 
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.376 секунд. Запросов: 22.