Πξνγξακκαηηζκόο Ι (ΗΥ120) Γηάιεμε 21: Μεηαγιώηηηζε θαη ζύλδεζε πνιιαπιώλ αξρείσλ θώδηθα - Βηβιηνζήθεο
Δπαλαρξεζηκνπνίεζε θώδηθα Μεγάιν «ζηνίρεκα» ζηελ βηνκεραλία ινγηζκηθνύ. Ιδαληθά, δελ ρξεηάδεηαη λα μαλαγξάςνπκε θώδηθα πνπ έρεη ήδε γξαθηεί (από θάπνηνπο άιινπο). Πώο ρξεζηκνπνηνύκε θώδηθα πνπ ππάξρεη; Πξνζέγγηζε Α: αληηγξάθνπκε ηνλ πεγαίν θώδηθα, θάλνληαο ίζσο πξνζαξκνγέο γηα ηηο αλάγθεο καο. Πξνζέγγηζε Β: θαινύκε ηνλ εθηειέζηκν θώδηθα, πεξλώληαο ηηο παξακέηξνπο πνπ ρξεηάδνληαη ζύκθσλα κε ηηο νδεγίεο ρξήζεο / πεξηγξαθή ιεηηνπξγηθόηεηαο ηνπ. Τν Β απαηηεί κεραληζκό ζύλδεζεο θώδηθα πνπ έρεη ήδε κεηαθξαζηεί κε ηνλ θώδηθα πνπ γξάθνπκε. 2
Γνκεκέλε αλάπηπμε ζπζηεκάηωλ Ο θώδηθαο ελόο πνιύπινθνπ ζπζηήκαηνο αλαπηύζζεηαη ζηαδηαθά, «ρηίδνληαο» λέα ιεηηνπξγηθόηεηα πάλσ ζηελ ήδε ππάξρνπζα. Πωο ρξεζηκνπνηνύκε ππάξρνπζα ιεηηνπξγηθόηεηα; Mέζσ ηεο αληίζηνηρεο δηεπαθήο πξνγξακκαηηζκνύ (programming interface ή/θαη application programming interface API). Σην πιηθό απηό γίλεηαη κέζσ ηεο αληίζηνηρεο θπζηθήο δηεπαθήο (physical interface): π.ρ. πηλάθηα, θαιώδηα. Πξέπεη λα ηεξνύληαη πνιύ ζπγθεθξηκέλνη θαλόλεο αιιειεπίδξαζεο, ζύκθσλα κε ηηο αληίζηνηρεο πξνδηαγξαθέο ρξήζεο. 3
0A1F68CED90B3020D85F1397C 5D90A3120D35F1197FFFF0131 D28CEB95F3420C85C11100 00B19D5711C210AA00B5A911F F2F8D9C5B3B20B851A0AC10 4 void init(int); int rnd(); hardware interface software interface
hardware documentation 5 void init(int); /* initialize random number generator with a seed; call once, before rnd */ int rnd(void); /* returns next random number */ software documentation
Γηεπαθή Λνγηζκηθνύ Απνηειείηαη (θπξίσο) από δειώζεηο ζηαζεξώλ, κεηαβιεηώλ θαη ζπλαξηήζεσλ. Κάζε ζπλάξηεζε ρξεζηκεύεη γηα έλα ζπγθεθξηκέλν ζθνπό π.ρ. ηελ εθηέιεζε θάπνηαο ιεηηνπξγηθόηεηαο. Η ζεκαζία / θσδηθνπνίεζε ησλ παξακέηξσλ θαη ιεηηνπξγηθόηεηα ησλ ζπλαξηήζεσλ νξίδεηαη κέζσ θαηάιιεισλ πξνδηαγξαθώλ (ηεθκεξίσζε). Γηα λα ρξεζηκνπνηήζνπκε έλα ηκήκα ινγηζκηθνύ, πξέπεη Να ην ζπλδέζνπκε θαηάιιεια κε ην πξόγξακκα καο Να «θαινύκε» ηηο ζπλαξηήζεηο ζύκθσλα κε ηηο πξνδηαγξαθέο. 6
Η Λνγηθή ηνπ Μαύξνπ Κνπηηνύ (Black Box) Μαο ελδηαθέξεη ε ιεηηνπξγηθόηεηα ηνπ θώδηθα πνπ ρξεζηκνπνηνύκε Όρη νη «εζσηεξηθέο» ιεπηνκέξεηεο πινπνίεζεο ηεο. Λνγηθή ηνπ black-box: γλσξίδνπκε ην πσο πξέπεη λα ρξεζηκνπνηήζνπκε θάηη ρωξίο απαξαίηεηα λα γλσξίδνπκε θαη ην πσο (αθξηβώο) απηό «δνπιεύεη». Π.ρ. όηαλ νδεγνύκε, αιιάδνπκε ηαρύηεηεο κε ηνλ κνριό ηαρπηήησλ ζύκθσλα κε θάπνηνπο απινύο(;) θαλόλεο ρωξίο λα γλσξίδνπκε ην πσο ιεηηνπξγεί εζσηεξηθά ν κεραληζκόο επηινγήο / κεηάδνζεο. Π.ρ. ρξεζηκνπνηνύκε κηα ζπλάξηεζε κε βάζε ηελ πεξηγξαθή ηεο ιεηηνπξγηθόηεηαο ηεο (manuals) ρωξίο λα γλσξίδνπκε ην πσο απηή πινπνηείηαη. 7
διεπαθή σπήζηρ 8 εζωηερική ςλοποίηζη λειηοςπγικόηηηαρ (πος δεν βλέπει ο εξωηεπικόρ παπαηηπηηήρ/σπήζηηρ) περιγραθή διεπαθήρ (οδηγίερ σπήζηρ) black box
9 σλοποίηζη ζσζηήμαηος διεύθσνζης περιγραθή διεπαθήρ οι ηποσοί ζηπίβοςν ππορ ηην καηεύθςνζη πος ζηπίβειρ ηο ηιμόνι black box
P1x compiler x -> y P1 y 10 P2x compiler x -> y P2 y P1 y P2 y linker P y CPU y
Σηαηηθή Γηαζύλδεζε P1 P linker P1 P 11 P2 P linker P2 P P3 P linker P3 P
Γπλακηθή Γηαζύλδεζε P1 linker P1 12 P P2 linker P2 P P P3 linker P3 P
Αλάπηπμε απηόλνκωλ ηκεκάηωλ ινγηζκηθνύ Σρεδίαζε πξνγξακκαηηζηηθήο δηεπαθήο: απνθαζίδνπκε ην πσο ζα ρξεζηκνπνηεζεί (πξνγξακκαηηζηηθά) ε ιεηηνπξγηθόηεηα. Καηαζθεπή header file: νξηζκόο ηεο δηεπαθήο κε ηελ κνξθή ελόο header file πνπ ζα ρξεζηκνπνηεζεί (θπξίσο) από ηα πξνγξάκκαηα «πειάηεο». Καηαζθεπή πινπνίεζεο: ζε μερσξηζηό αξρείν πινπνηνύκε ηε ιεηηνπξγηθόηεηα, όπσο νξίδεηαη ζην header file, πνπ κεηαθξάδεηαη γηα λα δεκηνπξγεζεί ην ηκήκα θώδηθα πνπ ζα ζπλδεζεί (αξγόηεξα) κε ηνλ θώδηθα από ηα πξνγξάκκαηα «πειάηεο». 13
Header files ζηελ C Η δηεπαθή πξνγξακκαηηζκνύ ζηελ C νξίδεηαη κέζσ ελόο header file, πνπ πεξηέρεη (α) νξηζκνύο ηύπσλ δεδνκέλσλ, (β) δειώζεηο ζηαζεξώλ θαη θαζνιηθώλ κεηαβιεηώλ, θαη (γ) δειώζεηο ζπλαξηήζεσλ. Οη δειώζεηο κεηαβιεηώλ θαη ζπλαξηήζεσλ πξέπεη λα έρνπλ ηνλ πξνζδηνξηζκό extern, ππνδεηθλύνληαο ζηνλ κεηαγισηηηζηή όηη νη αληίζηνηρεο πινπνηήζεηο ηνπο δελ βξίζθνληαη απαξαίηεηα ζην ίδην αξρείν. Κάλνληαο #include έλα header file, ην πξόγξακκα κπνξεί λα ρξεζηκνπνηεί ηύπνπο, κεηαβιεηέο θαη ζπλαξηήζεηο πνπ πινπνηνύληαη ζε μερωξηζηό ηκήκα ινγηζκηθνύ (ηνλ πεγαίν θώδηθα ηνπ νπνίνπ κπνξεί λα κελ γλσξίδνπκε) θαη λα κεηαθξαζηεί επηηπρώο. 14
Σύλδεζε Όηαλ έλα πξόγξακκα κεηαθξάδεηαη κε βάζε ηηο δειώζεηο πνπ πεξηέρεη έλα header file, ν θώδηθαο πνπ παξάγεηαη από ηνλ κεηαθξαζηή πεξηέρεη αλαθνξέο ζε εμωηεξηθέο κεηαβιεηέο θαη ζπλαξηήζεηο. Γηα λα παξαρζεί ν ηειηθόο εθηειέζηκνο θώδηθαο, απαηηείηαη κηα επηπιένλ δηαδηθαζία ελζωκάηωζεο ησλ νξηζκώλ θαη πινπνηήζεσλ ηνπο, πνπ βξίζθνληαη ζε θάπνην άιιν αξρείν πνπ έρεη ήδε κεηαθξαζηεί. Απηή ε δηαδηθαζία νλνκάδεηαη ζύλδεζε (linking). Αθνύ ν κεηαθξαζκέλνο θώδηθαο ζπλδεζεί κε όια ηα ππόινηπα κεηαθξαζκέλα ηκήκαηα πνπ παξέρνπλ ηνπο νξηζκνύο / πινπνηνύλ ησλ εμσηεξηθώλ κεηαβιεηώλ / ζπλαξηήζεσλ, δεκηνπξγείηαη ην ηειηθό εθηειέζηκν. 15
/* foo.h */ extern int i; extern void boo(); 16 ςλοποιείηαι από σπηζιμοποιείηαι από /* foo.c */ #include "foo.h" int i=0; /* main.c */ #include "foo.h" int main(int argc, char *argv[]) { void boo() { i++; boo(); i++; boo();
/* foo.h */ extern int i; extern void boo(); /* foo.c */ #include "foo.h" int i=0; void boo() { i++; /* foo.c */ #include /* foo.h foo.h */ extern int i; extern void boo(); int i=0; void boo() { i++; /* foo.o */ ------------ 17 i -> 0 boo -> 5 ------------ 0 1 2 3 4 5 6 7 8 > gcc foo.c c o foo.o >
/* foo.h */ /* main.c */ extern int i; #include "foo.h" extern void boo(); /* foo.h */ /* main.c */ #include "foo.h" int main( ) { boo(); i++; boo(); extern int i; extern void boo(); int main( ) { boo(); i++; boo(); 18 /* main.o */ ------------ i ->??? boo ->??? ------------ 0 boo 1 i 2 3 i 4 boo > gcc main.c c o main.o >
/* main.o */ ------------ i ->??? boo ->??? ------------ 0 boo 1 i 2 3 i 4 boo + /* foo.o */ ------------ i -> 0 boo -> 5 ------------ 0 1 2 3 4 5 6 7 8 /* test */ 0 1 2 3 4 5 6 7 8 9 10 11 12 13 19 > gcc main.o foo.o o test >
Πεξηζζόηεξα γηα ην extern Ο πξνζδηνξηζκόο extern ρξεζηκνπνηείηαη γηα ηηο δειώζεηο εμωηεξηθώλ κεηαβιεηώλ / ζπλαξηήζεσλ, πνπ νξίδνληαη / πινπνηνύληαη ζε έλα άιιν αξρείν. Η παξάιεηςε ηνπ extern ζε δήισζε ζπλάξηεζεο (πνπ δελ πινπνηείηαη ηνπηθά) νδεγεί ζε αλαδήηεζε γηα «ηαηξηαζηή» πινπνίεζε ηεο ζπλάξηεζεο ζηα αξρεία κε ηα νπνία γίλεηαη ζύλδεζε ηνπ θώδηθα. Η παξάιεηςε ηνπ extern ζε δήισζε (θαζνιηθήο) κεηαβιεηήο δελ εγγπάηαη ηνπηθόηεηα Aλ κηα άιιε θαζνιηθή κεηαβιεηή δειώλεηαη ζε άιιν αξρείν κε ην ίδην όλνκα, θαηά ηελ δηαζύλδεζε νη αλαθνξέο ζε απηό ην όλνκα ζα αθνξνύλ ηελ ίδηα ζέζε κλήκεο. 20
/* a.c */ int i; void incval() { i++; > gcc a.c c o a.o > gcc b.c c o b.o > gcc a.o b.o o test > >./test 15 16 > /* b.c */ extern void incval(); int main(int argc, char *argv[]) { extern int i; i=15; incval(); 21
/* a.c */ int i; void incval() { i++; > gcc a.c c o a.o > gcc b.c c o b.o > gcc a.o b.o o test > >./test 15 15 > /* b.c */ extern void incval(); int main(int argc, char *argv[]) { int i; i=15; incval(); 22
/* a.c */ int i; void incval() { i++; /* b.c */ extern int i; extern void incval(); int main(int argc, char *argv[]) { i=15; incval(); 23 > gcc a.c c o a.o > gcc b.c c o b.o > gcc a.o b.o o test > >./test 15 16 >
/* a.c */ extern int i; void incval() { i++; /* b.c */ int i; extern void incval(); int main(int argc, char *argv[]) { i=15; incval(); 24 > gcc a.c c o a.o > gcc b.c c o b.o > gcc a.o b.o o test > >./test 15 16 >
/* a.c */ extern int i; void incval() { i++; /* b.c */ extern int i; extern void incval(); int main(int argc, char *argv[]) { i=15; incval(); 25 > gcc a.c c o a.o > gcc b.c c o b.o > gcc a.o b.o o test undefined reference to i >
26 όκσο...
/* a.c */ int i; void incval() { i++; /* b.c */ int i; extern void incval(); int main(int argc, char *argv[]) { i=15; incval(); 27 > gcc a.c c o a.o > gcc b.c c o b.o > gcc a.o b.o o test 15 16 >
/* a.c */ int i; void incval() { i++; /* b.c */ int i; void incval(); int main(int argc, char *argv[]) { i=15; incval(); 28 > gcc a.c c o a.o > gcc b.c c o b.o > gcc a.o b.o o test 15 16 >
/* a.c */ int i; void incval() { i++; /* b.c */ int i; int main(int argc, char *argv[]) { i=15; incval(); 29 > gcc a.c c o a.o > gcc b.c c o b.o > gcc a.o b.o o test >./test 15 16 >
Πεξηζζόηεξα γηα ην static Πσο απνθεύγνπκε κηα θαζνιηθή κεηαβιεηή ή/θαη ζπλάξηεζε πνπ πινπνηνύκε απνθιεηζηηθά γηα ηνπο ζθνπνύο ηνπ ηνπηθνύ θώδηθα ζε έλα αξρείν λα «πξνζπειαζζεί» (θαηά ιάζνο) κέζα από θώδηθα πνπ βξίζθεηαη ζε άιιν αξρείν; Με ηνλ πξνζδηνξηζκό static επηηπγράλεηαη ε επηζπκεηή ηνπηθόηεηα, δειαδή ε εκβέιεηα ησλ θαζνιηθώλ κεηαβιεηώλ / ζπλαξηήζεσλ πεξηνξίδεηαη ζην αξρείν όπνπ απηέο δειώλνληαη / πινπνηνύληαη. Δίλαη αδύλαην λα γίλεη αλαθνξά ζε απηέο (είηε επίηεδεο είηε θαηά ιάζνο) κέζα από θώδηθα πνπ βξίζθεηαη ζε έλα άιιν αξρείν. 30
/* a.c */ int i; void incval() { i++; /* b.c */ static int i; extern void incval(); int main(int argc, char *argv[]) { i=15; incval(); 31 > gcc a.c c o a.o > gcc b.c c o b.o > gcc a.o b.o o test > >./test 15 15 >
/* a.c */ static int i; void incval() { i++; /* b.c */ int i; extern void incval(); int main(int argc, char *argv[]) { i=15; incval(); 32 > gcc a.c c o a.o > gcc b.c c o b.o > gcc a.o b.o o test > >./test 15 15 >
/* a.c */ static int i; void incval() { i++; /* b.c */ extern int i; extern void incval(); int main(int argc, char *argv[]) { i=15; incval(); 33 > gcc a.c c o a.o > gcc b.c c o b.o > gcc a.o b.o o test undefined reference to i >
/* a.c */ int i; static void incval() { i++; /* b.c */ extern int i; extern void incval(); int main(int argc, char *argv[]) { i=15; incval(); 34 > gcc a.c c o a.o > gcc b.c c o b.o > gcc a.o b.o o test undefined reference to incval >
/* a.c */ int i; static void incval() { i++; /* b.c */ extern int i; int main(int argc, char *argv[]) { i=15; incval(); 35 > gcc a.c c o a.o > gcc b.c c o b.o > gcc a.o b.o o test undefined reference to incval >
Έλα «κηθξό» πξόβιεκα Όηαλ έλαο θώδηθαο Α νξίδεη κεηαβιεηέο θαη πινπνηεί ζπλαξηήζεηο κε ζθνπό απηέο λα ρξεζηκνπνηεζνύλ κέζα από νπνηνδήπνηε άιιν θώδηθα, ηόηε απηέο δελ κπνξεί λα δεισζνύλ σο static. Όηαλ ν θώδηθαο Α ζπλδεζεί κε έλα άιιν θώδηθα Β, νη κεηαβιεηέο / ζπλαξηήζεηο ηνπ Α είλαη δηαζέζηκεο γηα ζύλδεζε κε αληίζηνηρεο (άκεζεο ή έκκεζεο) εμσηεξηθέο δειώζεηο πνπ ππάξρνπλ ζηνλ Β. Αλ νη εμσηεξηθέο δειώζεηο ηνπ Β έρνπλ πξνθύςεη από ιάζνο (π.ρ. παξάιεηςε πξνζδηνξηζκνύ static ζε δήισζε θαζνιηθήο κεηαβιεηήο / ζπλάξηεζεο ή παξάιεηςε δήισζεο θαη πινπνίεζεο ζπλάξηεζεο), ε δηαζύλδεζε ζα νδεγήζεη ζε ιάζνο απνηέιεζκα. 36
Η ξίδα ηνπ πξνβιήκαηνο Αλαθνξά ζε εμσηεξηθέο κεηαβιεηέο / ζπλαξηήζεηο γίλεηαη κε βάζε έλαλ επίπεδν ρώξν νλνκάησλ, όπνπ δελ κπνξεί λα απνθιεηζζεί ε ηπραία ρξήζε ηνπ ίδηνπ νλόκαηνο από δηαθνξεηηθά ηκήκαηα θώδηθα. Ο πξνγξακκαηηζηήο δελ έρεη ηε δπλαηόηεηα λα πξνζδηνξίζεη ην ηκήκα ινγηζκηθνύ ην νπνίν ζα πξέπεη λα παξέρεη ηνλ νξηζκό / πινπνίεζε κηαο εμσηεξηθήο κεηαβιεηήο / ζπλάξηεζεο. Άιιεο γιώζζεο ιύλνπλ ην πξόβιεκα δίλνληαο ζε θάζε ηκήκα ινγηζκηθνύ έλα κνλαδηθό όλνκα κε βάζε ην νπνίν άιια ηκήκαηα θώδηθα κπνξεί λα αλαθέξνληαη (ρσξίο πηζαλόηεηα ιάζνπο) ζε κεηαβιεηέο θαη ζπλαξηήζεηο πνπ απηό πξνζθέξεη. 37
Βηβιηνζήθεο Τκήκαηα ινγηζκηθνύ γεληθήο ρξεζηκόηεηαο, πνπ έρνπλ ζρεδηαζηεί κε ζθνπό λα δηεπθνιύλεη ηελ αλάπηπμε δηαθνξεηηθώλ εθαξκνγώλ. Αλαπηύζζνληαη όπσο έλα (ζπκβαηηθό) αλεμάξηεην ηκήκα ινγηζκηθνύ, Με μερσξηζηή κεηάθξαζε θαη (εθ ησλ πζηέξσλ) ζύλδεζε κε ηνλ θώδηθα ησλ πξνγξακκάησλ πνπ ηηο ρξεζηκνπνηνύλ. Οη βηβιηνζήθεο ρξεζηκνπνηνύληαη από ηνπο πξνγξακκαηηζηέο ρωξίο γλώζε γηα ηελ εζσηεξηθή πινπνίεζε ηνπο (black box). Τεθκεξηώλνληαη κέζα από αλαιπηηθέο πεξηγξαθέο ρξήζεο ηεο πξνγξακκαηηζηηθήο δηεπαθήο ηνπο βιέπε εγρεηξίδηα & βηβιία πξνγξακκαηηζκνύ. 38
Αθεξεκέλνο Τύπνο Γεδνκέλωλ (ΑΤΓ) 39 Δίλαη ε πινπνίεζε λέαο ιεηηνπξγηθόηεηαο ζηελ κνξθή ελόο λένπ ηύπνπ δεδνκέλωλ (ζπλήζσο σο έλα black box). Δίλαη έλα ηκήκα ινγηζκηθνύ πνπ θηηάρλεηαη μερσξηζηά, θαη κπνξεί λα ρξεζηκνπνηεζεί κέζσ κηαο (ηεθκεξησκέλεο) δηεπαθήο.
Παξάδεηγκα: Πνιύ κεγάινη αθέξαηνη Λεηηνπξγηθόηεηα γηα αθεξαίνπο αιιά γηα πνιύ κεγάιεο ηηκέο, πνπ ππεξβαίλνπλ (θαηά πνιύ) ηα όξηα ησλ κεγάισλ αθεξαίσλ ηνπ επεμεξγαζηή καο. Μπνξνύκε λα εηζάγνπκε έλα λέν ηύπν δεδνκέλσλ VeryBigInt σο ΑΤΓ, π.ρ. κε πξάμεηο γηα ηελ: αξρηθνπνίεζε κεηαβιεηώλ πξόζζεζε θαη αθαίξεζε κεηαβιεηώλ θιπ Ο πξνγξακκαηηζηήο ρξεζηκνπνηεί ηελ παξαπάλσ ιεηηνπξγηθόηεηα ρσξίο λα λνηάδεηαη γηα ην πσο απηή πινπνηείηαη «εζσηεξηθά» ζηνλ ΑΤΓ. 40
διεπαθή για ηον ηύπο VeryBigInt typedef VeryBigInt; void vbi_set(verybigint *i, char *s); char *vbi_get(verybigint *i); 41 int vbi_add(verybigint *i1, const VeryBigInt *i2); int vbi_diff(verybigint *i1, const VeryBigInt *i2); vbi_set vbi_get vbi_add vbi_diff ανηικείμενο VeryBigInt ωρ black box
/* ελδεηθηηθή δηεπαθή γηα ΑΤΔ VeryBigInt */ typedef VeryBigInt; int vbi_set(verybigint *i, char *s); /* αξρηθνπνηεί ηελ κεηαβιεηή κε βάζε ηελ αθέξαηα ηηκή πνπ πεξληέηαη ωο αιθαξηζκεηηθό, θαη επηζηξέθεη 1 / 0 γηα επηηπρία / απνηπρία */ 42 char *vbi_get(verybigint *i); /* επηζηξέθεη ηελ ηηκή ωο αιθαξηζκεηηθό, ε κλήκε ηνπ νπνίνπ πξέπεη λα απνδεζκεπηεί από ηνλ θαιώλ θώδηθα */ int vbi_add(verybigint *i1, const VeryBigInt *i2); /* i1 = i1 + i2 θαη επηζηξέθεη 1 γηα επηηπρία ή 0 αλ μεπεξαζηεί ην ππνζηεξηδόκελν πεδίν ηηκώλ */ int vbi_diff(verybigint *i1, const VeryBigInt *i2); /* i1 = i1 - i2 θαη επηζηξέθεη 1 γηα επηηπρία ή 0 αλ μεπεξαζηεί ην ππνζηεξηδόκελν πεδίν ηηκώλ */
int main(int argc, char *argv[]) { int res; VeryBigInt i1,i2; char s[512],*s2; scanf("%511s,s); res=vbi_set(&i1,s); if (!res) { printf("set error for %s\n",s); return; 43 scanf("%511s,s); res=vbi_set(&i2,s); if (!res) { printf("set error for %s\n",s); return; res=vbi_add(&i1,&i2); if (!res) { printf("range error\n"); return; s2=vbi_get(&i1); printf("%s\n",s2); free(s2);
Δλδεηθηηθή Υινπνίεζε Κάζε κεηαβιεηή αληηζηνηρεί ζε έλα πίλαθα από ραξαθηήξεο, ζηνλ νπνίν απνζεθεύνληαη ηα δεθαδηθά ςεθία ηεο ηξέρνπζαο ηηκήο σο απινί ραξαθηήξεο. Τν πξόζεκν ηεο ηηκήο απνζεθεύεηαη ζηνλ πίλαθα. Η vbi_set αξρηθνπνηεί ηνλ πίλαθα κε βάζε ην αιθαξηζκεηηθό πνπ πεξληέηαη ζαλ παξάκεηξνο. Η vbi_get δεζκεύεη έλα πίλαθα ραξαθηήξσλ ζηε δπλακηθή κλήκε θαη απνζεθεύεη ηελ ηηκή σο θαλνληθό (εθηππώζηκν) αιθαξηζκεηηθό (κε ηεξκαηηθό). Οη vbi_add θαη vbi_diff πινπνηνύλ ηηο πξάμεηο κε ζπκβνιηθό ηξόπν ςεθίν πξνο ςεθίν.. 44
VeryBigInt i; vbi_set(&i,"-1234"); 45 0 N-1 '-' '0' '0' '1' '2' '3' '4' '5'
Παξάδεηγκα: Τύπνο Date Λεηηνπξγηθόηεηα γηα ηε δηαρείξηζε εκεξνκεληώλ. ΑΤΓ Date, π.ρ. κε πξάμεηο γηα ηελ: αλάζεζε ηηκήο ζε κεηαβιεηή εμαγσγή ηηκήο από κεηαβιεηή αύμεζε κεηαβιεηήο θαηά έλα (κηα κέξα) ζύγθξηζε ησλ ηηκώλ δύν κεηαβιεηώλ Θέινπκε ν πξνγξακκαηηζηήο λα ρξεζηκνπνηεί ηελ παξαπάλσ ιεηηνπξγηθόηεηα ρσξίο λα λνηάδεηαη γηα ην πσο απηή πινπνηείηαη «εζσηεξηθά» ζηνλ ΑΤΓ. 46
διεπαθή για ηον ηύπο Date typedef Date; int date_set(date *dt, int d, int m, int y); void date_get(date *dt, int *d, int *m, int *y); void date_inc(date *dt); int date_diff(date *dt1, Date *dt2); 47 date_set date_get date_inc ανηικείμενο Date ωρ black box date_diff
#define OK 0 #define ILLEGAL_DAY_VALUE -1 #define ILLEGAL_MONTH_VALUE -2 #define ILLEGAL_YEAR_VALUE -3 typedef struct { int day,month,year; Date; 48 int date_set(date *dt, int d, int m, int y); /* αξρηθνπνηεί ηελ κεηαβιεηή κε ηηο ηηκέο πνπ δίλνληαη ζαλ παξάκεηξνη, θαη επηζηξέθεη 0 γηα επηηπρία, δηαθνξεηηθά ηηκή < 0 */ void date_get(const Date *dt, int *d, int *m, int *y); /* απνζεθεύεη ηελ ηηκή ηεο κεηαβιεηήο ζηηο κεηαβιεηέο πνπ δίλνληαη ζαλ παξάκεηξνη */ void date_inc(date *dt); /* πξνρωξά ηελ ηηκή ηεο κεηαβιεηήο θαηά 1 κέξα */ int date_diff(const Date *dt1, const Date *dt2); /* επηζηξέθεη ηε δηαθνξά ηεο εκεξνκελίαο dt2 από ηελ εκεξνκελία dt1, ζε αξηζκό ηωλ εκεξώλ */
Γεκηνπξγία Σηαηηθήο Βηβιηνζήθεο Γεκηνπξγία ηεο πξνγξακκαηηζηηθήο δηεπαθήο θαη ηνπ αληίζηνηρνπ header file. Υινπνίεζε ηεο ιεηηνπξγηθόηεηαο (ζε έλα ή πεξηζζόηεξα αξρεία θώδηθα.c) Μεηαγιώηηηζε θάζε αξρείνπ θώδηθα θαη δεκηνπξγία ελόο αληίζηνηρνπ object file (.ν) gcc -Wall -c <code_filename> -o <object_filename> Γεκηνπξγία βηβιηνζήθεο ar rcs <static_library_filename> <object_filenames> Τν όλνκα ηεο ζηαηηθήο βηβιηνζήθεο πξέπεη λα αξρίδεη από lib ελώ ε θαηάιεμε ηνπ αξρείνπ πξέπεη λα είλαη.a Π.ρ. ar rcs libmy_lib.a my_lib.o 49
Φξήζε Σηαηηθήο Βηβιηνζήθεο Σπκπεξίιεςε (#include) ηνπ header file ηεο βηβιηνζήθεο Φξήζε ζηνλ θώδηθά καο ησλ ζπλαξηήζεσλ πνπ παξέρεη ε βηβιηνζήθε (όπσο ηεθκεξηώλνληαη ζηηο νδεγίεο ρξήζεο θαη ην header file) Μεηαγιώηηηζε & ζύλδεζε: gcc......... -l<όλνκα βηβιηνζήθεο> -L<ηνπνζεζία_βηβιηνζήθεο> Από ην όλνκα βηβιηνζήθεο αθαηξνύκε ην lib θαη ην.a Π.ρ. gcc my_code.c -o my_code -lmy_lib -L. 50