Autor Beitrag
Frankieboy
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 65



BeitragVerfasst: Mi 16.06.10 17:01 
Hallo,

wieder mal eine grundlegende Frage, zu der ich in der Delphihilfe (da schön geordnet :roll:) nichts finde.

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
var
  Zeichen: set of chars;
begin
  Zeichen := ['A'..'Z'];
  {[...]}
end;


ich benutze eine Set of chars und weise Ihr danach einige Chars zu (mehr als im Beispiel).
1. Wie bekommt man die Länge einer set (of CHars), also die Menge der Zeichen insgesamt?
2. Wie kann man bestimmte Zeichen, z.B. Zeichen Nr. 5 aus der Menge auslesen?

Vielen Dank schon mal,

Frank
Narses
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10183
Erhaltene Danke: 1256

W10ent
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: Mi 16.06.10 17:15 
Moin!

user profile iconFrankieboy hat folgendes geschrieben Zum zitierten Posting springen:
1. Wie bekommt man die Länge einer set (of CHars), also die Menge der Zeichen insgesamt?
Das ist (AFAIK) nicht möglich (klar: ausser selbst zählen, was in der Menge ist).
DOH hat folgendes geschrieben:
Mengenoperatoren

Die folgenden Operatoren haben eine Menge als Operanden.

Mengenoperatoren
ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
Operator  Operation  Operandtyp  Ergebnistyp  Beispiel
+  Vereinigung  Menge  Menge  Set1 + Set2
-  Differenz  Menge  Menge  S - T
*  Teilmenge  Menge  Menge  S * T
<=  Teilmenge  Menge  Boolean  Q <= MySet
>=  Obermenge  Menge  Boolean  S1 >= S2
=  Gleich  Menge  Boolean  S2 = MySet
<>  Ungleich  Menge  Boolean  MySet <> S1
in  Element  Ordinal, Menge  Boolean  A in Set1

Für +, - und * gelten die folgenden Regeln:

Der Ordinalwert O ist nur in X + Y enthalten, wenn O in X oder Y (oder beiden) enthalten ist. O ist nur in X - Y enthalten, wenn O in X, nicht aber in Y enthalten ist. O ist nur in X *Y enthalten, wenn O sowohl in X als auch in Y enthalten ist.
Das Ergebnis einer Operation mit +, - oder * ist vom Typ set of A..B, wobei A der kleinste und B der größte Ordinalwert in der Ergebnismenge ist.

Für <=, >=, =, <> und in gelten die folgenden Regeln:

X <= Y ist nur dann True, wenn jedes Element von X ein Element von Y ist; Z >= W ist gleichbedeutend mit W <= Z. U = V ist nur dann True, wenn U und V genau dieselben Elemente enthalten. Andernfalls gilt: U <> V is True.
Für einen Ordinalwert O und eine Menge S ist O in S nur dann True, wenn O ein Element von S ist.

user profile iconFrankieboy hat folgendes geschrieben Zum zitierten Posting springen:
2. Wie kann man bestimmte Zeichen, z.B. Zeichen Nr. 5 aus der Menge auslesen?
Die Elemente einer Menge haben keine Ordnung. Ob ein Element in der Menge ist, kann man mit dem in-Operator rausfinden, s.o.

cu
Narses

_________________
There are 10 types of people - those who understand binary and those who don´t.
martin300
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 186
Erhaltene Danke: 2



BeitragVerfasst: Mi 16.06.10 17:27 
Hallo,
zu 1)
siehe: www.delphipraxis.net/551329-post.html

zu 2)
Aus Wikipedia: "Bei der Beschreibung einer Menge geht es ausschließlich um die Frage, welche Elemente in ihr enthalten sind. Es wird nicht danach gefragt, ob ein Element mehrmals enthalten ist, oder ob es eine Reihenfolge unter den Elementen gibt."

und somit macht 1) auch nicht viel Sinn.
Narses
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10183
Erhaltene Danke: 1256

W10ent
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: Mi 16.06.10 18:16 
Moin!

user profile iconmartin300 hat folgendes geschrieben Zum zitierten Posting springen:
und somit macht 1) auch nicht viel Sinn.
Vor allem werden dort Annahmen über das Speicherabbild einer Menge gemacht und das ist für eine abstrakte Betrachtung des Sprachfeatures absolut tödlich! :|

cu
Narses

_________________
There are 10 types of people - those who understand binary and those who don´t.
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19312
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Do 17.06.10 09:44 
Außerdem bin ich mir nicht sicher ob das wirklich so viel schneller als die triviale Version ist:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
type
  TCharSet = set of Char;

function CountSet(const Value: TCharSet): Integer;
var
  i: Char;
begin
  Result := 0;
  for i in Value do
    Inc(Result);
end;
Sinspin
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1335
Erhaltene Danke: 118

Win 10
RIO, CE, Lazarus
BeitragVerfasst: Do 17.06.10 15:03 
Das klappt aber nicht mit Delphi7 oder anderen älteren Versionen.
Dort musst du von der maximalen Menge ausgehen also:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
function CountSet(const Value: TCharSet): integer;
var
  l: integer;

begin
  Result := 0;
  for l := 0 to 255 do
    if Chr(l) in Value then
     Inc(Result);
end;

_________________
Wir zerstören die Natur und Wälder der Erde. Wir töten wilde Tiere für Trophäen. Wir produzieren Lebewesen als Massenware um sie nach wenigen Monaten zu töten. Warum sollte unser aller Mutter, die Natur, nicht die gleichen Rechte haben?