Re: Help needed for ada package



<strictly_mk@xxxxxxxxxxx> wrote in message
news:1122475184.849564.159870@xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
> With the code kindly posted by Steve and with the advice some of you
> here gave me I have attempted this thing again and this is the code I
> have 'written'/'modified'. I've simplified it somewhat since I am
> supposed to show the concept of the procedures and functions working
> regardless if they fail after a certain amount of time.
>

Now that you're asking for help, and not for someone to do it for you, as
you can see, you get a lot more positive response.

> package body POP is
>
> type Individual is
> record
> Person : ID;
> Danger : Rating;
> Associate : ID;
> Reported : Boolean;
> end record;
>
> type Society is array( 1 .. 1000000 ) of Individual;
>
> type Society_Ptr is access all Society;
>
> Pointer : Society_Ptr;
> Counter : Natrual := 0;
>

If the array is going to be fixed in size, why not just use:

type Society is array( 1 .. 1000000 ) of Individual;

Society_Buffer : Society;

In my original response I used a pointer because I dynamically allocated
an array to store individuals. When the array became full, I dynamically
allocated a new larger array, copied the values from the original array to
the new larger array and then deallocated the original array. It is
certainly simpler to just go with a fixed maximum size.

> procedure Rate (Citizen : in ID; Badness : in Rating) is
> begin
> Counter := Counter + 1;
> Pointer( Counter ).Person := Citizen;
> Pointer( Counter ).Rating := Badness;
> Pointer( Counter ).Associate := null;
> Pointer( Counter ).Reported := false;
> end;
> end Rate;
>

Just a note: One of the features I really like about Ada is the ability to
do record assignments, so this Rate function could be:

Counter := Counter + 1;
Pointer( Counter ) := ( Person => Citizen, Rating => Badness, Associate =>
null, Reported => False );


> procedure Associate (Citizen_1, Citizen_2 : in ID) is
>
> I : Integer
>
> for I in 0..Counter loop
> if Pointer( I ).Citizen = Citizen_1
> then
> Pointer( I ).Associate := Citizen_2;
> end if;
> end Associate;
>
> --query functions
> function Most_Dangerous return ID is
>
> MD_Counter : Integer := 1;
>
> I : Integer
>
> for I in 0..Counter loop
> if Society(I).Danger < Society(MD_Counter).Danger then
> if Society(MD_Counter).Reported = false then
> begin
> Most_Dangerous_Pointer := MD_Counter;
> MD_Counter := MD_Counter + 1;
> end;
> else
> MD_Counter := MD_Counter + 1;
> end if;
> else
> MD_Counter := MD_Counter + 1;
> end if;
> end loop;
>
> begin
> return Pointer(Most_Dangerous_Pointer).Citizen;
> Pointer(Most_Dangerous_Pointer).Reported := true;
> end;
>
> end Most_Dangerous;
>
> I've put all the required information into an array of records. But the
> problem is I realised that if a citizen has more than one associate my
> code won't work. (If the code were to compile) As it stands it would
> logically work if each person only had one associate. I remember an old
> project using code similar to Associate : Associates.Bag within the
> record instances. An I was wondering if anyone knows how this package
> might look like. This way I could put Associate, Next_Member and
> More_In_Group in that package as well. I think this is what the marker
> is looking for as I think I'm supposed to demonstrate my program being
> modular. Any comments?
>

One way to handle the "associates" is to create an association code for each
individual. When two citizens are associated, make the id's of the
associates the same.

You might, for example start out with an association id of 0 indicating no
association. When the Associate procedure is called, find the location of
each of the citizens and handle each of the cases:
If both associates have no association, create a new association id, and
assign it to both.
If just one of the associates has a non-zero association id, assign it to
the other.
If both of the associates have a non-zero association id (ie: A and B),
then change the association ID of all citizens that are currently B to A.

I am assuming that:
if A associated with B and B associated with C it is implied that A
associated with C.

I hope this helps,
Steve
(The Duck)


.



Relevant Pages

  • Re: Array Help
    ... Steve & Piet: ... the Access "INSERT INTO" SQL query is: ... one field is changed for each query, I was thinking that I could loop ... I am not sure how to do a loop through the array or write any code for it ...
    (microsoft.public.access.modulesdaovba)
  • Re: Cleaning Up Array After unset()
    ... Steve wrote in ... The problem I discovered is that unset leaves the ... > $old_order using a for loop, I get errors on the indices that were ... That will reindex the array, ...
    (comp.lang.php)
  • Re: Referring to controls via loops - comments and suggestions
    ... controls and they all need to behave the same way, hence tryin to refer to each one via a loop. ... controls into an array and then referencing them via the array e.g. ... Steve Walker. ...
    (microsoft.public.dotnet.languages.csharp)
  • RE: Error 3021
    ... Create proto-file names using the selected job names and storre to an array ... Save and close the document and repeat the loop ... Dim strJobsAs String, strDocsAs String, varValsAs _ ...
    (microsoft.public.access.modulesdaovba)
  • RE: Error 3021
    ... Kevin Backmann ... Create proto-file names using the selected job names and storre to an array ... Save and close the document and repeat the loop ... Dim strJobsAs String, strDocsAs String, varValsAs _ ...
    (microsoft.public.access.modulesdaovba)