2010-01-17 124 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

相關問題