C++Builder
  Начало   Форум   Помощь Войти Регистрация  
Страниц: [1]   Вниз
  Печать  
Автор Тема: Хранение данных через AddObject и Objects.  (Прочитано 1312 раз)
Andy JOKER
Участник


Сказали спасибо: +0/-0
Offline

Сообщений: 16


Хранение данных через AddObject и Objects.
« : 29 Ноябрь 2011, 13:37:20 »

H!
Может такой подход кривой и неправильный, но тем не менее он работает и облегчает кодинг:
Код:
TStringList *lst = new TStringList();
lst->AddObject("a",(TObject*)1);
lst->AddObject("b",(TObject*)2);
...
где нить дальше в проге:
int f=(int)lst->Objects[1];
усложняем задачу, сопоставить терь надо 2 числа:
Код:
TStringList *lst = new TStringList();
unsigned int f[2],z[2];
f[0]=12;
f[1]=13;
lst->AddObject("b",(TObject*)f);
...
Собсно вопрос, как заполучить это все обратно в: z=(int)lst->Objects[0]?
Записан
volvo877
Глобальный модератор


Сказали спасибо: +736/-1
Offline

Сообщений: 891


Re: Хранение данных через AddObject и Objects.
« Ответ #1 : 29 Ноябрь 2011, 14:11:00 »

Цитировать
сопоставить терь надо 2 числа:
Хоть десять:
Код
struct mystruct
{
unsigned int f[2];
};
 
mystruct f = {12, 13};
lst->AddObject("b",(TObject*)&f);
// ...
mystruct z = *((mystruct*)(lst->Objects[0])); // z = {12, 13}
Это если у тебя данные, которые ты связываешь с StringList-ом, находятся в пределах видимости из того места, где пытаешься их получить. Иначе (описание f - в одной функции, а попытке получения указателя - в другой, к примеру) придется выделять память в куче, ибо там, где лежали данные когда ты связывал их с Objects, теперь лежит не пойми что...
Записан
Andy JOKER
Участник


Сказали спасибо: +0/-0
Offline

Сообщений: 16


Re: Хранение данных через AddObject и Objects.
« Ответ #2 : 29 Ноябрь 2011, 15:05:04 »

ээээ, но в этом случае, если я правильно ошибаюсь, придется создавать стотыщ мильенов mystructов на каждый AddObject?
мне же по сути надо запихать:
lst->AddObject("b",(TObject*){12,13})
чтобы {12,13} создались в куче и жили своей жизнью вне зависимости от f.
То есть, lst->AddObject("a",(TObject*)1) насколько я это представляю, создает в куче вполне себе независимый int равный "1", никак не привязанный к каким-либо объявленным переменным. Зная что это именно int а не char я в любой удобный момент могу его поиметь обратно, опять-же вне зависимости от каких-либо переменных, которые к этому моменту вообще могли быть 10 раз уничтожены.

даже более того:
Код:
TStringList *lst = new TStringList();
        int a=12;
        lst->AddObject("a",(TObject*)a);
        a=0;
        int b=(int)lst->Objects[0];
Вернет мне в b 12.
« Последнее редактирование: 29 Ноябрь 2011, 15:13:20 от Andy JOKER » Записан
volvo877
Глобальный модератор


Сказали спасибо: +736/-1
Offline

Сообщений: 891


Re: Хранение данных через AddObject и Objects.
« Ответ #3 : 29 Ноябрь 2011, 15:11:41 »

Цитировать
То есть, lst->AddObject("a",(TObject*)1) насколько я это представляю, создает в куче вполне себе независимый int равный "1", никак не привязанный к каким-либо объявленным переменным.
Ничего он не создает. Он просто записывает 0x00000001 (приведенный к типу указатель на TObject) в поле Objects[...]. И, зная, что в этом поле содержится int, можно этот "указатель" сконвертировать назад в int, и получить таким образом своё же сохраненное число. А вот когда приходится хранить больше, чем одно значение - "Хьюстон, у нас проблемы" (С) : размер твоего массива больше чем размер (TObject*). Дальше продолжать?
Записан
Andy JOKER
Участник


Сказали спасибо: +0/-0
Offline

Сообщений: 16


Re: Хранение данных через AddObject и Objects.
« Ответ #4 : 29 Ноябрь 2011, 15:18:36 »

ясно, т.е. все сводится к тому, чтобы придумать алгоритм пакования двух небольших char в один int, затем вытащить и декрюнчить обратно ... 
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  




....

Powered by SMF 1.1.21 | SMF © 2025, Simple Machines
Страница сгенерирована за 0.132 секунд. Запросов: 22.