c стандартной библиотечной функцией сортировки из программных жемчужин - PullRequest
1 голос
/ 21 июля 2010
#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;


}

это просто копия кода, у меня два вопроса, это показывает, что intcomp несовместим с этим кодом а также что intcomp работает? а также что в windows 7 EOF? как скажите программе, что она достигла EOF?

Ответы [ 5 ]

4 голосов
/ 21 июля 2010

функция qsort () требует указатель с определенной подписью.
Ваша функция имеет неправильную подпись, поэтому она жалуется.

Ваша функция имеет подпись:

int intcomp(int *x,int *y)

В то время как qsort требует подписи:

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

Обратите внимание на разницу в типах параметров.

Исправленная версия функции:

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;
}

В функцию qsort () передается указатель функции в качестве третьего параметра.
Этот указатель на функцию (в вашем случае intcomp ()) используется для сравнения значений в переданном массиве. Каждый вызов предоставляет указатели в массив. Результат функции должен быть:

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
1 голос
/ 21 июля 2010

Прежде всего: вопрос помечен C ++, и вы #include и , но ваш код на 100% C.

Мартин Йорк уже дал ответ, как исправить подпись функции, которую вы передаете qsort ().

Однако "истинное" (TM) решение C ++ будет использовать std :: sort <> вместо 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;    
}

Обратите внимание, что incomp () принимает целочисленные значения, а не указатели на int, и возвращает логическое значение. Точно так же, как оператор <(). </p>

Также обратите внимание, что в этом случае вы можете забыть intcomp и просто использовать std :: sort (& a [0], & a [n]), который будет использовать std :: less <>, который будет использовать operator <( int, int). </p>

1 голос
/ 21 июля 2010

qsort находится в stdlib.h, поэтому включите этот файл в начале. Обратите внимание, что algorithm и iostream не нужны.

#include <stdlib.h>

1 голос
/ 21 июля 2010

intcomp - это функция «Int Compare».Передается указатель на 2 дюйма и возвращается 0, если они совпадают, положительное значение равно x> y, а отрицательное значение равно x

qsort передается указатель на эту функциювызывает его каждый раз, когда хочет знать, как отсортировать пару значений.

Документы для qsort должны дать вам более подробную информацию.
например http://www.cppreference.com/wiki/c/other/qsort

0 голосов
/ 21 июля 2010

Как отметил Мартин Йорк, qsort нужна функция, которую он будет использовать для сравнения значений:

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

Вот хороший пример использования qsort: http://www.cppreference.com/wiki/c/other/qsort

Изменить: Ри был быстрее ....

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...