两个几乎相同的代码片段出错

时间:2017-03-10 18:37:17

标签: c debugging typedef comparator

**我是C的新手,所以请在回答时牢记这一点

我正在开发一个更大的程序,我在其中使用名为integer.c的类(它定义了一个整数和使用的函数),real.c(定义了一个double和使用的函数)和comparator.c (它定义了用于比较这些不同数据类型的函数(每个类也有一个标题)。

当我尝试编译较大的程序时,我的comparator.c文件中出现错误,说明:

    comparator.c:25:23: error: expected expression
        return ((integer *) p)->value - ((integer *) q->value);
                          ^
    comparator.c:25:14: error: use of undeclared identifier 'integer'
        return ((integer *) p)->value - ((integer *) q->value);
                 ^
    comparator.c:25:48: error: expected expression
        return ((integer *) p)->value - ((integer *) q->value);
                                                   ^
    comparator.c:25:39: error: use of undeclared identifier 'integer'
        return ((integer *) p)->value - ((integer *) q->value);
                                          ^
    comparator.c:23:25: warning: unused parameter 'p' [-Wunused-parameter]
    int intComparator(void *p, void *q)
                            ^
    comparator.c:23:34: warning: unused parameter 'q' [-Wunused-parameter]
    int intComparator(void *p, void *q)
                                     ^

这是我的comparator.c类,我想要注意我的intComparator函数和realComparator函数几乎是一样的,所以我不明白为什么我没有为我的realComparator得到这些错误:

    #include <stdio.h>
    #include <limits.h>
    #include <assert.h> 
    #include <string.h> 
    #include "comparator.h"
    #include "str.h"
    #include "integer.h"
    #include "real.h"

    //returns >0 if p is > q, returns 0 if equal, returns <0 is q is > p
    int intComparator(void *p, void *q)
    {
        return ((integer *) p)->value - ((integer *) q)->value;
    }

    ////returns >0 if p is > q, returns 0 if equal, returns <0 is q is > p
    double realComparator(void *p,void *q)
    {
        return ((real *) p)->value - ((real *) q)->value;
    }


    int stringComparator(void *p,void *q)
    {
        int r = strcmp((char *)p, (char *)q);
        return r;
    }

这是我的integer.c类和real.c类用于比较(请注意,这个程序的任何编程风格可能看起来很奇怪,因为它适用于我需要遵循样式和程序大纲说明的类项目) :

integer.c的:

    #include <stdio.h>
    #include <stdlib.h>
    #include <limits.h>
    #include <assert.h>
    #include "integer.h"

    extern void Fatal(char *,...);

    integer *
    newInteger(int x)
        {
        integer *p = malloc(sizeof(integer));
        if (p == 0)
        {
            fprintf(stderr,"out of memory\n");
            exit(-1);
        }
        p->value = x;
        return p;
        }

    int 
    getInteger(integer *v)
        {
        assert(v!=0);
        return v->value;
        }

    void 
    displayInteger(FILE *fp,void *v)
        {
        assert(v!=0);
        fprintf(fp,"%d",getInteger((integer *) v));
        }

    void
    freeInteger(integer *v)
        {
        free(v);
        }

real.c:

    #include <stdio.h>
    #include <stdlib.h>
    #include <limits.h>
    #include <assert.h>

    extern void Fatal(char *,...);

    real *
    newReal(double x)
    {
        real *p = malloc(sizeof(real));
        if (p == 0)
        {
            fprintf(stderr,"out of memory\n");
            exit(-1);
        }
        p->value = x;
        return p;
    }

    double
    getReal(real *v)
    {
        assert(v!=0);
        return v->value;
    }


    void
    displayReal(FILE *fp,void *v)
    {
        assert(v!=0);
        fprintf(fp,"%f",getReal((real *) v));
    }

    void
    freeReal(real *v)
    {
        free(v);
    }

这是我的integer.h和real.h文件:

integer.h:

    #include <stdio.h>

    #ifndef __INTEGER_INCLUDED__
    #define __INTEGER_INCLUDED__

    typedef struct integer
        {
        int value;
        } integer;

    extern integer *newInteger(int);
    extern int getInteger(integer *);
    extern void displayInteger(FILE *,void *);
    extern void freeInteger(integer *);

    #define PINFINITY IN_MAX
    #define NINFINITY IN_MIN

    #endif

real.h:

    #include <stdio.h>

    #ifndef __REAL_INCLUDED__
    #define __REAL_INCLUDED__

    typedef struct real
    {
        double value;
    } real;

    extern real *newReal(double);
    extern double getReal(real *);
    extern void displayReal(FILE *,void *);
    extern void freeReal(real *);

    #define PINFINITY IN_MAX
    #define NINFINITY IN_MIN

    #endif

这是str.h:

    #include <stdio.h>

    #ifndef __STRING_INCLUDED__
    #define __STRING_INCLUDED__

    extern char * getString(char *);
    extern void displayString(FILE *,void *);
    extern void freeString(char *);

    #define PINFINITY IN_MAX
    #define NINFINITY IN_MIN

    #endif

和comparator.h:

    #ifndef comparator_h
    #define comparator_h

    typedef int (*Comparator)(void*,void*);
    typedef void (*Printer)(FILE*,void*);

    extern int intComparator(void *p, void *q);
    extern int realComparator(void *p, void *q);
    extern int stringComparator(void *p, void *q);

    #endif /* comparator_h */

我已经盯着这个这么久了,多次检查过所有内容,无法弄清楚为什么我会收到这些错误。任何帮助都会很棒,谢谢。

2 个答案:

答案 0 :(得分:1)

仔细看看括号:

return ((integer *) p)->value - ((integer *) q->value);
//                              ^^^^^^^^^^^^^^ 

return ((real *) p)->value - ((real *) q)->value;
//                           ^^^^^^^^^^^
  • 在第一种情况下,您将q->value投射到integer*

  • 在第二种情况下,您将q投射到real*,然后访问->value

我认为第一种情况是错误。

答案 1 :(得分:-1)

我看到了一些问题,但首先,我想建议修改代码以协助调试。你在一行中写了很多代码。我建议你将代码分成几部分,直到你明白它为止。然后当它工作时,你可以将它们组合在一起。像这样:

int intComparator(void *p, void *q)
    {
      int rval;
      int p1;
      int q1;

      p1 = (int *)p -> value;
      q1 = (int *)q -> value;
      rval = p1 - q1;
        return (rval);
    }

现在,我看到以下两个问题: 1.您正在尝试将p和q作为指向整数的指针。我认为你需要将它们作为指针转换为int,而不是整数。 2.在realcomparator中,你正在返回一个int,但我认为你正在使用实数。您应该将返回值更改为实数,或者在返回之前将结果转换为整数。