Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Delphi [игнор отключен] [закрыт для гостей] / вхождение целой переменной в перечень / 25 сообщений из 27, страница 1 из 2
26.04.2021, 00:27
    #40065736
GrigoriyFomin
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вхождение целой переменной в перечень
Есть ли возможность в Delphi сделать такую конструкцию?
Код: pascal
1.
	if var_is_int32 in [7,8,2315] then


(про множественные var2=1 or var2=2 or var2=4 я в курсе). Хочется красивого решения, как в других языках.
...
Рейтинг: 0 / 0
26.04.2021, 00:33
    #40065742
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вхождение целой переменной в перечень
Функцию напиши и будет "как в других языках".
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
26.04.2021, 00:34
    #40065743
rgreat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вхождение целой переменной в перечень
2315 - не прокатит.

Максимум 255.
...
Рейтинг: 0 / 0
26.04.2021, 10:28
    #40065826
Fr0sT-Brutal
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вхождение целой переменной в перечень
Код: pascal
1.
2.
3.
4.
case int of
  1, 300, 23040980: yes
  else no
end
...
Рейтинг: 0 / 0
26.04.2021, 10:39
    #40065831
Zelius
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вхождение целой переменной в перечень
GrigoriyFomin,

посмотри как сделана CharInSet
...
Рейтинг: 0 / 0
27.04.2021, 01:09
    #40066178
GrigoriyFomin
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вхождение целой переменной в перечень
rgreat
2315 - не прокатит.

Максимум 255.

Так вот это и интересно, вроде компилятор давно 32 бита, не говоря о 64 битах, а ограничение на 8 бит наверное еще с паскаля на i8085 тянется с 1982 года. Ведь один фиг процессор жонглирует 32битовыми регистрами.....
...
Рейтинг: 0 / 0
27.04.2021, 06:43
    #40066190
istrebitel
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вхождение целой переменной в перечень
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
interface

TArrayOperations = class
public
  class function Contain<T>(const Array1: TArray<T>; const Value: T): Boolean; overload; static;
  class function Contain<T>(const Array1: TArray<T>; const Value: T; const Comparer: IComparer<T>): Boolean; overload; static;
end;

implementation

class function TArrayOperations.Contain<T>(const Array1: TArray<T>; const Value: T; const Comparer: IComparer<T>): Boolean;
var
  MyElem: T;
begin
  for MyElem in Array1 do
    if Comparer.Compare(MyElem, Value) = 0 then
      Exit(True);
  Exit(False);
end;

class function TArrayOperations.Contain<T>(const Array1: TArray<T>; const Value: T): Boolean;
var
  IComp: IComparer<T>;
begin
  IComp := TComparer<T>.Default;
  Result := Contain<T>(Array1, Value, IComp);
end;


Использование
Код: pascal
1.
2.
if TArrayOperations.Contain<TField>([fdqMainEmergency, fdqMainMaintenance, fdqMainInWork], Column.Field) then
if TArrayOperations.Contain<Integer>([5, 100, 100500], IntVar) then
...
Рейтинг: 0 / 0
27.04.2021, 09:15
    #40066210
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вхождение целой переменной в перечень
GrigoriyFomin
Так вот это и интересно, вроде компилятор давно 32 бита, не говоря о 64 битах, а ограничение на 8 бит наверное еще с паскаля на i8085 тянется
При чем здесь 8 бит, если максимальный размер множества еще с паскаля 32 байта?
...
Рейтинг: 0 / 0
27.04.2021, 10:25
    #40066233
Fr0sT-Brutal
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вхождение целой переменной в перечень
_Vasilisk_
GrigoriyFomin
Так вот это и интересно, вроде компилятор давно 32 бита, не говоря о 64 битах, а ограничение на 8 бит наверное еще с паскаля на i8085 тянется
При чем здесь 8 бит, если максимальный размер множества еще с паскаля 32 байта?

Оба не правы. Максимальный размер множества - 255 элементов
...
Рейтинг: 0 / 0
27.04.2021, 14:44
    #40066365
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вхождение целой переменной в перечень
Fr0sT-Brutal
Оба не правы. Максимальный размер множества - 255 элементов
Не 255, а 256. Что составляет, внезапно, 32 байта

Вот код, который поможет вам в этом убедиться
Код: pascal
1.
2.
3.
4.
5.
6.
procedure TForm1.Button1Click(Sender: TObject);
var
  LSet: set of Byte;
begin
  ShowMessageFmt('%d', [SizeOf(LSet)]);
end;
...
Рейтинг: 0 / 0
28.04.2021, 02:18
    #40066529
white_nigger
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вхождение целой переменной в перечень
Вообще непонятно, что мешает delphi заюзать кодогенерацию, аналогичную case - там уже всё есть и поддержка Integer, диапазоны...
...
Рейтинг: 0 / 0
28.04.2021, 09:13
    #40066564
