From mboxrd@z Thu Jan 1 00:00:00 1970 X-Spam-Checker-Version: SpamAssassin 3.4.4 (2020-01-24) on polar.synack.me X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00,FREEMAIL_FROM autolearn=ham autolearn_force=no version=3.4.4 X-Google-Thread: 103376,bc4137777a63bff X-Google-Attributes: gid103376,public X-Google-Language: ENGLISH,ASCII-7-bit Path: g2news1.google.com!news3.google.com!news.glorb.com!border1.nntp.dca.giganews.com!nntp.giganews.com!local01.nntp.dca.giganews.com!nntp.comcast.com!news.comcast.com.POSTED!not-for-mail NNTP-Posting-Date: Wed, 27 Jul 2005 21:25:10 -0500 From: "Steve" Newsgroups: comp.lang.ada References: <1122305318.728942.304120@f14g2000cwb.googlegroups.com> <2OudnZo-iL1aN3jfRVn-iQ@comcast.com> <1122475184.849564.159870@g44g2000cwa.googlegroups.com> Subject: Re: Help needed for ada package Date: Wed, 27 Jul 2005 19:27:45 -0700 X-Priority: 3 X-MSMail-Priority: Normal X-Newsreader: Microsoft Outlook Express 6.00.2900.2180 X-RFC2646: Format=Flowed; Original X-MimeOLE: Produced By Microsoft MimeOLE V6.00.2900.2180 Message-ID: NNTP-Posting-Host: 24.22.63.157 X-Trace: sv3-q6xPIPp7Cn3gkrPNqjTdSy5u71UXC/mz0W0gabDjXUhWd2kdWlzeWTn5XhluhpYpY/i7Hse8FoKDSS7!c8JprZJFhnaefdgPKjbUGg0emEXXMq62K4scM4C8pAtgJmCwylRaP5KXJjSHAEO9WpMtWP7cDUI= X-Complaints-To: abuse@comcast.net X-DMCA-Complaints-To: dmca@comcast.net X-Abuse-and-DMCA-Info: Please be sure to forward a copy of ALL headers X-Abuse-and-DMCA-Info: Otherwise we will be unable to process your complaint properly X-Postfilter: 1.3.32 Xref: g2news1.google.com comp.lang.ada:3813 Date: 2005-07-27T19:27:45-07:00 List-Id: wrote in message news:1122475184.849564.159870@g44g2000cwa.googlegroups.com... > 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)