25
Libraries Making Functions Globally Reusable (§ 6.4) 1

Libraries Making Functions Globally Reusable (§ 6.4) 1

Embed Size (px)

Citation preview

Page 1: Libraries Making Functions Globally Reusable (§ 6.4) 1

Libraries

Making Functions Globally Reusable(§ 6.4)

1

Page 2: Libraries Making Functions Globally Reusable (§ 6.4) 1

Review

22

22 bancecircumfere

abarea a

a

bb

2

We have written a program that used functions to compute the area and circumference of ellipses.

Page 3: Libraries Making Functions Globally Reusable (§ 6.4) 1

3

double ellipseArea(double length, double width);

double ellipseCircumference(double length, double width);

Function Prototypes (placed before main()):

Function Definitions & Documentation(placed after main()):const double PI = 3.14159;

/* Function to compute the area of an ellipse Receive: two double values length, width, representing the major axis and minor axis of an ellipse Return: the area of the ellipse -------------------------------------------------------*/double ellipseArea(double length, double width){ double halfLength = length/2.0, halfWidth = width/2.0; return PI * halfLength * halfWidth; }

Page 4: Libraries Making Functions Globally Reusable (§ 6.4) 1

4

Putting these prototypes, documentation, and definitions along with main() in the same program makes it possible to reuse them at several different places in the program. However, suppose that in order to solve some other problem, a different program requires computing the area and circumference of an ellipse.

double ellipseCircumference(double length, double width){ double halfLength = length/2.0, halfWidth = width/2.0;

return 2.0 * PI * sqrt( (halfLength * halfLength + halfWidth * halfWidth) / 2.0);}

/* Function to compute the circumference of an ellipse Receive: two double values length, width, representing the major axis and minor axis of an ellipse Return: the circumference of the ellipse ---------------------------------------------------------*/

Funcs call others Proj 5 area -> perim Proj.6: many

Page 5: Libraries Making Functions Globally Reusable (§ 6.4) 1

How can we reuse our functions in a different program?

Options:• Copy-and-paste ellipseArea()

and ellipseCircumference()from our previous program into the new program.

• Store ellipseArea() and ellipseCircumference()in a library so that programs can share them.

5

Is there automatic updating

of a programif the original functions are

modified?

No

Yes!We also

have global reusability.

OLE

Page 6: Libraries Making Functions Globally Reusable (§ 6.4) 1

LibrariesA library consists of three files:A header file (whose name has a.h suffix) that contains shareable function prototypes and constants.An implementation file (whose name has a .cpp suffix) that contains shareablefunction definitions. A documentation file (whose name has a .txt (or .doc) suffix) that contains documentation for the library.

6

In Visual C++, put all 3 and the program that uses the library in the same project.

Source

Files

Resource Files

Header

Files

What? How? Detailed what - user man.6

Page 7: Libraries Making Functions Globally Reusable (§ 6.4) 1

Example

7

Other Examples:Text: Temperature conversionProject: Metric conversion

Since we are creating a library to share functions that describe an ellipse, we might name our library ellipse, with

• header file ellipse.h,• implementation file ellipse.cpp, and• documentation file ellipse.txt.

must be the same

Temp – good e.g. to look at

Page 8: Libraries Making Functions Globally Reusable (§ 6.4) 1

Header file: ellipse.hIn ellipse.h, we place the function

prototypes:/*----- ellipse.h ----- Library of functions for computing ellipse attributes.

L. Nyhoff CS 104X Jan 16, 2012

Functions provided: ellipseArea: compute area of an ellipse ellipseCircumference: compute circumference of an ellipse ------------------------------------------------------------*/

double ellipseArea(double length, double width);double ellipseCircumference(double length, double width);// ... plus any others we want to provide such as the// ... focal length, eccentricity, etc.

The corresponding implementation file ellipse.cpp and any program that uses these functions must contain

#include "ellipse.h"

8

Note the "directory"

Can use this same opening documentation in all 3 files

but change1st line

What? How? Detailed what - user manopening doc: dict-ary;.cpp encyclop. public

Metric

Page 9: Libraries Making Functions Globally Reusable (§ 6.4) 1

Their definitions are placed in ellipse.cpp:

9

/*----- ellipse.cpp ----- Library of functions for computing ellipse attributes.

L. Nyhoff CS 104X Jan 16, 2012

Functions provided: ellipseArea: compute area of an ellipse ellipseCircumference: compute circumference of an ellipse ------------------------------------------------------------*/#include <cmath>

