You are on page 1of 35

IDZ DO

PRZYKADOWY ROZDZIA
SPIS TRECI

KATALOG KSIEK
KATALOG ONLINE
ZAMW DRUKOWANY KATALOG

TWJ KOSZYK
DODAJ DO KOSZYKA

CENNIK I INFORMACJE
ZAMW INFORMACJE
O NOWOCIACH
ZAMW CENNIK

CZYTELNIA
FRAGMENTY KSIEK ONLINE

Wydawnictwo Helion
ul. Chopina 6
44-100 Gliwice
tel. (32)230-98-63
e-mail: helion@helion.pl

Kylix. Czarna ksiga

Autorzy: Don Taylor, Jim Mischel, Tim Gentry


Tumaczenie: Marcin Pancewicz
ISBN: 83-7197-565-1
Tytu oryginau: Kylix Power Solutions
Format: B5, stron: 328

Kylix, pierwsze narzdzie typu RAD (Rapid Application Development) dla systemu
operacyjnego Linuks jest rodowiskiem projektowym dla programowania aplikacji
graficznego interfesju uytkownika (GUI), aplikacji WWW oraz baz danych. Napisana przez
dowiadczonych programistw, ta ksika jest po prostu obowizkow pozycj dla
kadego programisty Kyliksa.
Kylix Power Solutions ma dwa gwne cele: jak najszybciej zapozna ci
z programowaniem Linuksa oraz dostarczy gotowych, sprawdzonych rozwiza
najczciej wystpujcych programistycznych problemw. Przedstawione przykady
obejmuj szeroki zakres zagadnie, od kontrolowania KDE po wzajemn komunikacj
midzy procesami. Kady przyklad obejmuje szczegowe omwienie zagadnienie
i zawiera kod rodlowy programu wykorzystujcego omawian strategi.
Ta ksika pomoe Ci w:
Jak najlepszym wykorzystaniu Kyliksa, bezporednio po wyjciu z opakowania.
Poznaniu zasadniczych rnic pomidzy programowaniem w Linuksie i w Windows
i to w rekordowo krtkim czasie.
Uruchamianiu, kontrolowaniu, zamykaniu i komunikowaniu si z innymi aplikacjami
z wntrza swoich programw.
Programowym ustawianiu i modyfikowaniu systemowych uprawnie Linuksa.
Monitorowaniu procesw w systemie.
Uyciu systemowego programu cron do ukadania harmonogramw zada
administracyjnych.
Implementowaniu wsplnych bibliotek obiektw.
Tworzenie moduw interfejsu Pascala dla istniejcych bibliotek jzyka C.
Tworzeniu wasnego systemu pomocy -- wcznie z wasn przegldark.
Rozwizywaniu codziennych programistycznych problemw w Kyliksie.
Co znajdziesz w tej ksice dla siebie:
Przegld systemu operacyjnego Linux, w porwnaniu z Windows.
Wprowadzenie do jzyka C dla programistw Pascala.
Przykady rozwiza rnorodnych programistycznych problemw Linuksa i Kyliksa,
wraz z omwieniami i przykadami kodu.
Ta ksika powstaa dla:
Programistw Delphi przenoszcych si do Kyliksa.
Programistw Visual Basica chccych przenie swoje programy do Linuksa.
Obecnych programistw Linuksa chccych tworzy aplikacje graficznego interfejsu

"
"
"
"
"
"
"
"
"
"
"
"
"
"
"
"

Spis treci
O Autorach .........................................................................................................11
Wprowadzenie .....................................................................................................13

Cz I

Z Delphi do Kyliksa .................................................................. 17

Rozdzia 1. Porwnanie rodowisk ........................................................................19


Rnice pomidzy rodowiskami.............................................................................................19
Rnice systemowe ................................................................................................................. 20
Rnice wystpujce w rodowisku programowania ................................................................... 22
Open Source ........................................................................................................................... 23

Okna w Linuksie.......................................................................................................................24
System X Window .................................................................................................................. 24
Meneder okien....................................................................................................................... 25

Gdzie znale wicej informacji ..............................................................................................27


Rozdzia 2. Krtki wykad na temat Linuksa ..........................................................29
Pliki i katalogi..........................................................................................................................29
Nazwy plikw i katalogw........................................................................................................ 30
cza do plikw ...................................................................................................................... 32
Wasno plikw i katalogw .................................................................................................... 33
Do czego su te katalogi?....................................................................................................... 35

Techniki programowania Linuksa ............................................................................................36


Koncepcja wywoa systemowych............................................................................................ 37
Procesy i sygnay..................................................................................................................... 38
Programowanie wtkw........................................................................................................... 39
Komunikacja pomidzy procesami ............................................................................................ 40

System plikw /proc ................................................................................................................43


Gdzie znale wicej informacji ..............................................................................................44
Rozdzia 3. Korzystanie z bibliotek ........................................................................45
Tworzenie obiektu wsplnego i korzystanie z niego ................................................................46
Tworzenie grupy projektw...................................................................................................... 46
Biblioteka Hello....................................................................................................................... 47
Wywoywanie funkcji bibliotecznych......................................................................................... 48
Udostpnianie bibliotek ............................................................................................................ 49

Konwencje wsplnych bibliotek..............................................................................................50


Konwencje nazywania bibliotek ................................................................................................ 50
Gdzie umieci biblioteki? ........................................................................................................ 52
Gdzie Linux szuka bibliotek? .................................................................................................... 52
Kylix a zgodno z konwencj bibliotek..................................................................................... 53
Zabawa z nazwami funkcji ....................................................................................................... 54

C:\Andrzej\PDF\Kylix. Czarna ksiga\!Spis-08.doc

Kylix. Czarna ksiga

Dynamiczne adowanie bibliotek .............................................................................................55


Inicjalizacja i kocowe dziaania bibliotek .................................................................................. 58
Gdzie szuka bibliotek funkcja dlopen......................................................................................... 58

Przenoszenie bibliotek pomidzy platformami .........................................................................58


Konwencje wywoa ............................................................................................................... 59
Nazwa biblioteki...................................................................................................................... 59
Typ uchwytu biblioteki ............................................................................................................ 60
Modu ShareMem.................................................................................................................... 60
Kod startowy biblioteki ............................................................................................................ 60
Modu interfejsu dla rnych platform ....................................................................................... 61

Gdzie znale wicej informacji ..............................................................................................63


Rozdzia 4. Podstawy C dla programistw Kyliksa .................................................65
Podrcznik C dla programisty Pascala.....................................................................................66
Typy danych C i Pascala.......................................................................................................... 66
Zmienne, struktury, unie oraz typy............................................................................................ 68
Operatory jzyka C ................................................................................................................. 70
Instrukcje sterujce i ptle ........................................................................................................ 73
Wskaniki .............................................................................................................................. 75
Funkcje i procedury.............................................................................................................. 78
Pozostae zagadnienia .............................................................................................................. 79
Elementy C++......................................................................................................................... 81

Uywanie bibliotek C w Kyliksie ............................................................................................83


Tworzenie programw za pomoc polecenia make ..................................................................... 84
Tworzenie moduu interfejsu .................................................................................................... 86

Gdzie znale wicej informacji ..............................................................................................92

Cz II

Przykady programowania Kyliksa............................................... 95

Rozdzia 5. Kontrolowanie procesw .....................................................................97


5.1 Zastpowanie biecego procesu nowym programem........................................................98
Przykad: program execTest ................................................................................................... 100

5.2 Uruchamianie procesu potomnego....................................................................................104


Przykad: tworzenie procesu potomnego z programu konsolowego............................................. 105
Przykad: tworzenie procesu potomnego w aplikacji graficznego interfejsu uytkownika .............. 106

5.3 Uruchamianie programu i czekanie na zakoczenie jego dziaania...................................107


Przykad: program forkWait ................................................................................................... 107

5.4 Tworzenie procesu dziaajcego w tle.............................................................................109


Przykad: program bgTest ...................................................................................................... 109

5.5 Niszczenie procesu...........................................................................................................110


Przykad: program CrashTestDummy...................................................................................... 110
Przykad: modu ProcStuff ..................................................................................................... 112
Przykad: program KillerApp .................................................................................................. 116

5.6 Ustalanie priorytetw procesw ......................................................................................118


Przykad: program priTest ...................................................................................................... 120

5.7 Zmniejszanie obcienia systemu.....................................................................................121


Przykad: program Sleeper...................................................................................................... 122

5.8 Uzyskiwanie informacji na temat identyfikatora procesu oraz uytkownika.....................124


Przykad: program GetPID ..................................................................................................... 125

5.9 Uzyskiwanie szczegowych informacji na temat procesu ...............................................127


Przykad: wyliczanie procesw ............................................................................................... 128
Przykad: uzyskiwanie linii polecenia procesu ........................................................................... 129

C:\Andrzej\PDF\Kylix. Czarna ksiga\!Spis-08.doc

Spis treci

Przykad: uzyskiwanie rodowiska procesu .............................................................................. 131


Przykad: uzyskiwanie pliku wykonywalnego, katalogu gwnego
oraz katalogu roboczego procesu .......................................................................................... 131
Przykad: uzyskiwanie informacji na temat plikw otwartych przez proces ................................. 132
Przykad: uzyskiwanie szczegowych informacji na temat procesu............................................ 134

5.10 Ograniczanie dziaania procesu do pojedynczej instancji ..............................................136


Przykad: program OneInst..................................................................................................... 137

5.11 Ustalanie harmonogramu dziaania procesu ...................................................................140


Przykad: skrypt startdummy .................................................................................................. 141
Przykad: program RunAt....................................................................................................... 141
Przykad: program RunScheduled ........................................................................................... 144

5.12 Uruchamianie procesu przez superuytkownika .............................................................149


Rozdzia 6. Obsuga komunikacji midzy procesami .............................................151
6.1 Podstawowa komunikacja przeprowadzana z uyciem sygnaw.....................................152
Przykad: program SigSender.................................................................................................. 154

6.2 Uzyskiwanie opisw poprawnych sygnaw systemowych..............................................157


Przykad: program SigNames.................................................................................................. 157

6.3 Tworzenie procedur obsugi sygnaw ............................................................................158


Przykad: program HndSender ................................................................................................ 158
Funkcja sigaction oraz obiekt TSigAction................................................................................. 159
Zarzdzanie zestawami sygnaw ............................................................................................ 161
Przykad: program HndRecvr ................................................................................................. 162

6.4 Zabezpieczanie przed procesami zombie .........................................................................165


Przykad: program KillAllZombies........................................................................................... 165

6.5 Komunikacja z aplikacjami konsoli poprzez potoki .........................................................168


Przykad: program PipeRead .................................................................................................. 169
Przykad: program RunAt (jeszcze raz).................................................................................... 171

6.6 Przekazywanie danych pomidzy potomnym a nadrzdnym procesem GUI......................172


Przykad: PipeParent ............................................................................................................. 173
Przykad: PipeChild ............................................................................................................... 176

6.7 Przekazywanie danych pomidzy niezalenymi procesami GUI .......................................178


Przykad: FIFOSender ........................................................................................................... 179
Przykad: FIFORecvr............................................................................................................. 181

6.8 Koordynowanie procesw za pomoc semaforw...........................................................183


Praca z obiektami IPC ........................................................................................................... 184
Semafory ............................................................................................................................ 185
Funkcje semaforw ............................................................................................................... 185
Tworzenie i otwieranie zestaww semaforw........................................................................... 186
Kontrolowanie semaforw za pomoc funkcji semctl................................................................ 187
Przykad: program OneAtATime............................................................................................. 192

6.9 Wysoko wydajna komunikacja przeprowadzona z uyciem pamici wsplnej ................195


Funkcje pamici wsplnej ...................................................................................................... 195
Tworzenie i otwieranie obiektw pamici wsplnej................................................................... 196
Kontrolowanie obiektw pamici wsplnej............................................................................... 197
Przykad: program shmTalk.................................................................................................... 198

6.10 Komunikowanie si poprzez kolejki komunikatw ........................................................202


Funkcje kolejek komunikatw ................................................................................................ 202
Tworzenie i otwieranie kolejek komunikatw........................................................................... 203
Kontrolowanie kolejek komunikatw....................................................................................... 203
Wysyanie komunikatw ........................................................................................................ 205
Odbieranie komunikatw........................................................................................................ 206

C:\Andrzej\PDF\Kylix. Czarna ksiga\!Spis-08.doc

Kylix. Czarna ksiga

Praca z rnymi rodzajami komunikatw ................................................................................ 207


Kolejki komunikatw i wskaniki............................................................................................ 209
Przykad: prosty dziennik debugowania ................................................................................... 209

Rozdzia 7. Korzystanie z systemu plikw ............................................................213


7.1 Sprawdzanie uprawnie dla pliku....................................................................................213
Przykad: program GetPermissions.......................................................................................... 214

7.2 Definiowanie uprawnie dla pliku...................................................................................216


Przykad: program SetPermissions .......................................................................................... 216

7.3 Implementacja blokowania plikw danych na poziomie plikw......................................218


Przykad: program LockFile.................................................................................................... 219

7.4 Implementacja blokowania plikw danych na poziomie rekordw..................................222


Polecenia blokowania pliku..................................................................................................... 222
Przypadek hipotetyczny ......................................................................................................... 224
Przykad: program LockWriter................................................................................................ 224
Przykad: program LockReader............................................................................................... 228

7.5 Uzyskiwanie atrybutw i informacji na temat pliku..........................................................234


Przykad: program FileInfo ..................................................................................................... 236

7.6 Montowanie innych systemw plikw .............................................................................239


Przykad: program MountTool................................................................................................ 242

Rozdzia 8. Pomoc online ....................................................................................247


Architektura systemu pomocy.................................................................................................247
8.1 Tworzenie prostej przegldarki pomocy..........................................................................248
Przykad: klasa TSimpleHelpViewer........................................................................................ 250

8.2 Dodawanie pomocy do aplikacji......................................................................................255


Przykad: dodawanie pomocy do aplikacji................................................................................ 257

8.3 Wsppraca z zewntrznym systemem pomocy ................................................................258


Formularze SimpleHelp.......................................................................................................... 259
Format plikw pomocy .......................................................................................................... 259
Przykad: implementowanie systemu pomocy SimpleHelp ......................................................... 260
Przyszo pomocy w Kyliksie................................................................................................ 267

Rozdzia 9. Szuflada............................................................................................269
9.1 Uzyskiwanie listy zalogowanych uytkownikw..............................................................270
Przykad: program LogUser.................................................................................................... 272

9.2 Sprawdzanie nie odczytanej poczty..................................................................................274


Przykad: program CheckMail................................................................................................. 275

9.3 Wysyanie poczty pod adresy lokalne ..............................................................................283


Przykad: program PipeMail ................................................................................................... 284

9.4 Uycie programu sendmail z aplikacji..............................................................................287


Wysyanie za pomoc programu sendmail................................................................................ 287
Przykad: program FileMail..................................................................................................... 288

9.5 Posugiwanie si semkowymi maskami uprawnie........................................................292


Przykad: program OctalConv................................................................................................. 292

9.6 Uruchamianie programu jako superuytkownik (ponownie).............................................296


Dziedziczenie i rodowisko..................................................................................................... 297
Przykad: zmiana konfiguracji uytkownika.............................................................................. 299
Przykad: skrypt runsu1 ......................................................................................................... 299
Przykad: skrypt runsu2 ......................................................................................................... 300

9.7 Wykorzystanie dziennikw systemowych do debugowania..............................................301


Systemowe procedury dziennikw .......................................................................................... 302

C:\Andrzej\PDF\Kylix. Czarna ksiga\!Spis-08.doc

Spis treci

Ukryty demon....................................................................................................................... 303


Przykad: program SysLog ..................................................................................................... 305

Skorowidz .........................................................................................................309

C:\Andrzej\PDF\Kylix. Czarna ksiga\!Spis-08.doc

Rozdzia 4.

Podstawy C
dla programistw Kyliksa
Kluczowe zagadnienia:


Podrcznik C dla programisty Pascala

Typy danych C i Pascala

Zmienne, struktury, unie oraz typy

Operatory jzyka C

Instrukcje sterujce i ptle

Wskaniki

Funkcje i procedury

Elementy C++

Wykorzystywanie bibliotek C w Kyliksie

Gdzie znale wicej informacji

Jak wspominalimy w rozdziale 2., Pascal nigdy nie by dla Linuksa gwnym jzykiem
programowania. Ogromna wikszo bibliotek zostaa napisana w C lub C++ i posiada interfejsy oraz przykadowy kod stworzone dla tych wanie jzykw. Istnieje bardzo niewiele
bibliotek stworzonych w Pascalu, a te, ktre powstay, s tak zalene od kompilatora,
dla ktrego zostay napisane, e najprawdopodobniej nie bd nadaway si do uycia
w Kyliksie. Oznacza to, e ty, jako programista Kyliksa, musisz podj decyzj. Jeli nie
chcesz czeka, a kto inny napisze potrzebne ci moduy, moesz albo przepisa same biblioteki, albo stworzy dla nich biblioteki porednie, budujc wasny interfejs API. Jeli wybierzesz pierwsze rozwizanie, spotkamy si za kilka lat, gdy skoczysz projekt. Gdy wybierzesz drugie rozwizanie, bdziesz zadowolony, poniewa Kylix znacznie upraszcza
tworzenie moduw interfejsw umoliwiajcych aplikacjom dostp do bibliotek jzyka C.
Zauwa, e uylimy zwrotu znacznie upraszcza, co niekoniecznie oznacza, e jest to
atwe. W pewnych przypadkach nie jest to nawet moliwe, szczeglnie, jeli biblioteki
zostay napisane w C++ (z wykorzystaniem specyficznych waciwoci tego jzyka).
Mamy jednak powody sdzi, e z czasem ilo bibliotek zgodnych z Kyliksem bdzie
rosa i mamy szczer nadziej, e wkrtce ten rozdzia stanie si niepotrzebny.

C:\Andrzej\PDF\Kylix. Czarna ksiga\04-08.doc

65

66

Cz I K Z Delphi do Kyliksa

Teraz jednak moe si okaza, e bdziesz musia czyta przykady kodu napisanego
w C co stanowi ekscytujce wyzwanie dla programisty Pascala. Jzyk C jest znacznie bardziej zagmatwany ni Pascal i z tego powodu czasem moe przypomina szyfr.
Oglne zrozumienie niektrych struktur tego jzyka pomoe Ci jednak w zrozumieniu
dokumentacji interfejsw API i przykadw kodu stworzonych dla tego jzyka.
W tym rozdziale zaprezentujemy kluczowe informacje potrzebne do zrozumienia interfejsw i przykadw kodu, a take zademonstrujemy, w jaki sposb moesz stworzy
moduy interfejsw Pascala dla bibliotek C. Nie martw si nie bdziemy prbowali
zrobi z Ciebie programisty C. Jeli znasz ju ten jzyk, moesz przej bezporednio
do podrozdziau Wykorzystywanie bibliotek C w Kyliksie.

Podrcznik C dla programisty Pascala


Zagadnienia programowania w C przedstawimy od pocztku, wskazujc te konstrukcje
programowe i waciwoci jzyka, ktre s unikalne dla C. Wskaemy rwnie podobne
waciwoci obu jzykw i zaakcentujemy dzielce je rnice. Zaczniemy od typw danych.

Typy danych C i Pascala


Podstawowe typy danych w C mona podzieli na trzy kategorie typy cakowite, typy
rzeczywiste oraz typy inne zebrano je w tabeli 4.1. Typ jzyka C,  , nie
jest obsugiwany przez wszystkie kompilatory i czasami ma swoj specjaln nazw (na
przykad 
w kompilatorach Microsoftu i Borlanda). Cho wystpuje bardzo
rzadko, wspominamy o nim dla dopenienia obrazu caoci.
Tabela 4.1. Porwnywalne cakowite typy danych
Typ C

Typ Pascala

Opis

Zakres



 

8-bitowa liczba cakowita ze znakiem

128..127



 

16-bitowa liczba cakowita ze znakiem

32 768..32 767

  lub
 

32-bitowa liczba cakowita ze znakiem

2 147 483 648 ..

 

32-bitowa liczba cakowita ze znakiem



2 147 483 647


2 147 483 648 ..
2 147 483 647

 

 

64-bitowa liczba cakowita ze znakiem

9 223 372 036 854 775 808 ..


9 223 372 036 854 775 807






8-bitowa liczba cakowita bez znaku

0..255







16-bitowa liczba cakowita bez znaku

0..65535


 

  lub
 

32-bitowa liczba cakowita bez znaku

0..4 294 967 295




 

32-bitowa liczba cakowita bez znaku

0..4 294 967 295





Brak

64-bitowa liczba cakowita bez znaku

0..18 446 744 073 709 551 615

66

C:\Andrzej\PDF\Kylix. Czarna ksiga\04-08.doc

Rozdzia 4. K Podstawy C dla programistw Kyliksa

67

Tak jak w przypadku wszystkich typw w C, wskaniki mona tworzy dla kadego z typw cakowitych. Omwimy je nieco pniej. W przeszoci pojawia si powany problem
z typami rzeczywistymi (czyli zmiennoprzecinkowymi), poniewa ich implementacja
zmieniaa si zalenie od kompilatora. Oznaczao to, e typy   i  nie byy
przenaszalne, zwaszcza pomidzy rnymi jzykami. Obecnie jednak wikszo kompilatorw przestrzega standardu IEEE (dla wymaga pojedynczej i podwjnej precyzji),
co znacznie zwiksza przenoszalno tych typw. Ale nawet mimo tego, jeli twoja
aplikacja korzysta z tych typw odwoujc si do bibliotek C, pamitaj, aby dokadnie
sprawdzi wyniki (patrz tabela 4.2).
Tabela 4.2. Porwnywalne rzeczywiste typy danych
Typ C

Typ Pascala

Opis

Zakres



 

Liczba zmiennoprzecinkowa
o pojedynczej precyzji

W przyblieniu od 3.4E38
do 3.4E+38





Liczba zmiennoprzecinkowa
o podwjnej precyzji

W przyblieniu od 1.7E308
do 1.7E+308

 

  

Liczba zmiennoprzecinkowa
o potrjnej precyzji

Rny

Typy wyliczeniowe () s uywane w C do tworzenia zmiennych typu cakowitego,


mogcych przyjmowa z okrelonego zestawu wartoci symbolicznych jedn warto
(patrz tabela 4.3).
Tabela 4.3. Porwnywalne inne typy danych
Typ C

Typ Pascala

Opis



Typ wyliczeniowy

Lista wyliczeniowa okrelonych wartoci


cakowitych, wyraana jako typ.

(Kady typ cakowity)

 

Warto boolowska (prawda lub fasz)


" 

 lub !

Wskanik

Wskanik do wartoci typu .


Wskanik bez typu.

Krtka historia typu int


