Как связать сторонние данные с названиями переменных?

Форум для изучающих FPC и их учителей.

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

Как связать сторонние данные с названиями переменных?

Сообщение ANTIKLAN » 05.01.2016 01:10:29

Всем привет!
Прошу помощи у более опытных коллег. :D
Есть несколько однотипных переменных, которым присвоены значения. Эти переменные комбинируются между собой. Задача в зависимости от комбинации выводить текст соответствующий своей переменной, но не являющийся значением этой переменной.
Как такое реализовать? Уже день думаю. :D
Аватара пользователя
ANTIKLAN
новенький
 
Сообщения: 55
Зарегистрирован: 25.02.2015 09:21:42

Re: Как связать сторонние данные с названиями переменных?

Сообщение скалогрыз » 05.01.2016 01:39:01

по-моему ты говоришь про RTTI
скалогрыз
долгожитель
 
Сообщения: 1803
Зарегистрирован: 03.09.2008 02:36:48

Re: Как связать сторонние данные с названиями переменных?

Сообщение ANTIKLAN » 05.01.2016 20:59:39

скалогрыз писал(а):по-моему ты говоришь про RTTI

Штука полезная, но немного не то. Я тут ночью залез в учебники и узнал о такой классной штуке как записи. Все стало просто ясно и логично сразу. Сделан еще один шаг к переходу на ООП :D Сейчас разбираюсь как создать массив записей и с ним работать. :roll:
Аватара пользователя
ANTIKLAN
новенький
 
Сообщения: 55
Зарегистрирован: 25.02.2015 09:21:42

Re: Как связать сторонние данные с названиями переменных?

Сообщение Снег Север » 05.01.2016 21:15:04

Массив записей создается точно так же, как массив любых других типов элементов. В чём проблема?
Аватара пользователя
Снег Север
долгожитель
 
Сообщения: 2993
Зарегистрирован: 27.11.2007 16:14:47

Re: Как связать сторонние данные с названиями переменных?

Сообщение ANTIKLAN » 06.01.2016 12:20:10

Снег Север писал(а):Массив записей создается точно так же, как массив любых других типов элементов. В чём проблема?

Уже сделано. Но есть неудобства в виде необходимости помнить под каким индексом какая запись находится. Может можно такое решение заменить чем то более удобным?
Аватара пользователя
ANTIKLAN
новенький
 
Сообщения: 55
Зарегистрирован: 25.02.2015 09:21:42

Re: Как связать сторонние данные с названиями переменных?

Сообщение Снег Север » 06.01.2016 20:17:25

ANTIKLAN писал(а):Но есть неудобства в виде необходимости помнить под каким индексом какая запись находится. Может можно такое решение заменить чем то более удобным?
Не могу понять суть проблемы. Вам надо отыскивать элемент массива по уникальному имени, что ли? Ну так давайте такое имя в дополнительном поле вашей записи и отыскивайте перебором.
Аватара пользователя
Снег Север
долгожитель
 
Сообщения: 2993
Зарегистрирован: 27.11.2007 16:14:47

Re: Как связать сторонние данные с названиями переменных?

Сообщение скалогрыз » 06.01.2016 20:44:15

ANTIKLAN писал(а):Но есть неудобства в виде необходимости помнить под каким индексом какая запись находится. Может можно такое решение заменить чем то более удобным?

по-моему, ты говоришь про RTTI
скалогрыз
долгожитель
 
Сообщения: 1803
Зарегистрирован: 03.09.2008 02:36:48

Re: Как связать сторонние данные с названиями переменных?

Сообщение Vadim » 06.01.2016 22:53:19

Про базу данных он говорит. Хотя и невнятно... :-)
Vadim
долгожитель
 
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Re: Как связать сторонние данные с названиями переменных?

Сообщение zub » 07.01.2016 02:45:40