#include <cassert>

using namespace std;

#include "ellipse.h"

const double PI = 3.14159; // Could go in ellipse.h

double ellipseArea(double length, double width){ assert(length >= 0 && width >= 0); double halfLength = length/2.0, halfWidth = width/2.0;

return PI * halfLength * halfWidth;}

Put afterusing namespace std;

Implementation file: ellipse.cpp

#include .h - compiler check func protos with defs. here; can chamge implem.

Page 10: Libraries Making Functions Globally Reusable (§ 6.4) 1

double ellipseCircumference(double length, double width){ assert(length >= 0 && width >= 0); double halfLength = length/2.0, halfWidth = width/2.0;

return 2.0 * PI * sqrt((halfLength * halfLength + halfWidth * halfWidth)/2.0);}

//... plus definitions of any others we provide ...

This file can be compiled separately from any program that uses it

10

Implementation file (cont.)

(called a client program).

Metric

Not build -- private

Page 11: Libraries Making Functions Globally Reusable (§ 6.4) 1

Our documentation file will be a copy of the header file with function specifications added for additional documentation.

/*----- ellipse.txt ----- Library of functions for computing ellipse attributes.

L. Nyhoff CS 104X Jan 16, 2012

Functions provided: ellipseArea: compute area of an ellipse ellipseCircumference: compute circumference of an ellipse ------------------------------------------------------------*/

/*------------------------------------------------------- Compute the area of an ellipse. Receive: length, width, two double values. Return: the area of the corresponding ellipse. -------------------------------------------------------*/double ellipseArea(double length, double width);

11

Documentation file: ellipse.txt

Page 12: Libraries Making Functions Globally Reusable (§ 6.4) 1

/*------------------------------------------------------- Compute the circumference of an ellipse. Receive: length, width, two double values. Return: the circumference of ellipse defined by length and width. -------------------------------------------------------*/double ellipseCircumference(double length, double width);

// ... plus prototypes and specifications // ... for any others we provide ...

12

But some programmersdo put the

documentationin the header file.

Documentation file (cont.)

By storing the documentation in a separate file, we provide information on how to use the library without cluttering the other library files.

Metricpublic

Page 13: Libraries Making Functions Globally Reusable (§ 6.4) 1

Program Translation

Translating a program into machine language

consists of two steps:1. Compiling, in which the syntax of the

main program and of the implementation files of any included libraries are checked, and if no errors are found, converts them into the computer’s machine language.

2. Linking, in which any calls to functions (from main() or from other functions) are bound to the definitions of those functions.

13

link: now defs outside programcompile & link diagram

Page 14: Libraries Making Functions Globally Reusable (§ 6.4) 1

Using a Library

14

To use a library:

A program must #include its header file (usually above the main function and after using namespace std;).

When the compiler (actually its preprocessor) encounters this #include directive, it must be able to find the header file so it can open it and replace the #include directive with its contents so they get compiled along with the program.

When the file contains function prototypes, the effect of the #include directive is to insert those prototypes into the program.

Put it in the project's

header files

In Visual C++:

Metric

Page 15: Libraries Making Functions Globally Reusable (§ 6.4) 1

15

It must also be able to find the corresponding implementation file so it can open it, insert the contents of its header file into it, and then compile it (separately from the program).

Put it in the project's

source files

In Visual C++:

Once these compilations are successful, the linker combines these compiled files into one, connecting(i.e., "linking") each function call to the compiledcode of that function's definition.

A failure in either stage is an error.

Page 16: Libraries Making Functions Globally Reusable (§ 6.4) 1

Compilation ErrorsA program calling a function for which no prototype is given produces a compiler error.

This can occur if you call a library function and neglect to #include the header file containing its prototype.

You’ll be trying to use a function that has not been declared.

16

what proto does!

Page 17: Libraries Making Functions Globally Reusable (§ 6.4) 1

Linking Errors

A program calling a function for which the linker cannot find a definition produces a linker error.This can occur if a program calls a function but the linker is not told to use the library implementation file or object file containing

that function’s definition.How this is done varies from platform to platform, but often involves a project file.

17

Page 18: Libraries Making Functions Globally Reusable (§ 6.4) 1

Example#include <iostream> // cin, cout, <<, >>, ...using namespace std;

#include "ellipse.h" // insert ellipse prototypes