Czytelnicy znaj cy C mog zauway w tabeli 4.1 nieobecno 16-bitowej wersji typu .
Dawniej rozmiar typu danych  zalea od stosowanego kompilatora C i pierwotnie
odpowiada rozmiarowi komputera, dla ktrego by kompilowany program. Obecnie typ 
ma prawie zawsze rozmiar 32 bitw, ale nie jest to zagwarantowane. Gdy pojawi si*
nowe architektury komputerw i nowe kompilatory, typ  z pewnoci stanie si* typem
64-bitowym. Ta zmienno powoduje, e  jest mao popularny w deklaracjach interfejsw
API, wi*c nie natrafia si* na niego zbyt cz*sto. Jeli tak si* jednak stanie, powiniene
dowiedzie si* z innych 1rde, jaki powinien mie rozmiar.
Typ  moe sprawia kopoty szczeglnie wtedy, gdy korzystasz ze starszych bibliotek,
na przykad przenosz c kod ze starych, 16-bitowych programw Windows. W takim
przypadku musisz zwrci uwag* na wymagania programowego interfejsu API i upewni
si*, czy uywasz w swoim kodzie typu cakowitego o odpowiednim rozmiarze.

C:\Andrzej\PDF\Kylix. Czarna ksiga\04-08.doc

67

68

Cz I K Z Delphi do Kyliksa

Wartoci te s wyliczane w deklaracji typu enum, jak pokazano w poniszym przykadzie:


#

$%  &'()%

)  *+

Utworzono tu nowy typ o nazwie  . Zmiennym tego typu mona przypisywa
jedn z trzech wymienionych na licie wyliczenia wartoci, tak jak w:
#


&%  +

Tworzymy zmienn  typu   i ustawiamy jej warto jako sta symboliczn
 . Jest to bardzo podobne (cho nie zamienne) do typu wyliczeniowego w Pascalu; zblionym odpowiednikiem powyszej deklaracji w Pascalu mogoby by:
%
#

&,%  )%

)  -+

Wersja w jzyku C dziaa nieco inaczej, gdy wartoci staych symbolicznych na licie
mog by okrelone albo nieokrelone s wtedy numerowane kolejno poczwszy od
zera. Z perspektywy Pascala poprzednia deklaracja C tworzy zmienn o rozmiarze typu
 i ustawia jej warto na 1.
W jzyku C nie ma jawnego typu  . Zamiast niego warto logiczna jest symbolizowana przez kade wyraenie, dajce warto cakowit. Logiczny fasz odpowiada
wartoci zero, podczas gdy kada warto niezerowa odpowiada logicznej prawdzie. Gdy
musisz przekaza warto logiczn do funkcji API jzyka C, po prostu podaj warto
cakowit o odpowiedniej wielkoci, ustawion jako 0 dla faszu lub jako 1 dla prawdy.
acuchy istniejce w Pascalu nie posiadaj swojego odpowiednika w C. Zamiast tego
uywa on tablic znakw, zakoczonych znakiem pojedynczym o wartoci zero (znakiem null). Ten format nazywany jest formatem zakoczonym zerem lub acuchem
ASCIIZ. acuchy C s przekazywane jako wskaniki do znakw (   w C),
ktre w Pascalu mona przedstawi jako typ  .
Dla wasnej wygody Kylix automatycznie umieszcza bajt o wartoci zero na ko5cu
dugich i szerokich a5cuchw. Uatwia to odwoywanie si* do nich jako do a5cuchw
zako5czonych zerem, gdy wystarczy po prostu zastosowa rzutowanie do typu  .

W odrnieniu od Pascala, C nie posiada operatorw manipulowania acuchami. Mona


nimi operowa za pomoc grupy funkcji przeznaczonych specjalnie do tego celu, takich
jak  ,  czy  . Gdyby chcia uywa take tych funkcji, s one dostpne w Kyliksie po doczeniu do programu moduu .

Zmienne, struktury, unie oraz typy


C przechowuje dane strukturalne na dwa sposoby: jako struktury lub jako unie. Struktura wystpujca w C jest bardzo podobna do rekordu w Pascalu i s one ze sob prawie
zamienne. Poniszy przykad pokazuje struktur w jzyku C oraz odpowiadajcy jej rekord w Pascalu:

68

C:\Andrzej\PDF\Kylix. Czarna ksiga\04-08.doc

Rozdzia 4. K Podstawy C dla programistw Kyliksa

69

 
$
   .  +
 %  +

 .
/+
*+
%  & 
 0 1  +
   1  +
 /1 +
+

Naley zwrci uwag, e te konstrukcje nie s cakowicie rwnowane. Przykad


podany w Pascalu tworzy nowy typ o nazwie , podczas gdy przykad w C nie tworzy typu, gdy do jego stworzenia potrzebne jest sowo kluczowe typedef, ktre zostaoby
zastosowane nastpujco:
%  

$
   .  +
 %  +

 .
/+
* +

Sowo kluczowe   suy w C do tworzenia nowego typu (w tym przypadku typu
o nazwie ), ktry moe by uywany tak jak kady oficjalny typ jzyka. Bez uycia sowa kluczowego typedef zmienne trzeba definiowa przy uyciu sowa kluczowego
, tak jak pokazano poniej:

   . +

Jeli do stworzenia nowego typu zostao uyte sowo kluczowe   , sowo kluczowe  moe zosta pominite.
Unia () w jzyku C podobna jest do posiadajcego warianty rekordu Pascala. Stanowi grup zmiennych zajmujcych w pamici to samo miejsce. Oto przykad unii w C
i odpowiadajcego jej w Pascalu rekordu z wariantami:
%   
$
 
 ."+


2.3)2.(+

 .3) .() .4) .5+
*6
 .54+
% 6
 .54& 

 
"541,6
 71  -+
"(1,3)(1 -+
"81, 3) () 4) 51 -+
+

W obu przykadach pola o rozmiarze bajtu zajmuj w pamici tyle samo miejsca, co pole
4-bajtowe. W rzeczywistoci w jzyku C korzysta si z tej moliwoci dosy czsto,
szczeglnie, gdy potrzebny jest dostp do poszczeglnych bajtw zmiennej.

C:\Andrzej\PDF\Kylix. Czarna ksiga\04-08.doc

69

70

Cz I K Z Delphi do Kyliksa

Jeli musisz stworzy rekord odpowiadajcy okrelonej strukturze lub unii jzyka C,
zwr szczegln uwag na rozmiary poszczeglnych pl skadajcych si na niego
i uyj waciwych typw Pascala odpowiadajcych typom jzyka C. Musz one pasowa do siebie i musz zosta podane w tej samej kolejnoci, w przeciwnym razie pojawi si bdy danych.

Operatory jzyka C
C posiada wicej operatorw ni mgby przypuszcza. Czsto irytuje to programistw
Pascala. Operatory te znajdziesz w przykadach kodu, a cho wikszo z nich posiada
swj odpowiednik w Pascalu, istniej operatory specyficzne wycznie dla jzyka C (na
szczcie, mona znale sposb na obejcie wikszoci z takich operatorw).
Tabela 4.4 przedstawia operatory, ktre speniaj w C i w Pascalu podobne funkcje.
Podstawowe operatory matematyczne s w Pascalu przecione, mog wic by uywane take jako operatory dla acuchw. Taka sytuacja nie zdarza si w jzyku C, w ktrym
nie ma ustawionych typw, a do manipulowania acuchami uywa si funkcji. Operatory porwna numerycznych (na przykad , !, " oraz !") s jednak identyczne z odpowiednimi operatorami Pascala.
Jak wida, wiele operatorw jest do siebie podobnych, ale posiada inn symbolik. Kilka operatorw stosowanych jest w inny sposb na przykad, unarny operator wyuskania wskanika jest stosowany w C po lewej stronie operanda, podczas gdy w Pascalu
znajduje si po prawej stronie. Niektre operatory maj inne znaczenie, ale dziaaj podobnie. Istniej jednak operatory, ktre s unikalne dla jzyka C. S to: trjargumentowy operator warunkowy, operatory inkrementacji i dekrementacji, operatory przypisa
arytmetycznych, operator uzupenienia do jednoci oraz operator przecinka.

Trjargumentowy operator warunkowy


Trjargumentowy operator warunkowy przyjmuje posta #$ i wyglda jak wyraenie
w nawiasach, tak jak w poniszym kodzie:
&,&&39:
:1: :-+

Pierwszy operand w tym operatorze warunkowym jest dowolnym wyraeniem zwracajcym warto logiczn (pamitaj, e w C wartoci logiczn jest kada warto cakowita
traktowana jako warto zerowa lub niezerowa). W tym przypadku wyraeniem tym
jest ""%. Drugim operandem jest warto, ktra zostanie zwrcona przez operator
w przypadku prawdziwoci wyraenia, za trzecim operandem jest warto, ktra zostanie
zwrcona w przeciwnym razie. W Pascalu ten przykad mona przepisa nastpujco:
&3
1&;
;


1&; ;+

Uycie trjargumentowego operatora warunkowego nie jest zbyt czste, gdy sprawia
on, e kod programu staje si trudniejszy do przegldania.

70

C:\Andrzej\PDF\Kylix. Czarna ksiga\04-08.doc

Rozdzia 4. K Podstawy C dla programistw Kyliksa

71

Tabela 4.4. Rwnowane operatory w C i w Pascalu


Operator C

Opis dla jzyka C

Operator Pascala

<

Dodawanie liczb i wskanikw.

<

'

Odejmowanie liczb i wskanikw.

'

Mnoenie liczb.

Dzielenie cakowite i rzeczywiste (w zalenoci od typw


operandw).

 " oraz =

>

Dzielenie modulo.

?

'

Negacja liczby (operator unarny; stosowany do typw cakowitych).

'

&

Przypisanie.

1&

&&

Sprawdzenie rwnoci.

&

@@

Logiczny AND (uywany w wyraeniach warunkowych).

A 

BB

Logiczny OR (uywany w wyraeniach warunkowych).

C

Logiczny NOT (uywany w wyraeniach warunkowych).

0

EE oraz FF

Bitowe przesunicie w lewo i w prawo.

 oraz 

Bitowy AND.

A 

Bitowy OR.

C

Bitowy XOR.

G

Adres (operator unarny; stosowany dla zmiennych lub funkcji).

Wyuskanie wskanika (unarny; stosowany do typw wskanikowych).

'F

Selekcja struktury; stosowany do wskanika do struktury.

I lub !I

Selekcja struktury; stosowany do egzemplarza struktury.

J ,-

Zwraca rozmiar zmiennej lub typu.

 J C,-

,E%F-

Rzutowanie typw (na przykad , - ).

E%F,- (na przykad


  ,- )

Operatory inkrementacji i dekrementacji


