[Delphi] Ako zistit jednotlive prvky zo set

C++, C#, Visual Basic, Delphi, Perl a ostatní

Moderátor: Moderátoři Živě.cz

Odeslat příspěvekod pexxi 2. 5. 2007 10:04

Mam mnozinu prvkov, napr. set of Char, ktoru predavam funkcii ako parameter, potreboval by som "extrahovat" jednotlive prvky z tejto mnoziny, da sa to nejak urobit v Delphi?

Priklad: procedure VypisSet(S:set of Char)

v pripade, ze zavolam proceduru VypisSet(['x','y','z']), mala by vypisat na obrazovke znaky x, y, z... Na poradi prvkov v mnozine mi nezalezi.

Potrebujem totiz naplnit dynamicke pole znakov udajmi zo set of Char, ale neviem ako na to, zjednodusilo by mi to upravu jednej kniznice, kde sa mi trosku "zmenila filozofia" prace so znakmi.
It's better to be wholly alone, than alone with ass-holes. ;-)
pexxi
Junior

Odeslat příspěvekod Trebus 3. 5. 2007 07:42

Kód: Vybrat vše
for i := 65 to 90 do
   if Chr(i) in S then
      write(Chr(i));
Trebus
Junior

Odeslat příspěvekod Nargon 3. 5. 2007 07:58

V jinem jazyku bych to resil pomoci funkce FOREACH, ale nevim jestli ji delphi ma, ale tak nejak to zkusim, snad to moc nezmrvim
Kód: Vybrat vše
c: Char;
foreach(c in S) write(c);
Desktop: Ryzen 7 1800X (3.95GHz, 1.35V), Asus Crosshair VI Hero, 16GB DDR4 Ram (3200MHz), 128GB SSD + 3TB HDD, Nvidia GTX 1080
Notebook: Asus UL50VT 15.6" (SU7300@1.7GHz, 4GB ram, 500GB HDD, Intel GMA 4500MHD + nVidia G210M, dlouha vydrz cca 7+ hod)
Nargon
Moderátor

Odeslat příspěvekod Povik 3. 5. 2007 08:55

Kód: Vybrat vše
program Project2;
{$APPTYPE CONSOLE}

uses SysUtils;

type  SetOfChar = set of char;
      ArrayOfSetOfChar = array of SetOfChar;

var AnArray : ArrayOfSetOfChar;
    i : integer;

procedure VypisSet(var kde:ArrayOfSetOfChar);
begin
   for i:= 0 to 255 do
     if chr(i) in kde[0] then writeln(chr(i));
end;

begin
SetLength(AnArray, 1);
AnArray[0] := ['A', 'B', 'C','k','t','#'];

VypisSet(AnArray);
readln;


end.


Toto mi funguje...vyzkoušej
"Představte si nekonečně dimenzionální vektorový prostor..." (Žemlička Jan - Algebra, MFF UK)
Povik
Junior
Uživatelský avatar

Odeslat příspěvekod pexxi 3. 5. 2007 09:21

Diky vsetkym za odpovede, ale nakoniec som zistil, ze sa to neda...

Nepotreboval som vypisat pole znakov (to uz ovladam od 12-rokov ;-), ale mnozinu znakov, set of Char (asi som sa zle vyjadril), teda nieco ako:

const MojaSet:set of Char=['A','B','C'];

Lenze interne je kazda set v Delphi reprezentovana 256 bitmi, t.j. 32 bytov, samotny obsah set sa nikde neuklada, t.j. je jedno, ci mam

const MojaSet:set of Byte=[1,2,3];
const MojaSet: set of Char=['A','B',C'];

Kazda z nich bude v pameti reprezentovana rovnako, iba bitovym indikatorom, ci je dany prvok v mnozine obsiahnuty alebo nie... O ostatne sa uz postara kompilator pocas kompilacie, t.j. napriklad sekvenciu:

MojaSet:=MojaSet+['A']; nahradi prislusnym nastavenim bitu
MojaSet:=MojaSet-['A']; nahradi prislusnym vynulovanim bitu

Mozno by sa to dalo riesit nejakym makrom preprocesora, ale v Delphi s tym nemam skusenosti.

Nakoniec som teda prislusne aj upravil kniznicu tak, ze sa tam nikde nevyuzivaju mnoziny set of Char.
It's better to be wholly alone, than alone with ass-holes. ;-)
pexxi
Junior


Kdo je online

Uživatelé procházející toto fórum: Žádní registrovaní uživatelé a 0 návštevníků