swame2
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вхождение целой переменной в перечень
GrigoriyFomin,

Вариант для 512 значений, переделай под свое количество


Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
160.
161.
162.
163.
164.
165.
166.
167.
168.
169.
170.
171.
172.
173.
174.
175.
176.
177.
178.
179.
180.
181.
182.
183.
184.
185.
186.
187.
188.
189.
190.
191.
192.
193.
194.
195.
196.
197.
198.
199.
200.
201.
202.
203.
204.
205.
206.
207.
208.
209.
210.
211.
212.
213.
214.
215.
216.
217.
218.
219.
220.
221.
222.
223.
224.
225.
226.
227.
228.
229.
230.
231.
232.
233.
234.
235.
236.
237.
238.
239.
240.
241.
242.
243.
244.
245.
246.
247.
248.
249.
250.
251.
252.
253.
254.
255.
256.
257.
  TIntArray = array of integer;
  TIntSet512Item = 0..511;
  TIntSet512 = record
  const
    LData = 63;
  var
    //TEnumSetType = set of Byte;
    FData: array [0..LData] of cardinal;
  private
    function GetAsSaveStr: string;
    procedure SetAsSaveStr(const Value: string);
  public
    procedure Clear;
    function IsEmpty: Boolean;
    procedure Include (AItem: TIntSet512Item); overload; inline;
    procedure Include (AItems: TIntArray); overload; inline;
    procedure Include (AItems: array of integer); overload;
    procedure Exclude (AItem: TIntSet512Item); overload; inline;
    procedure Exclude (AItems: TIntArray); overload; inline;
    function ToArray: TIntArray;

    class operator In (AItem: TIntSet512Item; const Value: TIntSet512): Boolean;
    class operator Equal (const L, R: TIntSet512) : Boolean;
    class operator NotEqual (const L, R: TIntSet512): Boolean;
    class operator Add (const L, R: TIntSet512): TIntSet512;
    class operator Add (const L: TIntSet512; R: TIntSet512Item): TIntSet512;
    class operator Subtract (const L, R: TIntSet512): TIntSet512;
    class operator Subtract (const L: TIntSet512; R: TIntSet512Item): TIntSet512;
    class operator Multiply (const L, R: TIntSet512): TIntSet512;

    procedure LoadJSON (const ATag: string; ANode: TJSONObject);
    procedure SaveJSON (const ATag: string; ANode: TJSONObject);

    property AsSaveStr: string read GetAsSaveStr write SetAsSaveStr;
  end;

{ TIntSet512 }

