2010-05-27 73 views
2
#include<stdlib.h> 
#include<stdio.h> 
#include<string.h> 
//This program is a sorting application that reads a sequence of numbers from a file and prints them on the screen . The reading from the file here , is a call back function . 

typedef int (*CompFunc)(const char* , const char*); 
typedef int (*ReadCheck)(char nullcheck); 
int array[100]; 
//Let this function be done in the library itself . It doesn't care as to where the compare function and how is it implemented . Meaning suppose the function wants to do sort in ascending order or in descending order then the changes have to be done by the client code in the "COMPARE" function who will be implementing the lib code . 
void ReadFile(FILE *fp,ReadCheck rc) 
{ 
    char a; 
    char d[100]; 
    int count = 0,count1=0,k; 
    a=fgetc(fp); 

    while (1 !=(*rc)(a)) 
    { if(a==' ') 
     { 

     d[count1]='\0'; 
     array[count]=atoi(d); 

     count=count+1; 

     printf("%s \n",d); 
     memset(d,'\0',100); 
     count1=0; 
     } 
     else 
     { 

     d[count1]=a; 
     count1=count1+1; 


     } 

     a=fgetc(fp); 
    } 

} 
void Bubblesort(char* array , int size , int elem_size , CompFunc cf) 
{ int i,j,k; 
    int *temp; 
    for(i=0;i < size ;i++) 
    { 
     for (j=0;j < size -1 ; j++) 
     { 
      // make the callback to the comparision function 
      if(1 == (*cf)(array+j*elem_size,array+ (j+1)*elem_size)) 
       { 

    //interchanging of elements 
        temp = malloc(sizeof(char *) * elem_size); 
        memcpy(temp , array+j*elem_size,elem_size); 
        memcpy(array+j*elem_size,array+(j+1)*elem_size,elem_size); 
        memcpy(array + (j+1)*elem_size , temp , elem_size); 
        free(temp); 
       } 
     } 
    } 


} 



//Let these functions be done at the client side 

int Compare(char* el1 , char* el2) 
    { 
     int element1 = *(int*)el1; 
     int element2 = *(int*)el2; 

     if(element1 < element2) 
      return -1; 
     if(element1 > element2) 
      return 1 ; 
     return 0; 
    } 

int ReadChecked(char nullcheck) 
    { 
     if (nullcheck=='\n') 
      return 1; 
     else 
      return 0; 
    } 
int main() 
{ 
    FILE *fp1; 
    int k; 
    fp1=fopen("readdata.txt","r"); 

    ReadFile(fp1,&ReadChecked); 
printf("before sorting \n"); 
    for (k=0;k<6;k++) 
    printf("%d \n",array[k]); 

     Bubblesort((char*)array,5,sizeof(array[0]),&Compare); 
    printf("after sorting \n"); 
    for (k=0;k<5;k++) 
    printf("%d \n",array[k]); 

return 0; 
} 

當我運行此代碼時,我不會收到任何錯誤。除了少數警告,但是當我在另一個系統中運行它時,代碼崩潰。我可以知道爲什麼嗎?這是C代碼中的錯誤,以及如何擺脫警告?

+0

錯誤在第82行;)(你能指出行嗎,我懶得數你代碼中的行)。 – 2010-05-27 11:22:36

回答

2
fsc1.c: In function ‘ReadFile’: 
fsc1.c:19: warning: passing argument 1 of ‘strcpy’ makes pointer from integer without a cast 

你應該通過&array[count]作爲第一個參數,而不是array[count]

fsc1.c: In function ‘Bubblesort’: 
fsc1.c:40: warning: passing argument 1 of ‘cf’ from incompatible pointer type 
fsc1.c:40: warning: passing argument 2 of ‘cf’ from incompatible pointer type 

我會叫CF爲(*cf)(&array[j], &array[j+1]),沒有必要擔心元素大小,編譯器會照顧它。

fsc1.c:43: warning: incompatible implicit declaration of built-in function ‘malloc’ 
fsc1.c:47: warning: incompatible implicit declaration of built-in function ‘free’ 

您需要#include <stdlib.h>

fsc1.c: In function ‘main’: 
fsc1.c:80: error: incompatible types in assignment 

FP1應該被聲明爲FILE *

fsc1.c:82: warning: passing argument 1 of ‘Bubblesort’ from incompatible pointer type 

你的陣列是char陣列,而冒泡的第一個參數的預期int *。我會改變Bubblesort採取char *

1

Fopen返回指針。

替換此:

FILE fp1; 

FILE *fp1; 

在主要的開始。

0

strcpy對指針進行操作,但array[count]是一個字符。你還沒有提供足夠的信息來說明那裏應該發生什麼。

cf採用指針char但(在BubbleSort)你是一個指針傳遞它int;但在main中,您將char的數組傳遞到BubbleSort。也許你應該改變BubbleSort採取一系列char

您還沒有包括<stdlib.h>

+0

基本上我正在檢查數字超過一個數字..所以,除非我得到一個空格,我把所有的數字放入數組d,然後將其作爲字符串複製到c .. – Hick 2010-05-27 11:29:02

0

strcpy(array[count],d); 

試圖將一個字符串複製到一個字符。你可能想這樣做(這取決於它是什麼,你想複製):

array[count] = d[count]; 

我認爲你需要包括stdlib.h中。