Показать сообщение отдельно
  #1  
Старый 17.03.2014, 19:20
Аватар для seeman_tm
seeman_tm seeman_tm вне форума
Новичок
 
Регистрация: 03.02.2011
Сообщения: 79
Репутация: -2306
По умолчанию Функции поиска чего то в чём то

Предлагаю для обсуждения две функции по поиску массива в массиве.
Функции производят поиск в динамических или фиксированных массивах, с одной оговоркой. При поиске фиксированного или динамического подмассива в фиксированном (статическом) массиве, результат функций надо увеличить на начальный индекс фиксированного массива.

Первая функция производит поиск подмассива в массиве с лева направо.
Код:
Function lArrayPos(Const Arr, fArr: Array Of Byte; Offset: Integer = 0): Integer;
Var Index, DIndex: Integer;
Label f1;
  Begin
    Result := -1;
    if (LenGth(Arr) = 0) or (LenGth(fArr) = 0) then Exit;
    if Offset < 0 then Offset := 0;
    for Index := Low(Arr)+Offset to High(Arr) - (LenGth(fArr) - 1)  do
      Begin
        for DIndex := Low(fArr) to High(fArr) do
          Begin
             if Arr[Index+(dIndex - Low(fArr))] <> fArr[dIndex] then Goto f1;
          End;
        Result := Index;
        Exit;
      f1:
      End;
  End;

Вторая функция производит поиск подмассива в массиве с права налево.
Код:
Function rArrayPos(Const Arr, fArr: Array Of Byte; Offset: Integer = 0): Integer;
Var Index, DIndex: Integer;
Label f1;
  Begin
    Result := -1;
    if (LenGth(Arr) = 0) or (LenGth(fArr) = 0) then Exit;
    if Offset < 0 then Offset := 0;
    for Index := High(Arr) - Offset Downto Low(Arr) + (LenGth(fArr)-1) do
      Begin
        for DIndex := High(fArr) Downto Low(fArr) do
          Begin
            if Arr[Index+(dIndex - High(fArr))] <> fArr[dIndex] then Goto f1;
          End;
        Result := (Index - LenGth(fArr)) + 1;
        Exit;
      f1:
      End;
  End;

Погонял, по тестировал, ошибок не обнаружено. Интересует ваше мнение.
Ответить с цитированием