![]() |
set of.. speichern/laden?
Hallo,
ich habe folgendes:
Delphi-Quellcode:
Wie muss die Prozedur SaveToFile aussehen, damit ich später ein möglichst einfaches LoadFromFile machen kann?
type
TMyTyp = (mt1,mt2,mt3,mt4,mt5); TMyTypes = set of TMyTyp; . . procedure SaveToFile(ATyp : TMyTypes); begin //Was muss hier rein? end; procedure Test; var mytyp : TMyTypes; begin mytyp := [mt1,mt2,mt4]; SaveToFile(mytyp); end; ich hatte mal irgendwo das Phänomen, dass solche sets als Integer abgespeichert wurden. Dabei hatte der erste Wert den Wert "1", der zweite den Wert "2", der dritte "4", der vierte "8", diese dann alle zusammenaddiert wurden und somit eindeutig in einer Zahl den Inhalt des gespeicherten Sets dargestellt haben. //Edit: In diesem Fall wäre das die Zahl "11" die diese zusammensetzung eindeutig darstellt und die nicht anders zusammenzusetzen ist. Gibt es dafür einen Befehl der das macht? Hoffentlich hab ich mich verständlich ausgedürckt :oops: MfG :angel: |
Re: set of.. speichern/laden?
|
Re: set of.. speichern/laden?
Ein Set ist ein Bitvektor.
Das sieht dann bei 5 Werten etwa so aus: 00000000 00000000 00000000 000abcde Wenn a im set ist, dann ist in dem Bitvektor a=1, ansonsten a=0. Bei b-e ist das dann analog. Wenn du also ein Set speichern/laden willst, musst du es beim Speichern nur nach Integer casten und dann abspeichern, beim Laden nen Integer laden und in deinen Settyp casten. |
Re: set of.. speichern/laden?
wie genau sprech ich jetzt die Bits an?
also wenn ich a,b,c,d,e hab stehen die 00000000 00000000 00000000 000edcba drin. also wenn die Bits ein string wären wäre es
Delphi-Quellcode:
wo ich setzen müsste für a.
bits[Length(bits)-Ord(a)]
aber wie bekomm ich die als Bits? oder soll ich die besser quadrieren? Also
Delphi-Quellcode:
wenn es das schon gäbe, als einfach Funktion oder so die das komplette Set gleich speichert wäre das viel einfacher...
zahl:=zahl+Round(power(Ord(a)+1,2));
ok, das speichern hab ich:
Delphi-Quellcode:
aber wie lade ich das jetzt wenn ich z.B. "11" bekomme?
function GetZahl(ASet : TMyTypes):Integer;
var i : integer; begin if TMyTyp(0) in ASet then Result:=1 else result:=0; for i:= 1 to 4 do//Kann man die Anzahl der Werte dynamisch ermitteln? if TMyTyp(i) in ASet then Result:=Result+Round(power(i,2)); end; |
Re: set of.. speichern/laden?
Wenn du ein Set in einen Integer umwandeln willst, dann caste es einfach nach integer und vice versa.
|
Re: set of.. speichern/laden?
Delphi-Quellcode:
ergibt aber ne fehlerhafte Typenumwandlung
Integer(myset);
die Schleife hab ich jetz folgendermaßen überarbeitet:
Delphi-Quellcode:
aber das mit dem Laden... das will irgendwie nicht...
function GetZahl(ASet : TMyTypes):Integer;
var mytest : TMyTyp; begin Result:=0; for mytest in ASet do if Ord(mytest) = 0 then Result:=Result+1 else Result:=Result+Round(Power(Ord(mytest),2)); end; |
Re: set of.. speichern/laden?
Zitat:
|
Re: set of.. speichern/laden?
Also beim laden bin ich jetzt soweit, aber häng an der entscheidenden Stelle:
Delphi-Quellcode:
ich habe eben das Result und möchte einen Teil davon setzen. wie mache ich das?
function GetSet(AZahl : integer):TMyTypes;
var mytest : TMyTyp; cnt,i,lzahl : integer; begin cnt:=0; repeat inc(cnt); until Round(Power(cnt,2))> AZahl; lzahl:=AZahl; Result:=[]; for i:= Pred(cnt) downto 1 do if Round(Power(i,2)) <= lZahl then begin lzahl:=lzahl-Round(Power(i,2)); Result:= (Result or TMyTyp(i)); end; if lzahl = 1 then Result:= Result or TMyTyp(0); end; OR und + gehen beide nicht. Muss was anderes her? |
Re: set of.. speichern/laden?
Wie wärs mit:
![]() |
Re: set of.. speichern/laden?
Ein Typecasting auf ein Set zum Speichern halte ich für ziemlich gefährlich.
1) Wie Khabarakh sagte, kann ein Set auch mal größer 32Bit sein. 2) Ein Set kann(muss) auch, mal erweitert werden, wenn's notwendig ist. Was bekommt man denn da heraus, wenn man eine alte Setstruktur läd. Ich würde mir da eher eine Get bzw. Set-Procedure schreiben z.B.
Delphi-Quellcode:
Da hast du dann die richtige Kontrolle.
Function MySetToString(aSet:TMySet):String;
Function StringToMySet(aString:String):TMySet; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:17 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz