2010-05-22 3 views
1
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 ошибка с вышеуказанным кодом?Указатели на структуры

+0

Для дальнейшего использования, вы должны включать в себя текст из сообщение об ошибке компилятора в вашем вопросе. Эти сообщения существуют по какой-то причине. Когда вы станете более опытными, вы сможете их понять и использовать для быстрого определения ошибок в коде. Публикация их здесь также поможет людям дать вам лучший совет. –

ответ

2

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

Доступ значения структур с использованием указателей осуществляется с помощью 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++]; 
} 
5

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

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

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

+0

Бинго это первое предложение - чистое золото. Почему текстовые книги не пишут такие простые различия, как это. У меня есть три книги C, и никто из них не объясняет это прозрачно. –

+0

@AndrewS: Спасибо! Я обнаружил, что на самом деле очень сложно описать вещи простым и понятным способом. – Claudiu

3

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

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

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

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

void enqueue(queue *QUEUE,int data) 
{ 
    if (QUEUE->qrear < (max - 1)) 
    { 
    QUEUE->qrear++; 
    QUEUE->q[QUEUE->qrear] = data; 
    } 
} 
Смежные вопросы