<html lang="en">
<head>
<title>Comparison Functions - The GNU C Library</title>
<meta http-equiv="Content-Type" content="text/html">
<meta name="description" content="The GNU C Library">
<meta name="generator" content="makeinfo 4.13">
<link title="Top" rel="start" href="index.html#Top">
<link rel="up" href="Searching-and-Sorting.html#Searching-and-Sorting" title="Searching and Sorting">
<link rel="next" href="Array-Search-Function.html#Array-Search-Function" title="Array Search Function">
<link href="http://www.gnu.org/software/texinfo/" rel="generator-home" title="Texinfo Homepage">
<!--
This file documents the GNU C library.

This is Edition 0.12, last updated 2007-10-27,
of `The GNU C Library Reference Manual', for version
2.8 (Sourcery G++ Lite 2011.03-41).

Copyright (C) 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2001, 2002,
2003, 2007, 2008, 2010 Free Software Foundation, Inc.

Permission is granted to copy, distribute and/or modify this document
under the terms of the GNU Free Documentation License, Version 1.3 or
any later version published by the Free Software Foundation; with the
Invariant Sections being ``Free Software Needs Free Documentation''
and ``GNU Lesser General Public License'', the Front-Cover texts being
``A GNU Manual'', and with the Back-Cover Texts as in (a) below.  A
copy of the license is included in the section entitled "GNU Free
Documentation License".

(a) The FSF's Back-Cover Text is: ``You have the freedom to
copy and modify this GNU manual.  Buying copies from the FSF
supports it in developing GNU and promoting software freedom.''-->
<meta http-equiv="Content-Style-Type" content="text/css">
<style type="text/css"><!--
  pre.display { font-family:inherit }
  pre.format  { font-family:inherit }
  pre.smalldisplay { font-family:inherit; font-size:smaller }
  pre.smallformat  { font-family:inherit; font-size:smaller }
  pre.smallexample { font-size:smaller }
  pre.smalllisp    { font-size:smaller }
  span.sc    { font-variant:small-caps }
  span.roman { font-family:serif; font-weight:normal; } 
  span.sansserif { font-family:sans-serif; font-weight:normal; } 
--></style>
<link rel="stylesheet" type="text/css" href="../cs.css">
</head>
<body>
<div class="node">
<a name="Comparison-Functions"></a>
<p>
Next:&nbsp;<a rel="next" accesskey="n" href="Array-Search-Function.html#Array-Search-Function">Array Search Function</a>,
Up:&nbsp;<a rel="up" accesskey="u" href="Searching-and-Sorting.html#Searching-and-Sorting">Searching and Sorting</a>
<hr>
</div>

<h3 class="section">9.1 Defining the Comparison Function</h3>

<p><a name="index-Comparison-Function-819"></a>
In order to use the sorted array library functions, you have to describe
how to compare the elements of the array.

   <p>To do this, you supply a comparison function to compare two elements of
the array.  The library will call this function, passing as arguments
pointers to two array elements to be compared.  Your comparison function
should return a value the way <code>strcmp</code> (see <a href="String_002fArray-Comparison.html#String_002fArray-Comparison">String/Array Comparison</a>) does: negative if the first argument is &ldquo;less&rdquo; than the
second, zero if they are &ldquo;equal&rdquo;, and positive if the first argument
is &ldquo;greater&rdquo;.

   <p>Here is an example of a comparison function which works with an array of
numbers of type <code>double</code>:

<pre class="smallexample">     int
     compare_doubles (const void *a, const void *b)
     {
       const double *da = (const double *) a;
       const double *db = (const double *) b;
     
       return (*da &gt; *db) - (*da &lt; *db);
     }
</pre>
   <p>The header file <samp><span class="file">stdlib.h</span></samp> defines a name for the data type of
comparison functions.  This type is a GNU extension.

<!-- stdlib.h -->
<!-- GNU -->
   <p><a name="index-comparison_005ffn_005ft-820"></a>
<pre class="smallexample">     int comparison_fn_t (const void *, const void *);
</pre>
   </body></html>

