William Sandqvist Funktionsbibliotek När man utvecklat en funktion så långt att den är "färdigutvecklad" kan man lika gärna spara den på kompilerad form. Dels går då kompileringen av hela projektet snabbare, dels så kan man dölja för andra hur man gjort funktionen - det kan få bli ens egen affärshemlighet! I undervisningen så kan vi ge "facitfunktioner" som man kan provköra i stället för egna för att t.ex. se om man förstått uppgiften rätt. Om man kör fast på någon funktion kan man ta tillfälligt ta med en "facitfunktion" i stället för den egna för att komma vidare. Stora delar av C:s funktionsbibliotek levereras färdigkompilerade, och det är många gånger kvaliteten på dessa som man betalar för när man köper en kompilator!
William Sandqvist Library - hur skapar och använder man färdigkompilerade funktioner? /* swap3.c using pointers to make a swapping function work */ /* from Stephen Prata, C Primer Plus ISBN */ #include void interchange(int * u, int * v); int main(int argc, char *argv[]) { int x = 5, y = 10; printf("Orginally x = %d and y = %d\n", x, y); interchange(&x, &y); printf("Now x = %d and y = %d\n", x, y); system("PAUSE"); return 0; } void interchange(int * u, int * v) { int temp; temp = *u; *u =*v; *v = temp; } Vårt tidigare exempel: byt plats på två tal …
William Sandqvist Funktionsfil och headerfil Funktionen placeras i funktionsfilen LibFunk.c och den deklareras i headerfilen LibFunk.h. /* LibFunk.c function interchange() */ void interchange(int * u, int * v) { int temp; temp = *u; *u =*v; *v = temp; } /* LibFunk.h function prototype for the interchange() function */ /* Swap's contents of two integers */ void interchange(int *, int *);
William Sandqvist interchange() är extern /* swap4.c using pointers to make a swapping function work */ #include #include "LibFunk.h" extern void interchange(int * u, int * v); int main(int argc, char * argv[]) { int x = 5, y = 10; printf("Orginally x = %d and y = %d\n", x, y); interchange(&x, &y); printf("Now x = %d and y = %d\n", x, y); system("PAUSE"); return 0; } I programmet swap4.c används två metoder för att deklarera funktionen ( det räcker med antingen den ena metoden eller den andra ). Dels inkluderar vi h-filen LibFunk.h dels deklareras funktionen med raden extern void interchange(int *u, int *v);. Nyckelordet extern står för att funktionsdefinitionen finns i en annan fil.
William Sandqvist Library filen LibFunk.a Skapa ett nytt projekt med Dev-C++. ( File, New, Project ) Välj typen Static Library. Som projektnamn väljer vi LibFunk.
William Sandqvist Skapa Funktionsbibliotek Här skulle vi nu ha möjlighet att lägga till fler funktioner, antingen som egna filer i projektet eller inuti filen interchange.c ( som i så fall borde få ett annat namn ). Här nöjer vi oss med en funktion i vårt funktionsbibliotek! Lägg till en ny fil till projectet och ge den namnet interchange.c. I den filen skriver vi sedan funktionen interchange().
William Sandqvist Skapa Funktionsbibliotek Kompilera projektet. Execute, Compile. Nu skapas Library-filen med namnet LibFunk.a. Försöker man läsa den filen med en texteditor blir man inte “klokare” - din affärshemlighet är således skyddad!
William Sandqvist Använda funktionsbibliotek Skapa ett nytt projekt med Dev-C++, File, New, Project. Välj den vanliga typen Console application. Se nu till att filen LibFunk.a ( eller en kopia ) ligger i samma mapp som projektfilen. Skriv programmet som filen swap4.c. Lägg till filen LibFunk.h till projektet.
William Sandqvist Inställningar vid länkningen För att funktionen ska "hittas" vid länkningen måste vi göra några inställningar: Välj Project, Options, fliken Parameters och skriv till filnamnet LibFunk.a i rutan Linker. Tryck på Ok. Nu kan programmet kompileras och köras!
William Sandqvist Körningen void interchange(int * u, int * v) { int temp; temp = *u; *u =*v; *v = temp; } Programmet fungerar lika bra med funktionen i en öppen källkodsfil som i en hemlig binärkodsfil ! ”Öppen” källkod: ”Hemlig” binärkodsfil:
William Sandqvist Den hemliga lösningen till Lab1 Vi har gjort ett funktionsbibliotek för Lab1! Man kan ta med alla funktionerna eller någon av dem i sitt projekt i stället för egna funktioner, men eftersom de är kompilerade så kommer man inte att kunna se vad de innehåller! /* libLab1.h prototypes for functions in libLab1.a */ /* Prompts the user to input a Complex number */ /* returns the Complex number by reference */ void Cinput(double * real, double * imag); /* Calculates the product of two Complex numbers */ /* returns the Complex answer by reference */ void Cproduct(double a1, double b1, double a2, double b2, double * real, double * imag); /* Calculates the quotient of two Complex numbers */ /* returns the Complex answer by reference */ void Cquotient(double a1, double b1, double a2, double b2, double * real, double * imag); /* Calculates and returns the absolute value of a Complex number */ double Cabs(double real, double imag); /* Calculates and returns the argument of a Complex number */ double Carg(double real, double imag); /* Prints a Complex number */ void Cprint(double real, double imag);
William Sandqvist Testa funktionsblioteket Glöm inte att filen liblab1.a måste tas med vid länkningen. ( Med filen i arbetsbiblioteket, välj Project, Options, fliken Parameters och skriv till filnamnet liblab1.a i rutan Linker. Tryck på Ok ). /* testprogram with functions Cinput() and Cprint() */ #include #include #include #include "liblab1.h" /* deklaration of Cinput() and Cprint() */ int main(int argc, char *argv[]) { double realdel, imagdel; Cinput(&realdel, &imagdel); Cprint(realdel, imagdel); system("PAUSE"); return 0; }
William Sandqvist Körningen