procedure TIntSet512.Clear;
begin
  FillChar (FData [0], sizeof(FData), #0);
end;

function TIntSet512.IsEmpty: Boolean;
var
  i: integer;
begin
  for i := 0 to LData do
    if FData [i] <> 0 then
      exit (false);
  Result := true;
end;

class operator TIntSet512.Equal(const L, R: TIntSet512): Boolean;
var
  i: integer;
begin
  for i := 0 to LData do
    if L.FData [i] <> R.FData [i] then
      exit (false);
  Result := true;
end;

class operator TIntSet512.NotEqual(const L, R: TIntSet512): Boolean;
begin
  Result := not (L = R);
end;

class operator TIntSet512.In(AItem: TIntSet512Item; const Value: TIntSet512): Boolean;
var
  i, j: word;
begin
  DivMod (AItem, 32, i, j);
  Result := (Value.FData [i] and (1 shl j)) <> 0;
end;

procedure TIntSet512.Include(AItem: TIntSet512Item);
var
  i, j: word;
begin
  DivMod (cardinal(AItem), 32, i, j);
  FData [i] := (FData [i] or (1 shl j));
end;

procedure TIntSet512.Exclude(AItem: TIntSet512Item);
var
  i, j: word;
begin
  DivMod (AItem, 32, i, j);
  FData [i] := (FData [i] and not (1 shl j));
end;

class operator TIntSet512.Add(const L: TIntSet512; R: TIntSet512Item): TIntSet512;
begin
  Result := L;
  Result.Include (R);
end;

class operator TIntSet512.Subtract(const L: TIntSet512; R: TIntSet512Item): TIntSet512;
begin
  Result := L;
  Result.Exclude (R);
end;

procedure TIntSet512.Include(AItems: TIntArray);
var
  i: integer;
begin
  for i := 0 to length (AItems)-1 do
    Include(AItems [i]);
end;

procedure TIntSet512.Include (AItems: array of integer);
var
  i: integer;
  Itm: TIntSet512Item;
begin
  for i := 0 to length (AItems)-1 do begin
    Itm := AItems [i];
    Include(Itm);
  end;
end;

procedure TIntSet512.Exclude(AItems: TIntArray);
var
  i: integer;
begin
  for i := 0 to length (AItems)-1 do
    Exclude(AItems [i]);
end;

class operator TIntSet512.Add(const L, R: TIntSet512): TIntSet512;
var
  i: integer;
begin
  for i := 0 to LData do
    Result.FData [i] := L.FData [i] or R.FData [i];
end;

class operator TIntSet512.Multiply(const L, R: TIntSet512): TIntSet512;
var
  i: integer;
begin
  for i := 0 to LData do
    Result.FData [i] := L.FData [i] and R.FData [i];
end;

class operator TIntSet512.Subtract(const L, R: TIntSet512): TIntSet512;
var
  i: integer;
begin
  for i := 0 to LData do
    Result.FData [i] := L.FData [i] and not R.FData [i];
end;

function TIntSet512.ToArray: TIntArray;
var
  i, j, Cnt: integer;
  D: cardinal;

  procedure Add (K: integer);
  var
    L: integer;
  begin
    L := length (Result);
    if Cnt >= L then
      SetLength (Result, L*2);
    Result [Cnt] := K;
    inc (Cnt);
  end;
begin
  SetLength (Result, 16);
  Cnt := 0;
  for i := 0 to LData do begin
    D := FData [i];
    if D = 0 then continue;
    for j := 0 to 31 do
      if (D and (1 shl j)) <> 0 then
        Add (i*32+j);
  end;
  SetLength (Result, Cnt);
end;

function TIntSet512.GetAsSaveStr: string;
var
  i, j: integer;
  S: string;
  D: cardinal;

   function CondSep (const Cond1, Sep, Cond2: string): string;
   begin
    if (Cond1 = '') or (Cond2 = '') then
      Result := Cond1 + Cond2
    else
      Result := Cond1 + Sep + Cond2;
   end;

begin
  Result := '';
  for i := 0 to LData do begin
    D := FData [i];
    if D = 0 then continue;

    S := '';

    for j := 0 to 31 do
      if (D and (1 shl j)) <> 0 then
        S := CondSep (S, ',', (i*32+j).ToString);
    Result := CondSep (Result, ',',  S);
  end;
end;

procedure TIntSet512.SetAsSaveStr(const Value: string);
var
  A: TStringArray;
  i, K: integer;
begin
  ExtractWords (Value, ',', A);
  Clear;
  for i := 0 to length (A)-1 do
    if TryStrToInt (A[i], K) then
      include (K);
end;

procedure TIntSet512.LoadJSON (const ATag: string; ANode: TJSONObject);
var
  A: TJSONArray;
  i, V: integer;
begin
  Clear;
  A := ANode.GetValue('ViewTypes') as TJSONArray;
  if A = nil then exit;
  for i := 0 to A.Count-1 do
    if TryStrToInt (A.Items [i].Value, V) then
      include (V);
end;

procedure TIntSet512.SaveJSON (const ATag: string; ANode: TJSONObject);
var
  A: TJSONArray;
  i, j: integer;
  D: cardinal;
begin
  if IsEmpty then exit;

  A := TJSONArray.Create;
  ANode.AddPair (ATag, A);

  for i := 0 to LData do begin
    D := FData [i];
    if D = 0 then continue;

    for j := 0 to 31 do
      if (D and (1 shl j)) <> 0 then
        A.Add ((i*32+j).ToString);
  end;
end;


...
Рейтинг: 0 / 0
28.04.2021, 10:19
    #40066583
Fr0sT-Brutal
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вхождение целой переменной в перечень
_Vasilisk_
Не 255, а 256.

Напомнить, чему равно $FF?

Насчет 32 бита не прав был, да. Ошибся в расчетах. Плюс подумал, что раз уж int64 завезли, то и множества могли бы расширить
...
Рейтинг: 0 / 0
28.04.2021, 10:21
    #40066584
Fr0sT-Brutal
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вхождение целой переменной в перечень
swame2
GrigoriyFomin,

Вариант для 512 значений, переделай под свое количество

Неплохо, но разве есть смысл DivMod-ить на 32, когда это делается сдвигом и and-ом? DivMod ужасно медленный
...
Рейтинг: 0 / 0
28.04.2021, 10:22
    #40066585
Kazantsev Alexey
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вхождение целой переменной в перечень
white_nigger
Вообще непонятно, что мешает delphi заюзать кодогенерацию, аналогичную case - там уже всё есть и поддержка Integer, диапазоны...

Стили рисовать проще...
...
Рейтинг: 0 / 0
28.04.2021, 10:23
    #40066586
Kazantsev Alexey
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вхождение целой переменной в перечень
swame2
Вариант для 512 значений, переделай под свое количество

А можно просто взять TBits.
...
Рейтинг: 0 / 0
28.04.2021, 11:09
    #40066604
Дегтярев Евгений
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вхождение целой переменной в перечень
Fr0sT-Brutal
_Vasilisk_
Не 255, а 256.

Напомнить, чему равно $FF?

а как связано максимально значение закодированное 8 битами с кол-вом бит в 32 байтах?
...
Рейтинг: 0 / 0
28.04.2021, 11:16
    #40066607
Fr0sT-Brutal
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вхождение целой переменной в перечень
Дегтярев Евгений
Fr0sT-Brutal
пропущено...

Напомнить, чему равно $FF?

а как связано максимально значение закодированное 8 битами с кол-вом бит в 32 байтах?

А как устроено множество, по-твоему?
...
Рейтинг: 0 / 0
28.04.2021, 11:53
    #40066630
swame2
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вхождение целой переменной в перечень
Kazantsev Alexey,

TBits это класс, его нужно криэйтить и следить за копированием, у нас была потребность легко перебрасывать присвоением в другие части кода именно копии.
...
Рейтинг: 0 / 0
28.04.2021, 12:00
    #40066636
swame2
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вхождение целой переменной в перечень
Fr0sT-Brutal

Неплохо, но разве есть смысл DivMod-ить на 32, когда это делается сдвигом и and-ом? DivMod ужасно медленный


Может быть, но это на уровне предположений, надо мерять.
В современных дельфях много чего оптимизировано, посмотри в код DivMod, там не так тяжело.
Мы не заморачивались суперпроизводительностью, по крайней мере это лучше, чем поиск перебором в массиве, как у всех.
...
Рейтинг: 0 / 0
28.04.2021, 12:01
    #40066637
swame2
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вхождение целой переменной в перечень
swame2
Kazantsev Alexey,

TBits это класс, его нужно криэйтить и следить за копированием, у нас была потребность легко перебрасывать присвоением в другие части кода именно копии, часто измененные.
...
Рейтинг: 0 / 0
28.04.2021, 12:16
    #40066646
swame2
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вхождение целой переменной в перечень
Fr0sT-Brutal


Насчет 32 бита не прав был, да. Ошибся в расчетах. Плюс подумал, что раз уж int64 завезли, то и множества могли бы расширить


Если сделали такие множества, то типичный дельфи-программист сразу начал бы хреначить множества по подгигабайта, никто же не смотрит что там под капотом, посмотреть хотя бы на Devexpress c его расходом памяти.
...
Рейтинг: 0 / 0
28.04.2021, 12:53
    #40066674
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вхождение целой переменной в перечень
Fr0sT-Brutal
Напомнить, чему равно $FF?
Внимание вопрос: какое максимальное число элементов может быть в множестве [0..5]? 5? Или все таки 6?
...
Рейтинг: 0 / 0
28.04.2021, 13:23
    #40066701
andreymx
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вхождение целой переменной в перечень
а почему рассматривается только вхождение целой переменной в перечень?
скльщики привыкли ко всем типам переменных, а ораклисты даже к таким конструкциям
(1,3,'2') in ((1,3,'2') ,(1,1,'2') ,(1,2,'3'))
...
Рейтинг: 0 / 0
28.04.2021, 14:18
    #40066730
Fr0sT-Brutal
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вхождение целой переменной в перечень
swame2
Fr0sT-Brutal

Неплохо, но разве есть смысл DivMod-ить на 32, когда это делается сдвигом и and-ом? DivMod ужасно медленный

В современных дельфях много чего оптимизировано, посмотри в код DivMod, там не так тяжело.

Я сам делал DivMod на асме и какой бы там код ни был - все равно сводится к инструкции DIV, которая занимает на порядки больше циклов, чем сдвиг
swame2
Если сделали такие множества, то типичный дельфи-программист сразу начал бы хреначить множества по подгигабайта, никто же не смотрит что там под капотом, посмотреть хотя бы на Devexpress c его расходом памяти.

Вовсе нет. С самого начала компилятор достаточно умен, чтобы выбирать размер множества исходя из кол-ва элементов. Ну а объявить множества из > 255 элементов просто так - это едва ли вероятно.
_Vasilisk_
Fr0sT-Brutal
Напомнить, чему равно $FF?
Внимание вопрос: какое максимальное число элементов может быть в множестве [0..5]? 5? Или все таки 6?

Внимание вопрос: как, по-твоему, реализованы множества в Pascal?
Наводящий вопрос и домашнее задание: как реализовано добавление в множество элемента с Ord = 0
...
Рейтинг: 0 / 0
Форумы / Delphi [игнор отключен] [закрыт для гостей] / вхождение целой переменной в перечень / 25 сообщений из 27, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]