Hallo,
Was soll ich sagen, aber es zählt immer noch einen zuwenig, wenn gleiche Felder vorliegen
.
Gruß Horst
Hallo Horst,
sorry, aber bei mir passiert das nicht.
Zumindest dann nicht, wenn ich
tData=integer
deklariere.
Wenn ich, wie du es gemacht hast
tData=cardinal
deklariere, dann wird nicht compiliert, anstatt kommt in der Prozedur FillArray bei der Zeile
d := delta * MAXDATCOUNT;
eine Fehlermeldung :
[DCC Fehler] Intersect_Main.pas(318): E2099 Überlauf bei Konvertierung oder arithmetischer Operation
Die
OH sagt hierzu:
Der Compiler hat in einem arithmetischen Ausdruck einen Überlauf entdeckt. Das Ergebnis des Ausdrucks kann wegen seiner Größe nicht in 32 Bits dargestellt werden. Überprüfen Sie die durchgeführten Berechnungen, und stellen Sie sicher, dass die Ergebnisse von der Hardware des Computers dargestellt werden können.
Und wenn ich mit der Maus auf die Konstante "delta" zeige dann kommt der Hinweis
delta = null - Erroneous Type
Wenn ich aber nun die Konstante delta explizit als cardinal deklariere, also
delta:cardinal= High(TData) div maxdatcount-1;
dann wird compiliert und die
Asm-Funktion liefert korrekte Ergebnisse.
Ich vermute, dass es daran liegt….
Delphi-Quellcode:
type
TData=cardinal;
const
maxdatcount=5000000;
// delta=High(TData) div maxdatcount-1; // so wird nicht compiliert
delta:cardinal=High(TData) div maxdatcount-1; // so funktioniert es
procedure FillArray(var A:TSampleArray);
var
i : integer;
d : tData;
begin
i := High(A);
d := delta * MAXDATCOUNT;
For i := i downto 0 do
begin
d := d-delta;
A[i] := d;
end;
end;
procedure TMain.Button1Click(Sender: TObject);
var intersect,data:TSampleArray;
begin
SetLength(data,maxdatcount);
FillArray(data);
intersect:=copy(data);
SetLength(intersect,GetIntersect_5(intersect,data,Length(intersect)));
meRes.Lines.Add(inttostr(Length(intersect)));
end;