AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

Aufzählungstyp-Variablen vergleichen

Ein Thema von Codehunter · begonnen am 10. Jul 2018 · letzter Beitrag vom 10. Jul 2018
Antwort Antwort
Benutzerbild von Codehunter
Codehunter

Registriert seit: 3. Jun 2003
Ort: Thüringen
2.272 Beiträge
 
Delphi 10.4 Sydney
 
#1

Aufzählungstyp-Variablen vergleichen

  Alt 10. Jul 2018, 08:59
Delphi-Version: 10.2 Tokyo
Moin!

Ich steh mal wieder auf dem Schlauch. Wenn ich zwei Aufzählungstyp-Variablen habe und mit möglichst wenig Codegeschwurbel feststellen will, ob alle Elemente aus Variable A in Variable B enthalten sind, wie stelle ich das an?
Delphi-Quellcode:
type
  TFeld = (A, B, C, D, E, F, G, H, I, J, K);
  TFelder = set of TFeld;

var
  FPflichtfelder: TFelder = [A, B, C, D];
  FVar1: TFelder = [A, C, E];
  FVar2: TFelder = [A, B, C, D, E];

  function Pruefe(Var1, Var2: TFelder): Boolean;
  begin
    // Hier mit einem Einzeiler machbar ?
  end;

begin
  if Pruefe(FVar1, FPflichtfelder) then {...} // -> FALSE
  if Pruefe(FVar2, FPflichtfelder) then {...} // -> TRUE
end;
Ich mache grundsätzlich keine Screenshots. Schießen auf Bildschirme gibt nämlich hässliche Pixelfehler und schadet der Gesundheit vom Kollegen gegenüber. I und E zu vertauschen hätte den selben negativen Effekt, würde aber eher dem Betriebsklima schaden
  Mit Zitat antworten Zitat
Bbommel

Registriert seit: 27. Jun 2007
Ort: Köln
648 Beiträge
 
Delphi 12 Athens
 
#2

AW: Aufzählungstyp-Variablen vergleichen

  Alt 10. Jul 2018, 09:16
Etwa so?
Mit der entscheidenden einen Zeile.

Delphi-Quellcode:
program Project1;

{$APPTYPE CONSOLE}

{$R *.res}

uses
  System.SysUtils;

type
  TFeld = (A, B, C, D, E, F, G, H, I, J, K);
  TFelder = set of TFeld;

var
  FPflichtfelder: TFelder = [A, B, C, D];
  FVar1: TFelder = [A, C, E];
  FVar2: TFelder = [A, B, C, D, E];

function Pruefe(Var1, Var2: TFelder): Boolean;
begin
  Result:=(Var1*Var2)=Var1;
end;

begin
  try
    if Pruefe(FPflichtfelder,FVar1) then
      writeln('alles drin')
    else
      writeln('da fehlt was');
    if Pruefe(FPflichtfelder,FVar2) then
      writeln('alles drin')
    else
      writeln('da fehlt was');
    readln;
  except
    on E: Exception do
      Writeln(E.ClassName, ': ', E.Message);
  end;
end.
Jetzt so implementiert, wie du es beschrieben hast in deinem Text (also var1 muss komplett in var2 enthalten sein), das heißt, die Pflichtfelder müssten dann der erste Parameter sein - genau anders herum als in deinem Codebeispiel.

Oder habe ich jetzt zu einfach gedacht?
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.537 Beiträge
 
Delphi 11 Alexandria
 
#3

AW: Aufzählungstyp-Variablen vergleichen

  Alt 10. Jul 2018, 09:18
Wenn ich mich nicht irre: if VarA * VarB = VarA then ...
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Der schöne Günther

Registriert seit: 6. Mär 2013
6.110 Beiträge
 
Delphi 10 Seattle Enterprise
 
#4

AW: Aufzählungstyp-Variablen vergleichen

  Alt 10. Jul 2018, 09:24
Delphi-Quellcode:
procedure p();
type
   TItem = (a, b, c);
   TSet = set of TItem;
var
   setA, setB, setC: TSet;
begin
   setA := [a, b];
   setB := [a, b, c];

   if (setA <= setB) then
      ShowMessage('A ist Teilmenge von B')
   else
      ShowMessage('A ist KEINE Teilmenge von B')

end;
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.114 Beiträge
 
Delphi 12 Athens
 
#5

AW: Aufzählungstyp-Variablen vergleichen

  Alt 10. Jul 2018, 10:00
Mathematik:
Delphi-Quellcode:
x in A // EIN Wert ist in A drin
A * [x] <> [] // EIN Wert ist in A drin
A * [x] = [x] // NUR dieser Wert ist in A drin (wie IN)

A = B // beides sind gleich
A * B = B // alles von B ist in A drin
A * B = [] // nichts von B ist in A drin
A * B <> [] // irgendwas von B ist in A drin
A - B <> [] // nichts außer etwas von B in A drin

Die Vergleichsoperatoren sind etwas gewöhnungsbedürftig, aber zumindestens funktionieren sie richtig, wenn sie funktionieren.
Delphi-Quellcode:
setA := [a, b, c];
setB := [d];
if setA <= setB then
setB ist ordinal und binär größer, aber der Vergleich stimmt, also es ist False.


if setA <= setB then entspricht if not (setA > setB) then , aber < und > gibt es nicht. ([DCC Fehler] E2008 Inkompatible Typen - im XE)
Nur warum < und > nicht gehen, erschließt sich mir nicht, denn "ist Teilmenge und/aber nicht gleich" gibt es doch wohl.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests

Geändert von himitsu (10. Jul 2018 um 10:12 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Codehunter
Codehunter

Registriert seit: 3. Jun 2003
Ort: Thüringen
2.272 Beiträge
 
Delphi 10.4 Sydney
 
#6

AW: Aufzählungstyp-Variablen vergleichen

  Alt 10. Jul 2018, 11:53
Ich danke euch allen! Besonders Himitsu für die Erläuterungen zu den Grundlagen.

Ich denke ich habe gedanklich den Fehler gemacht, die Sets wie eine Variable vom Typ Byte zu behandeln. Speichertechnisch ist es wohl so, das Handling dagegen unterscheidet sich grundlegend.
Ich mache grundsätzlich keine Screenshots. Schießen auf Bildschirme gibt nämlich hässliche Pixelfehler und schadet der Gesundheit vom Kollegen gegenüber. I und E zu vertauschen hätte den selben negativen Effekt, würde aber eher dem Betriebsklima schaden
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.114 Beiträge
 
Delphi 12 Athens
 
#7

AW: Aufzählungstyp-Variablen vergleichen

  Alt 10. Jul 2018, 12:40
Mathematisch und nur mit = <> * + und - kann man problemlos sich alles binär und bitweise betrachten. (mehrere boolsche Operationen)

(x in A) and (y in A) and (z in A) = A * [x..z] = [x..z]

(x in A) or (y in A) or (z in A) = A * [x..z] <> []

Bei <> die Ergebnisse der einzelnen Bits/Werte mit ODER und bei = mit UND verbinden.



Nur die <= und => muß man hierbei "logisch" betrachten, oder man muß sie sich anders vorstellen

A <= B = A - B = []
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:58 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz