定义结构函数

时间:2016-07-27 19:26:53

标签: c

我有下一个代码,但是我编译了,它看起来像一个错误:错误:预期的标识符或'('之前'浮动'。但它只是像其他的一样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

3 个答案:

答案 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 ...

这是一个错误。