home *** CD-ROM | disk | FTP | other *** search
/ Game Fest 1993 / gamefest1993stgcomputerslimited1993.iso / soft / ed / pro2 / chap11.txt < prev    next >
Text File  |  1989-11-10  |  27KB  |  590 lines

  1.  
  2.  
  3.  
  4.  
  5.                                                    Chapter 11
  6.                                         STRUCTURES AND UNIONS
  7.  
  8.  
  9. WHAT IS A STRUCTURE?
  10. ____________________________________________________________
  11.  
  12. A structure is a user defined data type.      ===============
  13. Using a structure you have the ability to        STRUCT1.C
  14. define a new type of data considerably more   ===============
  15. complex than the types we have been using. 
  16. A structure is a combination of several
  17. different previously defined data types, including other
  18. structures we have defined.  A simple definition is, "a
  19. structure is a grouping of related data in a way convenient
  20. to the programmer or user of the program."  The best way to
  21. understand a structure is to look at an example, so if you
  22. will load and display STRUCT1.C, we will do just that.
  23.  
  24. The program begins with a structure definition.  The keyword
  25. struct is followed by some simple variables between the
  26. braces, which are the components of the structure.  After the
  27. closing brace, you will find two variable names listed, boy,
  28. and girl.  According to the definition of a structure, boy is
  29. now a variable composed of three elements, initial, age, and
  30. grade.  Each of the three fields are associated with boy, and
  31. each can store a variable of its respective type.  The
  32. variable named girl is also a variable containing three fields
  33. with the same names as those of boy but are actually different
  34. variables.  We have therefore defined 6 simple variables. 
  35.  
  36.  
  37. A SINGLE COMPOUND VARIABLE
  38. ____________________________________________________________
  39.  
  40. Lets examine the variable named boy more closely.  As stated
  41. above, each of the three elements of boy are simple variables
  42. and can be used anywhere in a C program where a variable of
  43. their type can be used.  For example, the age element is an
  44. integer variable and can therefore be used anywhere in a C
  45. program where it is legal to use an integer variable, in
  46. calculations, as a counter, in I/O operations, etc.  We now
  47. have the problem of defining how to use the simple variable
  48. named age which is a part of the compound variable named boy. 
  49. To do so we use both names with a decimal point between them
  50. with the major name first.  Thus boy.age is the complete
  51. variable name for the age field of boy.  This construct can
  52. be used anywhere in a C program that it is desired to refer
  53. to this field.  In fact, it is illegal to use the name boy or
  54. age alone because they are only partial definitions of the
  55. complete field.  Alone, the names refer to nothing.  (Actually
  56. the name boy alone does have meaning when used with some of
  57. the newest C compilers.  We will discuss this later.)
  58.  
  59.                                                     Page 11-1
  60.  
  61.                            Chapter 11 - Structures and Unions
  62.  
  63. ASSIGNING VALUES TO THE VARIABLES
  64. ____________________________________________________________
  65.  
  66. Using the above definition, we can assign a value to each of
  67. the three fields of boy and each of the three fields of girl. 
  68. Note carefully that boy.initial is actually a char type
  69. variable, because it was assigned that in the structure, so
  70. it must be assigned a character of data.  In line 13,
  71. boy.initial is assigned the character R in agreement with the
  72. above rules.  The remaining two fields of boy are assigned
  73. values in accordance with their respective types.  Finally the
  74. three fields of girl are assigned values but in a different
  75. order to illustrate that the order of assignment is not
  76. critical.
  77.  
  78.  
  79. HOW DO WE USE THE RESULTING DATA?
  80. ____________________________________________________________
  81.  
  82. Now that we have assigned values to the six simple variables,
  83. we can do anything we desire with them.  In order to keep this
  84. first example simple, we will simply print out the values to
  85. see if they really do exist as assigned.  If you carefully
  86. inspect the printf() statements, you will see that there is
  87. nothing special about them.  The compound name of each
  88. variable is specified because that is the only valid name by
  89. which we can refer to these variables.
  90.  
  91. Structures are a very useful method of grouping data together
  92. in order to make a program easier to write and understand. 
  93. This first example is too simple to give you even a hint of
  94. the value of using structures, but continue on through these
  95. lessons and eventually you will see the value of using
  96. structures.  Compile and run STRUCT1.C and observe the output.
  97.  
  98.  
  99. AN ARRAY OF STRUCTURES
  100. ____________________________________________________________
  101.  
  102. Load and display the next program named       ===============
  103. STRUCT2.C.  This program contains the same       STRUCT2.C
  104. structure definition as before but this time  ===============
  105. we define an array of 12 variables named
  106. kids.  It should be clear that this program
  107. contains 12 times 3 = 36 simple variables, each of which can
  108. store one item of data provided that it is of the correct
  109. type.  We also define a simple variable named index for use
  110. in the for loops.
  111.  
  112. In order to assign each of the fields a value, we use a for
  113. loop and each pass through the loop results in assigning a
  114. value to three of the fields.  One pass through the loop
  115. assigns all of the values for one of the kids.  This would not
  116.  
  117.                                                     Page 11-2
  118.  
  119.                            Chapter 11 - Structures and Unions
  120.  
  121. be a very useful way to assign data in a real situation, but
  122. a loop could read the data in from a file and store it in the
  123. correct fields.  You might consider this the crude beginning
  124. of a data base, which it is.
  125.  
  126. In the next few instructions of the program we assign new
  127. values to some of the fields to illustrate the method used to
  128. accomplish this.  It should be self explanatory, so no
  129. additional comments will be given.
  130.  
  131.  
  132. A RECENT UPGRADE TO THE C LANGUAGE
  133. ____________________________________________________________
  134.  
  135. Most modern C compilers will allow you to copy an entire
  136. structure with one statement.  This is a fairly recent
  137. addition to the C language and is a part of the ANSI standard,
  138. so you should feel free to use it with your C compiler if it
  139. is available.  Line 24 is an example of using a structure
  140. assignment.  In this statement, all 3 fields of kids[4] are
  141. copied into their respective fields of kids[10].
  142.  
  143.  
  144. WE FINALLY DISPLAY ALL OF THE RESULTS
  145. ____________________________________________________________
  146.  
  147. The last few statements contain a for loop in which all of the
  148. generated values are displayed in a formatted list.  Compile
  149. and run the program to see if it does what you expect it to
  150. do.  You will need to remove line 24 if your compiler does not
  151. support structure assignments.
  152.  
  153.  
  154. USING POINTERS AND STRUCTURES TOGETHER
  155. ____________________________________________________________
  156.  
  157. Examine the file named STRUCT3.C for an         =============
  158. example of using pointers with structures.        STRUCT3.C
  159. This program is identical to the last program   =============
  160. except that it uses pointers for some of the
  161. operations.
  162.  
  163. The first difference shows up in the definition of variables
  164. following the structure definition.  In this program we define
  165. a pointer named point which is defined as a pointer that
  166. points to the structure.  It would be illegal to try to use
  167. this pointer to point to any other variable type.  There is
  168. a very definite reason for this restriction in C as we have
  169. alluded to earlier and will review in the next few paragraphs.
  170.  
  171. The next difference is in the for loop where we use the
  172. pointer for accessing the data fields.  Recall from chapter
  173. 8 of this tutorial that we said that the name of an array is
  174. actually a pointer to the first element of the array.  Since
  175.  
  176.                                                     Page 11-3
  177.  
  178.                            Chapter 11 - Structures and Unions
  179.  
  180. kids is a pointer variable that points to the first element
  181. of the array which is a structure, we can define point in
  182. terms of kids.  The variable kids is a constant so it cannot
  183. be changed in value, but point is a pointer variable and can
  184. be assigned any value consistent with its being required to
  185. point to the structure.  If we assign the value of kids to
  186. point then it should be clear that it will point to the first
  187. element of the array, a structure containing three fields.
  188.  
  189.  
  190. POINTER ARITHMETIC
  191. ____________________________________________________________
  192.  
  193. Adding 1 to point will now cause it to point to the second
  194. field of the array because of the way pointers are handled in
  195. C.  The system knows that the structure contains three
  196. variables and it knows how many memory elements are required
  197. to store the complete structure.  Therefore if we tell it to
  198. add one to the pointer, it will actually add the number of
  199. memory elements required to get to the next element of the
  200. array.  If, for example, we were to add 4 to the pointer, it
  201. would advance the value of the pointer 4 times the size of the
  202. structure, resulting in it pointing 4 elements farther along
  203. the array.  This is the reason a pointer cannot be used to
  204. point to any data type other than the one for which it was
  205. defined.
  206.  
  207. Now to return to the program displayed on your monitor.  It
  208. should be clear from the previous discussion that as we go
  209. through the loop, the pointer will point to the beginning of
  210. one of the array elements each time.  We can therefore use the
  211. pointer to reference the various elements of the structure. 
  212. Referring to the elements of a structure with a pointer occurs
  213. so often in C that a special method of doing that was devised. 
  214. Using point->initial is the same as using (*point).initial
  215. which is really the way we did it in the last two programs. 
  216. Remember that *point is the stored data to which the pointer
  217. points and the construct should be clear.  The "->" is made
  218. up of the minus sign and the greater than sign. 
  219.  
  220. Since the pointer points to the structure, we must once again
  221. define which of the elements we wish to refer to each time we
  222. use one of the elements of the structure.  There are, as we
  223. have seen, several different methods of referring to the
  224. members of the structure, and in the for loop used for output
  225. at the end of the program, we use three different methods. 
  226. This would be considered very poor programming practice, but
  227. is done this way here to illustrate to you that they all lead
  228. to the same result.  This program will probably require some
  229. study on your part to fully understand, but it will be worth
  230. your time and effort to grasp these principles.
  231.  
  232. Lines 31 and 32 are two additional examples of structure
  233. assignment for your benefit.  Compile and run this program,
  234.  
  235.                                                     Page 11-4
  236.  
  237.                            Chapter 11 - Structures and Unions
  238.  
  239. and once again, if your compiler does not support structure
  240. assignment, you will need to remove lines 31 and 32.
  241.  
  242.  
  243. NESTED AND NAMED STRUCTURES
  244. ____________________________________________________________
  245.  
  246. Examine the file named NESTED.C for an         ==============
  247. example of a nested structure.  The               NESTED.C
  248. structures we have seen so far have been very  ==============
  249. simple, although useful.  It is possible to
  250. define structures containing dozens and even
  251. hundreds or thousands of elements but it would be to the
  252. programmers advantage not to define all of the elements at one
  253. pass but rather to use a hierarchical structure definition. 
  254. This will be illustrated with the program on your monitor.
  255.  
  256. The first structure contains three elements but is followed
  257. by no variable name.  We therefore have not defined any
  258. variables, only a structure, but since we have included a name
  259. at the beginning of the structure, the structure is named
  260. person.  The name person can be used to refer to the structure
  261. but not to any variable of this structure type.  It is
  262. therefore a new type that we have defined, and we can use the
  263. new type in nearly the same way we use int, char, or any other
  264. types that exist in C.  The only restriction is that this new
  265. name must always be associated with the keyword struct.
  266.  
  267. The next structure definition contains three fields with the
  268. middle field being the previously defined structure which we
  269. named person.  The variable which has the type of person is
  270. named descrip.  So the new structure contains two simple
  271. variables, grade and a string named lunch, and the structure
  272. named descrip.  Since descrip contains three variables, the
  273. new structure actually contains 5 variables.  This structure
  274. is also given a name alldat, which is another type definition. 
  275. Finally we define an array of 53 variables each with the
  276. structure defined by the type alldat, and each with the name
  277. student.  If that is clear, you will see that we have defined
  278. a total of 53 times 5 variables, each of which is capable of
  279. storing a value.
  280.  
  281.  
  282. TWO MORE VARIABLES
  283. ____________________________________________________________
  284.  
  285. Since we have a new type definition we can use it to define
  286. two more variables.  The variables teacher and sub are defined
  287. in line 19 to be variables of the type alldat, so that each
  288. of these two variables contain 5 fields in which we can store
  289. data.
  290.  
  291.  
  292.  
  293.  
  294.                                                     Page 11-5
  295.  
  296.                            Chapter 11 - Structures and Unions
  297.  
  298. NOW TO USE SOME OF THE FIELDS
  299. ____________________________________________________________
  300.  
  301. In lines 21 through 25 of the program, we will assign values
  302. to each of the fields of teacher.  The first field is the
  303. grade field and is handled just like the other structures we
  304. have studied because it is not part of the nested structure. 
  305. Next we wish to assign a value to her age which is part of the
  306. nested structure.  To address this field we start with the
  307. variable name teacher to which we append the name of the group
  308. descrip, and then we must define which field of the nested
  309. structure we are interested in, so we append the variable name
  310. age.  The teachers status is handled in exactly the same
  311. manner as her age, but the last two fields are assigned
  312. strings using the string copy function strcpy() which must be
  313. used for string assignment.  Notice that the variable names
  314. in the strcpy() function are still variable names even though
  315. they are made up of several parts each.
  316.  
  317. The variable sub is assigned nonsense values in much the same
  318. way, but in a different order since they do not have to occur
  319. in any required order.  Finally, a few of the student
  320. variables are assigned values for illustrative purposes and
  321. the program ends.  None of the values are printed for
  322. illustration since several were printed in the last examples.
  323.  
  324. Compile and run this program, but when you run it, you may get
  325. a stack overflow error.  C uses its own internal stack to
  326. store the automatic variables on, but some C compilers use
  327. only a 2048 byte stack as a default.  This program requires
  328. more than that for the defined structures so it will be
  329. necessary for you to increase the stack size.  Consult your
  330. compiler documentation for details concerning the method of
  331. increasing the stack size.  There is no standard way to do
  332. this.  There is another way around this problem, and that is
  333. to move the structure and variable definitions outside of the
  334. program where they will be external variables and therefore
  335. static.  The result is that they will not be kept on the
  336. internal stack and the stack will not overflow.  It would be
  337. good for you to try both methods of fixing this problem.
  338.  
  339.  
  340. MORE ABOUT STRUCTURES
  341. ____________________________________________________________
  342.  
  343. It is possible to continue nesting structures until you get
  344. totally confused.  If you define them properly, the computer
  345. will not get confused because there is no stated limit as to
  346. how many levels of nesting are allowed.  There is probably a
  347. practical limit of three beyond which you will get confused,
  348. but the language has no limit.  In addition to nesting, you
  349. can include as many structures as you desire in any level of
  350. structures, such as defining another structure prior to alldat
  351. and using it in alldat in addition to using person.  The
  352.  
  353.                                                     Page 11-6
  354.  
  355.                            Chapter 11 - Structures and Unions
  356.  
  357. structure named person could be included in alldat two or more
  358. times if desired, as could pointers to it.
  359.  
  360. Structures can contain arrays of other structures which in
  361. turn can contain arrays of simple types or other structures. 
  362. It can go on and on until you lose all reason to continue. 
  363. I am only trying to illustrate to you that structures are very
  364. valuable and you will find them great aids to programming if
  365. you use them wisely.  Be conservative at first, and get bolder
  366. as you gain experience.
  367.  
  368. More complex structures will not be illustrated here, but you
  369. will find examples of additional structures in the example
  370. programs included in the last chapter of this tutorial.  For
  371. example, see the include file named STRUCT.DEF on the
  372. distribution disk. 
  373.  
  374.  
  375. WHAT ARE UNIONS?
  376. ____________________________________________________________
  377.  
  378. Examine the file named UNION1.C for an         ==============
  379. example of a union.  Simply stated, a union       UNION1.C
  380. allows you a way to look at the same data      ==============
  381. with different types, or to use the same data
  382. with different names.
  383.  
  384. In this example we have two elements to the union, the first
  385. part being the integer named value, which is stored as a two
  386. byte variable somewhere in the computers memory.  The second
  387. element is made up of two character variables named first and
  388. second.  These two variables are stored in the same storage
  389. locations that value is stored in, because that is what a
  390. union does.  A union allows you to store different types of
  391. data in the same physical storage locations.  In this case,
  392. you could put an integer number in value, then retrieve it in
  393. its two halves by getting each half using the two names first
  394. and second.  This technique is often used to pack data bytes
  395. together when you are, for example, combining bytes to be used
  396. in the registers of the microprocessor.
  397.  
  398. Accessing the fields of the union are very similar to
  399. accessing the fields of a structure and will be left to you
  400. to determine by studying the example.
  401.  
  402. One additional note must be given here about the program. 
  403. When it is run using some C compilers, the data will be
  404. displayed with two leading f's due to the hexadecimal output
  405. promoting the char type variables to int and extending the
  406. sign bit to the left.  Converting the char type data fields
  407. to int type fields prior to display should remove the leading
  408. f's from your display.  This will involve defining two new int
  409. type variables and assigning the char type variables to them. 
  410. This will be left as an exercise for you.  Note that the same
  411.  
  412.                                                     Page 11-7
  413.  
  414.                            Chapter 11 - Structures and Unions
  415.  
  416. problem will come up in a few of the later files in this
  417. tutorial.
  418.  
  419. Compile and run this program and observe that the data is read
  420. out as an int and as two char variables.  The char variables
  421. may be reversed in order because of the way an int variable
  422. is stored internally in your computer.  If your system
  423. reverses these variables, don't worry about it.  It is not a
  424. problem but it can be a very interesting area of study if you
  425. are so inclined.
  426.  
  427.  
  428. ANOTHER UNION EXAMPLE
  429. ____________________________________________________________
  430.  
  431. Load and display the file named UNION2.C for   ==============
  432. another example of a union, one which is much     UNION2.C
  433. more common.  Suppose you wished to build a    ==============
  434. large database including information on many
  435. types of vehicles.  It would be silly to
  436. include the number of propellers on a car, or the number of
  437. tires on a boat.  In order to keep all pertinent data,
  438. however, you would need those data points for their proper
  439. types of vehicles.  In order to build an efficient data base,
  440. you would need several different types of data for each
  441. vehicle, some of which would be common, and some of which
  442. would be different.  That is exactly what we are doing in the
  443. example program on your monitor.
  444.  
  445. In this program, we will define a complete structure, then
  446. decide which of the various types can go into it.  We will
  447. start at the top and work our way down.  First, we define a
  448. few constants with the #defines, and begin the program itself. 
  449. We define a structure named automobile containing several
  450. fields which you should have no trouble recognizing, but we
  451. define no variables at this time.
  452.  
  453.  
  454. A NEW CONCEPT, THE TYPEDEF
  455. ____________________________________________________________
  456.  
  457. Next we define a new type of data with a typedef.  This
  458. defines a complete new type that can be used in the same way
  459. that int or char can be used.  Notice that the structure has
  460. no name, but at the end where there would normally be a
  461. variable name there is the name BOATDEF.  We now have a new
  462. type, BOATDEF, that can be used to define a structure anyplace
  463. we would like to.  Notice that this does not define any
  464. variables, only a new type.  Capitalizing the name is a
  465. personal preference only and is not a C standard.  It makes
  466. the typedef look different from a variable name.
  467.  
  468. We finally come to the big structure that defines our data
  469. using the building blocks already defined above.  The
  470.  
  471.                                                     Page 11-8
  472.  
  473.                            Chapter 11 - Structures and Unions
  474.  
  475. structure is composed of 5 parts, two simple variables named
  476. vehicle and weight, followed by the union, and finally the
  477. last two simple variables named value and owner.  Of course
  478. the union is what we need to look at carefully here, so focus
  479. on it for the moment.  You will notice that it is composed of
  480. four parts, the first part being the variable car which is a
  481. structure that we defined previously.  The second part is a
  482. variable named boat which is a structure of the type BOATDEF
  483. previously defined.  The third part of the union is the
  484. variable airplane which is a structure defined in place in the
  485. union.  Finally we come to the last part of the union, the
  486. variable named ship which is another structure of the type
  487. BOATDEF.
  488.  
  489. I hope it is obvious to you that all four could have been
  490. defined in any of the three ways shown, but the three
  491. different methods were used to show you that any could be
  492. used.  In practice, the clearest definition would probably
  493. have occurred by using the typedef for each of the parts.
  494.  
  495.  
  496. WHAT DO WE HAVE NOW?
  497. ____________________________________________________________
  498.  
  499. We now have a structure that can be used to store any of four
  500. different kinds of data structures.  The size of every record
  501. will be the size of that record containing the largest union. 
  502. In this case part 1 is the largest union because it is
  503. composed of three integers, the others being composed of an
  504. integer and a character each.  The first member of this union
  505. would therefore determine the size of all structures of this
  506. type.  The resulting structure can be used to store any of the
  507. four types of data, but it is up to the programmer to keep
  508. track of what is stored in each variable of this type.  The
  509. variable named vehicle was designed into this structure to
  510. keep track of the type of vehicle stored here.  The four
  511. defines at the top of the page were designed to be used as
  512. indicators to be stored in the variable named vehicle. 
  513.  
  514. A few examples of how to use the resulting structure are given
  515. in the next few lines of the program.  Some of the variables
  516. are defined and a few of them are printed out for illustrative
  517. purposes. 
  518.  
  519. The union is not used too frequently, and almost never by
  520. beginning programmers.  You will encounter it occasionally so
  521. it is worth your effort to at least know what it is.  You do
  522. not need to know the details of it at this time, so don't
  523. spend too much time studying it.  When you do have a need for
  524. a variant structure, a union, you can learn it at that time. 
  525. For your own benefit, however, do not slight the structure. 
  526. You should use the structure often.
  527.  
  528.  
  529.  
  530.                                                     Page 11-9
  531.  
  532.                            Chapter 11 - Structures and Unions
  533.  
  534. WHAT IS A BITFIELD?
  535. ____________________________________________________________
  536.  
  537. Load and display the program named BITFIELD.C  ==============
  538. for an example of how to define and use a        BITFIELD.C 
  539. bitfield, a relatively new addition to the     ==============
  540. programming language C.  In this program, we
  541. have a union made up of a single int type
  542. variable in line 7 and the structure defined in lines 8
  543. through 12.  The structure is composed of three bitfields
  544. named x, y, and z.  The variable named x is only one bit wide,
  545. the variable y is two bits wide and adjacent to the variable
  546. x, and the variable z is two bits wide and adjacent to y. 
  547. Moreover, because the union causes the bits to be stored in
  548. the same memory location as the variable index, the variable
  549. x is the least significant bit of the variable index, y is the
  550. next two bits, and z is stored in the next two bits of index.
  551.  
  552. Compile and run the program and you will see that as the
  553. variable index is incremented by 1 each time you will see the
  554. bitfields of the union counting due to their respective
  555. locations within the int definition.  Note that your compiler
  556. may not support the bitfield since it is a relatively new
  557. construct to the C programming language.
  558.  
  559. One thing must be pointed out, the bitfields must be defined
  560. as parts of an unsigned int or your compiler will issue an
  561. error message.
  562.  
  563.  
  564. WHAT IS THE BITFIELD GOOD FOR?
  565. ____________________________________________________________
  566.  
  567. The bitfield is very useful if you have a lot of data to
  568. separate into individual bits or groups of bits.  Many systems
  569. use some sort of a packed format to get lots of data stored
  570. in a few bytes.  Your imagination is your only limitation to
  571. use of this feature of C. 
  572.  
  573. PROGRAMMING EXERCISES
  574. ____________________________________________________________
  575.  
  576. 1.   Define a named structure containing a string for a name,
  577.      an integer for feet, and another for arms.  Use the new
  578.      type to define an array of about 6 items.  Fill the
  579.      fields with data and print them out as follows.
  580.  
  581.         A human being has 2 legs and 2 arms.
  582.         A dog has 4 legs and 0 arms.
  583.         A television set has 4 legs and 0 arms.
  584.         A chair has 4 legs and 2 arms.
  585.          etc.
  586.  
  587. 2.   Rewrite exercise 1 using a pointer to print the data out.
  588.  
  589.                                                    Page 11-10
  590.