Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.05.23;
Скачать: CL | DM;

Вниз

Динамическая структура.   Найти похожие ветки 

 
WinLamka   (2004-05-12 07:47) [0]

всем привет. вопрос такой - мне нужно сделать небольшую динамическую струтурку для хранения свойств различных обьектов в моемй проге.
структура представляет собой примерно такую штуку
<#> <название поля> <тип поля> <значение>
1  "f1" tp_string "aaaaa"
2  "f2" tp_int 445
3 .... ye b nl
ну и тд. количество записей динамическое. ну как запихнуть это дело в дин массив я знаю - сделать массив recordов и setlength ему делать, вопрос в следующем - как мне организовать "бестиповую" переменную для хранения значения поля? поинтером?   если не трудно маааленький примерчик. спасибо.


 
TUser ©   (2004-05-12 07:53) [1]


> мне организовать "бестиповую" переменную для хранения значения
> поля?

??? Поле - это часть твоей записи, так? Почему переменная д.б. безтиповой? Там у тебя явно стринги и (tp_string, tp_int).

Недавно на алголисте прочитал интересный обзор про создание списков, стеков и прочего. Там все рекомендуют делать через указатели, т.е. хранить в каждой записи инфу о предыдущей/последующей. Стандартный TList из VCL сделан на основе дин. массива. Если тебе надо сэкономить память - то лучше в массиве, если надо увеличить скорость при операциях вставки/удаления - тогда через указатели.


 
WinLamka   (2004-05-12 07:53) [2]

вопрос в догонку - есть дин массив динамических массивов... освободит ли setlength основному массиву память занятую вторым масивов, или надо сначала второй укорачивать? или все вообще автоматом?


 
WinLamka   (2004-05-12 07:55) [3]

>> Поле - это часть твоей записи, так? Почему переменная д.б.
>>бзтиповой? Там у тебя явно стринги и (tp_string, tp_int).

потому что в нее нужно будет иметь возможность писать значения различных тпов  (в зависимости от поля) не делать же мне в записи по переменной для каждого типа! это блин неэкономно получается!


 
TUser ©   (2004-05-12 07:59) [4]

Т.е. setLength(MyArray,0)? Вроде должен убить всю инфу из массива в памяти. Но если боишся утечек - наверное, лучше самому выделять и освобождать руками нужное количество памяти.
Подожди, кто-нибудь сейчас авторитетнее ответит.


 
TUser ©   (2004-05-12 08:00) [5]

А, понял
= record case ...


 
Fedia   (2004-05-12 08:01) [6]

Могу предложить следующее:

 Struct = record
   n: integer;
   Name, Type, Value: string;
 end;

типы конечно можно заменить

var
 MyStruct: array of Struct;

Если динамическому массиву динамических массивов присвоишь nil, то память должна освободиться полностью. Есть вероятность что я не прав, но у меня всегда освобождается.


 
WinLamka   (2004-05-12 08:05) [7]

>>Fedia
это я и сам знаю сенка =) штука в том что мне не нужно тип только стринг для value! мне нужно чтоб если в type было указано что он интеджер то и работать с ним как интеджером , время на преобразования типов при каждом обращении к полю у мой программы не так уж и много =))

зы переменную Type как ты написал не пропустит не один компилятор =)


 
Fedia   (2004-05-12 08:10) [8]

Да, на счет type не простит. Надо было читать вопрос целиком. Извини. Как говорят: "Поспешишь, людей насмешишь"


 
WinLamka   (2004-05-12 08:17) [9]

>>TUser ©   (12.05.04 08:00) [5]

это так чтоли?
type
 TMyField = record
 fname:string;
 case ftype:byte of
   0: (fvaluet0: integer);
   1: (fvaluet1: string[255]);
...
end;

? если да то это не совсем подходит =( во-первых мне хоршобы чтоб переменная со значением всегда имела одно имя, да и в записях такого нельзя истпользовать просто string, Только лимитированный, а мне это не подходит...


 
evvcom ©   (2004-05-12 08:23) [10]

Для подобной задачи уже давно придуман тип, он Variant называется.
А память освобождается всегда корректно, если компилятор видит все типы. Это касается хоть SetLength, хоть New/Dispose. Поясню. Если есть:
type
 TMyType = record
   MyStr: string;
 end;
 PMyType = ^TMyType;
var
 pMyVar: PMyType;
 pMyPnt: Pointer;
begin
 New(pMyVar);
 pMyVar^.MyStr := "Ля-ля-ля...";
{$IFDEF Variant1}:
 // Вариант 1:
 Dispose(pMyVar); // Всё освободится! Все типы известны.
{$ELSE}
 // Вариант 2:
 pMyPnt := pMyVar;
 Dispose(pMyPnt); // утечка! MyStr останется в памяти
{$ENDIF}
end;


 
WinLamka   (2004-05-12 08:28) [11]

>> evvcom ©  
а если так :
type a:array of TMyClass;
var b:array of array
...
setlength(b,8);
setlength(b[7],1)
b[7]:=TMyObject.create;
...
setlength(b,1); - будет ли автоматом вызван деструктов для класса?


 
evvcom ©   (2004-05-12 08:34) [12]

Ну а бряк на деструктор не судьба поставить и F9 нажать?


 
WinLamka   (2004-05-12 08:36) [13]

>>evvcom ©

ууу... и правда.
я просто начинающий еще кодер, мне такое даже в голову не пришло =)



Страницы: 1 вся ветка

Текущий архив: 2004.05.23;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.259 c
8-1079010705
_none_
2004-03-11 16:11
2004.05.23
как проиграть звук из AVI файла, имея AVIStream?


14-1083567626
Белый волк
2004-05-03 11:00
2004.05.23
Правильное отображение кирилицы в консольном приложении Delphi


1-1083740297
han-bratan
2004-05-05 10:58
2004.05.23
Динамическое добавление пунктов меню


14-1083255040
Thor
2004-04-29 20:10
2004.05.23
Бовин умер :(


1-1084270327
BlackTiger
2004-05-11 14:12
2004.05.23
Алгоритм переноса слов (на канве битмапа или принтера). Как/где?