home *** CD-ROM | disk | FTP | other *** search
/ 8bitfiles.net/archives / archives.tar / archives / genie-commodore-file-library / Information / C.TUTOR.2.SFX / lesson10 next >
Encoding:
Text File  |  1991-03-07  |  7.7 KB  |  387 lines

  1.  
  2. ├ ╠ANGUAGE ╘UTORIAL
  3. -------------------
  4. ╨ART 10 OF 11
  5.  
  6.  
  7. ╬╧╘┼: ╙╒┬╙╘╔╘╒╘╔╧╬╙ ╞╧╥ ╙╨┼├╔┴╠ ├
  8. ╠┴╬╟╒┴╟┼ ├╚┴╥┴├╘┼╥╙:
  9.  
  10. ╠┼╞╘ ├╒╥╠┘ ┬╥┴├╦┼╘:   █
  11. ╥╔╟╚╘ ├╒╥╠┘ ┬╥┴├╦┼╘:  ▌
  12. ┬┴├╦ ╙╠┴╙╚:           \
  13. ╘╔╠─┼:                »
  14. ╓┼╥╘╔├┴╠ ┬┴╥:         ▀
  15. ╒╬─┼╥╙├╧╥┼:           ñ
  16.  
  17.  
  18. ╘HE ├ ╨╥┼╨╥╧├┼╙╙╧╥ -
  19.  
  20. ┬┼╟╔╬  
  21.   ─┼├╠┴╥┼_┴╬_╔╬╘┼╟┼╥ X;
  22.   ╠┼╘ X=0;
  23.   ┴╙_╠╧╬╟_┴╙ ( X ╔╙_╠┼╙╙_╘╚┴╬ 5 ) ─╧
  24.   ╠┼╘ X ╔╬├╥┼┴╙┼_┬┘ 1;
  25.   ╨╥╔╬╘_X;
  26.   ╘╚┼╬_╙╘╧╨
  27. ┼╬─
  28.  
  29. ╫OULDN'T IT BE NICE IF WE COULD WRITE 
  30. THE ABOVE PROGRAM AND HAVE IT TURN 
  31. ITSELF INTO THE FOLLOWING PROGRAM 
  32. AUTOMATICALLY? 
  33.  
  34. MAIN() 
  35.   INT X;
  36.   X = 0;
  37.   WHILE(X < 5) 
  38.   X += 1;
  39.   PRINTF("%D",X);
  40.  
  41.  
  42.  
  43. ╘HIS WOULD REQUIRE THE FOLLOWING 
  44. DEFINITIONS: 
  45.  
  46. DEFINE  ┬┼╟╔╬   
  47. TO MEAN MAIN() █
  48.  
  49. DEFINE  ─┼├╠┴╥┼_┴╬_╔╬╘┼╟┼╥  
  50. TO MEAN INT
  51.  
  52. DEFINE  ╠┼╘ 
  53. TO MEAN (NOTHING!)
  54.  
  55. DEFINE  ┴╙_╠╧╬╟_┴╙  
  56. TO MEAN WHILE
  57.  
  58. DEFINE  ╔╙_╠┼╙╙_╘╚┴╬
  59. TO MEAN <
  60.  
  61. DEFINE  ─╧  
  62. TO MEAN 
  63.  
  64. DEFINE  ╔╬├╥┼┴╙┼_┬┘ 
  65. TO MEAN +=
  66.  
  67. DEFINE  ╨╥╔╬╘_X 
  68. TO MEAN PRINTF("%D",X)
  69.  
  70. DEFINE  ╘╚┼╬_╙╘╧╨   
  71. TO MEAN 
  72.  
  73. DEFINE  ┼╬─ 
  74. TO MEAN ▌
  75.  
  76. ╧NE FASCINATING ASPECT OF THE ├ 
  77. LANGUAGE IS ITS ABILITY TO PERFORM 
  78. REPLACEMENTS OF ┬┼╟╔╬  BY MAIN()  , 
  79. AND ╠┼╘ BY NOTHING (A "NULL STRING") 
  80. AND ┼╬─ BY , ETC. ETC. 
  81.  
  82. ┬EFORE THE ├-COMPILER GOES TO WORK ON 
  83. YOUR PROGRAM, A ├-PREPROCESSOR WILL 
  84. MAKE THE APPROPRIATE REPLACEMENTS ... 
  85. AND (═┴╟╔├!) THE COMPILER GETS A 
  86. NORMAL, STANDARD, ├ PROGRAM TO 
  87. COMPILE. 
  88.  
  89. ╘O TELL THE PREPROCESSOR THAT YOU 
  90. HAVE REDEFINED CERTAIN ├-PHRASES, YOU 
  91. NEED ONLY BEGIN YOUR PROGRAM WITH 
  92. THESE #DEFINITIONS. 
  93.  
  94.  
  95. ╘O #DEFINE ╘╚╔╙ AS ╘╚┴╘ -
  96.  
  97. #DEFINE  ┬┼╟╔╬   MAIN() █
  98. #DEFINE  ─┼├╠┴╥┼_┴╬_╔╬╘┼╟┼╥  INT
  99. #DEFINE  ╠┼╘  
  100. #DEFINE  ┴╙_╠╧╬╟_┴╙  WHILE
  101. #DEFINE  ╔╙_╠┼╙╙_╘╚┴╬  <  
  102. #DEFINE  ╔╬├╥┼┴╙┼_┬┘   += 
  103. #DEFINE  ╨╥╔╬╘_X   PRINTF("%D",X) 
  104. #DEFINE  ╘╚┼╬_╙╘╧╨ 
  105. #DEFINE  ┼╬─ ▌
  106.   
  107. ┬┼╟╔╬
  108.   ─┼├╠┴╥┼_┴╬_╔╬╘┼╟┼╥ X;  
  109.   ╠┼╘ X=0;   
  110.   ┴╙_╠╧╬╟_┴╙ ( X ╔╙_╠┼╙╙_╘╚┴╬ 5 ) ─╧ 
  111.   ╨╥╔╬╘_X;   
  112.   ╘╚┼╬_╙╘╧╨  
  113. ┼╬─  
  114.  
  115. ╔F THE ABOVE PROGRAM IS WRITTEN AND 
  116. COMPILED, THE PREPROCESSOR WILL MAKE 
  117. ALL REPLACEMENTS INDICATED BY THE 
  118. VARIOUS #DEFINE STATEMENTS! ╘HE 
  119. #DEFINE STATEMENTS ARE INSTRUCTIONS 
  120. TO THE PREPROCESSOR. ╫E'VE ACTUALLY 
  121. SEEN SUCH INSTRUCTIONS BEFORE! 
  122.  
  123. ╥EMEMBER #INCLUDE <STDIO.H>  ??
  124.  
  125. ╘╚┴╘ WAS ALSO AN INSTRUCTION TO THE 
  126. PREPROCESSOR .. TO REPLACE THE 
  127. PHRASE, #INCLUDE <STDIO.H> BY THE 
  128. LIBRARY OF STANDARD INPUT/OUTPUT 
  129. ROUTINES. ( ...WHICH EXPLAINS WHY A 
  130. COMPILED PROGRAM IS OFTEN VERY MUCH 
  131. LARGER THAN THE PROGRAM WE WRITE WITH 
  132. OUR FAVOURITE TEXT-EDITOR ...IT 
  133. CONTAINS THE I/O LIBRARY OF 
  134. FUNCTIONS!) 
  135.  
  136. #INCLUDE <STDIO.H>  
  137. #INCLUDE <MATH.H>   
  138.  
  139. ╙INCE ├ IS SUPPOSED TO BE A ╨╧╥╘┴┬╠┼ 
  140. LANGUAGE (WRITE A ├ PROGRAM ON YOUR 
  141. FAVOURITE TEXT-EDITOR AND COMPILE IF 
  142. FOR ┴╬┘ COMPUTER FOR WHICH YOU HAVE A 
  143. COMPILER), THE STANDARD IPUT/OUTPUT 
  144. ROUTINES ARE SYSTEM DEPENDENT ... AND 
  145. NOT, STRICTLY SPEAKING, PART OF THE 
  146. LANGUAGE! ╙OMEBODY HAS WRITTEN THE 
  147. FUNCTIONS IN STDIO.H WITH A SPECIFIC 
  148. COMPUTER IN MIND ...WHICH REMINDS ME
  149. ...THE LIBRARY OF ═┴╘╚ FUNCTIONS 
  150. (SUCH AS SIN()) IS ╬╧╘ IN STDIO.H. 
  151. ╔F YOU USE THEM, BE SURE TO 
  152. #INCLUDE <MATH.H>.
  153.  
  154.  
  155. ═ORE #DEFINITIONS -
  156.  
  157. ╔N THE PREVIOUS EXAMPLE WE USED:
  158.  
  159. #DEFINE  ╨╥╔╬╘_X   PRINTF("%D",X) 
  160.  
  161. WHICH MEANT THAT, TO PRINT Y OR PRINT 
  162. A ETC. WE WOULD NEED MORE 
  163. #DEFINITIONS (LIKE ╨╥╔╬╘_Y AND  
  164. ╨╥╔╬╘_A). 
  165.  
  166. ┬╒╘, ├ IS VERY SMART. ┘OU CAN INCLUDE 
  167. A ╓┴╥╔┴┬╠┼ IN THE #DEFINITION (WITHIN 
  168. PARENTHESES!), FOR EXAMPLE: 
  169.  
  170. #DEFINE  ╨╥╔╬╘(X) PRINTF("%D",X) 
  171.  
  172. ...AND NOW USE ╨╥╔╬╘(Y) OR ╨╥╔╬╘(A) 
  173. ETC AND THE PREPROCESSOR WOULD MAKE 
  174. THE SUBSTITUTIONS TO Y OR A. 
  175.  
  176. ╫E WANT TO WRITE THE STUFF IN 
  177. ├┴╨╔╘┴╠╙ BUT HAVE THE ├-COMPILER GET 
  178. THE PROPER ├ PROGRAM: 
  179.  
  180. ┬┼╟╔╬  MAIN() █
  181. ╠┼╘ X=0;  INT X=0; 
  182. ╔╞ (X ╠┼╙╙ 10) ─╧  WHILE (X<10) 
  183. ╨╥╔╬╘(X);  PRINTF(" %D ",X);
  184. ╨╥╔╬╘(╙╤╒┴╥┼(X));  PRINTF("%D",X*X);
  185. ╬┼╫╠╔╬┼;  PRINTF("\N");
  186. ╔╬├╥┼┴╙┼(X);  X+=1;
  187. ┼╬─╔╞   
  188. ╙╘╧╨ ▌
  189.  
  190. ...CAN YOU SEE WHAT #DEFINITIONS ARE 
  191. NECESSARY ??? 
  192.  
  193. ╘HESE #DEFINITIONS:
  194. #DEFINE  ┬┼╟╔╬ MAIN() █
  195. #DEFINE  ╠┼╘   INT   
  196. #DEFINE  ╔╞  WHILE 
  197. #DEFINE  ╠┼╙╙  < 
  198. #DEFINE  ─╧  
  199. #DEFINE  ╨╥╔╬╘(X)  PRINTF(" %D ",X)
  200. #DEFINE  ╙╤╒┴╥┼(X) X*X   
  201. #DEFINE  ╬┼╫╠╔╬┼   PRINTF("\N")
  202. #DEFINE  ╔╬├╥┼┴╙┼(X)   X+=1  
  203. #DEFINE  ┼╬─╔╞  
  204. #DEFINE  ╙╘╧╨ ▌
  205.  
  206. ╫E WOULD HAVE ALL THOSE #DEFINITIONS 
  207. IN A SEPARATE FILE (ON DISK) CALLED, 
  208. SAY, NEWDEFS.C SO THAT ANYONE COULD 
  209. AUTOMATICALLY USE THE #DEFINITIONS
  210. BY PLACING THE FOLLOWING AT THE
  211. START OF THEIR PROGRAM:
  212.  
  213. #INCLUDE <NEWDEFS.C>
  214.  
  215. ╘HE PREPROCESSOR WOULD #INCLUDE ALL 
  216. THOSE #DEFINITIONS AT THE BEGINNING 
  217. OF EVERY PROGRAM, THEN MAKE ALL THE 
  218. APPROPRIATE SUBSTITUTIONS AND 
  219. REPLACEMENTS ... 
  220.  
  221. ╫E HAVE WRITTEN THE #DEFINITIONS 
  222. USING ├┴╨╔╘┴╠╙ TO REPLACE ├-PHRASES. 
  223.  
  224. ╘HAT'S NOT NECESSARY, BUT ┴─╓╔╙┴┬╠┼! 
  225. ( THEN IT'S OBVIOUS WHICH PARTS OF 
  226. YOUR PROGRAM ARE ╚╧═┼-═┴─┼ AND WHICH 
  227. ARE "REAL ├") ...AND BESIDES, IT IS
  228. THE ACCEPTED PRACTICE AMONG REAL
  229. ├ PROGRAMMERS.
  230.  
  231. ╬OT ONLY DO #DEFINITIONS ALLOW US TO 
  232. WRITE ├ IN A PERSONAL DIALECT, BUT 
  233. THEY ALSO ALLOW US TO QUICKLY CHANGE 
  234. CERTAIN ├-PHRASES. 
  235.  
  236. ╬OTES FROM THE AUTHOR -
  237.  
  238. ╧N THE ├64 ╔ CAN CLEAR THE
  239. SCREEN BY USING:
  240.  
  241. #DEFINE  ├╠┼┴╥  PRINTF("%C",0X093);   
  242. /* WHERE 0X093 IS THE VALUE OF THE
  243.    'CLEAR SCREEN' CHARACTER */
  244.  
  245. ...THEN ╔ CAN USE ├╠┼┴╥;  WHEREVER ╔ 
  246. NEED IT, IN MY PROGRAM TO CLEAR THE 
  247. SCREEN. 
  248.  
  249.  
  250. ╘YPEDEFINITIONS -
  251.  
  252. ┘OU BEGIN YOUR PROGRAM WITH:
  253.  
  254. #DEFINE ╙┴═  INT 
  255.  
  256. AND IT WILL BE PREPROCESSED, AND EVERY 
  257. OCCURRENCE OF ╙┴═ WILL BE REPLACED BY 
  258. INT  ...AS IN ╙┴═ X=0; WHICH GETS 
  259. PASSED ON TO THE COMPILER (BY THE 
  260. PREPROCESSOR) AS INT X=0; 
  261.  
  262. ╘HIS "REPLACEMENT" BY THE 
  263. PREPROCESSOR HOLDS FOR ANYTHING,
  264. NOT JUST ─┴╘┴ ╘┘╨┼╙. ╙O, FOR EXAMPLE
  265. YOU COULD WRITE:
  266.  
  267. #DEFINE  ╬EW╠INE╨LEASE  PRINTF("\N")
  268.  
  269. ...WHICH ALLOWS YOU TO USE 
  270. ╬EW╠INE╨LEASE; IN PLACE OF 
  271. PRINTF("\N"); 
  272.  
  273. ┬╒╘, THERE IS A "SPECIAL" FEATURE FOR 
  274. ─┴╘┴ ╘┘╨┼╙, CALLED TYPEDEF. 
  275.  
  276. ╔F YOU PLACE THE FOLLOWING AT THE 
  277. BEGINNING OF YOUR PROGRAM: 
  278.  
  279. TYPEDEF  INT   ╔╬├╚┼╙ 
  280. /* NOTE THE ORDER! */
  281.  
  282. ...YOU MAY SUBSEQUENTLY USE, IN YOUR 
  283. PROGRAM: 
  284.  
  285. ╔╬├╚┼╙ X, Y, Z;
  286.  
  287. ...AND THE VARIABLES X, Y AND Z WILL 
  288. BE REGARDED (BY THE COMPILER) AS INT 
  289. VARIABLES. 
  290.  
  291. ╚MMMM...
  292.  
  293. TYPEDEF  INT   ╔╬├╚┼╙
  294.  
  295. ...DOESN'T SEEM LIKE IT'S ANY 
  296. DIFFERENT FROM: 
  297.  
  298. #DEFINE  ╔╬├╚┼╙   INT
  299.  
  300. ┬╒╘, HERE IS THE DIFFERENCE. 
  301.  
  302. ╥EMEMBER THE CURIOUS WAY WE HAD TO 
  303. REFER TO AN ARGUMENT, PASSED TO A 
  304. FUNCTION, WHICH WAS ITSELF A 
  305. FUNCTION? 
  306.  
  307. FLOAT SOLVE(F,X,ERROR)
  308. FLOAT (*F)();
  309. /* NOTE THE ABOVE CURIOSITY! */
  310. FLOAT X, ERROR;   
  311.  
  312. ╚ERE, THE ├-PHRASE FLOAT (*F)();, 
  313. SAYS THAT F IS A POINTER TO A 
  314. FUNCTION, AND THIS FUNCTION RETURNS A 
  315. FLOAT. 
  316.  
  317. ╬OW, USING TYPEDEF, WE MAY INTRODUCE 
  318. A HOME-MADE ─┴╘┴ ╘┘╨┼ CALLED ╨OINTER 
  319. TO A ╞UNCTION WHICH RETURNS A ╞LOAT. 
  320.  
  321. TYPEDEF  FLOAT   (*╨╞╞)()
  322. /* NOTE THE ORDER! */
  323.  
  324. ╒SE THE ABOVE TYPEDEF (NEAR THE 
  325. BEGINNING OF YOUR PROGRAM) AND 
  326. (═┴╟╔├!) THE PHRASE ╨╞╞ IS 
  327. INTERPRETED (BY THE COMPILER) AS 
  328. MEANING A ╨OINTER TO A ╞UNCTION WHICH 
  329. RETURNS A ╞LOAT. 
  330.  
  331. ╒SE IT, IN SOLVE(), LIKE SO:
  332.  
  333. FLOAT SOLVE(F,X,ERROR)
  334. ╨╞╞  F;
  335. FLOAT X, ERROR;
  336.  
  337. ╬ICE EH?
  338.  
  339. ╙INCE TYPEDEF IS ═╧╥┼ THAN "JUST A 
  340. DUMB REPLACEMENT OF CHARACTERS", THE 
  341. PREPROCESSOR WON'T TOUCH IT ... BUT 
  342. PASSES IT ALONG TO THE COMPILER! 
  343.  
  344. ...AND ╘╚┴╘ MAKES IT DIFFERENT FROM A 
  345. #DEFINE TOO! 
  346.  
  347. ╚ERE ARE SOME MORE EXAMPLES:
  348.  
  349. TYPEDEF  CHAR  *╙╘╥╔╬╟ 
  350.  
  351. ╚ERE ╙╘╥╔╬╟ IS A POINTER TO A STRING 
  352. AND YOU MAY WRITE ╙╘╥╔╬╟ X; MEANING 
  353. THAT X IS A POINTER TO A CHARACTER 
  354. STRING. 
  355.  
  356. TYPEDEF  INT   ╓┼├╘╧╥[5]
  357.  
  358. ╚ERE ╓┼├╘╧╥ IS AN ARRAY OF 5 INTS AND 
  359. YOU MAY WRITE ╓┼├╘╧╥ X; SO X IS AN 
  360. ARRAY OF 5 INTEGERS. 
  361.  
  362. TYPEDEF  INT   ╔╬╘┼╟┼╥  
  363.  
  364. ╚ERE ╔╬╘┼╟┼╥ IS AN INT (OF COURSE!), 
  365. AND YOU MAY WRITE ╔╬╘┼╟┼╥ X; ... AND, 
  366. WHEN YOU COMPILE YOUR ├ PROGRAM FOR A 
  367. DIFFERENT COMPUTER WHERE INT ─┴╘┴ 
  368. ╘┘╨┼╙ ARE 4 BYTES LONG (AND YOU WERE 
  369. COUNTING ON THEIR BEING ONLY 2 BYTES 
  370. LONG!) YOU CHANGE THIS ONE STATEMENT 
  371. TO: 
  372.  
  373. TYPEDEF  SHORT ╔╬╘┼╟┼╥  
  374. /* MEANING A "SHORT" INTEGER */
  375.  
  376. ...AND ALL YOUR REFERENCES TO ╔╬╘┼╟┼╥ 
  377. X; AND ╔╬╘┼╟┼╥ Y; ETC. WILL BE 
  378. CHANGED THROUGHOUT THE PROGRAM TO 
  379. DECLARE "SHORT" VARIABLE TYPES RATHER 
  380. THAN INT'S. 
  381.  
  382. [┼ND OF PART 10 OF 11]
  383.