Newsgroup: it.comp.lang.delphi
Titolo: aumentare elementi set

So che il numero degli elementi di un Set (Delphi7) non può superare i 256.
 
Volevo sapere se però con qualche artifizio si poteva aumentare almeno da 
256 a 512 elementi.
 
MioSet=Set of 1..512 ????
 
Grazie per una eventuale risposta
 
 


Temo che non ci sia modo. I set sono gestiti dal compilatore e il limite
di 256 elementi non si puo' cambiare.
 
Devi ricorrere a soluzioni alternative usando liste o altre strutture dati.
 
Se gli elementi del tuo insieme sono i numeri da 0 a N, puoi usare il metodo
usato di solito in C: consiste nell'usare array di Byte e di usare gli operatori sui bit (or e shift) per agire sugli elementi dell'insieme,
qualcosa di questo genere:
 
// non compilato, tanto meno testato!
type
  TMySet = array[0..63] of Byte; // 86 byte = 512 bit
function Contains( const S : TMyset; bit : integer ) : boolean;
begin
  Result := (S[ bit div 8 ] and (1 shr (bit mod 8) )) <> 0;
end;
procedure SetBit( var S : TMyset; bit : integer );
begin
  S[ bit div 8 ] := S[ bit div 8 ] or (1 shr (bit mod 8) );
end;
 
 
 
ciao
Giacomo
 
 
 
 
 
 
 

type
 
TMySet = array[0..63] of Byte; // 86 byte = 512 bit
 
function Contains( const S : TMyset; bit : integer ) : boolean;
 
begin
 
Result := (S[ bit div 8 ] and (1 shr (bit mod 8) )) <> 0;
 
end;
 
procedure SetBit( var S : TMyset; bit : integer );
 
begin
 
S[ bit div 8 ] := S[ bit div 8 ] or (1 shr (bit mod 8) );
 
end;
 
Ti ringrazio per la tua risposta,non ho capito una cosa:
 
la funzione Contains e la procedura SetBit le devo usare insieme oppure
 
o uso una o uso l'altra??
 
Purtroppo non riesco a capacitarmi...sugli array.
 
E poi in ogni caso dovrei adeguare il codice di cui sopra alla funzione qui 
sotto,
 
quando cerco di farlo mi dà errore alla riga sotto indicata
 
?
 
function ContaGiocatori(TheSet: TMySet): ExtPlayerRange;
 
var
 
i: PlayerRange;
 
begin
 
Result := 0;
 
for i := 1 to NGiocatori do
 
if (i in TheSet) then Inc(Result);/// errore credo perchè la clausola IN non 
va
 
per gli array
 
end;
 
Il tutto fa parte di un algoritmo non mio per il calcolo
 
dei turni nei tornei di scacchi(sistema svizzero)che vorrei migliorare.
 
Volevo cercare di risolvere l'adeguamento alla funzione ContaGiocatori,per 
vedere
 
se risolvevo la cosa.
 
In pratica se vi sono fino a 255 giocatori i turni vengono fatti,se ve ne 
sono 300
 
i 45 in più vengo purtroppo giustamente ignorati se uso la dichiarazione SET 
of 1..255
 
Grazie di nuovo per una eventuale risposta che non pretendo risolutiva,ma 
che mi dia
 
qualche ulteriore chiarimento.
 
 

 dichiarazione SET of 1..255
 
puoi usare una stringa del tipo
;1;3;4;10;12;20;ecc.
e poi cercare se giocatore "i" è nell' "insieme"
con un pos(';'+inttostr(i)+';',stringa)<>0
 
-- 
Alessandra
 
Le regole religiose sono come gli elastici. Ogni credente se le
accomoda come meglio gli aggrada -F.Cucurachi

 end;
 
Esatto, IN puo' essere applicato solo ai set. Prova con:
 
if Contains(TheSet, i) then inc(Result);
 
ciao
Giacomo

 migliorare.
 
in php faresti tutto con gli array. I set e gli array del pascal,
invece, non sono mai stati sviluppati, per non rompere con lo standard
(assurdo), e risentono del vecchiume della progettazione originale di
Wirth degli anni '70.
 
-- 
Alessandra
 
Perche' dovrei permettere a quel dio che dovette affogare i suoi figli
di dire a me come crescere I miei figli ? - Robert Green Ingersoll

 in php faresti tutto con gli array.
 
Cioè stai dicendo che in php gli array hanno possono essere trattati 
come insiemi, e di conseguenza applicarne l'unione, l'intersezione, 
l'esclusione, ecc?
 
 
-- 
morde
Android
QT 4.7
Delphi (5,6,7.. expired)
Firebird Database
 

 l'esclusione, ecc?
 
no, ma hanno una flessibilità enormemente superiore agli array del
pascal, e pure dei set (che, come tu ben sai, consentono solo tipi
ordinali.. altra GROSSA limitazione).
Per l'esigenza del nostro amico, credo che gli array del php sarebbero
perfetti.
 
-- 
Alessandra
 
Fede è credere ciò che sai che non è così - Mark Twain

 no,
 
E pure sě, o non ho capito la domanda ;-)
 
array array_diff ( array $array1 , array $array2 [, array $... ] )
Compares array1 against array2 and returns the difference.
 
array array_intersect ( array $array1 , array $array2 [, array $ ... ] )
 
array_intersect() returns an array containing all the values of array1 
that are present in all the arguments. Note that keys are preserved.
 
http://www.php.net/manual/en/ref.array.php
 
 
-- 
Design for the future, because it will be here sooner than you think.
(C) Eric S. Raymond, from "The Art of Unix Programming"

 E pure sě, o non ho capito la domanda ;-)
 
no, sono io che non conoscevo quelle funzioni, mai usate.. ma non c'č
da stupirsene, le funzioni in php sono centinaia.
 
-- 
Alessandra
 
Chi insegna che non la ragione, ma l'amore sentimentale deve governare,
apre la strada a coloro che governano con l'odio - Karl Popper