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


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

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

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

Максимум 255.

Так вот это и интересно, вроде компилятор давно 32 бита, не говоря о 64 битах, а ограничение на 8 бит наверное еще с паскаля на i8085 тянется с 1982 года. Ведь один фиг процессор жонглирует 32битовыми регистрами.....
...
Рейтинг: 0 / 0
вхождение целой переменной в перечень
    #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
вхождение целой переменной в перечень
    #40066210
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GrigoriyFomin
Так вот это и интересно, вроде компилятор давно 32 бита, не говоря о 64 битах, а ограничение на 8 бит наверное еще с паскаля на i8085 тянется
При чем здесь 8 бит, если максимальный размер множества еще с паскаля 32 байта?
...
Рейтинг: 0 / 0
вхождение целой переменной в перечень
    #40066233
Fr0sT-Brutal
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
_Vasilisk_
GrigoriyFomin
Так вот это и интересно, вроде компилятор давно 32 бита, не говоря о 64 битах, а ограничение на 8 бит наверное еще с паскаля на i8085 тянется
При чем здесь 8 бит, если максимальный размер множества еще с паскаля 32 байта?

Оба не правы. Максимальный размер множества - 255 элементов
...
Рейтинг: 0 / 0
вхождение целой переменной в перечень
    #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
вхождение целой переменной в перечень
    #40066529
white_nigger
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вообще непонятно, что мешает delphi заюзать кодогенерацию, аналогичную case - там уже всё есть и поддержка Integer, диапазоны...
...
Рейтинг: 0 / 0
вхождение целой переменной в перечень
    #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
вхождение целой переменной в перечень
    #40066583
Fr0sT-Brutal
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
_Vasilisk_
Не 255, а 256.

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

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

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

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

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

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

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

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

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

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

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

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

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


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

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


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


Если сделали такие множества, то типичный дельфи-программист сразу начал бы хреначить множества по подгигабайта, никто же не смотрит что там под капотом, посмотреть хотя бы на Devexpress c его расходом памяти.
...
Рейтинг: 0 / 0
вхождение целой переменной в перечень
    #40066674
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Fr0sT-Brutal
Напомнить, чему равно $FF?
Внимание вопрос: какое максимальное число элементов может быть в множестве [0..5]? 5? Или все таки 6?
...
Рейтинг: 0 / 0
вхождение целой переменной в перечень
    #40066701
andreymx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а почему рассматривается только вхождение целой переменной в перечень?
скльщики привыкли ко всем типам переменных, а ораклисты даже к таким конструкциям
(1,3,'2') in ((1,3,'2') ,(1,1,'2') ,(1,2,'3'))
...
Рейтинг: 0 / 0
вхождение целой переменной в перечень
    #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
25 сообщений из 27, страница 1 из 2
Форумы / Delphi [игнор отключен] [закрыт для гостей] / вхождение целой переменной в перечень
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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