структура очереди выдает странную ошибку - PullRequest
0 голосов
/ 15 ноября 2011

вот реализация очереди, которая дает мне очень неясную ошибку

#include<iostream>
#include "bool.h"
#include "item.h"
#include "queue.h"

using namespace std;

void init_queue(queue *q){
    q->first=0;
    q->last=queuesize-1;
    q->count=0;

}
       void enqueue (queue *q,item_type x){
           if(q->count>=queuesize)
               cout<<" queue everflow occurs during enqueue "<<endl;
           else
           {
               q->last=(q->last+1)%queuesize;
               q->m[q->last]=x;
               q->count=q->count+1;

           }




       }

             int dequeue (queue *q)
             {
                 item_type x;
                 if(q->count<=0) cout<<"empthy queue "<<endl;
                 else
                 {
                     x=q->m[q->first];
                     q->first=(q->first+1)%queuesize;
                     q->count=q->count-1;
                 }
                 return (x);




                 }



             item_type headq(queue *q)
             {
                 return(q->m[q->first]);
             }
             int empthy(queue *q){


                 if (q->count<=0) return (TRUE);
                 else return (FALSE);
             }

 void print_queue(queue *q){
     int i;
     i=q->first;
     while(i!=q->last)
     {
         cout<<q->m[i];
         i=(i+1)%queuesize;
     }
     cout<<q->m[i]<<"  ";

 }
 int main(){
     queue *q;
     init_queue(q);
 int a;
 while(cin>>a){
     enqueue(q,a);




 }
 print_queue(q);


    return 0;
}

см. Также, пожалуйста, файл заголовка очереди

#define  queuesize 1000
#include "item.h"

typedef struct
{
int  m[queuesize+1];
  int first;
  int last;
  int count;
  }queue;

ошибка в том, что (на самом деле) это не ошибка, а предупреждениея компилирую, но когда я запускаю, он говорит, что локальная переменная q неинициализирована, поэтому какая переменная q - это имя структуры, поэтому, когда я запускаю метод init_queue, он должен инициализировать yes?

Ответы [ 6 ]

3 голосов
/ 15 ноября 2011

Вы должны создать экземпляр объекта очереди.

int main(){
 queue *q = new queue;
 init_queue(q);

или

использовать q в качестве переменной стека и передать адрес.

int main(){
 queue q;
 init_queue(&q);
3 голосов
/ 15 ноября 2011

Проблема заключается в этих двух строках кода.

 queue *q;
 init_queue(q);

Внутри init_queue вы предполагаете, что q выделена некоторая память для него путем разыменования с помощью оператора ->.Но это просто указатель на случайный адрес в памяти (так как он не был инициализирован).

q->first=0;
q->last=queuesize-1;
q->count=0;

Чтобы это исправить, вы должны добавить что-то вроде

queue *q = new queue();

Однако, поскольку вы находитесь в C ++, возможно, стоит создать класс для инкапсуляции выделения памяти в конструкторе и освобождения памяти в деструкторе.

Еще лучше было бы следовать предложению rageshctech и избегать использования ручной памятивыделение вообще и просто использовать что-то, выделенное в стеке (например, без указателя).

2 голосов
/ 15 ноября 2011
 queue *q;      
init_queue(q); 

Вы не выделяете память для q.

очереди * q = новой очереди;

Вы также можете выделить очередь в стеке: (рекомендуется!)

queue q;
   init_queue(&q); 
2 голосов
/ 15 ноября 2011

это имя структуры

Нет, q является указателем на queue -объект.В main вы не присвоили никакое значение q, и вы даже не создали объект queue, на который он мог бы указывать.Так что q неинициализирован.

Вы должны сделать это:

queue q;          // an instance of queue
queue *qptr = &q; // a pointer to that instance
// now use qptr (or &q) in place of q in the rest of the main function.
1 голос
/ 15 ноября 2011

Вы никогда не выделяли память для очереди.

Вместо указателей создайте класс с конструктором не по умолчанию и используйте его вместо этого.

Указатели - вещь C.Вы кодируете в C ++: P

1 голос
/ 15 ноября 2011

Я предполагаю, что предупреждение о переменной q в main? Это потому, что вы определяете его как указатель, но не выделяете его. Либо определите его как не указатель, и используйте &q во всех вызовах функций, либо выделите для него память:

queue *q = new queue;

И до того, как return 0 в main освободит память:

delete q;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...