2014-06-14 7 views
0

중첩 된 함수가있는 구조를 만들려고합니다.이 구조체는 호출 함수를 단순화하기 위해 중첩 된 함수에 인수로 구조 자체를 전달합니다. 이 코드는 xc16 컴파일러를 사용하여 Pic 24f 시리즈 mcu에서 실행됩니다. 또한 카운트 기능이 중복되어 있음을 알고 있지만 필자는 그것이 내 요점을 설명한다고 생각합니다.struct 자신을 인수로 포인터 함수에 전달합니다.

구조 :

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

홈페이지 : uchar (*PutPointer); 그냥 uchar *PutPointer;를 작성하는 재미있는 방법이라고

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 FifoPut(Fifo *fifo, uchar data)을 가지고 있기 때문에

, 당신이 작성해야 것으로 보인다 : main()에, 다음

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

을, 당신은 쓸 수 :이 함수 포인터를 할당

fifo1.CountPointer = FifoGetCount; 
fifo1.PutPointer = FifoPut; 

FifoGetCount 구조체의 요소에 FifiPut이 있습니다. 함수를 uchar *으로 한 번 호출하여 생성 된 uchar 값을 할당 한 코드입니다. 컴파일러 경고를 생성 했어야합니다. 그렇다면 질문에 그렇게 말 했어야합니다. 그렇지 않다면 관련 컴파일러 경고를 켜거나 더 나은 컴파일러를 얻어야합니다.

당신은 다음과 같은 기능을 사용할 수 있습니다 명시 적으로 함수의 첫 번째 인수로 구조의 주소를 통과해야

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

참고; C 컴파일러는 마술로 당신을 위해 그렇게하지 않을 것입니다. 암묵적으로 그렇게하기를 원한다면 찾고있는 언어를 C++이라고 부릅니다.

+0

고마워요, 제가 찾고있는 것이 맞습니다. 약간의 혼란스러운 코드는 일부 코드를 제거하여 컴파일러 문제를 무시한 결과입니다. – user2419860