Форум: "Основная";
Текущий архив: 2004.05.23;
Скачать: [xml.tar.bz2];
ВнизДинамическая структура. Найти похожие ветки
← →
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;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.035 c