Dimon.Ru |
Отправлено: 17.06.2004, 11:16 |
|
Станционный диспетчер
Группа: Участник
Сообщений: 92
|
Возникла необходимость создать таблицу, а которой можно работать примерно как с таблицей базы данных.
я сделал класс, описывающий ячейку таблицы (MyField), затем класс, который описывает строку (MyRecord).
в строке необхлдимо выделить память под ячейки.
В h-файле пишу так:
MyRecord{
...
MyField *Fields[1024];
...
};
в cpp-файле — так:
MyRecord::MyRecord(unsigned long fCount)
{
unsigned long count;
if(fCount>1024)
{count=1024;}
else count=fCount;
for(unsigned long i=0; i
{// Выделяем память под поля
Fields[i] = new MyField;
Fields[i]->SetIndex(i);
}
return;
}
дальше просто для теста создаю запись с каким-то количеством полей? например — 21:
MyRecord *zapis = new MyRecord(21);
присваиваю им значения, читаю значения и т.д.
Все работает, но при закрытии формы — access violation....
что самое интересное, когда я то же самое писан не в конструкторе класса, а просто создавал массив переменных класса MyField — то все работало нормально, но стоило вставить это дело в класс... |
|
olegenty |
Отправлено: 17.06.2004, 11:52 |
|
Ветеран
Группа: Модератор
Сообщений: 2412
|
а удаляешь-то где и как?
а почему бы не воспользоваться TRxMemoryData или TkbmMemTable?
и жесткая привязка к числу 1024 не нравится...
а vector, наконец, чем плох?
|
|
Gedeon |
Отправлено: 17.06.2004, 13:38 |
|
Ветеран
Группа: Модератор
Сообщений: 1742
|
QUOTE (olegenty @ 17/06/2004, 12:54) | а vector, наконец, чем плох? |
Вот его родимого как раз и надо использовать.
|
|
pagan |
Отправлено: 17.06.2004, 13:42 |
|
Ученик-кочегар
Группа: Участник
Сообщений: 22
|
Для начала хотелось бы увидеть полное объявление класса (ну или хотя бы частичное — особенно деструктор)
QUOTE | а vector, наконец, чем плох? |
тогда уж map, если конечно уникальный ключ будет не составным.
Ну а если опыта в STL мало, то может лучше попробовать VCL::TCollection.
Отредактировано pagan — 17/06/2004, 14:45 |
|
olegenty |
Отправлено: 17.06.2004, 16:01 |
|
Ветеран
Группа: Модератор
Сообщений: 2412
|
ну ну... никаких TCollection, он не для этого предназначен...
|
|
AVC |
Отправлено: 17.06.2004, 16:16 |
|
Ветеран
Группа: Модератор
Сообщений: 1583
|
Хочу вставить свои 5 коп. Для динамических массивов динамических структур а с успехом использую TList. Ни каких объявлений тип new arr[xx] только методы Add, Delete и Clear. Компонент на базе TList, реализующий поставленную задачу работает у меня уже не один год без сбоев. |
|
olegenty |
Отправлено: 18.06.2004, 07:05 |
|
Ветеран
Группа: Модератор
Сообщений: 2412
|
но у ТList существенный недостаток — когда объектов TList много — память, что откусывает TList, несоизмеримо больше памяти, что расходуется на реально-хранимые объекты... (я оперировал десятками тысяч TList)
|
|
AVC |
Отправлено: 18.06.2004, 07:53 |
|
Ветеран
Группа: Модератор
Сообщений: 1583
|
QUOTE |
память, что откусывает TList, несоизмеримо больше памяти, что расходуется на реально-хранимые объекты
|
CODE |
TList stores an array of pointers. (Help)
|
TList это просто список указателей допополнительный расход памяти может быть только из за указуемых элементов.
|
|
olegenty |
Отправлено: 18.06.2004, 07:57 |
|
Ветеран
Группа: Модератор
Сообщений: 2412
|
разберусь — отвечу подробней. когда ушёл от TList, прога стала пользовать на 20 MB меньше памяти.
|
|
pagan |
Отправлено: 18.06.2004, 08:05 |
|
Ученик-кочегар
Группа: Участник
Сообщений: 22
|
QUOTE | ну ну... никаких TCollection, он не для этого предназначен... |
Ладно, согласен — погорячился вот только привязываться к компонентам я бы тоже не стал. Ну а если использовать VCL, то вариантов много : это и TList, и TStrings etc.
P.S. лично я бы использовал STL |
|
olegenty |
Отправлено: 18.06.2004, 08:43 |
|
Ветеран
Группа: Модератор
Сообщений: 2412
|
вопрошающего на это и наталкивают.
хотя, если элементов мало...
CODE |
template <class C> class PACKAGE CListFlat
{
public:
TList *m_pItems;
__fastcall CListFlat() {m_pItems = new TList();};
__fastcall ~CListFlat() {delete m_pItems;};
inline void __fastcall Add(C pItem) {m_pItems->Add(pItem);};
inline int __fastcall Count() {return m_pItems->Count;};
inline C __fastcall Items(int i) {return reinterpret_cast<C>(m_pItems->Items[i]);};
inline C __fastcall Last() {return reinterpret_cast<C>(m_pItems->Last());};
};
template <class C> class PACKAGE CList
{
public:
TList *m_pItems;
__fastcall CList() {m_pItems = new TList();};
__fastcall ~CList() {for (int i = 0; i < m_pItems->Count; i++)
{
if (m_pItems->Items[i])
{
delete reinterpret_cast<C>(m_pItems->Items[i]);
}
}
delete m_pItems;};
inline void __fastcall Add(C pItem) {m_pItems->Add(pItem);};
inline int __fastcall Count() {return m_pItems->Count;};
inline C __fastcall Items(int i) {return reinterpret_cast<C>(m_pItems->Items[i]);};
inline C __fastcall Last() {return reinterpret_cast<C>(m_pItems->Last());};
};
|
и не париться. замечу, этот темплейт предназначен для работы с указателями. int, например, туда не подставить... но мне хватало, а для int был свой класс, с сортировкой и поиском методом бисекции
|
|
Dimon.Ru |
Отправлено: 18.06.2004, 15:34 |
|
Станционный диспетчер
Группа: Участник
Сообщений: 92
|
1.
QUOTE | а удаляешь-то где и как?
а почему бы не воспользоваться TRxMemoryData или TkbmMemTable?
и жесткая привязка к числу 1024 не нравится...
а vector, наконец, чем плох? |
Удаляю-то???
просто:
CODE | просто delete[] Fields; |
разве не правильно???
и потом, когда я делал это не в деструкторе класса, то ошибки не было...
2. честно говоря, я не хотел бы использовать RX-компоненты, а обойтись стандартными типами: в идеале — вместо AnsiString — char...
3. а что такое vector и с чем его едят??? |
|