我正在尝试创建一个具有嵌套函数的结构,它将结构本身作为参数传递给嵌套函数,以简化调用函数。代码将使用xc16编译器在Pic 24f系列mcu上运行。此外,我知道计数功能是多余的,但我认为它说明了我的观点。例如:
结构:
typedef struct
{
uchar Fifo[UART1_RX_MAX_BUFFER_SIZE];
uchar FifoIndex = 0;
uchar FifoCount = 0;
uchar FifoOverrunFlag = FALSE;
uchar (*CountPointer);
uchar (*PutPointer);
}Fifo;
功能:
// Returns: The number of items in the Fifo
uchar FifoGetCount(Fifo *fifo)
{
return fifo->FifoCount;
}
// Summary: Adds data to the end of the Fifo
// Parameters:
// data: Data to be added to the end of the Fifo
// Returns: True (1) if the data was successfully added
// False (0) if the data was not successfully added
// as a result of the Fifo being full
uchar FifoPut(Fifo *fifo, uchar data)
{
if (fifo->FifoCount > FIFO_MAX_SIZE)
{
fifo->FifoOverrunFlag = TRUE;
return FALSE;
}
uint putIndex = fifo->FifoGetPutIndex();
fifo->Fifo[putIndex] = data;
fifo->FifoCount++;
return TRUE;
}
主:
Fifo fifo1;
int main()
{
fifo1.CountPointer = FifoGetCount(fifo1);
fifo1.PutPointer = FifoPut(fifo1, uchar data);
// Intended Usage
uchar myCount = fifo1.FifoGetCount();
uchar myData = 1;
fifo1.FifoPut(myData);
}
答案 0 :(得分:0)
请注意,uchar (*PutPointer);
只是写uchar *PutPointer;
的有趣方式。要创建函数指针,您必须编写:uchar (*PutPointer)(…);
,其中…
应该由参数类型的规范替换 - 原型。
由于你有一个函数uchar FifoPut(Fifo *fifo, uchar data)
,你似乎应该写一下:
typedef struct Fifo Fifo;
struct Fifo
{
uchar Fifo[UART1_RX_MAX_BUFFER_SIZE];
uchar FifoIndex = 0;
uchar FifoCount = 0;
uchar FifoOverrunFlag = FALSE;
uchar (*CountPointer)(Fifo *fifo);
uchar (*PutPointer)(Fifo *fifo, uchar data);
};
然后,在main()
,你可以写:
fifo1.CountPointer = FifoGetCount;
fifo1.PutPointer = FifoPut;
这将函数指针FifoGetCount
和FifiPut
分配给结构的元素。您通过将函数调用一次uchar
生成的uchar *
值生成的代码。这应该是生成编译器警告。如果是的话,你应该在你的问题中说出来。如果不是,则需要打开相关的编译器警告,或者获得更好的编译器。
然后您可以将该功能用作:
uchar myCount = fifo1.FifoGetCount(&fifo1);
uchar myData = 1;
fifo1.FifoPut(&fifo1, myData);
请注意,您必须显式传递结构的地址作为函数的第一个参数; C编译器不会通过魔法为你做那件事。如果你想隐式完成,你正在寻找的语言叫做C ++。