Libraries, why we have them, and how to make and
use them.
In order to simplify the creation of programs for
its customers, software vendors make available one or
more libraries of functions which have general application.
When you write a program in 'C' much, if not most,
of the "hard work" is done by explicitly called
functions, which you call by simply writing their names
in your program script. Unfortunately there is a little
bit more to it than that. If the function returns a
value which is other than of type int, you have to tell
the compiler the type of the returned value. An example
will, I hope make things clear.
Lets's suppose that you have been given the task of,
making things stupidly simplistic for a book example,
sorting a list of names into alphabetical order. ( Yes,
I do know this can, and should be done in just one line
of shell script! However that's another story for another
day. )
You look diligently through the Programmer Reference
Manual, discover that the prose is almost opaque, and
find a couple of interesting looking routines called
strcmp, and qsort. You decide to use these library functions.
Now for just a moment lets consider the ins and outs
of what,
in effect, you have just done. You have just asked a
member of the team of programmers who created the library
to join you, by proxy as it were, in creating your masterpiece.
A useful concept, which has been in use almost since
the start of electronic computing.
To re-focus the mind on the task at hand; let's look
in the Reference Manual at the page for qsort(3C) -
The 3C in parenthesis is the cryptic code which is the
unix apology for a reference to section 3C in the Manual!
So find section 3C and look up qsort. Now have a look
at the SYNOPSIS, and notice that there is no mention
of a header file to #include, and also notice that
qsort returns a void, not an int. This means that there
is no header file /usr/include/qsort.h ( for my version
of unix - system V Release 3.2.2 - anyway ) and you
have to declare qsort yourself as an external function.
Also turn to the page string(3C) in the fine manual.
Notice that the
SYNOPSIS here includes the line #include <string.h>
so you have to put it in your program text. Once more
an example to make it all clear.
/* ----------------------------------------- */
#ident "@(#) qsort-demo.c"
#include <stdio.h>
#include <string.h>
#include <assert.h>
extern void qsort ();
extern int strcmp(); /* Some compilers need this defined,
most don't. */
char names[22][25] = /* Here are some names to sort.
*/
{
"John Nagle", "Colin Douthwaite",
"Ian Lance Taylor", "Brian J. Murrell",
"Pete", "Geoff Mccaughan", "David
Liebert", "Operator", "Bill Baucum",
"Victor Volkman", "Chay R Harley",
"Dan Romanchik", "Larry Kollar",
"Gaston Ormazabal", "Arijit Chandra",
"Kenneth Mark Hopkinson",
"Kerr Hatrick", "Tim Love", "Robert
M. Juranitch", "Jeffrey Micke",
"Duong Quoc", "Jagadesh Vasudevamurthy"
};
#define NUMBER_OF_NAMES sizeof ( names ) / sizeof (
names[0] )
main()
{
int i;
/*
** Print the unsorted names.
*/
printf ( "The Unsorted Names.\n" );
for ( i = 0; i < NUMBER_OF_NAMES; i++ ) printf (
"%s\n", names[i] );
/*
** Print a prompt, and wait.
*/
printf ( "Press RETURN to continue: " );
fflush ( stdout );
getchar();
/*
** Now apply qsort to the arrary of character strings.
*/
qsort (( char * ) names, NUMBER_OF_NAMES, sizeof (
*names ), strcmp );
assert ( names[0][0] < names[1][0] ); /* Quick
check to see it's done
it. */
/*
** Print the sorted names.
*/
printf ( "The Sorted Names.\n" );
for ( i = 0; i < NUMBER_OF_NAMES; i++ ) printf (
"%s\n", names[i] );
}
/* ----------------------------------------- */
Note very well:-
I wanted 22 short character strings for the data items
for the demo to sort. So grep, uniq, cut, tail, and
finally a tiny bit of vi fished eminently suitable strings
out of "mail.received". If your name is not
on the list, well I'm sorry, but the world is not a
fair place!
So that's how you use library routines. I chose qsort
because it is simple to use, and shows off a feature
of 'C' well, that's the ability to use a name of a function
as a pointer and then execute that function from within
the called function. It's strcmp in this case. A quick
look at the compiler output is instructive. As is the
nature of the animal, a tin-pot little program, which
should have taken all of ten minutes to get going in
fact took more like two hours. I put it down to the
fact that the Fine Manual did not make it adequately
obvious that the data array acted on by qsort was the
data itself. From reading the Fine Manual I got the
impression that the array acted on
was an array of pointers. You live and learn. It would
be a much faster qsort if, in fact, the sorting function
sorted pointers to data instead of the data itself.
You might like to make a function qsort_p which worked
in in this way. The qsort algorithm is well documented
elsewhere.
There is just one more point to notice about using
function libraries. The 'C' compilation system will
load functions from the library /lib/libc.a as a default.
All others have to be indicated to the linking loader
by a switch on the shell interactive command line.
$ cc -o prog prog.c -L /usr/local/lib -lgdbm -lmalloc
You might use this command line to compile and link
a program which uses both the GNU gdbm data-base manager
library, which is installed in the directory /usr/local/lib,
and the enhanced malloc library. Now, there hangs a
tale! I remember having to compile a program suit off
Usenet and it just would not work properly. No error
messages, no warnings, no missing linking-loader symbols.
It just "died" when I tried to run it. After
many, many hours of total frustration, I thought that
I would try linking in the enhanced malloc library.
Presto! It worked.
Note very well.
A common misconception is the notion that having a
#include <whatever.h> line in the source text
will automagically tell the linking loader to get the
functions from the appropriate library. Remove this
erroroneous notion from your mind. It won't. The -lwhatever
flag on the shell command line which initiates execution
of "cc" or "ld" is the only way
to tell the
loader where to look for the required library.
Lesson # 1, #
2, # 3, #
4, # 5, #
6, # 7, #
8
|