Jak sugeruj ich nazwy, operator inkrementacji (&&) oraz operator dekrementacji ('')
inkrementuj i dekrementuj zmienne cakowite i wskanikowe. S one podobne do
procedur  i ( Pascala, jednake w odrnieniu od Pascala, operatory te (podobnie
jak wszystkie inne operatory jzyka C) s w rzeczywistoci funkcjami zwracajcymi
warto operacji. Operatory te mog by umieszczone przed lub za operandem. Cho
operand jest inkrementowany lub dekrementowany bez wzgldu na pooenie operatora,
pooenie to wpywa na przyjmowane w wyraeniu wartoci. Poniewa znaczenie obu
tych operatorw jest identyczne, poniszy kod moe stanowi przykad dla nich obu:

&(3+

&<<+

J&<<+

Na kocu tego przykadu zmienna foo jak moglimy oczekiwa, przyjmuje warto 12.
Prawdopodobnie podejrzewasz take, e zmienna   przyjmuje warto 11, gdy &&  jest
obliczane jako warto operanda po dokonaniu inkrementacji operator jest umieszczony

C:\Andrzej\PDF\Kylix. Czarna ksiga\04-08.doc

71

72

Cz I K Z Delphi do Kyliksa

przed operandem. Moesz si jednak nieco zdziwi dowiadujc si, e wartoci


zmiennej  ) take jest 11. Poniewa operator wystpuje tu za operandem, warto tego
operanda jest stosowana w wyraeniu przed dokonaniem inkrementacji.
Operatory inkrementacji i dekrementacji spotkasz czsto w sytuacjach, w ktrych pomijana jest warto wyraenia. W takim przypadku umieszczenie operatora przed operandem lub za nim nie ma adnego znaczenia, za efekt dziaania operatora jest identyczny
jak dziaanie procedur  i ( w Pascalu. Na przykad instrukcja jzyka C:
<<+

jest identyczna z instrukcj Pascala:


 ,-+

Operatory przypisa arytmetycznych


Programici, ktrzy nie korzystaj z jzyka C czsto uwaaj operatory przypisa arytmetycznych za niepotrzebne skrty zapisu, jednak skoro zastosowanie ich jest bardzo
powszechne, rwnie je tutaj przedstawimy. Operatory te stanowi poczenie dowolnego operatora arytmetycznego lub bitowego z operatorem przypisania, co ilustruje poniszy przykad:
JJ<&K+
% B&(+

Powysze dwie linie mona w Pascalu przepisa jako:


JJ1&JJ<K+
% 1&% C(+

Jak wida, operatory te s jedynie skrtem zapisu, ale prawie kady programista C powie Ci, e krtki zapis to dobry zapis.

Operator uzupenienia do jednoci


Operator uzupenienia do jednoci (*) uywany jest do konwersji dowolnej wartoci
cakowitej w celu jej uzupenienia do jednoci. Taka konwersja wie si z inwersj
wszystkich bitw symbolizujcych operand. Na przykad warto cakowita 17 (binarnie 00010001) zostaa by zamieniona na warto 18 (binarnie 11101110). Operator ten
jest najczciej uywany do tworzenia masek logicznych przeznaczonych do manipulacji
na bitach (gdy okrelony bit zmiennej ma zosta ustawiony na zero).
W Pascalu operator uzupenienia do jednoci jest alternatywn form sowa kluczowego
. Gdy sowo to zostanie zastosowane dla wartoci logicznej, po prostu zaneguje t
warto. Jeli jednak zostanie zastosowane dla typu cakowitego, wykona operacj uzupenienia do jednoci. Dla przykadu spjrzmy na dwa zapisy. Pierwszy jest w jzyku C:


#.LCM6.?AN33(3+
III

"+
III
"@&O#.LCM6.?AN+=2PQJJ2 =

72

C:\Andrzej\PDF\Kylix. Czarna ksiga\04-08.doc

Rozdzia 4. K Podstawy C dla programistw Kyliksa

73

Drugi napisany zosta w Pascalu:




 L?
/1 &R(3+
"
7 1 +
III
7 1&7 A ,0, L?
/--+

Operator przecinka
Skrtowo zapisu, o ktrej wspominalimy wczeniej, moe czasem przybiera dziwne
formy. W jzyku C zdarzaj si sytuacje, w ktrych programista chce, by kilka instrukcji zostao wykonanych kolejno, pragnc jednoczenie, by syntaktycznie pozostay one
wyraeniem pojedynczym (zdarza si to czsto w ptlach , ktre omwimy ju
wkrtce). Operator przecinka jest po prostu przecinkiem umieszczanym pomidzy instrukcjami we wspomnianym wyej celu. Rezultatem powyszej operacji jest wyraenie
skadajce si z kilku instrukcji, ktre zwraca warto instrukcji znajdujcej si po
ostatnim przecinku. Pascal nie posiada odpowiednika tego operatora, lecz nie stanowi to
problemu, gdy w rzeczywistoci w Pascalu nie jest on potrzebny. Natrafienie na instrukcje oddzielone przecinkiem moe jednak sprawia kopot programistom Pascala, ktrzy
przyzwyczaili si do oddzielania instrukcji rednikami. Przykad uycia operatora przecinka pokaemy nieco dalej, w podrozdziale powiconym zastosowaniu instrukcji 
w jzyku C.

Instrukcje sterujce i ptle


Podobnie jak Pascal, jzyk C posiada kilka konstrukcji ptli. Dwie z nich podobne s do
ptli w Pascalu (ptle + oraz ,+). Trzecia z nich (ptla ) nosi t sam nazw, co jedna z ptli w Pascalu, lecz mechanizm jej dziaania jest nieco inny.

Ptle while oraz do/while


Ptle + jzyka C s prawie identyczne z ptlami + w Pascalu (z jedn wan
rnic: o ile warunek ptli w Pascalu musi dawa warto logiczn, o tyle warunek ptli
w C moe by wyraeniem dajcym dowoln warto cakowit.). Ptla wykonywana
jest tak dugo, jak dugo wyraenie posiada warto rn od zera, lub do czasu nakazania wczeniejszego opuszczenia ptli. Oznacza to, e wszystkie ponisze linie s w jzyku C
poprawnymi ptlami:
2  ,S<<2  ,S&S'42  ,S/
. /S.J2S.2
./2 ,--

Istniej (i s do czsto stosowane) take inne formy. Dziki nim ptle mog by konstruowane w bardzo elastyczny sposb, czasem nawet kosztem wikszej ich zoonoci
i zmniejszonej czytelnoci.

C:\Andrzej\PDF\Kylix. Czarna ksiga\04-08.doc

73

74

Cz I K Z Delphi do Kyliksa

Ptle ,+ przyjmuj w C nastpujc posta:




/S+
2  ,2T -+

Ptla ,+ jzyka C jest bardzo podobna do ptli  , Pascala, z tym e
ptla w C jest wykonywana, dopki warunek jest speniony (wyraenie ma warto rn od zera), za w Pascalu ptla jest powtarzana do chwili spenienia warunku (ma
warto true).

Ptle for
Ptla  moe by uwaana za kolejny stosowany w jzyku C zapis skrtowy. Ptla
 (lub bardziej poprawnie, instrukcja ) jest bardzo elastyczna i wydajna, ale moe
by rwnie bardzo zoona. Jej koncepcja przypomina nieco ptl  w Pascalu, gdy
tu take nastpuje inicjalizacja licznika ptli i aktualizowanie go podczas kadego jej
przebiegu. Podstawowa forma tej instrukcji w jzyku C jest nastpujca:
,2T (+2T 4+2T 5
/S+

Instrukcja tworzy ciao ptli i wykonywana jest zero lub wicej razy, w zalenoci od
trzech zawartych w nawiasach wyrae. Pierwsze wyraenie jest wyraeniem inicjalizacyjnym. Jest obliczane raz (na pocztku instrukcji ) i zwykle suy do inicjalizowania
jednej lub wicej zmiennych licznika ptli. Drugie wyraenie jest podobne do wyraenia warunkowego wystpujcego w ptli +. Wyraenie to jest obliczane przy kadym wejciu do ptli. Ptla koczy dziaanie w chwili, gdy wartoci osigan przez to
wyraenie jest zero (lub gdy nakaemy wczeniejsze opuszczenie ptli). Ostatnie z wyrae jest wyraeniem modyfikujcym. Obliczane jest po kadej iteracji ptli i suy
zwykle do inkrementacji zmiennej licznika ptli.
Oto przykad ptli :
, &3+ E(3+ <<% ,:>:) -+

Przykad ten po prostu wypisuje cyfry od 0 do 9. Wyraenie inicjalizacyjne ustawia


zmienn  - na zero. Wyraenie warunkowe powoduje, e ptla jest wykonywana dopty, dopki warto zmiennej idx jest mniejsza od dziesiciu. Wyraenie modyfikujce
zwiksza warto z miennej  - po kadym wykonaniu ptli. Odpowiednik tej ptli
w Pascalu mgby wyglda nastpujco:
L 1&3U
  , );;-+

W instrukcji for mona jednak stosowa take kilka innych rozwiza. Kade z wyrae
w nawiasach jest opcjonalne. Innymi sowy, mona zastpi je instrukcj pust skadajc
si wycznie ze rednika. Ponisza instrukcja jest jak najbardziej poprawna (cho nie
jest zbyt uyteczna, gdy powoduje niekoczce si wykonywanie bezuytecznej ptli):
,++-+

74

C:\Andrzej\PDF\Kylix. Czarna ksiga\04-08.doc

Rozdzia 4. K Podstawy C dla programistw Kyliksa

75

W jzyku C dozwolone jest, by program modyfikowa warto indeksu ptli wewntrz


jej ciaa. W Pascalu spowodowaoby to bd kompilacji.
Kade z wyrae wystpujcych w nawiasach moe stanowi rozdzielon przecinkami
list instrukcji (o czym wspominalimy wczeniej, przy okazji omawiania operatora
przecinka). Oto przykad:
, &3)S&3+

V WD&3+
S<&,
VSW&&;;9(13-)
V <<W&
VS<<W-+

Cho kod ten nie zdobyby nagrody za czytelno, zapisana w nim instrukcja jest poprawn
instrukcj jzyka C. (Jeli nie moesz zorientowa si, do czego ona suy, wyjaniamy,
e po prostu usuwa spacje z acucha znakw o nazwie ). Niestety, niektrzy programici C niektrzy, nie wszyscy zdaj si przyjmowa instrukcje takie jak ta za
moliwy do przyjcia kod, co sprawia, e czytanie przykadowych programw staje si
bardzo trudne. (Syszaem kiedy tak krytyczn uwag na temat jzyka C: Musi by
co nie tak z jzykiem, ktry atwo pozwala na wskazanie instrukcji i stwierdzenie
Zao si e zgadniesz do czego suy ta linia kodu.)

Wychodzenie z ptli: break i continue


Podobnie jak Pascal, jzyk C posiada dwa strukturalne mechanizmy wczeniejszego
opuszczania ptli. Tymi mechanizmami s instrukcje  . oraz ; dziaaj one
identycznie jak procedury  . i  w Pascalu. Instrukcja  . powoduje natychmiastowe zakoczenie dziaania ptli i przejcie do pierwszej instrukcji pojawiajcej si za ptl. Instrukcja continue nie powoduje wyjcia z ptli, lecz jedynie pominicie
pozostaej czci jej ciaa i rozpoczcie nastpnej iteracji.

Wskaniki
Cho Pascal obsuguje wskaniki, jednak jego programici nie wykorzystuj ich tak czsto jak programici C. W jzyku C wskaniki stanowi podstawowy element programu,
s uywane wszdzie i rozumiane przez wszystkich. (Lub prawie wszystkich nawet
zatwardziali programici C maj z nimi czasem problemy.)
Wskanik (ang. pointer) jest adresem okrelonego miejsca znajdujcego si w pamici.
Wskaniki umoliwiaj programistom przekazywanie parametrw przez referencj (co
omwimy wkrtce), prac z dynamicznie alokowan pamici oraz efektywne reprezentowanie zoonych struktur danych. Wskaniki cile wi si te z tablicami.
Spjrzmy na przykad w jzyku C:

 &43+

%+

deklarujemy w nim zmienn cakowit  - oraz zmienn , bdc wskanikiem do


egzemplarzy typu . Na razie wskanik nie zosta zainicjalizowany, co oznacza, e
wskazuje przypadkowe miejsce w pamici. W tym momencie prba wyuskania takiego

C:\Andrzej\PDF\Kylix. Czarna ksiga\04-08.doc

75

76

Cz I K Z Delphi do Kyliksa

wskanika najprawdopodobniej doprowadziaby do zniszczenia programu. Aby wskanik  wskazywa na zmienn  -, konieczne jest uycie poniszej instrukcji:
%&@ +

Uycie tego wskanika przez wyuskanie go spowoduje porednie uycie zmiennej  -.


Na przykad:
%&53+

spowoduje, e warto przechowywana w zmiennej  - zostanie ustawiona na 30.


Standardowym zastosowaniem wskanikw jest poruszanie si po tablicach i innych
strukturach danych. Poniszy przykad pokazuje zawarto tablicy o nazwie / ,
wypisujc j na ekranie:
"
VW&$X)(3)(X)43)4X)3*+
%&"
+
2  ,%D&3% ,:>:)%<<-+

