LibrariesLibraries
1
Making Functions Globally Reusable(§ 4.6)
ReviewReview
We have written a program that used functions to compute the area and circumference of an ellipse.
22
22 bancecircumfere
abarea a
a
bb
2
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; }
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 ---------------------------------------------------------*/
5
_____
_______
We also have global reusability.
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 ___________ so that programs can share them.
Is there automatic updating
of a program
if the original functions are
modified?
LibrariesLibraries
A library consists of three files:A _____________ file (whose name has a .h suffix) that contains shareable function __________________________________.
An ________________________ file (whose name has a .cpp suffix) that contains shareable function _____________________.
A ____________________ file (whose name hasa .txt (or .doc) suffix) that contains documentation for the library.
6
Header Files
In Visual C++, put all 3 and the program that uses the library in the same project.
Source Files
Resource Files
ExampleExample
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
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; }
Their _______________ are placed in ellipse.cpp:
_______________________
const double PI = 3.14159; // Could go in ellipse.h
double ellipseArea(double length, double width){ ________________________________________ double halfLength = length/2.0, halfWidth = width/2.0;
return PI * halfLength * halfWidth;}
9
Put afterusing namespace std;
/*----- ellipse.cpp ----- Library of functions for computing ellipse attributes.
L. Nyhoff CS 104X Oct 12, 2009
Functions provided: ellipseArea: compute area of an ellipse ellipseCircumference: compute circumference of an ellips ------------------------------------------------------------*/#include <cmath>
#include <cassert>
using namespace std;
Implementation file: ellipse.cpp
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((pow(halfLength, 2.0) + pow(halfWidth, 2.0))/2.0);
}
//... plus definitions of any others we provide ...
This file can be ___________________________ from any
program that uses it (called a ______________________). 1
0
Implementation file (cont.)
Our documentation file will be a copy of the header file, with __________________________ added foradditional documentation:
11
/*----- ellipse.cpp ----- Library of functions for computing ellipse attributes.
L. Nyhoff CS 104X Oct 12, 2009
Functions provided: ellipseArea: compute area of an ellipse ellipseCircumference: compute circumference of an ellips ------------------------------------------------------------*/
/*------------------------------------------------------- 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);
Documentation file: ellipse.txt
By storing the documentation in a separate file, we provide information on how to use the library without cluttering the other library files.
12
But some programmersdo put the
documentationin the header file.
/*------------------------------------------------------- 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 ...
Documentation file (cont.)
Program Translation
Translating a program into machine language
consists of two steps:1. ________________, 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. ___________, in which any calls to functions (from main() or from other functions) are bound to the definitions of those functions.
13
Using a LibraryUsing a Library
14
To use a library:
A program must ________________________(usually above the main function and after using namespace std;).
When the ___________ (actually its preprocessor) encounters this #include directive, it must be able to find the header file so it can open it and replace the #includedirective 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++:
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 ___________ 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.
Compilation ErrorsCompilation ErrorsA program _________________________________ ______________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 ______________.
16
Linking ErrorsLinking ErrorsA program calling a function for which the ____________________________________ 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
ExampleExample
18
Put afterusing namespace std;
#include <iostream> // cin, cout, <<, >>, ...using namespace std;
_______________________________ // insert ellipse prototypes
int main(){ cout << "Program to compute the area and circumference of " "an ellipse.\n";
cout << "Please enter its major & minor axes (meters): "; double majorAxis, minorAxis; cin >> majorAxis >> minorAxis;
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";}
Temperature conversion example in
the text
------ Build started: Project: Ellipse, Configuration: Debug Win32 ------
Compiling...
ellipse.cpp
driver.cpp
Generating Code...
Linking...
Build log was saved at "file://e:\CS104\Ellipse\Ellipse\Debug\BuildLog.htm"
Ellipse - 0 error(s), 0 warning(s)
---------------------- Done ----------------------
Build: 1 succeeded, 0 failed, 0 skipped
EXECUTION:
Program to compute the area and circumference of an ellipse.Please enter its major & minor axes (meters): 2 2
For an ellipse with major axis 2 meters and minor axis 2 meters area = 3.14159 sq. meters circumference = 6.28318 meters
Press any key to continue 19
Compilation creates a ____________________file
(usually with a .o or .obj suffix) from a
.cpp file.
int main()
{
// ...
}
C++Compiler
00100111010
10110001001
...
11101100100
file.cpp file.obj
20
LinkingLinking
00100111010
10110001001
...
11101100100
C++Linker
00100111010
10110001001
...
11101100100
11100101011
10010001000
...
10101101101
01101101011
11010101001
...
00101100100
file1.obj
file.exe
11100101011
10010001000
...
10101101101
file2.obj
01101101011
11010101001
...
00101100100
fileN.obj
Linking binds multiple ____________________ into a single ____________________________ that can be run.
21
OCD with LibrariesOCD with Libraries
1. 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 asccess it
from there.
4. Organize objects and operations into an algorithm.
22
•ExtendingC++