views:

79

answers:

3
typedef struct queue {

  int q[max];
  int qhead;
  int qrear;

} queue;


void init_queue(queue *QUEUE)
{
  QUEUE.qhead = 0;
  QUEUE.qrear = -1;
}
void enqueue(queue *QUEUE,int data)
{
  QUEUE.qrear++;
  QUEUE.q[QUEUE.qrear] = data;
}

int process_queue(queue *QUEUE)
{
  if(QUEUE.qhead > QUEUE.qrear) 
    return -1;
  else
    return QUEUE.q[QUEUE.qhead++];
}

I am implementing queues using arrays just to keep it simple. Wats the error with the above code?

+2  A: 

You should use -> instead of .:

Accessing structs' values using pointers is done using QUEUE-> or (*QUEUE). and not QUEUE.. You first need to dereference the pointer and only then access the value.

typedef struct queue {

  int q[max];
  int qhead;
  int qrear;

} queue;


void init_queue(queue *QUEUE)
{
  QUEUE->qhead = 0;
  QUEUE->qrear = -1;
}
void enqueue(queue *QUEUE,int data)
{
  QUEUE->qrear++;
  QUEUE->q[QUEUE->qrear] = data;
}

int process_queue(queue *QUEUE)
{
  if(QUEUE->qhead > QUEUE->qrear) 
    return -1;
  else
    return QUEUE->q[QUEUE->qhead++];
}
brickner
+4  A: 

First of all, the . operator is used to access members of a struct. You need -> to access members of a pointer to a struct:

void init_queue(queue *QUEUE)
{
  QUEUE->qhead = 0;
  QUEUE->qrear = -1;
}

Just as a tid-bit, a->b is equivalent to (*a).b - that is, first dereferencing the pointer a, and then accessing a member of that struct.

Claudiu
Thank you......
blacktooth
+3  A: 

Besides the compilation error from using . instead of ->, you also have potential buffer overflow in enqueue; you'll overflow your buffer after max calls. You have a couple of choice depending on what you want.

1) You can turn this into a circular queue:

void enqueue(queue *QUEUE,int data)
{
  QUEUE->qrear = (QUEUE->qrear + 1) % max;
  QUEUE->q[QUEUE->qrear] = data;
}

2) You can stop adding once you hit max:

void enqueue(queue *QUEUE,int data)
{
  if (QUEUE->qrear < (max - 1))
  {
    QUEUE->qrear++;
    QUEUE->q[QUEUE->qrear] = data;
  }
}
R Samuel Klatchko