summaryrefslogtreecommitdiff
path: root/reference/C/CONTRIB/SAWTELL/c-lesson.7
diff options
context:
space:
mode:
Diffstat (limited to 'reference/C/CONTRIB/SAWTELL/c-lesson.7')
-rwxr-xr-xreference/C/CONTRIB/SAWTELL/c-lesson.7161
1 files changed, 161 insertions, 0 deletions
diff --git a/reference/C/CONTRIB/SAWTELL/c-lesson.7 b/reference/C/CONTRIB/SAWTELL/c-lesson.7
new file mode 100755
index 0000000..d5caba1
--- /dev/null
+++ b/reference/C/CONTRIB/SAWTELL/c-lesson.7
@@ -0,0 +1,161 @@
+
+Lesson 6
+
+ 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.
+
+
+--
+ +----------------------------------------------------------------------+
+ | NAME Christopher Sawtell |
+ | SMAIL 215 Ollivier's Road, Linwood, Christchurch, 8001. New Zealand.|
+ | EMAIL chris@gerty.equinox.gen.nz |
+ | PHONE +64-3-389-3200 ( gmt +13 - your discretion is requested ) |
+ +----------------------------------------------------------------------+