Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> хранение классов в map, что не так 
:(
    Опции темы
LexusCheby
Дата 28.1.2007, 23:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 29
Регистрация: 28.1.2007

Репутация: нет
Всего: нет



есть класс 
class CResourceList
{    
   map<ULONG, CImage> List;
public:
 ....
};

//по _ID заружает изображение и сохраняет в контейнере
ULONG CResourceList::LoadImage(ULONG _ID)
{
   CImage mImg;
   char* FName;
   if(!GetImgPath(_ID, &FName)) 
      return 0;
   mImg.Destroy();
   mImg.Load(FName);
   List.insert(pair<ULONG, CImage>(_ID, mImg));
   return 1;
}

Есть член, который по ID возвращает указатель на CImage(2й параметр)
ULONG CResourceList::GetCImagePtr(ULONG _ID, CImage **_ImgPtr)
{
   *_ImgPtr=&(List.find(_ID)->second);
   return 1;
}

потом при попытке вывести изображение по указателю возникает ошибка
int FWidth=pCImage->GetWidth();
 int FHeight=pCImage->GetHeight();
pCImage->StretchBlt(dc,10,10,FWidth,FHeight,FWidth*0,FHeight*0,FWidth,FHeight, SRCCOPY);

 smile 
Подскажите почему ошибка. Найти другой путь могу. Хотелось бы причину понять
PM MAIL   Вверх
Daevaorn
Дата 29.1.2007, 00:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2155
Регистрация: 29.11.2004
Где: Москва

Репутация: 51
Всего: 70



Цитата(LexusCheby @  29.1.2007,  00:54 Найти цитируемый пост)
возникает ошибка

какая?
Цитата(LexusCheby @  29.1.2007,  00:54 Найти цитируемый пост)
ULONG CResourceList::GetCImagePtr(ULONG _ID, CImage **_ImgPtr)
{
   *_ImgPtr=&(List.find(_ID)->second);
   return 1;
}

Лучше так:
Код

ULONG CResourceList::GetCImagePtr(ULONG _ID, CImage **_ImgPtr)
{
    map<ULONG, CImage>::iterator i = List.find(_ID);
    if( i != List.end() )
    {
        *_ImgPtr=&(i->second);
        return 1;
    }
    else
        return ERROR_CODE;
}

PM MAIL WWW   Вверх
LexusCheby
Дата 29.1.2007, 08:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 29
Регистрация: 28.1.2007

Репутация: нет
Всего: нет



Программа компилируется нормально, возникает ошибка времени выполнения при выводе CImage
Программа корректно проверяет различные условия, связанные с пустыми указателями.
Ошибка в ATL-овском методе ReleaseDC.
У меня подозрание, что нельзя хранить в контейнерах класс CImage. Может указатели надо хранить?.
Все то же самое вне контейнеров прекрасно работало.
PM MAIL   Вверх
_hunter
Дата 29.1.2007, 11:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 8564
Регистрация: 24.6.2003
Где: Europe::Ukraine:: Kiev

Репутация: 16
Всего: 98



посмотри исходники -- что просиходит при копировании CImage. явно хендл просто копируется...
даже если бы при копировании создавался новый объект -- по этой же причине не рекомендуется хранить CImage -- только лишнее время уйдет на создание нового объекта.


--------------------
Tempora mutantur, et nos mutamur in illis...
PM ICQ   Вверх
LexusCheby
Дата 29.1.2007, 12:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 29
Регистрация: 28.1.2007

Репутация: нет
Всего: нет



Да, hunter, тоже к таким выводам прихожу. То есть при добавлении в map копирование у нас вызывается. А оно не весь объект копирует. Как лучше тогда сделать? Что вместо CImage в map хранить. Bitmap?
PM MAIL   Вверх
_hunter
Дата 29.1.2007, 12:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 8564
Регистрация: 24.6.2003
Где: Europe::Ukraine:: Kiev

Репутация: 16
Всего: 98



с Bitmap' ом (если имеется в виду CBitmap) будет то же самое.
храни указатели (CImage*). в принципе всегда (за исключением неких конкретных случаев) в контейнере лучше хранить указатель на объект чем сам объект...


--------------------
Tempora mutantur, et nos mutamur in illis...
PM ICQ   Вверх
LexusCheby
Дата 29.1.2007, 12:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 29
Регистрация: 28.1.2007

Репутация: нет
Всего: нет



Надеюсь что хранение указателей поможет. Попробую. Напишу о результах. Если все заработает (уверен что заработает), то обязательно возьму на заметку что лучше хранить в контейнерах указатель, а не сам объект.
PM MAIL   Вверх
HappyLife
Дата 30.1.2007, 11:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 642
Регистрация: 17.5.2006

Репутация: 3
Всего: 8



Или же почему сразу не делать как делают все без копирования?
Код

ULONG CResourceList::LoadImage(ULONG _ID)
{
   char* FName;
   if(!GetImgPath(_ID, &FName)) 
      return 0;
   List[_ID].Destroy();
   List[_ID].Load(FName);
   return 1;
}


Это сообщение отредактировал(а) HappyLife - 30.1.2007, 11:01
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0471 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.