Указатели на структуры - PullRequest
1 голос
/ 23 мая 2010
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++];
}

Я реализую очереди, используя массивы, просто для простоты.Wats ошибка с приведенным выше кодом?

Ответы [ 3 ]

5 голосов
/ 23 мая 2010

Прежде всего, оператор . используется для доступа к членам структуры. Вам нужно -> для доступа к членам указателя на структуру:

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

Тит-бит a->b эквивалентен (*a).b, то есть сначала разыменуем указатель a, а затем получаем доступ к члену этой структуры.

3 голосов
/ 23 мая 2010

Помимо ошибки компиляции при использовании . вместо ->, у вас также есть потенциальное переполнение буфера в enqueue;Вы переполните свой буфер после max вызовов.У вас есть пара выбора в зависимости от того, что вы хотите.

1) Вы можете превратить это в круговую очередь:

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

2) Вы можете прекратить добавление, как только вы нажмете max:

void enqueue(queue *QUEUE,int data)
{
  if (QUEUE->qrear < (max - 1))
  {
    QUEUE->qrear++;
    QUEUE->q[QUEUE->qrear] = data;
  }
}
2 голосов
/ 23 мая 2010

Вы должны использовать -> вместо .:

Доступ к значениям структур с помощью указателей осуществляется с помощью QUEUE-> или (*QUEUE)., а не QUEUE.. Сначала вам нужно разыменовать указатель и только затем получить доступ к значению.

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++];
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...