c struct передавая себя в качестве аргумента в функцию указателя

Я пытаюсь создать структуру с вложенными функциями, которая передает саму структуру в качестве аргумента во вложенную функцию для упрощения вызова функций. Код будет запущен на mcu Pic 24f серии с использованием компилятора xc16. Кроме того, я знаю, что функция подсчета избыточна, но я думаю, что она иллюстрирует мою точку зрения. Например:

Состав:

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);
}

1 ответ

Решение

Обратите внимание, что 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++.

Другие вопросы по тегам