Na szczegln uwag zasuguj dwie linie. Pierwsza z nich to ta, w ktrej deklarowana
jest zmienna . Zwr uwag, e zmiennej , wskanikowi do wartoci typu ,
przypisywana jest zmienna /  bdca odniesieniem do tablicy wartoci typu .
Wszystkie tablice w jzyku C mog by przekazywane jako wskaniki w wyniku zwyczajnego pominicia operacji indeksowania. W tym przypadku tablica /  (sama,
bez indeksu) stanowi odpowiednik wskanika do typu , co umoliwia wykonanie tego przypisania. Najczciej spotkasz si z tym przy okazji uycia w jzyku C tablic
znakw symbolizujcych acuchy. Tablice te bd przekazywane zwykle przy uyciu
bazowej nazwy tablicy jako typu  .
Drug wart uwagi lini jest ostatnia linia przykadu instrukcja &&. Efektem
dziaania tego wyraenia jest uzyskanie wyuskanej wartoci wskanika w celu wypisania jej na ekranie, a nastpnie inkrementacja samego wskanika. Inkrementacja wskanika dokonana w ten sposb powoduje, e jest on zwikszany o okrelon liczb bajtw,
zgodn z rozmiarem typu, na ktry wskazuje wskanik (ustalan przez kompilator). Przy
inkrementacji wskanikw, procedury  oraz ( w Pascalu dziaaj w ten sam sposb. W wyniku przeprowadzenia tej operacji nie zostaa zmieniana adna pami (mimo
zmiany wygldu wyraenia). Gdyby chcia inkrementowa zawarto pamici wskazywanej przez ten wskanik, musiaby uy nastpujcego wyraenia:
,%-<<+

Zwr uwag na uycie nawiasw (w celu okrelenia kolejnoci poszczeglnych operacji).


Innym powszechnym zastosowaniem wskanikw jest reprezentacja poczonych rekordw (podobnych do wystpujcych w listach poczonych). Najczciej rekordy te
(czyli wzy) s alokowane dynamicznie. Najpierw jednak tworzona jest deklaracja
struktury wza:
%  
0
$
  .  

0  +
*0 +

76

C:\Andrzej\PDF\Kylix. Czarna ksiga\04-08.doc

Rozdzia 4. K Podstawy C dla programistw Kyliksa

77

W ten sposb tworzymy nowy typ noszcy nazw nazwie 0 . Dwukrotne pojawienie
si nazwy typu, w pierwszej i ostatniej linii deklaracji, jest konieczne, aby umoliwi
zastosowanie deklaracji w linii czwartej. Jzyk C nie pozwala na uywanie referencji
wstpnych, wic typ Node nie mgby zosta uyty przed stworzeniem go w ostatniej linii.
Nastpnie tworzymy pierwszy wze listy poczonej, dynamicznie alokujc pami za
pomoc funkcji  12:
0  
&,0 -,
J ,0 --+
 
'F  .  &: :+
 
'F &0M+

Zwr uwag na zastosowanie rzutowania w celu konwersji wskanika do / (zwracanego przez funkcj  12) na wskanik do typu 0 , a take na uycie operatora
) 12 w celu okrelenia iloci bajtw, ktra powinna zosta zaalokowana. Zwr
take uwag na uycie operatora wyboru pola struktury ('!, zwanego take operatorem
strzaki) przy odwoywaniu si do pl w nowo zaalokowanej strukturze 0 , a take na
zastosowanie wartoci 033 do zainicjalizowania wskanika do nieistniejcego nastpnego wza listy. Warto 033 w jzyku C stanowi odpowiednik wartoci  w Pascalu.
Na zakoczenie tworzymy nastpny element listy i ustawiamy pierwszy element tak aby
na niego wskazywa:
0 %&,0 -,
J ,0 --+
%'F  .  &:% 
:+
%'F &0M+
 
'F &%+

Teraz przejcie przez elementy listy sprowadza si ju tylko do uycia poniszej ptli:
,%& 
+%D&0M+%&%'F $
% ,:>
Y :)%'F  .  -+
*

W Pascalu cay ten przykad mona zapisa nastpujco:


%
 0 &!0 +
0 & 
 0 1 +
0 1 0 +
 +
"
L 
1 0 +
 1 0 +
0 2,L 
-+
L 
!I 0 1&; ;+
L 
!I0 1& +
0 2, -+
!I 0 1&;% 
;+

C:\Andrzej\PDF\Kylix. Czarna ksiga\04-08.doc

77

78

Cz I K Z Delphi do Kyliksa


!I0 1& +
L 
!I0 1& +
1&L 
+
2  , EF -

   , !I 0 -+
 1& !I0 +
+

Podobnie jak Pascal, jzyk C obsuguje take wskaniki do funkcji. Jednak o ile w Pascalu sposb deklaracji tego typu wskanika jest bardzo prosty, w jzyku C moe on by
bardzo trudny do odszyfrowania. Oto przykad deklaracji w Pascalu, w ktrej tworzymy
nowy typ o nazwie 4, bdcy wskanikiem do funkcji zwracajcej warto
cakowit i otrzymujcej jako parametr pojedyncz warto cakowit.
#%
L   &L   ,S1  -1  +

A oto identyczna instrukcja zapisana w jzyku C:


%   ,L   -, S-+

Jeli sygnatury funkcji nie s skomplikowane, cao nie jest zbyt trudna do odczytania.
Jednak gdy staj si one bardziej zoone, wskaniki do funkcji s jednymi z najtrudniejszych fragmentw kodu w jzyku C. Nawet dowiadczeni programici C musz
czasem si zatrzyma, wzi gboki oddech i powoli analizowa deklaracj wskanika
do tak zoonej funkcji.

Funkcje i procedury
Wiele konwencji deklarowania i wywoywania funkcji i procedur stosowanych w jzyku C oraz w Pascalu jest podobnych do siebie. Pod wzgldem skadni, funkcja w C nie
rni si od procedury, ktra w C jest po prostu funkcj zwracajc / .
Wszystkie funkcje w C zdefiniowane jako zwracajce cokolwiek innego ni / musz
posugiwa si instrukcj  zwracajc warto do funkcji wywoujcej. Oto przykad:
  " +

Jej odpowiednikiem w Pascalu byoby przypisanie wartoci zwracanej do specjalnej,


niedeklarowanej zmiennej noszcej nazw 5. Odpowiednik powyszego przykadu, w Pascalu wygldaby nastpujco:
6
1&7 +
 +

Podobnie jak w Pascalu, argumenty funkcji jzyka C mog by przekazywane przez dan warto lub przez odniesienie. Jednak w odrnieniu od Pascala, nie istniej w tym
jzyku adne specjalne sowa kluczowe (takie jak np. / ) wskazujce, e argument
przekazywany jest przez odniesienie. Zamiast sw kluczowych uywa si tu wskanikw, tak jak w poniszym przykadzie:

78

C:\Andrzej\PDF\Kylix. Czarna ksiga\04-08.doc

Rozdzia 4. K Podstawy C dla programistw Kyliksa

79

" 
 L   , " ) " $
" <<+
" <&(3+
*

Funkcja przedstawiona w tym przykadzie przyjmuje dwa parametry, zmieniajc przed


swoim powrotem warto obu z nich. Pierwszy argument, valueParam, jest przekazywany
przez warto, zatem dokonane w nim zmiany nie s widoczne w funkcji wywoujcej.
Drugi parametr, /   , przekazywany jest przez odniesienie, wic zmiany jego wartoci dokonane w funkcji 4 bd widoczne take w funkcji wywoujcej.

Pozostae zagadnienia
W tym podrozdziale omwimy kilka rnic pomidzy jzykiem C a Pascalem, ktrych
dotd nie dao si nigdzie przyporzdkowa. Chodzi tu o indeksowanie tablic, dynamiczn alokacj pamici oraz preprocesor jzyka C.

Indeksy tablic
W Pascalu programici mog deklarowa swoje tablice wraz z indeksami obejmujcymi
dowolny zakres wartoci cakowitych. W C indeksy tablic obejmuj zawsze zakres od 0
do rozmiaru tablicy (minus jeden, bo indeks tablicy zaczyna si od zera). Na przykad,
w tej definicji tablicy:
"
V(3W+

poprawne wartoci indeksw dla tablicy /  obejmuj zakres od 0 do 9. Pamitaj, e


indeksy tablic w C zawsze zaczynaj si od zera.
Kolejna wana rnica dotyczy tablic wielowymiarowych. W Pascalu odwoujemy si
do nich nastpujco:
" 1&AV )SW+

Gdyby skadnia taka zostaa uyta w C, oznaczaaby to, e programista chce wykorzysta operator przecinka w sposb sprzeczny z reguami. W C odpowiednik tej instrukcji
wyglda nastpujco:
" &AV WVSW+

Dynamiczne alokowanie pamici


Dynamiczne alokowanie obiektw o znanych rozmiarach wyglda w Pascalu, bardzo
podobnie jak w jzyku C, w ktrym do alokowania i zwalniania pamici dynamicznej
su funkcje  12 oraz 12(podobnie jak procedury 67 oraz 47 w Kyliksie). Dla poniszego przykadu zapisanego w Pascalu:
Z ? , ) J C, 6 --+

odpowiednikiem w jzyku C byby:


%&, 6 #% -,
J , 6 --+

C:\Andrzej\PDF\Kylix. Czarna ksiga\04-08.doc

79

80

Cz I K Z Delphi do Kyliksa

Oba przykady alokuj blok pamici w rozmiarze odpowiednim dla przechowania rekordu typu 5 .
Pascal korzysta w tym celu te z procedur 0+ oraz (. C nie posiada tego mechanizmu, za C++ dysponuje nim w formie operatorw + i .

Preprocesor jzyka C
Temat ten moe atwo rozpta ma wojn, ale nie wolno go w tej ksice pomin.
Preprocesor jest bardzo uyteczn czci jzyka C, moe jednak doskonale gmatwa
czytelno kodu.
Preprocesor jzyka C jest mechanizmem przeznaczonym do podstawiania tekstu, uruchamianym w pierwszym przebiegu kompilatora C. Uywany jest do celw takich jak:
podstawianie zmiennych, internalizacja acuchw czy rozwijanie makr (cho z pewnoci istniej lepsze sposoby wykonania tych zada). Mechanizm podstawiania przyjmuje prost posta, co pokazuje poniszy przykad:
[  A\.0.\A65X
[  ? C\.0A?:]  :
[  N.0.\A6A\.0.\A6=K

Kada z powyszych linii definiuje makro preprocesora skadajce si z nazwy, takiej


jak np. (8909:85, oraz acucha podstawianego w miejsce tej nazwy, takiego jak
np. staa 365. Mona je take traktowa jako zmienne czasu kompilacji, ktre zawieraj
tekst podstawienia. Po przetworzeniu tych dyrektyw wszystkie miejsca wystpienia nazwy w kodzie rdowym zostan zastpione tekstem podstawienia. Zastosowane wczeniej dyrektywy mog zosta uyte w sposb pokazany w poniszym fragmencie kodu:
% ,:>
JS 2% J )>J2/I:)
? C\.0A?)N.0.\A6-+

Preprocesor stworzy nastpujcy kod, ktry moe potem zosta skompilowany w tradycyjny sposb:
% ,:>
JS 2% J )>J2/I:)
:]  :)5X=K-+

Pod tym wzgldem makra preprocesora przypominaj deklaracj  stosowan


