home *** CD-ROM | disk | FTP | other *** search
/ Amiga MA Magazine 1997 #3 / amigamamagazinepolishissue03-1 / ma_1995 / 05 / ami044.txt < prev    next >
Text File  |  1997-04-07  |  22KB  |  463 lines

  1. C dla kaûdego (cz. 1.)
  2. ----------------------
  3.  
  4. POCZÂTKI
  5.  
  6. <txt>Jëzyk C to dzisiaj jeden z najpopularniejszych jëzyków
  7. programowania, a bez wâtpienia najpopularniejszy jëzyk
  8. programowania wyûszego poziomu na Amidze.
  9.  
  10. <a>Kamil Iskra, Dariusz Ûbik
  11.  
  12. <txt>Moûna by wymieniê wiele zalet jëzyka C, ale naszym zdaniem
  13. naprawdë waûne sâ tylko trzy. 
  14.  
  15. -- Prostota. C jest bardzo surowy, moûna wrëcz powiedzieê --
  16. ascetyczny. Trzon jëzyka jest niezwykle skromny, dziëki czemu
  17. îatwo go opanowaê (naszym zdaniem znacznie îatwiej niû np.
  18. promowany w polskim szkolnictwie Pascal). C jest elastyczny i
  19. nakîada na programistë niewiele ograniczeï.
  20.  
  21. -- Powszechnoôê. Niemal kaûda publikacja na temat programowania
  22. Amigi dotyczy wîaônie tego jëzyka. W tym jëzyku jest napisany
  23. system operacyjny naszego komputera (niecaîy -- czëôê, tzn.
  24. fragmenty wymagajâce maksymalnej prëdkoôci, zostaîa napisana w
  25. asemblerze).
  26.  
  27. -- Bardzo dobre kompilatory. Jest ich wiele. Od tych dziaîajâcych
  28. juû na A500 z 0,5 MB RAM, aû po kolubryny ledwie pracujâce na
  29. A1200 z 6 MB RAM.
  30.  
  31. <sr>Kompilatory
  32.  
  33. <txt>Co do róûnych kompilatorów, to od razu pojawia sië pewien
  34. problem. Po prostu róûne kompilatory sâ ze sobâ nie do koïca
  35. zgodne. My, podobnie jak [sts] (ach, wy tajniacy -- patrz Magazyn
  36. AMIGA 6/94, artykuî "SAS C") uwaûamy, ûe najlepszy z dostëpnych
  37. na Amidze kompilatorów to SAS/C 6, wiëc wszystkie przykîady bëdâ
  38. pisane z myôlâ o nim. Nie powinno byê jednak wiëkszych problemów
  39. przy uûywaniu innych kompilatorów.
  40.  
  41. Co do opcji kompilatora, to sugerujemy zadbaê, aby typ "char" byî
  42. bezznakowy (wartoôci od 0 do 255, a nie od -128 do 127). W SAS/C
  43. 6 robi sië to podajâc opcjë UCHAR, w Manx Aztec C 5 opcjë -PP, w
  44. GNU CC opcjë -FUNSIGNED-CHAR. Naleûy sië równieû upewniê, ûe typ
  45. "int" jest 32-bitowy (long-int), a nie 16-bitowy (short-int) --
  46. kompilatory powinny mieê standardowo ustawionâ wîaôciwâ wartoôê.
  47.  
  48. <sr>Program kursu
  49.  
  50. <txt>Czas napisaê, czego chcielibyômy Was nauczyê i co zakîadamy,
  51. ûe juû umiecie. Zaczynajâc od tego drugiego: NIE bëdziemy uczyê
  52. podstaw jëzyka C. Na ten temat istnieje mnóstwo publikacji, poza
  53. tym podstawy sâ na kaûdym komputerze takie same, a wiëc moûna sië
  54. uczyê nawet z ksiâûek o pececie. My polecamy zdobycie "biblii
  55. jëzyka C" -- ksiâûki "Jëzyk ANSI C" autorstwa Briana W.
  56. Kernighana i Dennisa M. Ritchie (jest to nowa pozycja, wydana
  57. przez WNT, Warszawa 1994 -- nie polecamy pierwszego,
  58. przestarzaîego juû, wydania). Ksiâûka ta opisuje w doôê
  59. przystëpny sposób standard jëzyka, bez ûadnych pecetowych
  60. rozszerzeï (jest tylko jeden rozdziaî o Unixie).
  61.  
  62. Czego wiëc chcemy Was nauczyê? Chcemy daê Wam podstawy niezbëdne
  63. do pisania zgodnych ze ôrodowiskiem systemu operacyjnego
  64. aplikacji. Moûna by wiëc powiedzieê, ûe kurs ten to nie kurs
  65. jëzyka C, ale kurs programowania zgodnego z systemem operacyjnym.
  66. Co chcemy przez to powiedzieê? To, ûe zdecydowanâ wiëkszoôê
  67. zawartych w tym kursie informacji bëdâ mogli wykorzystywaê nie
  68. tylko programujâcy w C, ale równieû programujâcy w asemblerze,
  69. Pascalu, E itd.
  70.  
  71. Nasz kurs jëzyka C nie jest pierwszym w polskiej prasie
  72. komputerowej. Co wiëc nowego mamy zamiar wnieôê w stosunku do
  73. kursów prowadzonych kiedyô przez Bohdana R. Raua w "Amigowcu" i
  74. Jarosîawa Chrostowskiego w "C64+4 & AMIGA"? Przede wszystkim nasz
  75. kurs bëdzie nowoczeôniejszy. System operacyjny sië zmienia (no,
  76. ostatnio nieco wolniej, ale miejmy nadziejë, ûe to zastój
  77. chwilowy). Kurs z "Amigowca" bazowaî na systemie operacyjnym w
  78. wersji 1.3, my tymczasem mamy zamiar bazowaê na wersji 2.04
  79. systemu, nie zapominajâc przy tym o systemach 2.1 i 3.0.
  80. Chcielibyômy to jeszcze raz podkreôliê: BËDZIEMY PISALI O OS
  81. 2.04+. Wiëkszoôê przykîadów (jeôli nie wszystkie) bëdzie wymagaê
  82. przynajmniej tej wersji systemu operacyjnego.
  83.  
  84. Zaczniemy od tego, co z punktu widzenia uûytkowników jest
  85. najbardziej widoczne -- od graficznego interfejsu uûytkownika,
  86. tzn. ekranów, okien, gadûetów, menu. System operacyjny Amigi to
  87. jednak nie tylko okienka. Istnieje masa wielce przydatnych
  88. bibliotek nie zwiâzanych z GUI (Graphic User Interface --
  89. Graficzny Interfejs Uûytkownika). Opiszemy wiëc "exec.library",
  90. czyli System Executor -- bibliotekë zarzâdzajâcâ caîym systemem,
  91. oraz "dos.library" -- bibliotekë zarzâdzajâcâ wysokopoziomowym
  92. I/O. Wîaôciwie to chcielibyômy po trochu opisaê wszystkie
  93. najwaûniejsze elementy systemu operacyjnego, aby daê Wam dobre
  94. rozeznanie w tym, co system jest w stanie programiôcie
  95. zaoferowaê. Chcielibyômy wiëc napisaê równieû o
  96. "amigaguide.library", "commodities.library", "workbench.library",
  97. "locale.library", "iffparse.library" itd. Sâ to, rzecz jasna,
  98. nasze poboûne ûyczenia, a czy te ambitne plany uda nam sië
  99. zrealizowaê, czas pokaûe.
  100.  
  101. Jak juû wczeôniej wspomnieliômy, chcemy daê Wam "podstawy".
  102. Oznacza to, ûe NIE bëdziemy dokîadnie opisywaê wszystkich
  103. funkcji, pól struktur czy staîych. Jest to po prostu fizycznie
  104. niemoûliwe. System operacyjny jest tak obszerny, ûe jego peîny
  105. opis zajmuje tysiâce stron (mówimy o serii ksiâûkowej "Reference
  106. Manuals"). Z koniecznoôci wiëc bëdziemy opisywali tylko
  107. najwaûniejsze elementy systemu, najczëôciej uûywane w typowych
  108. programach. W tekôcie artykuîu znajdâ sië teû z pewnoôciâ pewne
  109. niedomówienia oraz póîprawdy -- chodzi po prostu o to, ûe
  110. gdybyômy zbyt czësto zastrzegali sië, ûe "nie do koïca jest tak,
  111. jak piszemy, bo...", to niezbyt dobrze obeznani z tematem
  112. Czytelnicy po prostu utraciliby gîówny wâtek artykuîu. Zagubiliby
  113. sië w tych wszystkich niuansach (albo zaczëliby sâdziê, ûe "ktoô"
  114. usiîuje ich "zrobiê w konia"); poza tym artykuî znacznie by sië
  115. wtedy wydîuûyî.
  116.  
  117. Rzecz jasna, bëdziemy sië starali robiê jak najmniej bîëdów.
  118. Najprawdopodobniej wszystkie przykîady bëdâ intensywnie testowane
  119. przy uûyciu opisanych przeze mnie w Magazynie AMIGA 12/94--1/95
  120. debuggerów. Jeûeli jednak znajdziecie w artykule bâdú w
  121. przykîadach jakieô bîëdy, lub teû macie inne uwagi/sugestie
  122. dotyczâce tego kursu, to piszcie do redakcji. Nie oczekujcie
  123. jednak, ûe Wasze listy znajdâ odzwierciedlenie juû w kolejnej
  124. czëôci kursu. Ze wzglëdu na dîugi cykl wydawniczy Magazynu AMIGA
  125. oraz na to, ûe piszemy z dwumiesiëcznâ "zakîadkâ", Wasze uwagi
  126. moûemy uwzglëdniê najwczeôniej 3 miesiâce po ich otrzymaniu.
  127.  
  128. <sr>Inkludy
  129.  
  130. <txt>Chcielibyômy skupiê sië na chwilë na "inkludach", czyli
  131. plikach nagîówkowych, doîâczanych przez kompilator dyrektywâ
  132. "#include". Na Amidze sâ one bardzo rozszerzone w stosunku do
  133. standardu ANSI -- zawierajâ wszystkie definicje i deklaracje
  134. niezbëdne do pisania aplikacji korzystajâcych z zasobów systemu
  135. operacyjnego. Istniejâ róûne wersje "inkludów" -- musicie mieê je
  136. przynajmniej w wersji dla OS 2.0, a w niektórych wypadkach
  137. potrzebne bëdâ inkludy dla OS 3.0 (my uûywamy inkludów dla OS 3.1
  138. i Wam teû to polecamy -- moûna je znaleúê na dysku CD Freda Fisha
  139. bâdú w Internecie: serwer "ftp.rz.uni-wuerzburg.de", katalog
  140. "pub/amiga/frozenfish/bbs/cbm"). O strukturze inkludów
  141. powinniôcie wiedzieê tyle, ûe opisy "device'ów" znajdujâ sië w
  142. katalogu "devices", a bibliotek w katalogu "libraries" (nie
  143. zawsze -- duûe biblioteki majâ osobne katalogi, np. "exec",
  144. "intuition", "dos"). W katalogu "clib" znajdujâ sië prototypy
  145. (deklaracje) funkcji z poszczególnych bibliotek i niektórych
  146. device'ów. Twórcy kompilatorów tworzâ czësto dodatkowy katalog, o
  147. nazwie "pragmas" bâdú "inline", zawierajâcy pewne informacje
  148. umoûliwiajâce kompilatorom tworzenie bardziej efektywnych wywoîaï
  149. funkcji systemowych. Czasami tworzâ teû oni katalog "proto",
  150. zawierajâcy proste pliki powodujâce zaîadowanie jednym ruchem
  151. deklaracji i pragm, np. wykonanie w SAS/C "#include
  152. <proto/intuition.h>" powoduje doîâczenie
  153. "clib/intuition_protos.h" i "pragmas/intuition_pragmas.h".
  154. Niestety, nie we wszystkich kompilatorach tak jest. Niektóre nie
  155. majâ plików "proto" i trzeba "rëcznie" doîâczaê deklaracje i
  156. pragmy. Niektóre nie majâ równieû pragm -- wtedy doîâcza sië
  157. tylko deklaracje.
  158.  
  159. Wydaje mi sië, ûe jak na wstëp, to ten fragment zrobiî sië to
  160. nieco przydîugi. Aby wiëc nie traciê czasu ani cennego miejsca,
  161. juû dziô zaczynamy "regularny" kurs. "Oddajë wiëc klawiaturë" w
  162. rëce mego wspólnika:
  163.  
  164. "-- Aleû dziëkujë Kamilku za okazanâ mi îaskë w postaci
  165. wysîuûonej dyskietki, o otrzymaniu klawiatury nie ômiaîbym marzyê
  166. nawet skrycie."
  167.  
  168. <sr>Co to jest multitasking?
  169.  
  170. <txt>Multitasking jest to moûliwoôê wykonywania jednoczeônie (lub
  171. jeôli ktoô chciaîby byê dokîadny, prawie jednoczeônie) kilku
  172. programów. Taki system pracy komputera pozwala na peîniejsze
  173. wykorzystanie mocy procesora z dwóch zasadniczych powodów.
  174.  
  175. Po pierwsze komputer domowy w wiëkszoôci wypadków czeka na sygnaî
  176. od uûytkownika lub urzâdzeï zewnëtrznych, w tym czasie inny
  177. program moûe efektywnie wykorzystywaê system (obciâûenie
  178. procesora da sië îatwo sprawdziê, np. za pomocâ programu Spy -- w
  179. graficzny sposób przedstawia on stopieï zajëcia procesora, czas,
  180. przez jaki pracowaî on "na peînych obrotach" oraz przez jaki
  181. "zbijaî bâki").
  182.  
  183. Drugim równie waûnym powodem budowy takich systemów jest
  184. moûliwoôê wspóîpracy kilku niezaleûnych programów, które mogâ na
  185. bieûâco przekazywaê sobie wyniki swojej pracy, a w ten sposób
  186. zaoszczëdziê czas potrzebny na zapis i odczyt danych z/do plików,
  187. co jest znaczâce przy wiëkszych obliczeniach. Taki sposób pracy
  188. jest szalenie wygodny. W tym wîaônie celu programy sâ wyposaûane
  189. w interface ARexxa (Amiga Rexx jest jëzykiem stworzonym w celu
  190. nadzorowania pracy programów (patrz Magazyn AMIGA 1/92,
  191. wrzesieï).
  192.  
  193. Niestety, nie ma róûy bez kolców: z multitaskingiem trzeba
  194. uwaûaê. Piszâc programy naleûy pamiëtaê o tym, ûe podczas ich
  195. wykonywania mogâ sië znajdowaê w pamiëci inne programy. To jest
  196. nasz problem -- problem programistów, którzy muszâ pamiëtaê, ûe
  197. "nie sâ sami", ûe nie wolno "grzebaê" w nie swojej pamiëci oraz
  198. zmuszaê procesora do pracy, jeôli nie jest to konieczne.
  199. Zabronione jest tworzenie tak zwanych busy loopów, czyli
  200. wykonujâcych sië bez przerwy pëtli sîuûâcych do oczekiwania na
  201. informacjë (dokîadniej zajmiemy sië tym przy okazji opisu funkcji
  202. Execa Wait() oraz portów).
  203.  
  204. Kolejnym problemem jest nieco wolniejsze funkcjonowanie
  205. programów, jednak twórcy borykajâ sië z nim raczej rzadko,
  206. poniewaû zastosowanie multitaskingu spowalnia dziaîanie programów
  207. w niewielkim stopniu (poza tym moûna programowi nadaê wyûszy
  208. priorytet, dziëki czemu bëdzie on miaî pierwszeïstwo w stosunku
  209. do pozostaîych).
  210.  
  211. Jednak jeôli komuô zaleûaîoby na wyciôniëciu z maszyny
  212. wszystkiego, moûe wyîâczyê pozostaîe zadania (taski). Do tego
  213. celu przeznaczone sâ funkcje Execa (Forbid(), Permit()), jednak
  214. nie bëdziemy sië nimi zajmowali (przynajmniej na poczâtku).
  215.  
  216. Amigowski multitasking jest doôê zgrabnie zorganizowany -- nawet
  217. jeôli dojdzie do katastrofy i jakiô program sië "powiesi", to nie
  218. oznacza to caîkowitej klëski systemu. Problem taki jest znany
  219. uûytkownikom programu Windows 3.1, który ma multitasking
  220. kooperatywny, czyli, mówiâc zîoôliwie, multitasking bez
  221. multitaskingu -- programy zwalniajâ procesor, gdy tego pragnâ,
  222. brak tam nadzorcy (patrz PC World Komputer Luty 1994: "Dos
  223. umarî!"). System zastosowany w Amidze wyglâda inaczej,
  224. powiedziaîbym, ûe jest pod wieloma wzglëdami lepszy. Na tym
  225. komputerze stale funkcjonuje program w trybie nadzorcy
  226. (Supervisor -- tryb procesora), zajmujâcy sië przydzielaniem
  227. czasu procesora programom znajdujâcym sië na liôcie oczekujâcych
  228. (ten program to taki komitet kolejkowy). Istnienie
  229. "wszechmocnego" nadzorcy pozwala na wykrycie i usuniëcie z listy
  230. zawieszonego programu, dziëki czemu system moûe dziaîaê nadal. W
  231. zasadzie mowa tu o anormalnym zachowaniu sië oprogramowania,
  232. jednak takie nieszczëôcia z caîâ pewnoôciâ spotkajâ Czytelników
  233. podczas pisania i testowania programów. Tyle wiedzy na temat
  234. multitaskingu powinno wystarczyê. Nareszcie moûemy sië zajâê
  235. bibliotekami, które sâ wypeînione po same brzegi funkcjami.
  236.  
  237. <sr>Dlaczego biblioteki?
  238.  
  239. <txt>Stosowanie bibliotek zewnëtrznych wynika z zastosowania
  240. multitaskingu. W wypadku pecetowego DOS-u funkcje znajdujâ sië w
  241. bibliotekach, które przy linkowaniu (konsolidacji) programu sâ
  242. doï doîâczane -- postëpowanie takie znacznie wydîuûa kod
  243. programu, a poza tym w wypadku funkcjonowania kilku programów
  244. jednoczeônie jest wprost zabójcze dla pamiëci (w wypadku Amigi
  245. równieû istniejâ takie biblioteki, ale czësto ich praca ogranicza
  246. sië do otwarcia zewnëtrznej biblioteki i wywoîania jakiejô jej
  247. funkcji). Biblioteki amigowe to wygoda i oszczëdnoôê -- spróbujmy
  248. to udowodniê. W chwili, gdy kilka programów korzysta z takiej
  249. samej funkcji, powiedzmy z file-requestera (okna wyboru plików),
  250. nie muszâ one mieê takiej funkcji w swoim kodzie -- wystarczy, ûe
  251. skorzystajâ z biblioteki systemowej "asl.library", która zawiera
  252. takâ funkcjë. Wykorzystywanie funkcji bibliotecznych oszczëdza
  253. równieû czas przeznaczony na pisanie i testowanie programów, poza
  254. tym dziëki zastosowaniu bibliotek programy sâ podobne do siebie
  255. zarówno pod wzglëdem obsîugi, jak i graficznego interfejsu
  256. uûytkownika (GUI). Spróbujmy sobie wyobraziê, ûe kaûde okno ma
  257. gadûet zamykania w innym miejscu, a zrozumiemy, co znaczy
  258. standard.
  259.  
  260. Czëôê bibliotek znajduje sië w pamiëci staîej komputera (od
  261. systemu 2.0 jest tego 512 KB), pozostaîe biblioteki znajdujâ sië
  262. na dysku, przewaûnie w katalogu "LIBS:". Podstawowâ bibliotekâ
  263. jest "exec.library", bez jej udziaîu nie jest moûliwe
  264. funkcjonowanie wîaôciwie ûadnego programu. Biblioteka ta jest
  265. otwierana przy inicjacji systemu i pozostaje otwarta do koïca
  266. jego pracy. W jej zasobach znajdujâ sië funkcje sîuûâce do
  267. przydzielania pamiëci, otwierania innych bibliotek oraz wiele
  268. innych niezwykle poûytecznych narzëdzi. Ze wzglëdu na swój
  269. specyficzny charakter biblioteka Exec musi byê dostëpna dla
  270. kaûdego i w kaûdej chwili. Z tej wîaônie przyczyny, w
  271. przeciwieïstwie do pozostaîych bibliotek, nie ma potrzeby jej
  272. otwierania.
  273.  
  274. <sr>Dlaczego otwieramy biblioteki?
  275.  
  276. <txt>Biblioteka podczas otwierania jest umieszczana w pamiëci,
  277. jeôli pochodzi z dysku, jeôli natomiast pochodzi z ROM-u, to
  278. pozostaje w nim, a w pamiëci RAM zapisywana jest jedynie
  279. pomocnicza struktura opisujâca bibliotekë. W celu otwarcia
  280. biblioteki naleûy posîuûyê sië funkcjâ Execa:
  281.  
  282. <l>struct Library *OpenLibrary( UBYTE *libName, unsigned long version );
  283.  
  284. <txt>Pierwszym argumentem funkcji jest wskaúnik na nazwë
  285. biblioteki, drugim minimalna wymagana wersja biblioteki. Jeûeli
  286. funkcja odnajdzie ûâdanâ bibliotekë w odpowiedniej wersji, to
  287. zwróci adres opisujâcej jâ struktury "Library", w przeciwnym
  288. wypadku zwróci 0 (NULL). Dlaczego istnieje parametr ograniczajâcy
  289. wersjë biblioteki? Odpowiedú jest prosta: biblioteki rozrastajâ
  290. sië i majâ coraz wiëcej funkcji, programiôci sâ i czësto muszâ
  291. byê wybredni, wîaônie dlatego umiera system w wersji 1.3, a
  292. poprzednie juû zostaîy pochowane. Funkcja OpenLibrary w tej
  293. formie pojawiîa sië w systemie 1.2 -- wczeôniej istniaîa funkcja
  294. o tej samej nazwie róûniâca sië tym, ûe nie sprawdzaîa, jakâ
  295. wersjë biblioteki otwiera. Stara funkcja zostaîa zachowana dla
  296. utrzymania zgodnoôci systemu z juû napisanym oprogramowaniem --
  297. obecnie nazywa sië OldOpenLibrary(), ma jedynie pierwszy
  298. argument.
  299.  
  300. Wartoôê zwróconâ przez OpenLibrary() naleûy zapamiëtaê w zmiennej
  301. wskaúnikowej o ôciôle okreôlonej nazwie (np. IntuitionBase dla
  302. "intuition.library", ReqToolsBase dla "reqtools.library" itd.),
  303. poniewaû zmienna ta jest wykorzystywana przy wywoîaniach funkcji
  304. z danej biblioteki.
  305.  
  306. <sr>Dlaczego zamykamy biblioteki?
  307.  
  308. <txt>Kiedy otwarta przez nas biblioteka nie jest nam juû dîuûej
  309. potrzebna, czyli zwykle pod koniec programu, naleûy jâ zamknâê.
  310. Sîuûy do tego funkcja Execa:
  311.  
  312. <l>void CloseLibrary( struct Library *library );
  313.  
  314. <txt>Jako jej parametr naleûy podaê wartoôê zwróconâ przez
  315. OpenLibrary(), czyli wskaúnik na strukturë "Library".
  316.  
  317. Poczâtkujâcy programiôci czësto majâ wâtpliwoôci, czy zamykanie
  318. bibliotek rzeczywiôcie jest potrzebne. Faktem jest, ûe jeûeli sië
  319. biblioteki nie zamknie, to nie bëdzie jakiejô strasznej
  320. katastrofy (nie dojdzie do zawieszenia programu), jednak porzâdny
  321. program ZAWSZE powinien zostawiaê po sobie porzâdek -- jeûeli sië
  322. coô (bibliotekë, czcionkë, plik, okno itd.) otworzyîo (bâdú
  323. utworzyîo), to naleûy to coô zamknâê, aby zapewniê sprawne
  324. dziaîanie systemu, umoûliwiê zwrot przydzielonej przy otwieraniu
  325. pamiëci.
  326.  
  327. Proponujemy przeêwiczyê otwieranie i zamykanie bibliotek na
  328. przykîadzie -- Listing #1.
  329.  
  330. W tym programiku otwieramy biblioteki, ich adresy przechowujemy w
  331. zmiennych o odpowiednich nazwach, po czym zamykamy biblioteki.
  332. Nie korzystamy jeszcze z ûadnych funkcji zawartych w
  333. bibliotekach (nie wszystko naraz).
  334.  
  335. Tym, którzy dopiero zaczynajâ programowaê w C, naleûy sië drobne
  336. wyjaônienie odnoônie jednej z linii programu:
  337.  
  338. <l>if (GfxBase=(struct GfxBase*)OpenLibrary("graphics.library", 0))
  339.  
  340. <txt>Jëzyk C jest dosyê elestyczny i pozwala na jednoczesne
  341. przypisanie wartoôci i sprawdzenie, czy wartoôê ta jest róûna od
  342. zera. Z takimi jëzykowymi idiomami bëdziemy sië czësto spotykaê;
  343. dla "uîatwienia" bëdâ jeszcze wzbogacone o znak "!", czyli po
  344. prostu negacjë (UWAGA: niektóre kompilatory mogâ wygenerowaê
  345. ostrzeûenie o moûliwoôci wystâpienia bîëdu w wypadku takiej
  346. formy, jest ona jednak w peîni poprawna, a ostrzeûenia sâ po to,
  347. by odszukaê literówki -- '=' zamiast '=='). Podobnie naleûaîoby
  348. przypomnieê, co oznacza dziwolâg umieszczony poniûej, ale tym
  349. zajmiemy sië za chwilë.
  350.  
  351. <l>IntuitionBase=(struct IntuitionBase*)OpenLibrary...
  352.  
  353. <sr>Struktura opisujâca bibliotekë
  354.  
  355. <txt>Jak juû mówiliômy, podczas otwierania biblioteki otrzymujemy
  356. wskaúnik na strukturë "Library". Znajomoôê tej struktury nie jest
  357. moûe niezbëdna przy pisaniu programów, zawsze jednak warto
  358. wiedzieê dokîadnie, "co w trawie piszczy". Jednym z jej pól jest
  359. "lib_OpenCnt", w tym polu jest zapisana liczba uûytkowników
  360. korzystajâcych z biblioteki w danej chwili. Jeôli biblioteka
  361. straci wszystkich uûytkowników (pole lib_OpenCnt == 0), to moûe
  362. zostaê usuniëta z pamiëci i tak sië stanie, ale dopiero w wypadku
  363. braków pamiëci. Jeôli problemy braku pamiëci nie wystâpiâ,
  364. biblioteka bëdzie pozostawaê w pamiëci, pomimo iû nikt z niej nie
  365. korzysta (czeka na lepsze czasy). Przejdúmy do pól "lib_Version"
  366. i "lib_Revision". W polach tych zapisany jest numer wersji
  367. biblioteki. Wîaônie po tych polach moûna sprawdziê, z jakâ wersjâ
  368. systemu pracujemy. Patrz Listing #2.
  369.  
  370. W kolejnych programach bëdziemy korzystaê z funkcji check_os(),
  371. której dla oszczëdnoôci miejsca nie bëdziemy za kaûdym razem
  372. przepisywaê, wiëc Czytelnik bëdzie zmuszony doîâczaê jâ (oraz
  373. definicje staîych "OS_xx") do kolejnych programów. Dwa sîowa
  374. odnoônie UWORD w deklaracji funkcji check_os() -- jest to nic
  375. innego jak "unsigned short int". Analogicznie ULONG oznacza
  376. "unsigned long int", a UBYTE -- "usigned char".
  377.  
  378. W tym krótkim programiku pokazaliômy, jak moûna wykorzystaê
  379. zmiennâ "SysBase", która jest wskaúnikiem na strukturë "ExecBase"
  380. (wartoôê tej zmiennej nadaje doîâczony podczas linkowania
  381. programu moduî startowy, pobierajâc jâ z komórki pamiëci pod
  382. adresem 0x00000004 -- ta informacja jest waûna raczej dla
  383. programujâcych w asemblerze). Zawartoôê struktury "ExecBase"
  384. moûna poznaê analizujâc systemowe inkludy, a ôciôlej mówiâc, plik
  385. "exec/execbase.h". Pierwszym polem tej struktury jest "LibNode"
  386. typu "Library", co oznacza, ûe struktura ta jest rozbudowanâ
  387. wersjâ struktury "Library", dziëki czemu moûemy swobodnie
  388. zastosowaê rzutowanie typów (ang. casting), z którym spotkaliômy
  389. sië juû w pierwszym przykîadzie podczas przypisywania wartoôci
  390. zmiennym "IntuitionBase" i "GfxBase". Poza polem "LibNode"
  391. struktura "ExecBase" zawiera pewne specyficzne dla niej dane,
  392. takie jak np. adres obecnie wykonywanego zadania ("ThisTask"),
  393. typ procesora ("AttnFlags") oraz wiele innych, czësto prywatnych,
  394. informacji (tj. takich, których aplikacje nie powinny
  395. wykorzystywaê).
  396.  
  397. Do danych zawartych w polu LibNode struktury "ExecBase" moûemy
  398. odwoîywaê sië na dwa róûne sposoby:
  399.  
  400. <l>ver=SysBase->LibNode.lib_Version;
  401.  
  402. ver=((struct Library*)SysBase)->lib_Version;
  403.  
  404. <txt>Analogicznie moûemy postëpowaê z pozostaîymi rozbudowanymi
  405. strukturami, opisujâcymi biblioteki:
  406.  
  407. <l>opc=IntuitionBase->LibNode.lib_OpenCnt;
  408.  
  409. opc=((struct Library*)IntuitionBase)->lib_OpenCnt;
  410.  
  411. <txt>Odwoîania te wskazujâ dokîadnie na të samâ zmiennâ, obie
  412. formy sâ poprawne.
  413.  
  414. Powróêmy do struktury "ExecBase". Zapoznajmy sië z kolejnym
  415. przykîadem. Patrz Listing #3.
  416.  
  417. Pole "ThisTask", jak juû wspomnieliômy, zawiera adres struktury
  418. "Task", w której znajdujâ sië informacje o wykonywanym w danej
  419. chwili zadaniu, a wiëc naszym programie. Informacji tych jest
  420. caîa masa (patrz "exec/tasks.h"), my pobieramy tylko te o nazwie
  421. procesu (bëdzie to najprawdopodobniej "Shell Process", choê mogâ
  422. sië zdarzyê i inne) oraz jego priorytecie (niemal zawsze 0).
  423.  
  424. Komentarza moûe wymagaê uûyty w nim "for". Staîe symboliczne
  425. "AFB_68xxx" sâ zdefiniowane w pliku "exec/execbase.h". Staîa
  426. AFB_68010 ma wartoôê 0, AFB_68020 to 1 itd. Dane zawarte w polu
  427. "AttnFlags" sâ zapisane w formie maski bitowej; gdy jest obecny
  428. dany procesor, to bit o numerze "AFB_68xxx" jest ustawiony,
  429. ustawione sâ jednak równieû niûsze bity, tyczâce sië starszych
  430. procesorów -- z tego powodu zastosowaliômy pëtlë z licznikiem
  431. malejâcym, zaczynajâcâ sprawdzanie od najnowszych procesorów.
  432. Warunek "licznik==-1" bëdzie speîniony dla procesora MC68000,
  433. który nie jest odnotowany w "AttnFlags". Przykîad ten wyôwietli
  434. nieprawdziwe informacje dla procesora MC68060 (potraktuje go
  435. najprawdopodobniej jako MC68040), jako ûe odpowiedniej staîej
  436. brakuje w pliku "exec/execbase.h". Warto w tym momencie wspomnieê
  437. o róûnicy pomiëdzy staîymi "AFB_68xxx" i "AFF_68xxx": staîe "B"
  438. oznaczajâ NUMER bitu, a staîe "F" sâ gotowâ MASK bitowâ (moûna
  439. by nieformalnie napisaê: "F"=1<<"B"). Radzimy o tym pamiëtaê,
  440. poniewaû jest to ogólnie uûywana konwencja, a pomylenie jednych
  441. staîych z drugimi staje sië przyczynâ bîëdnego dziaîania
  442. programu.
  443.  
  444. Na tym koïczymy dzisiejszy odcinek i zapraszamy do lektury
  445. nastëpnej czëôci kursu. A za miesiâc bierzemy sië do okien,
  446. zajmiemy sië równieû informacjami pochodzâcymi od okna.
  447.  
  448. <przyp>
  449. Zalecana literatura:
  450.  
  451. -- Inkludy (pliki dla kompilatora).
  452.  
  453. -- AutoDoce (podzielony na poszczególne biblioteki i "device'y",
  454. przesortowany alfabetycznie suchy opis wszystkich funkcji systemu
  455. operacyjnego).
  456.  
  457. -- "AMIGA ROM Kernel Reference Manual: Libraries, Devices"
  458. (przystëpnie napisany opis poszczególnych czëôci systemu
  459. operacyjnego, masa przykîadów).
  460.  
  461. -- Brian W. Kerninghan, Dennis M. Ritchie "Jëzyk ANSI C", WNT,
  462. Warszawa, 1994.
  463.