0

構造体を取る循環キューを実装しようとしています

  • ⟶ エンキューされていない場合はキューがいっぱいかどうかを確認します ⟶ そうでない場合は 0 を返します
  • ⟶ デキューされていない場合はキューが空かどうかをチェックします ⟶ そうでない場合は 0 を返します

以下は私のコードです:

    #ifndef_QUEUE_H_
    #define QUEUE_H_
    #define QUEUE_SIZE 32

    typedef struct queue 
    {
      int head;
      int tail;
      int buffer[QUEUE_SIZE];
    } queue_t;

    void init_queue(queue_t *);
    int enqueue(queue_t *, int);
    int isfull(queue_t *);
    int dequeue(queue_t *);            
    int queue_empty(queue_t *);            


    #endif
    /* queue.h ends here */


    /* *************************queue.c starts here************************ */
    #include<queue.h>
    #include<stm32f30x.h>

    #define QUEUE_SIZE 32

    int head;
    int tail;

    void init_queue(queue_t *q)
    {
      q->head = 0;
      q->tail = 0;
    }

    int enqueue(queue_t *q, int a )
    {
      if ((((q->head)+1)%QUEUE_SIZE)!=q->tail) 
        {
          q->buffer[q->head]=a;
          q->head=(((q->head)+1)%QUEUE_SIZE);
          return 1 ;
         }
     else 
         {  
            return 0 ;
         }

     }

    int dequeue(queue_t *q)
     {
      int temp ;
      if (queue_empty(q)) 
         {
           return 0;
          }
      else
        {
          temp = q->buffer[q->tail];
          q->tail=((q->tail)+1)%QUEUE_SIZE;
          return temp;
        }

    }

    int queue_empty(queue_t *q)
    {
      if (q->head == q->tail)
        {
          return 1;
        }
      return 0;
    }

    /* **************queue.c ends here********************** */

キューをテストしようとすると、たとえば「hello」と入力してその内容を印刷しようとすると、「ello hlo elo..」などの誤った応答が表示されます。

getchar および putchar 関数で enqueue および dequeue 関数を使用しています。以下は私のgetcharとputchar関数です:

queue_t rxbuf;
queue_t txbuf;
int putchar(int c) 
{

   while(!(enqueue(&txbuf, c)));
}

int nonblockgetchar(void)
{
  dequeue(&rxbuf);
}


int getchar(void) 
{
  int ch;
  while (!(ch=dequeue(&rxbuf)));
  return (ch);
}

あなたの時間を感謝し、助けてください。

4

0 に答える 0