2013-11-04 4 views
3

데이터를 받아들이는 FIFO 큐를 코딩하려고하는데, 일단 전체 데이터가 가장 오래된 데이터를 해제하면 새로운 데이터를위한 공간이 생깁니다.FIFO 큐를 C로 작성하기

내가 프로그래밍에 새로운 오전하지만 다음 코드로 올라와 관리해야 : 난 데 문제는이 데이터를 이동하지 않고 배열하면 실패 할 것입니다

int Q[size], f=0, r=-1; 

int Qfull() 
{ 
    if (r==size) return 1; 
    return 0; 
} 

int Qinsert() 
{ 
    if(Qfull()) 
    { 
     elem=Q[f]; 
     f=f+1; 
     return elem; 
     r++; 
     Q[r]=SPI1BUF; 

    } 
    else 
    { 
     r++; 
     Q[r]=SPI1BUF; 
    } 
} 

이 연구로 인해 가득 배열 크기를 지나서 증가합니다. 이 문제를 해결할 방법이 있습니까?

+2

http://www.cs.bu.edu/teaching/c/queue/array/types.html – SQLMason

+0

당신이 그렇게 직접 코드가 당신을 위해 최선의 해답이 될 수 없습니다 학습 때문에. 위의 링크를 보거나 코드의 특정 문제에 대해 직접적인 질문을 던지시기 바랍니다 :) QFull 크기 검사가 잘못되어 채워지 자마자 충돌이 발생합니다. –

+1

대기열의 크기가 고정되어있는 경우 링 버퍼 사용을 고려할 수 있습니다. 첫 번째 요소에 하나, 두 번째 요소에 두 개의 포인터가 있어야합니다. 요소를 제거하면 "마지막 요소"포인터를 증가시킵니다. 만약 그것이'Q + size'와 같으면'Q'로 설정하십시오. – cHao

답변

1

What Dan said이고 실제로는 return 다음에 진술을 넣을 수 없습니다. 그들은 사형 당하지 않는다.

0

작업을 수행하기위한 추가 단계를 수행하지 않고 순환 대기열을 만들려고합니다. 당신은 (cHao에 의해 언급 된 것처럼) 그렇게하거나 링크 된 목록을 사용하여 조사해야합니다. 많은 수정이 필요하지 않으므로 순환 대기열로 작업하는 것이 좋습니다.

또한 if/else 절의 두 줄에 동일한 두 줄이 있습니다. 이 두 줄을 옮겨서 if 절을 저장할 수 있어야합니다. 나는 귀하의 논리에 100 % 아니므로 if 문 앞에 갈 수 있는지 확인하십시오.

int Qinsert() 
{ 
    r++; 
    Q[r]=SPI1BUF; 
    if(Qfull()) 
    { 
    //... 
    } 
}