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,XPRIO autolearn=ham autolearn_force=no version=3.4.4 X-Google-Language: ENGLISH,ASCII-7-bit X-Google-Thread: 103376,88b13dd2d29fb385,start X-Google-Attributes: gid103376,public From: Jon Elbery Subject: Help with ADT Stack Date: 1997/05/29 Message-ID: <338CEEA4.93867B6D@iinet.net.au> X-Deja-AN: 244634666 X-Priority: 3 (Normal) Organization: iiNet Technologies Newsgroups: comp.lang.ada Date: 1997-05-29T00:00:00+00:00 List-Id: I have a problem with an assignment I am writing for university. You are my last resort!!! The program below works until I call line 259 ..I get a stack empty exception. Don't take any notice of the calls with cat, elephant etc..they will be removed in the final version!!!! I have tried everything I know (but am relatively new to Ada). Can someone please point me in the right direction?? Any help appreciated. I am using Gnat307 running in Dos. Penny GNAT 3.07 (961023) Copyright 1991-1996 Free Software Foundation, Inc. 1. 2. 3. 4. --File Statlib.ADB 5. 6. with Ada.Text_IO, ADTBStk; 7. use Ada.Text_IO; 8. With Ada.Integer_Text_IO; 9. use Ada.Integer_Text_IO; 10. with GetInt; 11. 12. 13. procedure Statlib is 14. 15. 16. --Sub Types 17. subtype NumTitlesType is Positive; 18. subtype NumCopiesType is Positive; 19. subtype SimTimeType is Natural; 20. subtype IDCodeType is String (1..3); 21. subtype LoanTimeType is Natural; 22. subtype UsageTimeType is Natural; 23. subtype CopyType is String (1..2); 24. subtype TitleType is Character; 25. 26. subtype CopyRange is Integer range 1..5; 27. 28. 29. type ItemType is 30. record 31. IDCode : IDCodeType; 32. UsageTime : UsageTimeType := 0; 33. LoanOutTime : LoanTimeType := 0; 34. end record; 35. 36. package LibType is new ADTBSTK (ItemType); 37. use LibType; 38. 39. --Types 40. type MainChoiceType is (C, Q); 41. type SimChoiceType is (L, R, A, T, M); 42. type DispenserType is array (TitleType range <> ) of LibType.Stack(5); 43. type OnLoanType is array (TitleType, CopyRange) of ItemType; 44. 45. 46. --Instantiations 47. 48. package MainChoice_IO is new Ada.Text_IO.Enumeration_IO (MainChoiceType); 49. use MainChoice_IO; 50. package SimChoice_IO is new Ada.Text_IO.Enumeration_IO (SimChoiceType); 51. use SimChoice_IO; 52. 53. 54. --Variables 55. Choice : MainChoiceType; 56. ------------------------------------------------------------------------------ 57. 58. procedure ProgramIntro is 59. 60. -- introduces the program 61. 62. begin 63. Set_Col (30); 64. Put_Line ("*** Library Simulation ***"); 65. New_Line (2); 66. Put_Line ("This program simulates the operation of a " 67. & "library reserve system."); 68. New_Line (2); 69. Put_Line ("Please choose an option from the menu."); 70. 71. end ProgramIntro; 72. ------------------------------------------------------------------------------ 73. 74. procedure GetMainChoice (Choice : out MainChoiceType) is 75. 76. -- displays the menu and gets the user's choice of 77. -- commencing a simulation or quitting 78. 79. begin 80. New_Line(2); 81. Set_Col (25); 82. Put ("**Main Menu**"); 83. New_Line(2); 84. Set_Col (20); 85. Put ("C Commence a simulation"); 86. New_Line; 87. Set_Col (20); 88. Put ("Q Quit the program"); 89. New_Line; 90. 91. InputLoop: 92. loop 93. declare 94. begin 95. New_Line; 96. Set_Col (20); 97. Put ("Your Choice: "); 98. Get (Choice); 99. Skip_Line; 100. exit; 101. 102. exception 103. when Data_Error => 104. Skip_Line; 105. Set_Col (20); 106. Put_Line ("Invalid Choice, please try again."); 107. end; 108. end loop InputLoop; 109. 110. end GetMainChoice; 111. ------------------------------------------------------------------------------ 112. 113. procedure GetNumTitles (NumTitles : out NumTitlesType) is 114. 115. -- prompts user for the number of titles 116. 117. begin 118. GetInt(NumTitles, 1,3, " the number of titles"); 119. end GetNumTitles; 120. ------------------------------------------------------------------------------ 121. 122. procedure CreateLoanOutArray (OnLoan : out OnLoanType) is 123. 124. -- creates the array for copies on loan 125. 126. -- CopyNo : CopyRange; 127. 128. begin 129. 130. for Title in TitleRange'Range loop 131. for CopyNo in CopyRange'Range loop 132. OnLoan(Title,CopyNo) :=("zzz", 0, 0); 133. end loop; 134. end loop; 135. end CreateLoanOutArray; 136. ------------------------------------------------------------------------------ 137. procedure DoSimChoice (SimChoice : SimChoiceType); 138. 139. procedure Initialise (Dispenser : in out DispenserType; 140. OnLoan : out OnLoanType; 141. SimTime : out SimTimeType) is 142. 143. -- Initialises all values for the simulation 144. 145. NumTitles : NumTitlesType; 146. NumCopies : NumCopiesType; 147. Title : TitleType; 148. Copy : CopyType; 149. Item : ItemType; 150. Cat,Elephant,Dog : ItemType; 151. SimChoice : SimChoiceTYpe; | >>> warning: "SimChoice" is never assigned a value 152. 153. begin 154. GetNumTitles (NumTitles); 155. 156. for Count in 1..NumTitles loop 157. Title := Character'Val (Count + 64); 158. GetInt(NumCopies, 1, 5, "the number of copies for Title " & 159. Title); 160. 161. declare 162. Dispenser : DispenserType('A'..'C'); 163. begin 164. for Count in reverse 1..NumCopies loop 165. Copy :="0" & Character'Val(Count + 48); 166. Item.IDCode := Title & Copy; 167. Skip_Line; 168. Put(Item.IDCode); 169. Put ("Hell"); 170. Skip_Line; 171. Item := ItemType(Item); 172. Push (Dispenser(Title),Item); 173. Cat := (Top(Dispenser(Title))); 174. New_Line; 175. Put(Cat.IDCode); 176. New_Line; 177. Put("Damn"); 178. New_Line; 179. Put(Cat.UsageTime); 180. 181. end loop; 182. Put (NumberofObjects(Dispenser(Title))); 183. Put ("lucy"); 184. Skip_Line; 185. DoSimChoice (SimChoice); 186. end; 187. end loop; 188. Dog := (Top(Dispenser('A'))); 189. Put (Dog.IDCode); 190. Put("Penny"); 191. SimTime := 0; 192. Put (SimTime); 193. CreateLoanOutArray (OnLoan); 194. Elephant := OnLoan('B',2); 195. Skip_Line; 196. Put(Elephant.IDCode); 197. 198. end Initialise; 199. ------------------------------------------------------------------------------ 200. 201. procedure GetSimChoice (SimChoice : out SimChoiceType) is 202. 203. -- displays the options for a simulation and get's the user's choice 204. 205. begin 206. New_Line(2); 207. Set_Col (25); 208. Put ("*** Options ***"); 209. New_Line(2); 210. Set_Col(20); 211. Put ("L Loan request"); 212. New_Line; 213. Set_Col(20); 214. Put ("R Return an item"); 215. New_Line; 216. Set_Col(20); 217. Put ("A Advance simulation time"); 218. New_Line; 219. Set_Col(20); 220. Put ("T Terminate the simulation"); 221. New_Line; 222. Set_Col(20); 223. Put ("M Monitor the simulation"); 224. New_Line; 225. 226. InputLoop: 227. loop 228. declare 229. begin 230. New_Line; 231. Set_Col (20); 232. Put ("Your Choice: "); 233. Get (SimChoice); 234. Skip_Line; 235. exit; 236. 237. exception 238. when Data_Error => 239. 240. Skip_Line; 241. Set_Col (20); 242. Put_Line ("Invalid Choice, please try again."); 243. end; 244. end loop InputLoop; 245. 246. end GetSimChoice; 247. ------------------------------------------------------------------------------ 248. 249. procedure GetLoanRequest (Title :out TitleType) is 250. 251. -- gets the user's choice of Title to borrow 252. Cat : ItemType; 253. Dispenser :DispenserType ('A'..'C'); 254. 255. begin 256. New_Line(2); 257. Put ("Which Title would you like to borrow? : "); 258. Get (Title); 259. Cat := (Top(Dispenser(Title))); 260. Put (Cat.IDCode); 261. Put("Tim"); 262. end GetLoanRequest; 263. ------------------------------------------------------------------------------ 264. 265. procedure AdvanceSimTime (SimTime : in out SimTimeType) is 266. 267. -- advances simulation time by one unit 268. 269. begin 270. SimTime := SimTime + 1; 271. end AdvanceSimTime; 272. ------------------------------------------------------------------------------ 273. 274. procedure DoLoan (SimTime : in out SimTimeType; 275. Title : out TitleType; 276. Dispenser : in out DispenserType; 277. OnLoan : in out OnLoanType) is 278. 279. -- takes the action to process a loan 280. 281. Item, Cat : ItemType; 282. CopyNo : CopyRange; | >>> warning: "CopyNo" is never assigned a value 283. 284. begin 285. -- GetLoanRequest (Title); 286. -- ProcessItem (Item, SimTime); 287. New_Line(2); 288. Put ("Which Title would you like to borrow? : "); 289. Get (Title); 290. Cat := (Top(Dispenser(Title))); 291. Put (Cat.IDCode); 292. Put("Tim"); 293. AdvanceSimTime (SimTime); 294. end DoLoan; 295. ------------------------------------------------------------------------------ 296. 297. procedure DoSimChoice (SimChoice : SimChoiceType) is 298. 299. -- takes the necessary action on user's choice of menu item 300. 301. Dispenser : DispenserType;--('A'..'C'); 302. OnLoan : OnLoanType; 303. SimTime : SimTimeType; 304. Title : TitleType; 305. 306. begin 307. case SimChoice is 308. when L => 309. Put ("Do Loan"); 310. DoLoan (SimTime, Title, Dispenser, OnLoan); 311. when R => 312. Put ("Return"); 313. when A => 314. Put ("Advance"); 315. when T => 316. Put ("Stop"); 317. when M => 318. Put ("In your Dreams!"); 319. end case; 320. end DoSimChoice; 321. ------------------------------------------------------------------------------ 322. 323. procedure DoSimulation is 324. 325. -- commences the simulation 326. 327. Dispenser : DispenserType ('A'..'C'); 328. OnLoan : OnLoanType; 329. SimTime : SimTimeType; 330. SimChoice : SimChoiceType; 331. Cat : ItemType; 332. 333. begin 334. Put ("Sim"); 335. Initialise(Dispenser, OnLoan, SimTime); 336. Cat := Top(Dispenser('A')); 337. Put (Cat.IDCode); 338. GetSimChoice (SimChoice); 339. Put (Cat.IdCode); 340. -- DoSimChoice (SimChoice); 341. end DoSimulation; 342. ------------------------------------------------------------------------------ 343. 344. procedure Farewell is 345. 346. -- leaves the program 347. 348. begin 349. Put ("Thank you for using this program"); 350. end Farewell; 351. ------------------------------------------------------------------------------ 352. 353. begin -- Statlib 354. ProgramIntro; 355. loop 356. 357. GetMainChoice (Choice); 358. exit when Choice = Q; 359. DoSimulation; 360. end loop; 361. Farewell; 362. end Statlib; 362 lines: