Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / проблема с map (STL) / 17 сообщений из 17, страница 1 из 1
12.08.2003, 07:49
    #32233490
dishlo
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
проблема с map (STL)
C++Builder, пишу:

TDataSet *MyDataset = new TDataSet(NULL);
map<int, TDataSet*> datasets;
datasets.insert(value(1, MyDataset)); -- value - это пара
TDataSet *DatasetFromMap = datasets;
-- в DatasetFromMap оказывается какая-то херня, но не указатель на MyDataset!

После некотрых экспериментов выяснил, что при создании map из пары (значение, значение) все ок, по ключу возвращяет то что и предполагалось.
При создании map (значение, указатель) по ключу возвращается мусор.

Никакой стоящей книги под рукой нет, может кто объяснит такое поведение?
...
Рейтинг: 0 / 0
12.08.2003, 08:01
    #32233499
dishlo
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
проблема с map (STL)
Ошибочка вкралась:

Код: plaintext
1.
2.
3.
4.
5.
TDataSet *MyDataset = new TDataSet(NULL); 
map<int, TDataSet*> datasets; 
datasets.insert(value( 1 , MyDataset));  -- value - это пара 
 
TDataSet *DatasetFromMap = datasets[ 1 ]; 
   /* в DatasetFromMap оказывается какая-то херня, но не указатель на MyDataset! */ 


После некотрых экспериментов выяснил, что при создании map из пары (значение, значение) все ок, по ключу возвращяет то что и предполагалось.
При создании map (значение, указатель) по ключу возвращается мусор.

Никакой стоящей книги под рукой нет, может кто объяснит такое поведение?
...
Рейтинг: 0 / 0
12.08.2003, 08:26
    #32233508
Chicago
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
проблема с map (STL)
Определение value в студию. И я бы еще попробовал
Код: plaintext
datasets[ 1 ]=MyDataset;
...
Рейтинг: 0 / 0
12.08.2003, 08:43
    #32233516
funikovyuri
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
проблема с map (STL)
по-идеи должно работать.
...
Рейтинг: 0 / 0
12.08.2003, 09:13
    #32233535
Chicago
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
проблема с map (STL)
Вот-вот, по идее должно работать. Единственно, что мне не понятно, что такое value. Может это просто map<...,...>::value_type, а может и нет.
...
Рейтинг: 0 / 0
12.08.2003, 09:41
    #32233579
dishlo
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
проблема с map (STL)
Отрадно видеть, что тема нашла отклик.
value - это map<int, TDataSet*>::value_type

datasets=MyDataset;

Да, именно так я и поступаю - добавляю пару, тут же по ключу нахожу ее и присваиваю указателю значение датасета, после этого с map можно работать, но ведь некрасиво.

Может это глюк реализации Builder'a? Никто таких экспериментов в других средах С++ не проводил?
...
Рейтинг: 0 / 0
12.08.2003, 09:43
    #32233581
dishlo
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
проблема с map (STL)
опять ошибка:

Код: plaintext
datasets[ 1 ]=MyDataset;
Да, именно так я и поступаю - добавляю пару, тут же по ключу нахожу ее и присваиваю указателю значение датасета, после этого с map можно работать, но ведь некрасиво.

Может это глюк реализации Builder'a? Никто таких экспериментов в других средах С++ не проводил?
...
Рейтинг: 0 / 0
12.08.2003, 10:10
    #32233629
funikovyuri
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
проблема с map (STL)
очень часто приходится хранить в конейнерах STL указатели - никогда подобных проблем не было. Правда именно TDataSet хранить не приходилось - но думаю в данном случае это не принципиально!

P.S. если у вас BCB 6 то с ним идет STL Port - так что врядли это из-за реализации Borland'а.
...
Рейтинг: 0 / 0
12.08.2003, 10:19
    #32233639
Chicago
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
проблема с map (STL)
Ну тогда сумасбродная идея: посмотреть, не переопределен ли оператор new для класса TDataSet. Возможно, переопределен, и каким-то образом это определение конфликтует с STL-евским аллокатором... хм...
...
Рейтинг: 0 / 0
12.08.2003, 10:31
    #32233656
funikovyuri
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
проблема с map (STL)
а причем тут оператор new? это больше похоже на отсутсвие конструктора копии у value_type!
...
Рейтинг: 0 / 0
12.08.2003, 10:49
    #32233677
dishlo
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
проблема с map (STL)
очень часто приходится хранить в конейнерах STL указатели - никогда подобных проблем не было. Правда именно TDataSet хранить не приходилось - но думаю в данном случае это не принципиально!

Да, с хранением указателя в векторе тоже никаких проблем.
А с мап история такая - указатель может быть любого типа, это неважно, я экспериментровал с AnsiString - та же история, возвращает мусор.

а причем тут оператор new? это больше похоже на отсутсвие конструктора копии у value_type!
И при создании пары тоже все нормально:
Код: plaintext
1.
value_type vt( 1 , MyDataset); 
vt.second -- это нормальный указатель на MyDataset
...
Рейтинг: 0 / 0
12.08.2003, 11:24
    #32233743
Chicago
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
проблема с map (STL)
Поэкспериментировал с map в VC++. Проблем нет.
...
Рейтинг: 0 / 0
12.08.2003, 12:56
    #32233919
funikovyuri
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
проблема с map (STL)
Вы лучше попробуйте
Код: plaintext
1.
2.
3.
4.
5.
6.
value_type vt( 1 , MyDataset), vt2;

vt2 = vt;

vt2.second  -- будет ли это нормальным указателем???
 
...
Рейтинг: 0 / 0
12.08.2003, 14:46
    #32234161
Chicago
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
проблема с map (STL)
ИМХО идея с отсутствием конструктора копирования не катит. Для указателя тупое побитовое копирование как раз должно работать. В тестовом примере нет и намека на то, что область памяти, на которую указывает second уже освобождена...
...
Рейтинг: 0 / 0
12.08.2003, 15:08
    #32234210
funikovyuri
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
проблема с map (STL)
вообще-то всегда можно сделать
Код: plaintext
1.
2.
3.
4.
5.
6.
class MyClass
{
     MyClass( const MyClass& )
     {}

// ...


т.е. для данного класса конструктор копии не определен

IMHO проблема все-таки в чем-то другом. Скорее всего в ошибке программиста
...
Рейтинг: 0 / 0
12.08.2003, 15:52
    #32234298
vdimas
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
проблема с map (STL)
Код: plaintext
1.
2.
3.
TDataSet *MyDataset = new TDataSet(NULL); 
map<int, TDataSet*> datasets; 
datasets.insert(map<int, TDataSet*>::value_type( 1 , MyDataset)); 
TDataSet *DatasetFromMap = datasets[ 1 ]; 


Попробуй так, мы же не видим всю прогу. Может у тебя по ходу это value переопределено.
...
Рейтинг: 0 / 0
13.08.2003, 07:29
    #32234821
dishlo
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
проблема с map (STL)
Спасибо за советы, господа, но когда я столкнулся с ошибкой, я провел "следственный эксперимент", в отдельном приложении c максимально простым кодом воспользовался map<int, int*> и результат был тот же - по ключу возвращался мусор.
Если у кого возможность есть, попробуйте поэкспериментровать в C++Builder 5.
...
Рейтинг: 0 / 0
Форумы / C++ [игнор отключен] [закрыт для гостей] / проблема с map (STL) / 17 сообщений из 17, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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