Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
1-1084302070
I.Ru.Ru
2004-05-11 23:01
2004.05.23
Выбор при открытии файла Excel


1-1084196546
webpauk
2004-05-10 17:42
2004.05.23
PopupMenu


6-1080884762
vasil
2004-04-02 09:46
2004.05.23
Использование Компонента WebBrowser


7-1081868399
RyDmi
2004-04-13 18:59
2004.05.23
Работа с LPT


4-1081421233
Makhanev A.S.
2004-04-08 14:47
2004.05.23
как отличить системное окно от обычного?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский