我有下一个代码,但是我编译了,它看起来像一个错误:错误:预期的标识符或'('之前'浮动'。但它只是像其他的一样exacly我有的代码和来自互联网的例子,但我没有注意到错误。
#ifndef Deteccion
#define Deteccion
#define acc_TH 12.74
int cont=0;
int pasos=0;
float SF,SL,SLT;
struct Deteccion
{
int muestras;
int pasos;
float frecuencia;
float longitud;
float orientacion;
};
struct Deteccion Detectar(float ax, float ay, float az, float wz)
{
float mag,longitud,frecuencia;
int muestras;
float sum_acc,sum_w,orientacion;
mag=(ax*ax)+(ay*ay)+(az*az);
mag=pow(mag,0.5);
if(mag>=acc_TH)
{
muestras=muestras+1;
sum_acc=mag+sum_acc;
sum_w=wz+sum_w;
}
else
{
cont=cont+1;
if(muestras<32)
{
muestras=0;
sum_acc=0;
sum_w=0;
}
}
if(cont==4)
{
pasos=pasos+1;
SF=50/muestras;
SL=sum_acc/muestras;
SL=pow(SL,0.333);
SL=0.22*SL;
SLT=SF+SL;
orientacion=(0.02*sum_w)+orientacion;
sum_w=0;
muestras=0;
sum_acc=0;
}
}
#endif
答案 0 :(得分:4)
由于您使用Deteccion
作为标题保护,因此您不能对struct
标记使用相同的标识符。预处理器用空格替换Deteccion
,因此编译器会看到:
struct // <<== Nothing
{
int muestras;
int pasos;
float frecuencia;
float longitud;
float orientacion;
};
要解决此问题,请为标头防护使用不同的标识符:
#ifndef Deteccion_H
#define Deteccion_H
注意:看起来您在具有功能实现的文件中使用了头文件保护。这非常不寻常。考虑重构代码,以便将实现和声明放在不同的文件中。
答案 1 :(得分:3)
问题是您首先将Deteccion定义为空宏,这解释了编译错误。编译器看到struct Detectar(float
是非法的。
有趣的是,struct Deteccion
定义有效,只是被视为匿名结构声明。虽然它是无用的,因为不可重复使用。
一般建议:仅在头文件中防止使用该技术进行多次包含。它在.c文件中没用,并使用独特的命名规则,如大写加前缀。
#ifndef DETECCION_H
#define DETECCION_H
作为惯例,宏通常是完整的大写字母,这可以避免像你一样的问题。
答案 2 :(得分:2)
因为你有:
#define Deteccion
将“Deteccion”定义为什么,行
struct Deteccion Detectar(float ...
实际上是
struct Detectar(float ...
这是一个错误。