130 likes | 247 Views
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!
E N D
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 william@kth.se
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 1-571969-161-8 */#include <stdio.h>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;} Vårt tidigare exempel: byt plats på två tal … void interchange(int * u, int * v){int temp; temp = *u; *u =*v; *v = temp;} William Sandqvist william@kth.se
Funktionsfil och headerfil Funktionen placeras i funktionsfilen LibFunk.c och den deklareras i headerfilen LibFunk.h. /* LibFunk.h function prototype for the interchange() function *//* Swap's contents of two integers */void interchange(int *, int *); /* LibFunk.c function interchange() */ void interchange(int * u, int * v){int temp; temp = *u; *u =*v; *v = temp;} William Sandqvist william@kth.se
interchange() är extern /* swap4.c using pointers to make a swapping function work */#include <stdio.h>#include "LibFunk.h" externvoid 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 william@kth.se
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 william@kth.se
Skapa Funktionsbibliotek Lägg till en ny fil till projectet och ge den namnet interchange.c. I den filen skriver vi sedan funktionen interchange(). 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! William Sandqvist william@kth.se
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 william@kth.se
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 william@kth.se
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 william@kth.se
Körningen ”Öppen” källkod: void interchange(int * u, int * v){int temp; temp = *u; *u =*v; *v = temp;} Programmet fungerar lika bra med funktionen i en öppenkällkodsfil som i en hemligbinärkodsfil ! ”Hemlig” binärkodsfil: William Sandqvist william@kth.se
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 william@kth.se
Testa funktionsblioteket /* testprogram with functions Cinput() and Cprint() */#include <stdio.h>#include <stdlib.h>#include <math.h>#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;} 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 ). William Sandqvist william@kth.se
Körningen William Sandqvist william@kth.se