Модератор: Модераторы
Снег Север писал(а): Для меня рекорды хороши тем, что не требуют освобождения памяти при удалении их из динамических массивов и перезагрузкой операторов.
Снег Север писал(а):То, что многие программисты выучив концепцию классов начинают совать их куда ни попадя, не есть хорошо.
Возможно я неудачно выразился. Я имел ввиду, что если элемент массива - рекорд, то при удалении этого элемента нет нужды предварительно вызывать деструктор, как для классовых переменных.Лекс Айрин писал(а):Я бы не сказал, что это совсем уж так...
serbod писал(а):Что будет, если Map[key] вернет nil? А оно обязательно будет.
serbod писал(а):Если не хочется заморачиваться с назначением владельца создаваемых объектов, то можно заморочиться с использованием интерфейсов вместо классов, они автоматически удаляются при отсутствии ссылок на них. Главная фишка - ссылка должна быть типа IInterface, а не TObject, иначе работать не будет.
program Project1;
uses
gmap,gutil;
type
TMapElement = record
Key: string;
KeyType: string;
Value: string;
end;
less = specialize TLess<string>;
TTagsMap = specialize TMap<string, TMapElement, less>;
function TMapElement_Create(_key, _keytype, _value: string):TMapElement;
begin
result.Key:=_key;
result.KeyType:=_keytype;
result.Value:=_value;
end;
var
m:TTagsMap;
begin
m:=TTagsMap.Create;
m.Insert('1',TMapElement_Create('1','2','3'));
m.Insert('2',TMapElement_Create('1','2','3'));
m.Items['1'].Key:='23';
m.Destroy;
end.
Я имел ввиду, что если элемент массива - рекорд, то при удалении этого элемента нет нужды предварительно вызывать деструктор, как для классовых переменных
zub писал(а):Обратите внимание на object`ы - имеют VMT при необходимости, есть наследование и могут быть созданы как в стеке, так и в куче
Не спорю, "как только, так сразу"...Лекс Айрин писал(а):Зависит от того что в этом рекорде лежит. Как только такая нужда появляется - рекорд желательно проапгрейдить до класса или обжекта
zub писал(а):Как только такая нужда появляется - рекорд желательно проапгрейдить до класса или обжекта
zub писал(а):program Project1;
uses
gmap,gutil;
type
TMapElement = record
Key: string;
KeyType: string;
Value: string;
end;
less = specialize TLess<string>;
TTagsMap = specialize TMap<string, TMapElement, less>;
function TMapElement_Create(_key, _keytype, _value: string):TMapElement;
begin
result.Key:=_key;
result.KeyType:=_keytype;
result.Value:=_value;
end;
var
m:TTagsMap;
begin
m:=TTagsMap.Create;
m.Insert('1',TMapElement_Create('1','2','3'));
m.Insert('2',TMapElement_Create('1','2','3'));
m.Items['1'].Key:='23';
m.Destroy;
end.
vitaly_l писал(а):Кстати Key: string; - лишний, как впрочем и KeyType: string;,
Лекс Айрин писал(а):может быть
Лекс Айрин писал(а):HTML у нас уже не язык {разметки}?
zub писал(а):Пример - плохой, тут нужен хешмап
program Project1;
uses
gmap,gutil;
type
TMapElement = record
Key: string;
KeyType: string;
Value: string;
end;
less = specialize TLess<string>;
generic TMySuperPuperMap<TKey, TValue, TCompare> = class (specialize TMap<TKey, TValue, TCompare>)
function GetMutableItem(key:TKey):PTValue;inline;
end;
TTagsMap = specialize TMySuperPuperMap<string, TMapElement, less>;
function TMySuperPuperMap.GetMutableItem(key:TKey):PTValue;
var Pair:TPair; ret:TIterator;
begin
Pair.Key:=key;
result:=pointer(FSet.NFind(Pair));
if result<>nil then
begin
result:=@(TMSet.PNode(result)^.data);
if result<>nil then
result:=@(PTPair(result)^.Value);
end;
end;
function TMapElement_Create(_key, _keytype, _value: string):TMapElement;
begin
result.Key:=_key;
result.KeyType:=_keytype;
result.Value:=_value;
end;
var
m:TTagsMap;
begin
m:=TTagsMap.Create;
m.Insert('1',TMapElement_Create('1','2','3'));
m.Insert('2',TMapElement_Create('1','2','3'));
m.GetMutableItem('1')^.Key:='23';
m.Destroy;
end.
program Project1;
uses
ghashmap,gutil;
type
TMapElement = record
Key: string;
KeyType: string;
Value: string;
end;
MyStringHash=class
class function hash(s:AnsiString; n:longint):SizeUInt;
end;
generic TMySuperPuperHashMap<TKey, TValue, Thash> = class (specialize THashMap<TKey, TValue, Thash>)
function GetMutableItem(key:TKey):TIterator.PValue;inline;
end;
TTagsMap = specialize TMySuperPuperHashMap<string, TMapElement, MyStringHash>;
function MakeHash(const s:AnsiString):SizeUInt;
var
I: Integer;
begin
Result := 0;
for I := 1 to Length(s) do
Result := ((Result shl 7) or (Result shr 25)) + Ord(s[I]);
end;
class function MyStringHash.hash(s:AnsiString; n:longint):SizeUInt;
begin
result:=makehash(s) mod SizeUInt(n);
end;
function TMySuperPuperHashMap.GetMutableItem(key:TKey):TIterator.PValue;
var i,bs:SizeUInt;
curbucket:TContainer;
begin
curbucket:=FData[THash.hash(key,FData.size)];
bs:=curbucket.size;
i:=0;
while i < bs do begin
if (curbucket[i].Key = key) then exit(@curbucket.Mutable[i]^.Value);
inc(i);
end;
// exception?
end;
function TMapElement_Create(_key, _keytype, _value: string):TMapElement;
begin
result.Key:=_key;
result.KeyType:=_keytype;
result.Value:=_value;
end;
var
m:TTagsMap;
PElement:^TMapElement;
begin
m:=TTagsMap.Create;
m.Insert('1',TMapElement_Create('1','2','3'));
m.Insert('2',TMapElement_Create('4','5','6'));
PElement:=m.GetMutableItem('1');
if PElement<>nil then
PElement^.Key:='23';
m.GetMutableItem('2')^.Key:='23';
m.Destroy;
end.
vitaly_l писал(а):ТС же уже рассказал, что ему нужно всего лишь получить значения нескольких input из HTML.
vitaly_l писал(а):Уже второй месяц, весь форум ищет решение этой наисложнейшей задачи.
Вернуться в Free Pascal Compiler
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 8