我相信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;