home *** CD-ROM | disk | FTP | other *** search
/ Amiga Elysian Archive / AmigaElysianArchive.iso / prog / source / cxercise.lha / READ.ME < prev    next >
Text File  |  1987-04-20  |  9KB  |  191 lines

  1. Amiga Tech User's Group                                 C Special Interest Group
  2.  
  3.  
  4. In this directory you'll find 4 executable programs (SimpleWindow1.c, 2.c,
  5. 3.c and my version of the menu program presented in the Jan/Feb issue of
  6. Amiga World) along with their source files.  However the source to 
  7. 'SimpleWindow2' is a hidden file; it's name is made up of non-printable
  8. characters, so it won't be seen in a dir command.  The idea is that if you
  9. are given the source to SimpleWindow 1 & 3, that you write your own program
  10. to duplicate the function of SimpleWindow2.  If you become totally frustrated
  11. by not being able to accomplish the task,  give me a call at (714) 980-1269
  12. and I'll tell you the name of the hidden file, so you can RENAME it to some-
  13. thing usable like "SimpleWindow2.c".
  14.  
  15. First make a backup of this disk (or this directory if you're short on disks)
  16. Then delete the executables from the backup disk (or directory).  Now run the
  17. SimpleWindow1 program from the original disk:
  18.  
  19. 1> cd "to whatever directory SimpleWindow1 is in" <RETURN>
  20. 1> simplewindow1 <RETURN>
  21.  
  22. A window should pop-up on the WorkBench screen, and go away after a few
  23. seconds.
  24.  
  25. 1> simplewindow2 <RETURN>
  26.  
  27. A window with a close box, front/back gadgets and a dragbar will pop-up, and
  28. a short message is displayed in the body of the window.  You will have to
  29. click in the close box to get it to go away.
  30.  
  31. 1> simplewindow3 <RETURN>
  32.  
  33. A new screen will cover the WorkBench screen, a window with all the system
  34. gadgets attached will appear on the new screen and some text will be written
  35. into both the screen and the window.  Again click the close box to quit.
  36.  
  37. Now let's make sure you can get the compiler to compile the first program.
  38. If you have LC 3.1 you will need to setup the compiler environment, which is
  39. best done by modifying your startup-sequence to do this at boot up.  Consult
  40. the installation section of the LC manual (pgs 1-6).  Once this is done, the
  41. command I used to compile all programs here was:
  42.  
  43. 1> lc -L filename <RETURN>
  44.  
  45. The '-L' causes the linker to automatically be invoked when the program suc-
  46. cessfully compiles.  For some reason, the 'L' must be CAPITALIZED, or BLink
  47. won't be executed.
  48.  
  49. If you have LC 3.03 the following commands should work:
  50.  
  51. 1> lc filename <RETURN>
  52. 1> blink from c.o,filename.o to filename library Amiga.lib,lc.lib <RETURN>
  53.  
  54. If you don't have BLink, you can use ALink with the same parameters as Blink.
  55.  
  56.  
  57. Next let's discuss the programs.  Print them out with the following command:
  58.  
  59. 1> type SampleWindow1.c to PRT: opt n
  60.  
  61. Repeat for SampleWindow3.c.
  62.  
  63. This will give you line-numbered listings which I will refer to here.
  64.  
  65. Looking at SimpleWindow1.c (SW1.c from now on), it starts with a short comment.
  66. In C a comment starts with a slash ('/') and an asterisk ('*'), the text of the
  67. comment, followed by an asterisk and a slash.
  68.  
  69. On line 9, '#include <exec/types.h>' causes the file 'types.h' in the sub-
  70. directory 'exec' to be compiled as part of this program.  Line 10 does the same
  71. for 'intuition.h' within the 'intuition' sub-directory.  The '.h' files define
  72. various structures and constants that are common to many Amiga programs and
  73. the Amiga's system software.
  74.  
  75. Line 11 defines 'IntuitionBase' as a pointer to a structure called
  76. 'IntuitionBase'.  All Intuition routines require this item to be defined and
  77. initialized before they can be used.  Your programs will not use this variable
  78. directly, but any Intuition routines linked in from 'Amiga.lib' will use it to
  79. establish the location of the entrypoint to each routine (the routines linked
  80. in from 'Amiga.lib' only provide run-time linkage to the actual library rou-
  81. tines).  
  82.  
  83. Line 30 defines 'SampleWindow' as an instance of a NewWindow structure, and
  84. initializes it.  By changing these values and recompiling, the window will
  85. open with the reflected changes in force.  See the "Intuition Reference
  86. Manual" pages 66-68 for the various settings of 'SampleWindow.Flags', which
  87. enable various gadgets, display modes and refresh modes.  See pages 65-70
  88. for info on the NewWindow structure in general.
  89.  
  90. Line 46 defines the logical entrypoint 'main' and is where your program 
  91. starts running.  The physical entrypoint to a program is the first instruction
  92. in 'c.o' which is linked in front of your program's code and provides various
  93. initialization, it then calls main() and when main() returns executes some
  94. cleanup code and exits.  I have defined main() as a 'void' function which
  95. means main() can't return a value to the Amiga's operating system.
  96.  
  97. Line 50 & 51 define two local variables for main()'s use.
  98.  
  99. Lines 58-60 is an 'if' statement that initializes 'IntuitionBase' with the
  100. returned value of the OpenLibrary() call.  The '(struct IntuitionBase *)'
  101. is a "cast" operation that tells the compiler to convert (if necessary)
  102. the return value from OpenLibrary() to a pointer to an IntuitionBase struct.
  103. The assignment is then compared with 'NULL' which forms the basis of the if
  104. statement's test.  I generally AND (the '&&' logical operator) a bunch of
  105. OpenXX() function calls together in one if statement (see lines 76-79 of
  106. SW3.c), since I don't like calling a function to kill off my program
  107. ('exit()') and I don't like excessive nesting of if statements.  It can be
  108. a nuissance however, to keep all the left and right parentheses properly
  109. paired.  SW1.c has only two OpenXX() function calls so I went ahead and
  110. nested the if statments.
  111.  
  112. Lines 62-64 is the second 'if statement/OpenXX()' call that opens a window,
  113. and checks to see if the window opened.
  114.  
  115. Lines 65-66 is just a time-delay loop (which by the way is very processor
  116. inefficient) that doesn't do anything but count to one million using the
  117. variable 'i'.
  118.  
  119. lines 66 on, close the window and the Intuition library and exit.
  120.  
  121.  
  122. SimpleWindow2's abilities are somewhere between SW1 & SW3.
  123.  
  124.  
  125. SimpleWindow3 shows how to write text into both screens & windows, the
  126. window has all the system gadgets attached and it opens it's own screen
  127. instead of using the workbench screen. 
  128.  
  129. Lines 16-20 shows the definition of the 'IntuiText' structure, which is used
  130. to write text to a 'RastPort'.
  131.  
  132. Lines 22-29 define an instance of a NewScreen structure which I called 'NS'.
  133.  
  134. Line 63 defines 'MyIM' as a place to store a copy of an IntuiMessage.
  135.  
  136. Line 68 defines the screen pointer that will point to our screen.
  137.  
  138. Line 69 defines a pointer to IntuiMessages that we will be receiving.
  139. Well, one message anyway.
  140.  
  141. Line 76-79 again my 'if OpenXX()' logic.
  142.  
  143. Line 82 looks like a string variable assignment, and in most other languages
  144. it would be.  In C however, this statment merely sets IntuiText.IText to
  145. the address of the first byte of the literal.  The literal itself is stored
  146. in an initialized data hunk,  and never moves or gets copied at all!
  147.  
  148. Lines 83 & 84 setup pixel coordinates for the starting location of where the
  149. text will be written.  These coordinates are relative to the rastport where
  150. the text is to be written, if it is a screen's rastport LeftEdge will specify
  151. how far (in pixels) the text will be writtten from the leftedge of the screen.
  152. The TopEdge specifies how far down the text will be written.
  153.  
  154. Line 85 makes the PrintIText() call to display the text.
  155.  
  156. Line 91 sets the screen pointer within our NewWindow structure to point to
  157. our newly opened screen, so that Intuition will put our window on our screen.
  158. This is the only item that couldn't be pre-initialized since we don't know
  159. where our screen's 'Screen' structure will be stored in memory.
  160.  
  161. Line 93 makes sure our window opens before proceeding.
  162.  
  163. Lines 96-100 sets up & prints some text in the newly opened window.
  164. Notice the change of FrontPen to 3 which is orange.
  165.  
  166. Lines 104-120 is the main IntuiMessage processing "loop" of the program.
  167. In this program it will only execute once because the only message we will
  168. ever receive is the CLOSEWINDOW message.  The reason being, that this is
  169. the only type of message that we told Intuition that we wanted to be 
  170. informed of in the IDCMPFlags field of our SampleWindow structure.
  171.  
  172. Line 105 waits until a message arrives at our Window's UserPort. When the
  173. WaitPort() function returns, we then must get the message's address with the
  174. 'IntuiMessage = (struct IntuiMessage *) GetMsg(Window->UserPort);' call on
  175. line 106. Line 107 copies the content of the message to our local data hunk.
  176. Notice the use of the '*' in front of 'IntuiMessage', this causes the data
  177. being pointed to, to be assigned, not the address of the data.
  178.  
  179. Line 108 ReplyMsg() is called to let Intuition know that we've received it's
  180. message, and can now reclaim the memory that the message is stored in.
  181.  
  182. Line 120 tests our copy of the message to see if it is a CLOSEWINDOW message.
  183. In this program it has to be, but in more elaborate programs there might be
  184. menu events, mouse events, keyboard events etc.  Each input event generates
  185. a message of a certain class that has to be checked so it can be properly 
  186. processed.  Other input event classes should be checked for and processed
  187. within the 'do { } while (MyIM.Class != CLOSEWINDOW);' loop.
  188.  
  189. Line 122-127 is the cleanup an exit part of the program.
  190.  
  191.