а я вангую что ТСу надо воттак
Код: Выделить всё
program dict;
{$MODE DELPHI}
uses ghashmap;
type

  StringHash=class
    class function hash(s:string; n:longint):SizeUInt;
  end;

  TMyDictionary <TValue> = class(THashMap<String, TValue,StringHash>)
  end;

  TMySuperPuperData=record
                          a:integer;
                          b:real;
                    end;

  TMySuperPuperDictionary=TMyDictionary<TMySuperPuperData>;

  function MakeHash(const s: String):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 StringHash.hash(s:String; n:longint):SizeUInt;
  begin
       result:=makehash(s) mod SizeUInt(n);
  end;

var
MySuperPuperDictionary:TMySuperPuperDictionary;
MySuperPuperData:TMySuperPuperData;
begin
  MySuperPuperDictionary:=TMySuperPuperDictionary.create;

  MySuperPuperData.a:=100;
  MySuperPuperDictionary.insert('сто',MySuperPuperData);
  MySuperPuperData.a:=200;
  MySuperPuperDictionary.insert('двести',MySuperPuperData);

  writeln(MySuperPuperDictionary.GetData('сто').a);
  writeln(MySuperPuperDictionary.GetData('двести').a);

  MySuperPuperDictionary.destroy;
  readln;
end.

а конкретно вот это
Код: Выделить всё
  MySuperPuperDictionary.GetData('сто');
  MySuperPuperDictionary.GetData('двести');

Но судя по тому что
Я тут ночью залез в учебники и узнал о такой классной штуке как записи.

пока рано, как советовали выше лучше добавить дополнительное поле и искать перебором
zub
долгожитель
 
Сообщения: 2884
Зарегистрирован: 14.11.2005 23:51:26

Re: Как связать сторонние данные с названиями переменных?

Сообщение ANTIKLAN » 07.01.2016 06:07:38

скалогрыз писал(а):
ANTIKLAN писал(а):Но есть неудобства в виде необходимости помнить под каким индексом какая запись находится. Может можно такое решение заменить чем то более удобным?

по-моему, ты говоришь про RTTI


zub писал(а):а я вангую что ТСу надо воттак
Код: Выделить всё
program dict;
{$MODE DELPHI}
uses ghashmap;
type

  StringHash=class
    class function hash(s:string; n:longint):SizeUInt;
  end;

  TMyDictionary <TValue> = class(THashMap<String, TValue,StringHash>)
  end;

  TMySuperPuperData=record
                          a:integer;
                          b:real;
                    end;

  TMySuperPuperDictionary=TMyDictionary<TMySuperPuperData>;

  function MakeHash(const s: String):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 StringHash.hash(s:String; n:longint):SizeUInt;
  begin
       result:=makehash(s) mod SizeUInt(n);
  end;

var
MySuperPuperDictionary:TMySuperPuperDictionary;
MySuperPuperData:TMySuperPuperData;
begin
  MySuperPuperDictionary:=TMySuperPuperDictionary.create;

  MySuperPuperData.a:=100;
  MySuperPuperDictionary.insert('сто',MySuperPuperData);
  MySuperPuperData.a:=200;
  MySuperPuperDictionary.insert('двести',MySuperPuperData);

  writeln(MySuperPuperDictionary.GetData('сто').a);
  writeln(MySuperPuperDictionary.GetData('двести').a);

  MySuperPuperDictionary.destroy;
  readln;
end.

а конкретно вот это
Код: Выделить всё
  MySuperPuperDictionary.GetData('сто');
  MySuperPuperDictionary.GetData('двести');

Но судя по тому что
Я тут ночью залез в учебники и узнал о такой классной штуке как записи.

пока рано, как советовали выше лучше добавить дополнительное поле и искать перебором

Это альтернативы? Что то сложно очень. Мне пока не понятно. :)
Аватара пользователя
ANTIKLAN
новенький
 
Сообщения: 55
Зарегистрирован: 25.02.2015 09:21:42


Вернуться в Обучение Free Pascal

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 9

Рейтинг@Mail.ru