Модератор: Модераторы

Снег Север писал(а): Для меня рекорды хороши тем, что не требуют освобождения памяти при удалении их из динамических массивов и перезагрузкой операторов.
Снег Север писал(а):То, что многие программисты выучив концепцию классов начинают совать их куда ни попадя, не есть хорошо.

Возможно я неудачно выразился. Я имел ввиду, что если элемент массива - рекорд, то при удалении этого элемента нет нужды предварительно вызывать деструктор, как для классовых переменных.Лекс Айрин писал(а):Я бы не сказал, что это совсем уж так...


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.
 но это уже высокохудожественное программирование. А вот всё остальное очень даже познавательно. Я даже спасибо zub скажу.
 но это уже высокохудожественное программирование. А вот всё остальное очень даже познавательно. Я даже спасибо zub скажу.
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
Сейчас этот форум просматривают: Yandex [Bot] и гости: 1