使用前向声明在结构中执行更改后,不清楚编译器错误

时间:2019-08-21 14:10:07

标签: c xc8

我相信XC8编译器的奇怪行为是由于前向声明存在问题。在大家的帮助下,我已纠正了该错误,但仍然存在奇怪的错误。因此,我现在详细说明我的问题。 在MENU结构中,已实现CursorStr并带来麻烦。 如果我取出CursorStr并直接使用ButtonFunc *,那么一切都会顺利进行。 在结构下方,我包括了贯穿程序的#define语句。

typedef struct ArrowStr {
    // Cursor select data
    uint8_t UP[4];
    uint8_t DOWN[4];
    uint8_t RIGHT[4];
    uint8_t LEFT[4];
}ARROW_STR;

typedef struct MenuStr MenuStr;
typedef uint8_t ButtonFunc(MenuStr *);

typedef struct CursorStr
{         
    ButtonFunc* ButtonUpPtr;
    ButtonFunc* ButtonDownPtr;
    ButtonFunc* ButtonLeftPtr;
    ButtonFunc* ButtonRightPtr;
    ButtonFunc* PreMenuCursorPtr;
    ButtonFunc* MenuCursorPtr;
    ButtonFunc* PostMenuCursorPtr;
}CURSOR_STR;

typedef struct MenuStr
{
    ARROW_STR Arrows; 
    // not known anymore
    int    *ValueArray;
    // Cusor position data
    uint8_t ROW_POS[4];
    uint8_t COL_POS[4];
    // A5-A3 format strings
    uint8_t Format[3][3];
    INDEX ROW_INDEX;
    INDEX COL_INDEX;
    INDEX DIM_INDEX;
    INDEX EDIT_INDEX;

    INDEX FORMAT_INDEX;
    uint8_t CURRENT_MENU;
    CURSOR_STR CursorStr;

  //  ButtonFunc* ButtonUpPtr;
  //  ButtonFunc* ButtonDownPtr;
  //  ButtonFunc* ButtonLeftPtr;
   // ButtonFunc* ButtonRightPtr;
   // ButtonFunc* PreMenuCursorPtr;
  //  ButtonFunc* MenuCursorPtr;
  //  ButtonFunc* PostMenuCursorPtr;
    uint8_t CursorX;
    uint8_t CursorY;
}MENU;

// used in case of CursorStr
    #define pButtonDownPtr       Menu->CursorStr.ButtonDownPtr
    #define pButtonUpPtr         Menu->CursorStr.ButtonUpPtr
    #define pButtonLeftPtr       Menu->CursorStr.ButtonLeftPtr
    #define pButtonRightPtr      Menu->CursorStr.ButtonRightPtr
    #define pPreMenuCursorPtr    Menu->CursorStr.PreMenuCursorPtr
    #define pMenuCursorPtr       Menu->CursorStr.MenuCursorPtr
    #define pPostMenuCursorPtr   Menu->CursorStr.PostMenuCursorPtr
    #define pCursorPtrs          Menu->CursorStr

 // used directly   
    #define pButtonDownPtr       Menu->ButtonDownPtr
    #define pButtonUpPtr         Menu->ButtonUpPtr
    #define pButtonLeftPtr       Menu->ButtonLeftPtr
    #define pButtonRightPtr      Menu->ButtonRightPtr
    #define pPreMenuCursorPtr    Menu->PreMenuCursorPtr
    #define pMenuCursorPtr       Menu->MenuCursorPtr
    #define pPostMenuCursorPtr   Menu->PostMenuCursorPtr

在XC8中,使用直接方法均可编译并正常运行,但使用CursorStr方法会报告声明冲突(1098)。当然,通过使用一些调用来保存,存储和替换指针,我可以达到我的目标,但是我希望看到CursorStr方法能够正常工作,因为这样可以使代码更简单。再次感谢您的帮助。

添加:

如果

typedef uint8_t ButtonFunc(MenuStr *)

已更改为

typedef uint8_t ButtonFunc(uint8_t *)

然后我可以理解各种警告,但是代码可以编译并且程序可以运行。因此,前向声明中还必须包含一些内容。

添加2

由于无法获得所需的信息,因此创建了一种解决方法,并将MENU_STR更改为以下代码。这可以正常工作,没有任何错误或警告。因此,目前我认为问题出在XC8编译器。

typedef uint8_t ButtonFunc(struct MenuStr *);
typedef uint8_t CursorFunc(void *);

 typedef struct Buttons{
       CursorFunc* ButtonUpPtr;
       CursorFunc* ButtonDownPtr;
       CursorFunc* ButtonLeftPtr;
       CursorFunc* ButtonRightPtr;
       CursorFunc* PreMenuCursorPtr;
       CursorFunc* MenuCursorPtr;
       CursorFunc* PostMenuCursorPtr;   
   }BUTTONS;


typedef struct MenuStr
{
    ARROW_STR Arrows; 
    // not known anymore
    int    *ValueArray;
    // Cusor position data
    uint8_t ROW_POS[4];
    uint8_t COL_POS[4];
    // A5-A3 format strings
    uint8_t Format[3][3];
    INDEX ROW_INDEX;
    INDEX COL_INDEX;
    INDEX DIM_INDEX;
    INDEX EDIT_INDEX;

    INDEX FORMAT_INDEX;
    uint8_t CURRENT_MENU;

    union
    {
         BUTTONS ButtonsPtrs;    
         struct 
         {
                 ButtonFunc* ButtonUpPtr;
                 ButtonFunc* ButtonDownPtr;
                 ButtonFunc* ButtonLeftPtr;
                 ButtonFunc* ButtonRightPtr;
                 ButtonFunc* PreMenuCursorPtr;
                 ButtonFunc* MenuCursorPtr;
                 ButtonFunc* PostMenuCursorPtr;   
        };
    };
    uint8_t CursorX;
    uint8_t CursorY;
}MENU;

0 个答案:

没有答案