где ошибка в этом коде C, и как избавиться от предупреждений? - PullRequest
2 голосов
/ 27 мая 2010
#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;
}

Когда я запускаю этот код, я не получаю никакой ошибки. Помимо нескольких предупреждений, но когда я запускаю его в другой системе, код вылетает. Могу я узнать почему?

Ответы [ 4 ]

2 голосов
/ 27 мая 2010
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, тогда как первый параметр Bubblesort ожидает int *. Я бы поменял Bubblesort на char *.

1 голос
/ 27 мая 2010

Fopen возвращает указатель.

Замените это:

FILE fp1;

на

FILE *fp1;

При главном запуске.

0 голосов
/ 27 мая 2010

Линия

strcpy(array[count],d);

пытается скопировать строку в символ. Вы, вероятно, хотите сделать что-то вроде (в зависимости от того, что вы пытаетесь скопировать):

array[count] = d[count];

Я думаю, вам нужно включить stdlib.h.

0 голосов
/ 27 мая 2010

strcpy работает с указателями, но array[count] является символом. Вы не дали достаточно информации, чтобы сказать, что там должно происходить.

cf переводит указатели на char, но (в BubbleSort) вы передаете указатель на int; все же в main вы передаете массив char в BubbleSort. Возможно, вам следует изменить BubbleSort на массив char?

Вы не включили <stdlib.h>.

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