powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / (lazarus) Вхождение элемента в массив байтов
15 сообщений из 15, страница 1 из 1
(lazarus) Вхождение элемента в массив байтов
    #40041869
Фотография Док
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть код:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
const
  s = 'qwerty{}[]';
var
  BtArr: TBytes {= Array of Byte};
  i: PtrInt;
begin
  BtArr:= BytesOf(RawByteString(s);
  for i:= Low(BtArr) to High(BtArr) do
    if (BtArr[i] = Byte('{')) 
      then 'bla-bla-bla';
end;



Можно ли проверить вхождение элемента в массив другим, более изящным, способом, без for..to..do?
=================
Док.

Win7 Ultim x64/Deb 10 (MATE; gtk2) amd64/Darwin Cocoa:
FB 3.0.6.33328, Lazarus 2.1(r.63874); FPC 3.3.1 trunk
...
Рейтинг: 0 / 0
(lazarus) Вхождение элемента в массив байтов
    #40041872
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Док,

На писать функцию
Код: pascal
1.
ByteInArray( const a: TBytes; b: Byte ): Boolean;


и вызывать её.
...
Рейтинг: 0 / 0
(lazarus) Вхождение элемента в массив байтов
    #40041888
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Куда уж проще чем через for.
...
Рейтинг: 0 / 0
(lazarus) Вхождение элемента в массив байтов
    #40041890
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Док,

IndexByte()

p.s. А чего по строке не ищется?
...
Рейтинг: 0 / 0
(lazarus) Вхождение элемента в массив байтов
    #40041902
ъъъъъ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Док
Можно ли проверить вхождение элемента в массив другим, более изящным, способом, без for..to..do?

Да, конечно.

Например. Пусть у тебя есть массив байт (например, однобайтные символы)
Код: pascal
1.
2.
const 
  c_s : AnsiString = '1234567890-=qwertyuiop[pasdfghjkl;xcvbnm,.';


Нужно определить, входит ли в строку конкретный однобайтный символ '$';
Решение:
1. Формируешь вспомогательный массив of Boolean, длиной High(Byte) + 1:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
var
  a_b : array of Boolean;
  c : AnsiChar;
begin
  SetLength(a_b, Succ(High(Byte)));
  for c in c_s do
    a_b[ord(c)] := True;



2. Теперь, всякий раз, когда тебе нужно решать твою задачу, ты выполняешь простую проверку в один шаг:
Код: pascal
1.
2.
  if a_b[<занчение_байта>] then
      ...
...
Рейтинг: 0 / 0
(lazarus) Вхождение элемента в массив байтов
    #40041922
Фотография Док
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kazantsev Alexey
Док,
...
p.s. А чего по строке не ищется?

ты ж сказал, что это моветон? Особенно с учетом кодировки :)

ъъъъъ,

чем тогда это отличается от
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
var 
  M: Set of Byte = [];
begin
  ...
  for i:= Low(BtArr) to High(BtArr) do
  M:= M + [BtArr[i]];
  if (Byte('{') in M) then ...
end;



?
...
Рейтинг: 0 / 0
(lazarus) Вхождение элемента в массив байтов
    #40041931
Фотография Док
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
не выходит каменный цветок
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
var
  s: String;
  BtArr: TBytes;
  i: PtrInt;//отладка
  len: PtrInt;//отладка
  b: Byte;//отладка
begin
  ...
  BtArr:= BytesOf(RawByteString(s));

  len:= Length(BtArr);
  b:= Byte('{');

  i:= IndexByte(BtArr,Length(BtArr),b);

  if (i > -1) then 'bla-bla-bla';
end;



функция все время возвращает -1, даже если искомый символ в массиве - единственный

зы. через строковые функции (с кучей кода) все работает без проблем
...
Рейтинг: 0 / 0
(lazarus) Вхождение элемента в массив байтов
    #40041932
Фотография Док
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
кажется, правильно так?
Код: pascal
1.
i:= IndexByte(BtArr[0],Length(BtArr),Byte('{'));
...
Рейтинг: 0 / 0
(lazarus) Вхождение элемента в массив байтов
    #40042043
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Док
ты ж сказал, что это моветон? Особенно с учетом кодировки :)

Когда я такое говорил?

Док
кажется, правильно так?

Да. А если нет гарантии, что массив будет не пустой, то лучше так: Pointer(BtArr)^.
...
Рейтинг: 0 / 0
(lazarus) Вхождение элемента в массив байтов
    #40042439
Фотография Док
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kazantsev Alexey
Когда я такое говорил?


гугель все помнит 21963696


Kazantsev Alexey
А если нет гарантии, что массив будет не пустой, то лучше так: Pointer(BtArr)^

ага, принято. Спасибо
...
Рейтинг: 0 / 0
(lazarus) Вхождение элемента в массив байтов
    #40042443
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Док
гугель все помнит 21963696

Похоже, ты забыл о чём шла речь: https://www.sql.ru/forum/actualutils.aspx?action=gotomsg&tid=1316587&msg=21963322
...
Рейтинг: 0 / 0
(lazarus) Вхождение элемента в массив байтов
    #40042984
Фотография Док
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kazantsev Alexey,

не забыл, но уже неважно :)
...
Рейтинг: 0 / 0
(lazarus) Вхождение элемента в массив байтов
    #40042993
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Док,

Кстати, получение байтов от RawByteString бессмысленная операция.
...
Рейтинг: 0 / 0
(lazarus) Вхождение элемента в массив байтов
    #40043849
Фотография Док
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kazantsev Alexey
Док,

Кстати, получение байтов от RawByteString бессмысленная операция.

хм, в исходнике две перегруженные функции с типами строк в аргументе RawByteString и UnicodeString. Вот я и подумал ...
...
Рейтинг: 0 / 0
(lazarus) Вхождение элемента в массив байтов
    #40043853
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Док,

Для RawByteString никаких преобразований не делается, просто копируется память.
...
Рейтинг: 0 / 0
15 сообщений из 15, страница 1 из 1
Форумы / Delphi [игнор отключен] [закрыт для гостей] / (lazarus) Вхождение элемента в массив байтов
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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