w Pascalu, z jedn istotn rnic brak w nich kontroli typw. Makra preprocesora
tworz stae pozbawione typu (stanowi po postu zwyke podstawienie tekstu) i mog
powodowa bardzo trudne do wyledzenia bdy w kodzie.
Kolejnym popularnym zastosowaniem preprocesora jest kompilacja warunkowa. Oprcz
mechanizmu podstawie tekstowych, posiada on moliwo stosowania ograniczonych
konstrukcji logicznych. Dyrektywa ;  oraz powizane z ni ; i ;  pozwalaj na warunkow kompilacj kodu w oparciu o zawarto dowolnego z makr preprocesora. Wemy na przykad poniszy kod:
[  MZ
 ?

 ,: S
 / S JS :-+
[  

80

C:\Andrzej\PDF\Kylix. Czarna ksiga\04-08.doc

Rozdzia 4. K Podstawy C dla programistw Kyliksa

81

Powyszy fragment ma na celu wygenerowanie komunikatu debugowania, ktry zostanie skompilowany tylko wtedy, gdy zdefiniowane zostao makro (:6 preprocesora (na
przykad przy uyciu dyrektywy ;  ). Naley pamita, e sprawdzanie odbywa si
podczas kompilacji, a nie podczas dziaania programu; jeli makro (:6 nie zostanie
zdefiniowane, instrukcja nie bdzie nawet wkompilowana do programu. Kylix posiada
identyczny mechanizm wykorzystujcy dyrektywy <=4(:4> oraz <=:0(4>.
Ten przykad zostanie rozszerzony tak, by zapewnia warunkow kompilacj kodu specyficznego dla okrelonej platformy. W zalenoci od aktualnie uywanej platformy definiowane bd rne makra, za w oparciu o ich definicje kompilowane bd rne
bloki kodu. Wyglda to nieadnie (zgadzaj si z tym nawet puryci jzyka C), ale jest
efektywne i duo atwiejsze ni zajmowanie si osobnymi dla kadej obsugiwanej platformy plikami rdowymi.
Ostatnim popularnym zastosowaniem preprocesora jest doczanie plikw rdowych.
Funkcja ta wykorzystywana jest w praktycznie kadym tworzonym kodzie rdowym C.
Bloki kodu C, zawierajce zwykle definicje makr, deklaracje typw oraz funkcji s zapisywane w tak zwanych plikach nagwkowych. Nazwy tych plikw zwykle posiadaj
rozszerzenie .h. Pliki nagwkowe odpowiadaj sekcjom interfejsw w plikach rdowych Pascala i mog by wykorzystywane przez rne pliki rdowe C poprzez zastosowanie dyrektywy ;  preprocesora. Dyrektywa ta przypomina instrukcj 
Pascala wykonanie jej informuje kompilator o typach, metodach i staych zawartych
w doczanym pliku nagwkowym. Czsto uywan w C dyrektyw jest:
[  E
 IF

ktra powoduje wstawienie zawartoci pliku tekstowego stdio.h w miejscu dyrektywy


; . Plik stdio.h zawiera wiele deklaracji funkcji i staych zwizanych ze standardow bibliotek wejcia-wyjcia jzyka C, a doczenie go powoduje, e kompilator
uzyskuje wszystkie informacje potrzebne do wygenerowania kodu korzystajcego z tej
wanie biblioteki.
Pliki nagwkowe bd Twoim gwnym rdem informacji w trakcie tworzenia moduw interfejsw potrzebnych do skorzystania w kodzie Kyliksa z bibliotek napisanych
w C. Jeli chcesz uywa takich bibliotek i nie by zmuszonym do tworzenia wszystkiego od nowa, powiniene nauczy si czyta i rozmie ich pliki nagwkowe.

Elementy C++
Cho jzyk C++ posiada w wikszoci tak sam skadni jak jzyk C, jednak dysponuje kilkoma dodatkowymi waciwociami, ktre mog stanowi dla Ciebie prawdziwe
wyzwanie. Niektre z tych waciwoci bardzo utrudniaj (a czasem wrcz uniemoliwiaj) uycie bibliotek napisanych specjalnie dla programw C++. Moglibymy napisa
ca ksik o rnicach pomidzy tymi dwoma jzykami, ale wykraczaaby ona daleko
poza temat poruszany w niniejszej ksice. Zamiast tego skupimy si na trzech rnicach, na ktre bdziesz natrafia najczciej prbujc wykorzysta biblioteki zewntrzne: funkcje przecione, funkcje skadowe oraz wyjtki.

C:\Andrzej\PDF\Kylix. Czarna ksiga\04-08.doc

81

82

Cz I K Z Delphi do Kyliksa

Funkcje przeci()one
W jzyku C wszystkie funkcje musz posiada nazwy unikalne. Jednak w C++ dozwolone jest posiadanie dwch funkcji o identycznych nazwach, rnicych si jedynie listami
parametrw. Na przykad, ponisze dwie funkcje:

." , " -+

." ," -+

spowoduj w C bd kompilatora, cho w C++ s jak najbardziej poprawne. Aby zapewni sobie dostp do tej nowej moliwoci i nadal mc korzysta ze starych narzdzi,
projektanci jzyka C++ wykorzystali sygnatur funkcji (ilo i typy parametrw) jako
nazw funkcji przechowywan w skompilowanym kodzie obiektu. W ten sposb istniejce linkery, debugery i inne narzdzia programistyczne mog by uywane nadal
mimo istnienia funkcji przecionych. Ten proces wczania sygnatury funkcji do skompilowanego kodu obiektu nazywany jest dekoracj nazw. Na przykad, nazwa funkcji:
#
L   , ))J-+

zostanie przez kompilator C++ zamieniona na nazw:


#
L   ..L 

Cho jest to niewtpliwie eleganckie rozwizanie problemu prezentacji funkcji przecionych w skompilowanym kodzie obiektu, powoduje jednak problemy, gdy prbuje si
uy tych funkcji w Kyliksie. Udekorowana nazwa funkcji nie wynika w sposb oczywisty z kodu, ale bez jej istnienia nie ma moliwoci poinformowania Kyliksa, ktrej
funkcji ze wsplnej biblioteki C++ chcesz w danej chwili uy.
Istnieje rozwizanie tego problemu, cho nie jest ono zbyt eleganckie. Gdy okrelisz ju
wspln bibliotek, ktrej chcesz uy, moesz przejrze za pomoc programu nm list
funkcji, ktre eksportuje. Program wypisuje list funkcji eksportowanych z pliku
obiektu lub ze wsplnej biblioteki. W przypadku biblioteki C++, nazwy te bd udekorowane. Do odzyskania nazwy udekorowanych funkcji suy program c++filt, dziki ktremu moesz uzyska udekorowan nazw dla kadej z nazw czytelnych. Jak to zrobi?
Po pierwsze, uruchom w linii polece program nm, przekazujc mu jako parametr nazw wsplnej biblioteki i przekieruj jego wyjcie do programu c++filt. Wynik zapisany
na ekranie bdzie wyglda podobnie do przedstawionego poniej:
> 
I
I(B<< 
33333333##
L   , ))33333333 4.%  I

Kolumna pierwsza (sekwencja cyfr) zawiera adres funkcji wewntrz wsplnej biblioteki, podczas gdy kolumna trzecia zawiera nazwy funkcji eksportowanych przez t bibliotek. Zwr uwag, e program c++filt zwraca czytelne nazwy funkcji. Moesz
uy tych pozbawionych dekoracji nazw do zlokalizowania funkcji, ktre chcesz wywoa w swoim kodzie. Nastpnie ponownie uruchom to samo polecenie, tym razem bez uycia filtra c++filt. Na ekranie zobaczysz ponisz list:
> 
I
I(
33333333##
L   ..L 
33333333 4.%  I

82

C:\Andrzej\PDF\Kylix. Czarna ksiga\04-08.doc

Rozdzia 4. K Podstawy C dla programistw Kyliksa

83

Odszukaj funkcj o tym samym adresie i uzyskasz w ten sposb udekorowan nazw,
ktr moesz wskaza w zewntrznej definicji w swoim interfejsie biblioteki.
Mwilimy, e nie jest to zbyt eleganckie wyjcie z sytuacji. W rzeczywistoci nie jest
take stuprocentowo pewne cakowicie zawodzi, gdy w bibliotece s uywane funkcje
skadowe (omwimy je za chwil). Ale moesz przynajmniej od czego zacz. Ta metoda, cho mudna, jest skuteczna w przypadku funkcji C++ nie bdcych funkcjami
skadowymi, szablonami funkcji oraz funkcjami nie zgaszajcymi wyjtkw.

Funkcje skadowe
W C++ funkcje skadowe (funkcje powizane z klas) musz przekazywa jako pierwszy parametr funkcji adres obiektu, dla ktrego zostay wywoane. Normalnie kompilator C++ dokonuje tego automatycznie w sposb niewidoczny dla programisty. Nie
uywasz jednak kompilatora C++ i nie znasz (nie moesz go nawet uzyska) adresu
obiektu C++. Dopki Borland nie wyda pakietu czcego Kylix z C++ Borlanda (podobnego do wersji dla Windows), funkcje skadowe C++ bd dla programistw Kyliksa
niedostpne.

Wyj(tki
Wyjtki w C++ s podobne do wyjtkw w Kyliksie: posiadaj wasna metod powiadomienia funkcji wywoujcej o bdach, ktre wystpiy podczas przetwarzania. Jednak
mechanizmy uywane przez C++ i Kylix z pewnoci nie bd ze sob zgodne. Take
w tym przypadku, o ile Borland nie wyda pakietu czcego C++ z Kyliksem, kada
funkcja C++ zadeklarowana jako zgaszajca wyjtki bdzie dla programistw Kyliksa
niedostpna.

Uywanie bibliotek C w Kyliksie


Zaczlimy ten rozdzia od obietnicy, e poprzez stworzenie dla Pascala odpowiedniego
interfejsu bdziesz mg uywa w programach Kyliksa bibliotek napisanych w jzyku
C. Nadszed wic czas, by zakasa rkawy i zobaczy, jak mona to osign. Sprbujemy wykorzysta bibliotek zewntrzn w projekcie Kyliksa.
Biblioteka, ktrej uyjemy, jest niewielk bibliotek przeznaczon do szyfrowania, wykorzystujc opracowany przez Bruce'a Schneiera algorytm Blowfish,. Jest to biblioteka
szyfrujca dostpna dla wszystkich, wolna od problemw patentowych i wielofunkcyjna
dla wszelkich zastosowa. Jej interfejs API jest tak may, e nie bdziemy mieli problemu
z przedstawieniem w tej ksice jego penej, dostosowanej wersji. Jest on jednoczenie
na tyle praktyczny, e stanowi dobre wprowadzenie do zagadnienia czenia Kyliksa
z bibliotekami zewntrznymi. Pod koniec rozdziau przedstawimy cze do tego pakietu.
Zanim przejdziesz do dalszej czci rozdziau, powiniene wiedzie, e istniej ju implementacje algorytmu Blowfish dla Delphi, ktre mog zosta przeniesione take do Kyliksa.
Przeniesienie istniejcej implementacji jest najprawdopodobniej lepszym rozwizaniem

C:\Andrzej\PDF\Kylix. Czarna ksiga\04-08.doc

83

84

Cz I K Z Delphi do Kyliksa

ni pisanie interfejsu przedstawionego w tym rozdziale. Jednak samodzielne jego napisanie posuy jako przykad praktycznego wykorzystania zasad, ktre poznae w tym
rozdziale.
Pewna liczba bibliotek zewntrznych jest dystrybuowana jako biblioteki statyczne, do
ktrych Kylix nie ma dostpu. W przypadku takich bibliotek wymagane jest przekompilowanie kodu rdowego biblioteki tak, by powstaa wsplna biblioteka (co opisywalimy w rozdziale 3). W tym celu musisz wrci na jaki czas do linii polece i pozna podstawy plikw makefile. Jeli biblioteka zewntrzna jest ju bibliotek wspln,
moesz ten krok pomin (i by z tego bardzo zadowolony).

Tworzenie programw za pomoc polecenia make


Pliki makefile s uywane jako skrypty parametrw programu make, ktry automatyzuje
proces budowy programu wynikowego, kompilujc tylko te pliki rdowe, ktre od
czasu ostatniej budowy ulegy modyfikacji. O korzystaniu z programu make napisano
ju wiele ksiek i artykuw, wic nie bdziemy zagbia si w jego szczegy. Moesz skorzysta z innych ksiek, ale dobrym rdem informacji na ten temat s zainstalowane w systemie strony man. (Jeli pracowae w MS DOS i korzystae z uruchamianych w linii polece wersji Turbo i Borland Pascala, moesz ju zna pewn
odmian plikw makefile i programu make.)
W swojej najprostszej formie plik makefile moe wyglda nastpujco:
 1 I
 ^^  I

Ten minimalny plik ustanawia kilka regu, ktre zostan uyte przez program make do
stworzenia pliku wykonywalnego o nazwie hello. Pierwsza linia okrela zalenoci: plik
hello (zwany celem) jest zaleny od pliku hello.c. Gdy zostanie uruchomiony program
make, sprawdzi, czy plik hello.c zosta zmodyfikowany pniej ni plik hello. Jeli plik
hello.c nie zosta zmodyfikowany, program make zakoczy dziaanie. Jeli jednak plik
rdowy uleg modyfikacji, wykonane zostanie polecenie zawarte w nastpnej linii, co
spowoduje, e cel zostanie zaktualizowany zgodnie z plikami umieszczonymi na licie
zalenoci. Dla reguy pojedynczej moe pojawi si kilka plikw zalenoci, za lista
polece moe przyj dugo potrzebn. Polecenia, ktre s zbyt dugie, mona podzieli na kilka linii, umieszczajc na kocu kadej z nich znak lewego ukonika (?).
Innym elementem, ktry powiniene lepiej pozna, s zmienne plikw makefile. Zmienne te s uywane w wikszoci plikw makefile w celu uatwienia modyfikacji i zrozumienia skomplikowanych regu. Nam mog posuy do uatwienia aktualizacji pliku makefile tak, by stworzy wspln bibliotek.
Zmienne definiowane s przy uyciu standardowo okrelonego przypisania, na przykad
takiego jak to:
LAZ&'

84

C:\Andrzej\PDF\Kylix. Czarna ksiga\04-08.doc

Rozdzia 4. K Podstawy C dla programistw Kyliksa

85

Ta zmienna moe zosta teraz uyta w dowolnym miejscu pliku makefile z wykorzystaniem zapisu =143862, ktry podczas dziaania programu make zostanie zastpiony zawartoci zmiennej. Moesz rozszerzy minimalny plik makefile uywajc zmiennych
(jak pokazuje poniszy przykad):
LAZ&'
A 0A?& 
6L& I
R,A 0A?-1R,6L R,LAZ-^R,A

0A?-R,6L-

Gdy wywoamy dla tego pliku makefile program make, otrzymamy wynik dokadnie taki sam jak w przypadku pliku minimalnego. (Cho w tym przykadzie nie dokonalimy
niczego nowego, poznae zasady, ktre przydadz si w trakcie modyfikacji pliku makefile w celu stworzenia wsplnej biblioteki.)
Aby uatwi sobie zarzdzanie przykadem, stworzylimy szkielet pliku makefile dostarczanego wraz z kodem rdowym biblioteki Blowfish. Listing 4.1 zawiera plik makefile,
ktry zostanie zmodyfikowany w celu stworzenia wsplnej biblioteki.
Listing 4.1. Szkieletowy plik makefile
& 
LAZ&'
A6&
6A0&  
& %I
C]&.
/ I. I. I.I.I
 1R,C]R,A6-R,-R,C]R,6A0-R,-

Zmodyfikowanie pliku makefile tak, by tworzy wspln bibliotek, jest do atwe. Jeli nie odwiedzie podanego pod koniec trzeciego rozdziau adresu URL, moesz uczyni to teraz i zajrze do podrozdziaw Creating a shared library oraz Installing and using
a shared library, znajdujcych si w tym dokumencie. Dziki zapoznaniu si z nimi atwiej
zrozumiesz co robimy.
Aby stworzy wspln bibliotek, kompilator C musi zosta uruchomiony wraz z opcj
@  (dodan do innych uywanych ju opcji) w celu stworzenia kodu zalenego od
pozycji. Wystarczy wic doda t opcj do linii definiujcej zmienn 4386, spowoduje
to, e opcja @  zostanie uyta wszdzie tam, gdzie w pliku makefile zostaa zastosowana ta zmienna:
LAZ&' ^ 

Aby utworzy wspln bibliotek, musimy wykona jeszcze jedno zadanie zebra
skompilowane pliki obiektw w pliku .so. Tene plik makefile wykorzystuje do stworzenia statycznej biblioteki aplikacje ar oraz ranlib. My zastpimy je poleceniami wymaganymi do stworzenia biblioteki wsplnej:

C:\Andrzej\PDF\Kylix. Czarna ksiga\04-08.doc

85

86

Cz I K Z Delphi do Kyliksa


 1R,C]R,-'
 '()'
  ) 2
I
I(Y
' 2
I
I(I3I(R,C]-^

Aby dowiedzie si, do czego su te polecenia, zajrzyj pod adres URL podany na
kocu rozdziau trzeciego. Dokument ten przedstawia take sposb instalowania nowootrzymanej biblioteki wsplnej, nie bdziemy wic omawia go w ksice. Ostateczna
posta pliku makefile zostaa przedstawiona na listingu 4.2.
Listing 4.2. Plik makefile uywany do stworzenia biblioteki wsplnej Blowfish
& 
LAZ&' ' 
A6&
6A0&  
& %I
C]&.
/ I. I. I.I.I
 1R,C]R,-'
 '()'
  ) 2
