Предлагаю для обсуждения две функции по поиску массива в массиве.
Функции производят поиск в динамических или фиксированных массивах, с одной оговоркой. При поиске фиксированного или динамического подмассива в фиксированном (статическом) массиве, результат функций надо увеличить на начальный индекс фиксированного массива.
Первая функция производит поиск подмассива в массиве с лева направо.
Код:
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;
Погонял, по тестировал, ошибок не обнаружено. Интересует ваше мнение.