user466534
user466534

Reputation:

c standard library sort function from programming pearls

#include <algorithm>
#include <stdio.h>
#include <iostream>



int intcomp(int *x,int *y) {  return *x-*y;};
int a[10000];
int main(void){
    int i; int n=0;
     while (scanf("%d",&a[n])!=EOF)
          n++;
     qsort(a,n,sizeof(int),intcomp);
      for (int i=0;i<n;i++)
           printf("%d\n",a[i]);
       return 0;


}

it is just copy of code i have two question it show me that intcomp is incompatible in this code and also what does intcomp function? and also what is in windows 7 EOF? how tell program that it reached EOF?

Upvotes: 1

Views: 534

Answers (5)

Sjoerd
Sjoerd

Reputation: 6875

First of all: the question is labeled C++ and you #include <algorithm> and <iostream>, but your code is 100% C.

Martin York already gave the answer how to correct the signature of the function you pass to qsort().

However, the "true"(TM) C++ solution would be to use std::sort<> instead of qsort!

#include <algorithm>    
#include <stdio.h>    

bool intcomp(int a, int b) { return a<b; }
int a[10000];    
int main(void){    
    int n=0;    
     while (scanf("%d",&a[n])!=EOF)    
          n++;    
     std::sort(&a[0], &a[n], intcomp);
      for (int i=0;i<n;i++)    
           printf("%d\n",a[i]);    
       return 0;    
}

Note that incomp() takes ints and not int pointers, and returns a bool. Just like operator<() would.

Also note that in this case, you could forget the intcomp and just use std::sort(&a[0], &a[n]), which will use std::less<>, which will use operator<(int, int).

Upvotes: 1

Loki Astari
Loki Astari

Reputation: 264631

the qsort() function requires a pointer with a particular signature.
Your function has the wrong signature so it is complaining.

Your function has the signature:

int intcomp(int *x,int *y)

While qsort requires the signature:

int intcomp(void const* xp,void const* yp)

Please note the difference in the parameter types.

A corrected version of the function is:

int intcomp(void const* xp,void const* yp)
{
  // Modified for C as the tag on the question changed:
  // int x = *static_cast<int const*>(xp);
  // int y = *static_cast<int const*>(yp);
  int x = *((int const*)(xp));
  int y = *((int const*)(yp));

  return x-y;
}

The function qsort() is passed a function pointer as the third parameter.
This function pointer (in your case intcomp()) is used to compare values in the array passed. Each call provides pointers into the array. The result of the function should be:

Less than 0:    if x is smaller than y
0:              If x is equal to y
Greater than 0: If x is larger than y

Upvotes: 4

BaumS
BaumS

Reputation: 55

As Martin York mentioned, qsort needs a function which it will use to compare the values:

void qsort( void *buf, size_t num, size_t size, int (*compare)(const void*, const void *) );

Here is a good example on how to use qsort: http://www.cppreference.com/wiki/c/other/qsort

Edit: Ri was faster....

Upvotes: 0

Delan Azabani
Delan Azabani

Reputation: 81452

qsort is in stdlib.h, so include that file at the beginning. Note that algorithm and iostream aren't needed.

#include <stdlib.h>

Upvotes: 1

Rik Heywood
Rik Heywood

Reputation: 13972

intcomp is an "Int Compare" function. It is passed a pointer to 2 ints and returns 0 if they are the same, a positive value is x > y and a negative value is x < y.

qsort is passed a pointer to this function and calls it each time it wants to know how to sort a pair of values.

The docs for qsort should give you some more details.
eg http://www.cppreference.com/wiki/c/other/qsort

Upvotes: 1

Related Questions