簡體   English   中英

c結構將自身作為參數傳遞給指針函數

[英]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;

這會將函數指針FifoGetCountFifiPut分配給該結構的元素。 您已經分配了一個uchar值的代碼,該值是通過對uchar *調用一次函數而生成的。 這應該一直在生成編譯器警告。 如果是這樣,您應該在問題中這樣說。 如果不是,則需要打開相關的編譯器警告,或者獲得更好的編譯器。

然后可以將函數用作:

uchar myCount = fifo1.FifoGetCount(&fifo1);
uchar myData = 1;
fifo1.FifoPut(&fifo1, myData);

注意,您必須顯式地將結構的地址作為函數的第一個參數傳遞。 C編譯器不會為您做到這一點。 如果您希望隱式完成該操作,那么您正在尋找的語言稱為C ++。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM