On 1/22/2014 12:12 PM, Lukasz Sokol wrote:
[...]
If you insist on using bits.... define them:

it isn't that i'm insisting on using them... more the way that my linear mind sees them... i'm trying to change this if it affords me better code that is easier to read, understand and modify...

const
   OptionAmmMin = $0001;
   OptionAmmMinMax = $0002;
   OptionAmmMax = $0004; // and so on

this is pretty much already being done by the code using SetBIT and GetBIT

then do

if Options and (OptionAmmMin and ... ) then

this is where the CASE "decision tree" comes in with each CASE having the necessary if/then filtering of the data record at hand...

I would have thought, that having an array of TOption like I wrote, would
ensure the exclusivity.
And having the array dynamic, you can check for its size, then write some 
clever code to use it ;)

it may very well but as i wrote, i cannot visualize it in my mind's eye :(

yes, i've basically been ignoring mmNone because all the bits are off so we 
just skip over it in the ANDing code

If there is a lot of options, but not always consecutive - so there would be a 
lot more of mmNone's
than significant states (IOW the data is sparse) -

yes, with what i have done, there are 1023 valid combination... 1024
if we count all options off (or mmNone)... that's out of 32767
combinations where the majority are invalid... it is no wonder, with
1023 combinations, that i got lost/confused with my first attempt
using if/then/else and while trying to manually implement the bitmap
CASE code...

If you count permutations (so combinations not repeating) you'd have 120 valid 
ones...?
http://easycalculation.com/statistics/permutation-combination.php
do I understand that correctly?

there are 1023 permutations of the 32767 possible... that means that i have to have 1023 (1024 counting no options set) case selectors... each with their specific if/then to check the current data record for a match...

[...]

i think i should be able to use one routine for both input selection
and output filtering... done by pass the bitmap and the routine to be
used... that'll save having to worry about editing in more than one
place when things change... i just gotta figure out how to pass the
routine to use...>
would something like:

   procedure runCase(var bitMap:word; whichProcedure: pointer);

called with

   runCase(SelectBits,@addItem);

   runCase(FilterBits,@writeoutput);

be the way to do this??

sometimes my linear procedural mind really gets in the way :/


Huh, well a lot of micro-management goes on here;

possibly ;)  but i don't know...

What if you did it like:

- define the valid bit masks (permutations?) at the start, dynamically

humm... my tool that generates the CASE statement does something like this... i might be able to adapt it... /BUT/ i still have to match the data records with the current permutation selected when the program is executed... don't i??

eg:
    myprogram --optionA=-1,145 --optionD=30,40

on execution, GetOption('optionA') loads the values from the optionA command line parameter... any value less than zero means to ignore that "slot"... all other numbers are valid...

the above "--optionA=-1,145" results in the optionA_MAX bit being set (00000000 00000010) and storing the value of 145 in optA_MAX...

the above "--optionD=30,40" results in the optionD_MINMAX bit (00000010 00000000), storing the value of 30 in optD_MIN, and storing the value of 40 in optD_MAX...

ANDing the bitmasks together we have 00000010 00000010 which is 514 in decimal... this is the case selector value used later for output filtering (and future input selecting)...

then the program loads all of the data records it finds in all of the default files... currently this is some 30000 records from some 80+ files updated nightly... as the data is loaded, it is merged and updated so there are no duplicates records and all records have the most current, by date and time, information in them...

after all the merging and updating, we start with the first record and run through all of them writing them to the output file... if there are no options specified on the command line, then all the records are written... in this example, only the records matching the values given for the two options will be written to the output file... currently, that's

   514 : begin // 00000010 00000010
           if (Rec^.optA <= optA_MAX) and
              (Rec^.optD >= optD_MIN) and (Rec^.optD <= optD_MAX) then
             writeoutput;
         end;

if you can explain to me how using the arrays would work so that i can visualize it like the above, then i can try to implement it... however, i can't see any way to bypass the huge CASE statement and its IF comparisons of the data in each record... how would using the arrays allow me to do that?

- associate the procedures (their pointers) to jump to with the valid bit masks 
in a new data type
(- do you REALLY have that many procedures ? Or are they somewhat repeating 
themselves ?)

it will be only two procedures IF i can do it like that... it should be easier to use one CASE procedure of the existing ~8000 lines for both (future) input selection of matching data records and for (current) output filtering of matching data records...

so what i was actually asking is if using a pointer is the proper item for passing the procedure to use and is @procA how i would specify that in the call to the procedure...

- then just walk the array of [bit mask, proc pointer] records and jump to 
pointers supplied if matching?

No ifs, no buts, treat the Options as a bitmask if such is its purpose?

Just a thought,

i really am trying to visualize your suggested methods ;)

--
NOTE: No off-list assistance is given without prior approval.
      Please keep mailing list traffic on the list unless
      private contact is specifically requested and granted.
_______________________________________________
fpc-pascal maillist  -  fpc-pascal@lists.freepascal.org
http://lists.freepascal.org/cgi-bin/mailman/listinfo/fpc-pascal

Reply via email to