I
I(Y
' 2
I
I(I3I(R,C]-^

Uff. Wystarczy ju tej linii polece! W nastpnym podrozdziale wrcimy do Kyliksa


i stworzymy modu interfejsu potrzebny do uycia nowej wsplnej biblioteki.

Tworzenie moduu interfejsu


Gdy mamy ju wspln bibliotek, moemy dla niej napisa modu interfejsu. W tym
celu uyjemy dwch plikw jako materiau rdowego. Pierwszym z nich bdzie plik
nagwkowy biblioteki w tym przypadku blowfish.h. Jak pamitasz, pliki nagwkowe zawieraj deklaracje typw, staych oraz funkcji tworzcych dla biblioteki interfejs API. Drugim rdem informacji bdzie dokumentacja interfejsu API biblioteki zawarta w pliku blowfish.doc. Otwierajc plik nagwkowy biblioteki znajdziesz, pokazany na
listingu 4.3, kod rdowy C.
Listing 4.3. Blowfish.h, plik nagwkowy C dla biblioteki Blowfish
=%==2
I=
=% ,-(UUX'(UU8 \ , H%
IA 

" I

#
%/ 
  %    2 
 \ , H%
I-I
#  %    2
2  

 2 0 
%
I

#
 
      '  

 

 2    


   I# 2    

%%   



   )   6)6A)

)) I) + S
  I#   
  2 

   
"   
 %  

  %  


# _
 ,SH%
I-I


86

C:\Andrzej\PDF\Kylix. Czarna ksiga\04-08.doc

Rozdzia 4. K Podstawy C dla programistw Kyliksa

87

%  
 \ ;
) 

 %   

      " I

%/ 

 %) \ 
  "   

  %
  
I
#
     

 % 
%
    ,   -%"  2  %/ I

6 
    
 
   
)2 2 
    ) %   %"   2    

  1
(I6 
  

  
   % 
   )

   
  2 
  I
4I6 
  
  
 %  " % 
   )

   
  2 
   
    =   
%"  2  
   I
5IA" 
  
    



2


% 2 / 2   1
:#
% 
% % 
2 2  
 \ , H%
I-:
# 2;% % ;     
  
 
  % %   1'-I
I    2

%    ,  " "   -
 %%
  ,%%    -
   / 2   1
:#
% 

2 2  # _
 ,SH%
I-:

#_CL#A6 6C7\6\CM0Z;;A;;A0
A0\G 6C6? A66A0#)0M0Z)M#0C#?##C)#_
? A66A0#CL?6_A0#A#\A0L#0LC6A A6#MA6 M6 C
A6A?I00C70#_A#_AM#_C6C6C0#6M#C6A
LC6A0\6#)06#)00#A) A)G? A6\)C6C0`M0#A
A?AZ,0M0Z)M#0C#?##C) 6CM6?0#CLM##M#ZCC
C667+CCLM)A#A)C6 6CL#+C6M00#66M #C0_C76AMA0C0A0\#_C6\CLA#\)_#_60C0#6A#)#6#
A#\)C6#C6#,0M0Z0ZZ0C6C#_6-A60Z0A0\A\
CM#CL#_MCL#_CL#A6)70LA7CL#_ C#\CL
M_A?AZI

#     
    
 % "  " 
 
  " " 
    I I I
  
%
%  %    
     
V   Z0M     IW
=
[   _A6.CL_._
[  _A6.CL_._
[  ..%
%

  ::$
[  
[  L.06\ #(
[  L.6\ #3
=/ 
;
 ; %  "  
2 2/
 A%) 2
 2  I 
 ;8 ;
L.C0Z   ;  '%  ; %
 
   
 A%=
[  L.C0Z


C:\Andrzej\PDF\Kylix. Czarna ksiga\04-08.doc

87

88

Cz I K Z Delphi do Kyliksa


[  L.6CM0(
[  L.CN8
%  
./ .

$
L.C0Z VL.6CM0<4W+
L.C0ZV4XW+
*L.N\+
[   0C 6C#C
" L.
./ ,L.N\/ )  )
-+
" L. . %,
 )
)L.N\/ )
  -+
" L. %,L.C0Z)L.N\/ -+
" L. %,L.C0Z)L.N\/ -+
" L.. %,
 )
)  )
L.N\/
)
 ")  -+
" L.. %,
 )
)  )
L.N\
  )
 " )  )  -+
" L.. %,
 )
)  )
L.N\
  )
 " )  -+