int main(){ cout << "Program to compute the area and circumference of ellipses.\n";

double majorAxis, minorAxis; cout << "\nEnter major & minor axes (in meters) (0 0 to stop): "; cin >> majorAxis >> minorAxis; while (majorAxis > 0) { double area = ellipseArea(majorAxis, minorAxis);

double circumference = ellipseCircumference(majorAxis, minorAxis);

cout << "\nFor an ellipse with major axis " << majorAxis << " meters and minor axis " << minorAxis << " meters\n" << "\tarea = " << area << " sq. meters\n" << "\tcircumference = " << circumference << " meters\n"; cout << "\nEnter major & minor axes (in meters) (0 0 to stop): "; cin >> majorAxis >> minorAxis; }} 18

Put afterusing namespace std;

Temperature conversion example in

the text

Metric

Page 19: Libraries Making Functions Globally Reusable (§ 6.4) 1

1>------ Rebuild All started: Project: EllipseLib, Configuration: Debug Win32 ------1> ellipse.cpp1> driver.cpp1> Generating Code...1> EllipseLib.vcxproj -> E:\CS104-12Int\classprogs\EllipseLib\Debug\EllipseLib.exe========== Rebuild All: 1 succeeded, 0 failed, 0 skipped ==========

19

EXECUTION:

Program to compute the area and circumference of ellipses.

Enter major & minor axes (in meters) (0 0 to stop): 2 2

For an ellipse with major axis 2 meters and minor axis 2 meters area = 3.14159 sq. meters circumference = 6.28318 meters

Enter major & minor axes (in meters) (0 0 to stop): 0 0Press any key to continue . . .

Page 20: Libraries Making Functions Globally Reusable (§ 6.4) 1

Compilation creates a binary object file

(usually with a .o or .obj suffix) from a

.cpp file.

C++Compiler

int main()

{

// ...

}

file.cpp

00100111010

10110001001

...

11101100100

file.obj

20

Page 21: Libraries Making Functions Globally Reusable (§ 6.4) 1

00100111010

10110001001

...

11101100100

file1.obj 00100111010

10110001001

...

11101100100

11100101011

10010001000

...

10101101101

01101101011

11010101001

...

00101100100

file.exe

11100101011

10010001000

...

10101101101

file2.obj

01101101011

11010101001

...

00101100100

fileN.obj

C++Linker

Linking binds multiple object files into a single binary executable file that can be executed by the operating system.

21

Page 22: Libraries Making Functions Globally Reusable (§ 6.4) 1

OCD with Libraries1. Specify the desired behavior of the program.2. Identify the objects needed.3. Identify the operations.

a. If an operation is not predefined:Write a function to perform it.

b. If an operation is likely to be reusable someday:Store its function in a library and access it

from there.4. Organize objects and operations into an algorithm.

22

ExtendingC++

Page 23: Libraries Making Functions Globally Reusable (§ 6.4) 1

/*----- ellipse.h ----- Library of functions for computing ellipse attributes.

L. Nyhoff CS 104X Jan 16, 2012

Functions provided: ellipseArea: compute area of an ellipse ellipseCircumference: compute circumference of an ellipse ------------------------------------------------------------*/

double ellipseArea(double length, double width);double ellipseCircumference(double length, double width);// ... plus any others we want to provide such as the// ... focal length, eccentricity, etc.

23

Page 24: Libraries Making Functions Globally Reusable (§ 6.4) 1

24

/*----- ellipse.cpp ----- Library of functions for computing ellipse attributes. L. Nyhoff CS 104X Jan 16, 2012 Functions provided: ellipseArea: compute area of an ellipse ellipseCircumference: compute circumference of an ellipse ------------------------------------------------------------*/#include <cmath>#include <cassert>using namespace std;#include "ellipse.h”

const double PI = 3.14159; // Could go in ellipse.h

double ellipseArea(double length, double width){ assert(length >= 0 && width >= 0); double halfLength = length/2.0, halfWidth = width/2.0;

return PI * halfLength * halfWidth;}double ellipseCircumference(double length, double width){ assert(length >= 0 && width >= 0); double halfLength = length/2.0, halfWidth = width/2.0;

return 2.0 * PI * sqrt((halfLength * halfLength + halfWidth * halfWidth)/2.0);}//... plus definitions of any others we provide ...

Page 25: Libraries Making Functions Globally Reusable (§ 6.4) 1

double ellipseCircumference(double length, double width){ assert(length >= 0 && width >= 0); double halfLength = length/2.0, halfWidth = width/2.0;

return 2.0 * PI * sqrt((halfLength * halfLength + halfWidth * halfWidth)/2.0);}

//... plus definitions of any others we provide ...

25