Re: Help needed for ada package
- From: "Steve" <nospam_steved94@xxxxxxxxxxx>
- Date: Wed, 27 Jul 2005 19:27:45 -0700
<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)
.
- Follow-Ups:
- Re: Help needed for ada package
- From: strictly_mk@xxxxxxxxxxx
- Re: Help needed for ada package
- References:
- Help needed for ada package
- From: strictly_mk
- Re: Help needed for ada package
- From: Steve
- Re: Help needed for ada package
- From: strictly_mk@xxxxxxxxxxx
- Help needed for ada package
- Prev by Date: Re: Help needed for ada package
- Next by Date: Re: Private primitive operations available to entire package hierarchy. Can it be done?
- Previous by thread: Re: Help needed for ada package
- Next by thread: Re: Help needed for ada package
- Index(es):
Relevant Pages
|