2012-11-17 133 views
-2

在這個程序中,我想根據價格對一個列表進行排序,然後我使用快速排序對列表進行排序,在快速排序中,我使用了比較comp_on_price,然後調用接口的快速排序。但是,當我運行它時,會出現太少參數的編譯錯誤。 與調用方法有什麼關係嗎?帶錯誤的調用函數:函數太少的參數'quicksort'

#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); 
} 
+1

您需要修復代碼的格式以使其可讀。 –

+1

你有沒有聽說過'qsort()'?它是自C89以來的C標準的一部分。 – qrdl

+0

@qrdl我只是想自己實現它。 –

回答

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

如果你看看你quicksort函數聲明,你會看到它有4個,而不是3個參數。最後一個參數是一個指向比較函數的指針。

你應該稱呼它:

quicksort(x, first, j-1, comp_on_price); 
+0

我添加了comp_on_price,但是,問題仍然存在,我認爲這與我的界面參數有關? –

+0

@StevenLiu如果將第四個參數添加到函數調用中,您會得到什麼其他錯誤消息? – ouah

+0

正如另一個答案中所指出的,如果您不在函數中使用參數,則無需將其添加到函數中的參數列表中。 – ouah

1

你的函數

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

有4個輸入參數,最後一個是指向一個功能。您可以將其刪除,因爲您沒有使用此功能