// In Variante 1
wird geprüft, ob ein kleineres Array in einem größeren
// enthalten ist bzw. ob zwei Arrays gleich sind, unter der
Voraussetzung,
// dass die Elemte der Arrays vom gleichen Typ sind. Im Beispiel
verwende
// ich den Typ "Double", es könnte aber jeder andere Typ sein.
// In Variante 2 wird geprüft, ob die Elemente des einen Arrays
im anderen
// enthalten sind, unabhängig von ihrer Reihenfolge.
// Getestet mit D4 unter XP
// Varinate 1
type
art = Double; // für diesen Fall
var
Grss: array[0..7] of Double = (1, 13, 33, 125, 2, 77, 120, 5);
Kln1: array[0..3] of Double = (2, 77, 120, 5);
Kln2: array[0..2] of Double = (33, 125, 77);
Kln3: array[0..2] of Double = (1, 13, 73);
Kln4: array[0..2] of Double = (1, 90, 2000);
Kln5: array[0..1] of Double = (1, 5);
function KinG(K, G: array of art): Integer;
var
se, sg, sk: integer;
A, P: PChar;
begin
Result := -1;
sg := sizeof(G);
sk := sizeof(K);
if sk <= sg then begin
se := sizeof(G[0]);
P := @G;
A := P;
repeat
if comparemem(@K, P, sk) then begin
Result := (P - A) div se;
break;
end;
inc(P, se);
until P - A > sg - sk;
end;
end;
// Beispielaufruf
// Zählung der Position beginnt bei "0"
procedure TForm2.Button3Click(Sender: TObject);
var
i: integer;
begin
i := KinG(Kln1, Grss);
if i >= 0 then
showmessage('Grss enthält Kln1 an Position ' + inttostr(i))
else showmessage('Nichts gefunden');
end;
//--------------------------------------------
// Varinate 2
function KinGx(K, G: array of art): Integer;
var x, y: integer;
begin
Result := 0;
for x := 0 to high(K) do
for y := 0 to high(G) do
if K[x] = G[y] then begin
inc(Result);
break;
end;
end;
// Beispielaufruf
procedure TForm2.Button4Click(Sender: TObject);
var
i: integer;
s: string;
begin
i := KinGx(Kln4, Grss);
if i = 0 then showmessage('Nichts gefunden') else
if i = length(Kln4) then showmessage('Grss enthält alle Elemente von Kln4')
else begin
s := 'Element';
if i <> 1 then s := s + 'e';
showmessage('Grss enthält nur ' + inttostr(i) + #32 + s + ' von Kln4')
end;
end;
|