2010-01-17 106 views
1

我不明白为什么会出现此错误。也许有人看到它。初始化类型时不兼容的类型

这是错误。

actor_plazma.c:92: error: incompatible types when initializing type ‘int (*)(struct VisObject *)’ using type ‘float’ 
actor_plazma.c:92: error: incompatible types when initializing type ‘void *’ using type ‘float’ 
make: *** [actor_plazma.lo] Error 1 

下面是相关的代码。

#define VISUAL_PARAM_LIST_ENTRY_FLOAT(name, val, lim)  { name, VISUAL_PARAM_ENTRY_TYPE_FLOAT, 0, val, lim } 


#define VISUAL_PARAM_LIMIT_FLOAT(min, max)   { VISUAL_PARAM_ENTRY_LIMIT_TYPE_FLOAT, 0, min, 0, 0, max, 0 } 

typedef enum { 
    VISUAL_PARAM_ENTRY_LIMIT_TYPE_NULL, 
    VISUAL_PARAM_ENTRY_LIMIT_TYPE_INTEGER, 
    VISUAL_PARAM_ENTRY_LIMIT_TYPE_FLOAT, 
    VISUAL_PARAM_ENTRY_LIMIT_TYPE_DOUBLE, 
    VISUAL_PARAM_ENTRY_LIMIT_TYPE_END 
} VisParamEntryLimitType; 

static VisParamEntryProxy params[] = { 
    VISUAL_PARAM_LIST_ENTRY_INTEGER ("bass sensitivity", 0, VISUAL_PARAM_LIMIT_NONE), 
    VISUAL_PARAM_LIST_ENTRY_INTEGER ("plazma effect", TRUE, VISUAL_PARAM_LIMIT_BOOLEAN), 
    VISUAL_PARAM_LIST_ENTRY_INTEGER ("3d effect option", FALSE, VISUAL_PARAM_LIMIT_BOOLEAN), 
    VISUAL_PARAM_LIST_ENTRY_INTEGER ("lines",  TRUE, VISUAL_PARAM_LIMIT_BOOLEAN), 
    VISUAL_PARAM_LIST_ENTRY_INTEGER ("spectrum",  TRUE, VISUAL_PARAM_LIMIT_BOOLEAN), 
    VISUAL_PARAM_LIST_ENTRY_INTEGER ("3d effect",  TRUE, VISUAL_PARAM_LIMIT_BOOLEAN), 
    VISUAL_PARAM_LIST_ENTRY_FLOAT ("rotation speed", 0.4, VISUAL_PARAM_LIMIT_FLOAT(0.0f, 1000.0f)), // line 92 
    VISUAL_PARAM_LIST_END 
}; 

编辑:哎呀,不包括一切:

typedef enum { 
    VISUAL_PARAM_ENTRY_TYPE_NULL,  /**< No parameter. */ 
    VISUAL_PARAM_ENTRY_TYPE_STRING,  /**< String parameter. */ 
    VISUAL_PARAM_ENTRY_TYPE_INTEGER, /**< Integer parameter. */ 
    VISUAL_PARAM_ENTRY_TYPE_FLOAT,  /**< Floating point parameter. */ 
    VISUAL_PARAM_ENTRY_TYPE_DOUBLE,  /**< Double floating point parameter. */ 
    VISUAL_PARAM_ENTRY_TYPE_COLOR,  /**< VisColor parameter. */ 
    VISUAL_PARAM_ENTRY_TYPE_PALETTE, /**< VisPalette parameter. */ 
    VISUAL_PARAM_ENTRY_TYPE_OBJECT,  /**< VisObject parameter. */ 
    VISUAL_PARAM_ENTRY_TYPE_END  /**< List end, and used as terminator for VisParamEntry lists. */ 
} VisParamEntryType; 

typedef enum { 
    VISUAL_PARAM_ENTRY_LIMIT_TYPE_NULL, 
    VISUAL_PARAM_ENTRY_LIMIT_TYPE_INTEGER, 
    VISUAL_PARAM_ENTRY_LIMIT_TYPE_FLOAT, 
    VISUAL_PARAM_ENTRY_LIMIT_TYPE_DOUBLE, 
    VISUAL_PARAM_ENTRY_LIMIT_TYPE_END 
} VisParamEntryLimitType; 

struct _VisParamEntryLimitProxy { 
    VisParamEntryLimitType type; 

    struct { 
     int  integer;  /**< Integer data. */ 
     float  floating;  /**< Floating point data. */ 
     double  doubleflt;  /**< Double floating point data. */ 
    } min; 

    struct { 
     int  integer;  /**< Integer data. */ 
     float  floating;  /**< Floating point data. */ 
     double  doubleflt;  /**< Double floating point data. */ 
    } max; 
}; 

struct _VisParamEntryProxy { 
    const char  *name; 

    VisParamEntryType type; 

    char   *string; 
    double   value; 

    VisColor   color; 

    VisParamEntryLimitProxy limit; 
}; 
+0

提供VisParamEntryProxy和VisParamEntryLimitType结构 – 2010-01-17 04:46:31

+0

那么什么是VisParamEntryProxy的定义是什么? – 2010-01-17 04:52:06

+0

让您的编译器生成预处理输出。那么你应该能够更清楚地了解疯狂的宏观替代之后发生了什么。 – jamesdlin 2010-01-17 05:22:41

回答

2

有用于VisParamEntryProxy类型定义。但是,假设这里是一个转录错误,我认为这个错误是由宏只提供5或6个初始值设定项,当结构需要时造成的7.

或者,如果我误认为类型链,那么它需要只有6个值。对于后者,你有这样的:

#define VISUAL_PARAM_LIST_ENTRY_FLOAT(name, val, lim) { name, VISUAL_PARAM_ENTRY_TYPE_FLOAT, 0, val, lim } 

但我认为它需要像

#define VISUAL_PARAM_LIST_ENTRY_FLOAT(name, val, lim) { name, VISUAL_PARAM_ENTRY_TYPE_FLOAT, 0, val, SOMECOLOR, lim} 
+0

是的颜色是问题。我把它移到了最后的位置,现在它可以工作。谢谢! – Scott 2010-01-17 05:26:20

相关问题