Hallo,
ich würde gerne die Anzahl der Elemente in einer Menge zählen, in der Art:
Delphi-Quellcode:
type
TMenge = set of 0.255
var
Menge : TMenge;
begin
Menge := [3, 5, 110];
writeln(Length(Menge)); // gibt 3 aus
end;
Da ich in Delphi keine Funktion gefunden habe, habe ich es mal mit dem Inline-Assembler versucht. Der Tag an dem ich das letzte mal etwas mit Assembler gemacht habe, ist jedoch schon etwas her...
Der Anfang war ja aber noch recht leicht. Wie zu erwarten, steht im Speicher für jedes Element der Menge ein Bit (1 = "Element drin", 0 = "Element nicht drin"). Was mir noch aufgefallen ist: Für bis zu 4 Byte/32 Bit (dementsprechend bis zu 32 Elementen) wird eine Menge als Werte-, ab 33 Elementen als Referenzparameter übergeben. Also übergebe ich lieber gleich die Adresse der Menge als Pointer an meine Assembler-Funktion und lade dann aus dem Speicher...
Jetzt das Problem:
Um möglichst wenig Redundanz zu erhalten, werden natürlich nicht immer gleich 32 Byte für jeden beliebigen Mengen-Typ reserviert, sondern nur so viele, wie gebraucht werden (in diesen Schritten: 1, 2, 4, 8, 16 oder 32 Bytes). Woher weiß ich aber, wie lang mein Mengentyp ist, wieviele Bytes ich also aus dem Speicher in die Register laden muss, um dort dann die Bits auf 1 auszählen zu können?
Hier der Anfang:
Delphi-Quellcode:
function Length(PNT : Pointer) : Byte;
asm
MOV EAX,[EAX]
// Bits auszählen, evtl. weitere Speicherbereiche laden,...
RET
end;
Danke und Gruß,
Lucas