[英]c struct passing itself as an argument into a pointer function
我正在嘗試創建具有嵌套函數的結構,該結構將結構本身作為參數傳遞給嵌套函數,以簡化調用函數。 該代碼將使用xc16編譯器在Pic 24f系列單片機上運行。 另外,我知道count函數是多余的,但我認為它說明了我的觀點。 例如:
結構體:
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);
}
請注意, uchar (*PutPointer);
只是編寫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 ++。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.