2014-06-14 141 views
0

我想创建一个嵌套函数的结构,它将结构本身作为参数传递到嵌套函数以简化调用函数。代码将使用xc16编译器在Pic 24f系列单片机上运行。另外,我知道计数函数是多余的,但我认为这说明了我的观点。例如:c结构自身作为参数传递到指针函数

结构:

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

注意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++。

+0

谢谢,我正在寻找什么。代码有点混乱是剥离了一些代码的结果,因此忽略了编译器问题。 – user2419860