-2

このプログラムでは、価格に従ってリストをソートしたいのですが、クイックソートを使用してリストをソートします。クイックソートでは、comp_on_price の比較を使用してから、インターフェースでクイックソートを呼び出します。しかし、実行すると、引数が少なすぎるコンパイルエラーが発生します。呼び出し方法に何か関係はありますか?

#include <stdlib.h>
#include <stdio.h>
#include <math.h>

FILE *fp;

typedef struct book{
    double rating;
    double price;
    double relevance;
    int ID;
}B;

B *list;

int read_file(char* infile, int N)
{
    int c;
    if((fp=fopen(infile, "rb")))
    {
        fscanf(fp, "%*s\t%*s\t%*s\t%*s\n");
        c=0;
        while((!feof(fp))&&(c<N))
        {
            fscanf(fp, "%lf\t%lf\t%lf\t%d\n", &list[c].rating, &list[c].price, &list[c].relevance, &list[c].ID);
            c++;
        }
        fclose(fp);
    }
    else
    {
        fprintf(stderr,"%s did not open. Exiting.\n",infile);
        exit(-1);
    }
    return(c);
}

int comp_on_price(const void *a, const void *b)
{
    if ((*(B *)a).price < (*(B *)b).price)
        return 1;
    else if ((*(B *)a).price > (*(B *)b).price)
        return -1;
    else
        return 0;
}

void quicksort(int x[10],int first, int last, int(*comp_on_price)(const void *, const void *))
{
    int pivot,j,temp,i;
    if(first<last)
    {
        pivot=first;
        i=first;
        j=last;

        while(i<j)
        {
            while(x[i]<=x[pivot]&&i<last)
            i++;
            while(x[j]>x[pivot])
            j--;
            if(i<j){
                temp=x[i];
                x[i]=x[j];
                x[j]=temp;
            }
        }/* while*/

        temp=x[pivot];
        x[pivot]=x[j];
        x[j]=temp;
        quicksort(x,first,j-1);
        quicksort(x,j+1,last);
    }
}

void user_interface(int N)
{
    // For Part 1 this function calls the sort function to sort on Price only
    comp_on_price(N);

    // For Part 2 this function
    // (1) asks the user if they would like to sort their search results
    // (2) asks for the most important field (or key), the next most etc
    // (3) calls your sort function
}

void print_results(int N)
{
    int i;
    if((fp=fopen("top20.txt","w")))
    {
        for(i=N-1;i>=N-20;i--)
        {
            printf("%g %g %g %d\n", list[i].rating, list[i].price, list[i].relevance, list[i].ID);
            fprintf(fp, "%g %g %g %d\n", list[i].rating, list[i].price, list[i].relevance, list[i].ID);
        }
        fclose(fp);
    }
    else
    {
        fprintf(stderr,"Trouble opening output file top20.txt\n");
        exit(-1);
    }
}

int main(int argc, char *argv[])
{
    int N;

    if(argc!=3)
    {
        fprintf(stderr, "./exec <input_size> <filename>\n");
        exit(-1);
    }

    N=atoi(argv[1]);

    list = (B *)malloc(N*sizeof(B));

    N=read_file(argv[2], N);

    user_interface(N);

    print_results(N);

    return(0);
}
4

2 に答える 2

1
quicksort(x,first,j-1);

関数宣言を見るquicksortと、3 つではなく 4 つのパラメーターがあることがわかります。最後のパラメーターは、比較関数へのポインターです。

次のように呼び出す必要があります。

quicksort(x, first, j-1, comp_on_price);
于 2012-11-17T15:05:41.873 に答える
1

あなたの機能

void quicksort(int x[10],int first, int last,int(*comp_on_price)(const void *, const void     *))

4 つの入力パラメータがあり、最後のパラメータは関数へのポインタです。この機能を使用していないため、削除できます

于 2012-11-17T15:11:11.343 に答える