L.% 
," -+
[ 

" L.
./ ,-+
" L. . %,-+
" L. %,-+
" L. %,-+
" L.. %,-+
" L.. %,-+
" L.. %,-+
L.% 
,-+
[  
[  ..%
%

*
[  
[  

Przyjrzyjmy si najpierw dyrektywom preprocesora. Tu za komentarzem dotyczcym


praw autorskich widzimy oglnie stosowany element plikw nagwkowych bibliotek C.
Konstrukcja:
[   _A6.CL_._
[  _A6.CL_._
,%J
PJ2ab% /  Pc2/2 [  

zabezpiecza przed wielokrotnym doczeniem pliku nagwkowego, co spowodowaoby


ze strony kompilatora trudnoci zwizane z ponown definicj typw i innymi tego typu
sprawami. W tym przypadku moesz je zignorowa.

88

C:\Andrzej\PDF\Kylix. Czarna ksiga\04-08.doc

Rozdzia 4. K Podstawy C dla programistw Kyliksa

89

Nastpna linia zawiera kolejn czsto wystpujc w plikach nagwkowych konstrukcj. Makro preprocesora  zostao zdefiniowane tylko w kompilatorach C++
i zastosowano tu je w celu poinformowania kompilatora C++, e wszystko, co zostao
zdefiniowane w tym pliku, korzysta z konwencji nazw jzyka C, a nie C++. Zabezpiecza to kompilator C++ przed generowaniem odwoa do zewntrznych funkcji noszcych udekorowane nazwy. W naszym przypadku rwnie moesz to zignorowa, zwracajc uwag tylko na to, e operujesz bibliotek eksportujc standardowe nazwy C
(a nie udekorowane nazwy C++).
Nastpne linie deklaruj dwie stae: 4:059 oraz 4(:59. Symbole te podporzdkowane s funkcjom wywoujcym, stworzymy wic par wasnych odpowiadajcych im staych. Stae te bd uywane do przekazywania parametrw o nazwie ,
okrelonych w deklaracjach procedur:
#%


L.06\ #&(+
L.6\ #&3+

Nastpne linie definiuj inne makro preprocesora, noszce nazw 43A06, ktre w pliku rdowym zostanie zastpione typem  . Typ danych nazywanych '
  odpowiada typowi 3B Kyliksa. Masz w tej sytuacji do wyboru dwie
moliwoci: moesz zapamita, e 43A06 i 3B s synonimami i samodzielnie
dokona podstawienia, lub zadeklarowa nowy typ i uy go w module interfejsu. Obydwa te rozwizania s skuteczne, ale zdefiniowanie wasnego typu znacznie uatwia
pniejsze przenoszenie kodu. Zadeklarujemy wic nowy typ, nadajc mu nazw 43A06:
#%
L.C0Z& +

Dwie nastpne linie deklaruj stae, ktre bd uywane w bibliotece i ktrych potrzebujemy do poprawnego okrelenia rozmiarw pewnych pl danych. Moesz po prostu
doda je do rozpocztej wczeniej sekcji :


L.6CM0&(+
L.CN&8+

Nastpnie musimy przetumaczy struktur wymagan przez bibliotek. Mamy ju zdefiniowany typ (43A06), dziki ktremu struktura ta jest stosunkowo atwa do odtworzenia. Poniewa staa 4x256 nigdy si nie zmienia, moemy zamiast niej podstawi
sta 1 024. Moemy take stworzy nowy typ wskanikowy, ktry nieco uatwi nam
korzystanie z tej struktury w deklaracjach funkcji:
#%
L.N\&6 
 1AV(IIL.6CM0<4WL.C0Z+
 1AV(II(34WL.C0Z+
 +
 L.N\&!L.N\+

Na tym koczymy tworzenie struktur i staych potrzebnych do korzystania z biblioteki.


Pozostaje nam jedynie przetumaczenie deklaracji funkcji skadajcych si na interfejs
API samej biblioteki. Zwr uwag, e wystpuj tu dwa bloki deklaracji, kady z nich

C:\Andrzej\PDF\Kylix. Czarna ksiga\04-08.doc

89

90

Cz I K Z Delphi do Kyliksa

posiada identyczne nazwy funkcji. Pierwszy blok zawiera pene deklaracje list parametrw funkcji, podczas gdy blok drugi zawiera jedynie ich nazwy. W starszym kodzie C (tak
zwanym K&R C, skrcie pochodzcym od nazwisk twrcw jzyka) deklaracje funkcji
nie zawieray list parametrw. Z czasem jednak okazao si, jak wane s pene deklaracje funkcji (zwane take prototypami funkcji). Jednak sporo bibliotek zawiera deklaracje
funkcji bez list parametrw (w celu zachowania zgodnoci ze starszymi kompilatorami).
W tym pliku nagwkowym programista uy kompilacji warunkowej opartej na makro
0A5AA. Jeli makro to jest niezdefiniowane, kompilator uyje penych prototypw
funkcji z bloku pierwszego. Jeli jest zdefiniowane, kompilator uyje tylko nazw procedur zawartych w bloku drugim. Poniewa Kylix obsuguje pene prototypy funkcji, moemy zupenie zignorowa blok drugi.
Aby mc przetumaczy deklaracje metod, musimy przetumaczy zarwno typ zwracany, jak i list parametrw metody. W przypadku tej biblioteki przetumaczenie typw zwracanych jest atwe, gdy typ inny ni void zwraca tylko jedna funkcja. Funkcjom C zwracajcym w Pascalu / odpowiadaj procedury. Aby przetumaczy listy parametrw,
uyj tabel 4.1, 4.2 oraz 4.3. Wyszukaj typ Pascala dokadnie odpowiadajcy odpowiedniemu typowi jzyka C i stwrz deklaracj parametru. Przyjrzyjmy si bliej pierwszej
z funkcji.
Pierwsza funkcja, 4., posiada trzy parametry. Pierwszym z nich jest wskanik
do struktury 4C:9. Gdy przekazujesz go do funkcji, moesz zaoy, e funkcja modyfikuje zawarto wskazywanej przez niego struktury (tak te stao si w naszym przypadku). Ten parametr zostanie zadeklarowany jako wskanik do struktury 4C:9, tak
jak w deklaracji funkcji w C. Moesz uy typu wskanikowego, ktry wczeniej przewidujco zadeklarowalimy dla typu rekordu:
  L.
./ ,/ 1 L.N\+III

Drugi parametr zaliczamy do typu . Jak pamitasz, rozmiar tego typu zaley od
kompilatora C uytego do skompilowania biblioteki. W wikszoci platform (wcznie
z Linuksem) jest to warto 32-bitowa (ale powiniene si o tym upewni). W tej deklaracji moesz uy typu 3:
  L.
./ ,/ 1 L.N\+ 1  +III

Ostatnim parametrem jest wskanik do zmiennej typu   . Ten typ deklaracji
jest uywany czsto jako wskanik do wystpujcego w pamici obszaru pozbawionego
typu, szczeglnie, gdy wystpuje razem z parametrem okrelajcym dugo (ang.
length), tak jak w tym przypadku. Aby uatwi sobie uycie tego parametru w ten wanie sposb, moesz do jego reprezentacji uy oglnego typu wskanikowego:
  L.
./ ,/ 1 L.N\+ 1  +1   -+

W normalnych warunkach przedstawiona powyej deklaracja byaby ju pena. Jednak


poniewa wywoujesz funkcj C, a nie procedur Pascala, musisz o tym poinformowa
kompilator. Sowo kluczowe   wymusza na kompilatorze Kyliksa zastosowanie
konwencji wywoania C do wywoania kodu dla tej metody. Oto ostateczna forma deklaracji tej procedury:
  L.
./ ,/ 1 L.N\+ 1  +1   -+ +

90

C:\Andrzej\PDF\Kylix. Czarna ksiga\04-08.doc

Rozdzia 4. K Podstawy C dla programistw Kyliksa

91

J*zyki C i C++ uywaj innych konwencji przekazywania do funkcji parametrw ni


Pascal. W Pascalu metoda domylna polega na umieszczaniu parametrw jeden
na drugim w kolejnoci od lewej do prawej, a wywoywany podprogram usuwa je
z utworzonego w ten sposb stosu. Jednak w C parametry s umieszczane na stosie
w kolejnoci od prawej do lewej, za procedura wywouj ca jest odpowiedzialna
zarwno za umieszczenie parametrw na stosie, jak te ich zdj*cie po powrocie
z wywoywanej procedury. Z powodu tych rnic, w przypadku wywoywania zewn*trznych
funkcji C, uycie waciwej konwencji wywoania nabiera duego znaczenia.

Procedura tumaczenia pozostaych funkcji i wypeniania sekcji interfejsu jest podobna.


Gdy zostanie zakoczona, zobaczysz nastpujce deklaracje:
  L. . %, %1   +1   +
/ 1 L.N\+ 1  -+ +
  L.. %, %1   +1   + 1  +
/
1 L.N\+ "1   + 1  -+ +
  L.. %, %1   +1   + 1  +

  1 L.N\+ " 1   +
 1   + 1  -+ +
  L.. %, %1   +1   + 1  +

  1 L.N\+ " 1   +
 1   -+ +
L   L.% 
1 + +

Jestemy wic coraz bliej. Pozostao nam ju tylko dostarczenie w sekcji implementacji
definicji dla funkcji i procedur zadeklarowanych w sekcji interfejsu. W tym celu moesz uy definicji zewntrznych, wskazujc kompilatorowi wspln bibliotek zawierajc implementacje tych metod. Aby to uczyni w sposb uporzdkowany, wr do
sekcji staych i dodaj do nich now sta reprezentujc nazw pliku .so. Nastpnie uyj
tej staej w definicjach zewntrznych:


L &; I
I(;+

Pierwsza procedura, 4., zostanie zaimplementowana w module interfejsu


w sposb nastpujcy:
%  L.
./ +   L   ;L.
./ ;+

Efektem dziaania tej linii jest poinformowanie kompilatora, aby wygenerowa kod
dziaania szukajcy (funkcjonujcy podczas dziaania programu) pliku libbf.so.1 i aby
uy implementacji funkcji 4. dziaajcej w tym pliku jako funkcji wywoywanej we wszystkich miejscach wystpie w plikach rdowych funkcji o tej nazwie.
Pena, kocowa posta moduu interfejsu zostaa przedstawiona na listingu 4.4. Po
skompilowaniu, modu ten moe zosta uyty dokadnie tak samo jak inne moduy Kyliksa. Po prostu docz jego nazw (+ ) do klauzuli  znajdujcej si w pliku
rdowym chccym korzysta z biblioteki Blowfish.

C:\Andrzej\PDF\Kylix. Czarna ksiga\04-08.doc

91

92

Cz I K Z Delphi do Kyliksa

Listing 4.4. Blowfish.pas, peny modu interfejsu dla zewntrznej biblioteki Blowfish
 2
+
 


L.06\ #&(+
L.6\ #&3+
L.6CM0&(+
L.CN&8+
L &; 2
I
I(;+
#%
L.C0Z& +
L.N\&6 
 1AV(IIL.6CM0<4WL.C0Z+
1AV(II(34WL.C0Z+
 +
 L.N\&!L.N\+
  L.
./ ,/ 1 L.N\+ 1  +1   -+ +
  L. . %, %1   +1   +
/ 1 L.N\+ 1  -+ +
  L.. %, %1   +1   + 1  +
/
1 L.N\+ "1   + 1  -+ +
  L.. %, %1   +1   + 1  +

  1 L.N\+ " 1   +
 1   + 1  -+ +
  L.. %, %1   +1   + 1  +

  1 L.N\+ " 1   +
 1   -+ +
L   L.% 
1 + +
%   
%  L.
./ +   L   ;L.
./ ;+
%  L. . %+   L   ;L. . %;+
%  L.. %+   L   ;L.. %;+
%  L.. %+   L   ;L.. %;+
%  L.. %+   L   ;L.. %;+
   L.% 
+   L   ;L.% 
;+
I

Gdzie znale wicej informacji


Biblioteka Blowfish przedstawiona w tym rozdziale jako przykad stanowi cz stworzonej przez Erica Younga biblioteki SSLeay. Cho biblioteka ta nie jest ju aktywnie
rozwijana, jej kod rdowy mona nadal znale w wielu miejscach. Przedstawiony tu
przykad pochodzi z pliku www2.psy.uq.edu.au/~ftp/Crypto/blowfish/libbf.tar.gz. Sam
przykad, wcznie z kodem z tego rozdziau, dostpny jest na stronie WWW tej ksiki.

92

C:\Andrzej\PDF\Kylix. Czarna ksiga\04-08.doc

Rozdzia 4. K Podstawy C dla programistw Kyliksa

93

Dokument HOWTO wspomniany na kocu trzeciego rozdziau stanowi wane rdo


informacji na temat tworzenia wsplnych bibliotek. Jest dostpny pod adresem www.
linuxdoc. org/HOWTO/Program-Library-HOWTO/index.html. Sie WWW jest pena
przykadw i podrcznikw programowania w C. Ze wzgldu na zmienno adresw
w sieci WWW nie podajemy czy do adnego z takich miejsc, ale podanie www.google.
com hasa C programming tutorial lub C programming reference w wyszukiwarce powinno skierowa Ci do mnstwa tego typu czy.

C:\Andrzej\PDF\Kylix. Czarna ksiga\04-08.doc

93

You might also like