**我是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 */
我已经盯着这个这么久了,多次检查过所有内容,无法弄清楚为什么我会收到这些错误。任何帮助都会很棒,谢谢。
答案 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,但我认为你正在使用实数。您应该将返回值更改为实数,或者在返回之前将结果转换为整数。