bug im mini-programm - ob jmnd mal eben drüberschauen könnte?
-
abend zusammen... naja eher guten morgen^^
hab hier ein kleine programm, dass an sich ja schon halbwegs brauchbar funktioniert - wenn ich aber nu 9 zeichen (durch leerzeichen getrennt) eingebe und mir diese ausgeben lasse, dann geht das gerade eben noch gut^^ - bei einem weiteren eingegeben zeichen, dass ich aus der queue lesen will versucht er anscheinend auf eine falsche speicheraddresse zuzugreifen. - ich such scho seit 2h find aber meinen eigenen fehler (wie immer .) net. sieht ihn jmnd?
header
#ifndef TEXT_QUEUE_H #define TEXT_QUEUE_H #include<string> const int max_queue_size=3; const int max_queue_number=3; using namespace std; typedef struct t_w{ string single_word; }text_word; typedef struct queue{ int front; int rear; text_word text[max_queue_size]; bool is_empty; }word_queue; typedef struct hyper_hyper{ int front_queue; int rear_queue; bool is_empty; //is_empty=true , wenn genau 1 grund-queue vorhanden ist word_queue* queues[max_queue_number]; }text_queue; bool append(text_queue* p_text, text_word in); text_word extract(text_queue* pointer_all); bool append(text_queue* p_text, word_queue* p_queue); bool is_full(text_queue* p_text); #endifmain
#include<iostream> #include<string> #include"text_queue.h" using namespace std; int main(int argc, char* argv[]) { int eingabe; text_word input, output; word_queue* pointer=NULL; text_queue* pointer_hyper=NULL; text_queue hyper; hyper.front_queue=hyper.rear_queue=0; hyper.is_empty=true; pointer_hyper=&hyper; int counter; do { cout<<"Bitte druecken sie die:\n"; cout<<"1 um Woerter einzugeben!\n"; cout<<"2 um Woerter auszulesen!\n"; cout<<"3 fuer Abbruch!\n"; cin>>eingabe; switch(eingabe) { case 3: { cout<<"Abbruch durch Benutzer..."<<endl; if(!hyper.is_empty) { pointer=NULL; delete pointer_hyper; //loeschen aller evtl. new-erzeugten queues, allerdings mäkelt er hier etwas pointer_hyper=NULL; } return 0; } case 1: { cout<<"Bitte geben sie die Woerter ein, bzw. 'exit' fuer Abbruch"<<endl; do { cin>>input.single_word; if (input.single_word=="exit") //schleifen-'ausbruch' break; if(hyper.is_empty) { hyper.queues[hyper.rear_queue]=new word_queue; hyper.queues[hyper.rear_queue]->is_empty=true; hyper.is_empty=false; } if(!append(pointer_hyper, input)) //platz im aktuellen queue? { if(append(pointer_hyper, pointer)) { hyper.queues[hyper.rear_queue]=new word_queue; hyper.queues[hyper.rear_queue]->is_empty=true; hyper.is_empty=false; pointer=hyper.queues[hyper.rear_queue]; } if(!append(pointer_hyper, input)) cout<<"'Warteschlange' voll! Es passt "<<input.single_word<<" "<<"nicht mehr hinein!\n"; } } while(1); break; } case 2: { if(hyper.is_empty) { cout<<"keine Woerter zum auslesen vorhanden!"<<endl; break; } cout<<"Wie viele Woerter sollen ausgelesen werden?"; cin>>eingabe; counter=eingabe; while(counter>0) { if(!hyper.is_empty) { pointer=hyper.queues[hyper.front_queue]; output=extract(pointer_hyper); cout<<output.single_word<<" "; counter--; if(pointer->is_empty) { delete pointer; pointer=NULL; } } else break; } cout<<"\nwurde aus der 'Warteschlange' entfernt\n\n"; if(counter>0) cout<<counter<<" Stellen koennen nicht gelesen werden, da sie nicht gefuellt sind!\n\n"; break; } default: { cout<<"ungueltige Eingabe - Bitte wiederholen!\n\n"; break; } } }while(1); return 0; }und funktions-cpp
#include<string> #include"text_queue.h" bool append(text_queue* p_text, text_word in) { bool is_true =false; if(p_text->queues[p_text->rear_queue]->is_empty) //wenn das jeweilige queue leer ist, werden front und rear je auf 0 gesetzt, um damit arbeiten zu können {p_text->queues[p_text->rear_queue]->rear=p_text->queues[p_text->rear_queue]->front=0;} if(p_text->queues[p_text->rear_queue]->rear+1==max_queue_size) { if(p_text->queues[p_text->rear_queue]->front!=0) { if(!p_text->queues[p_text->rear_queue]->is_empty) { p_text->queues[p_text->rear_queue]->rear=0; } p_text->queues[p_text->rear_queue]->text[p_text->queues[p_text->rear_queue]->rear]=in; p_text->queues[p_text->rear_queue]->is_empty=false; is_true=true; } return is_true; } if(p_text->queues[p_text->rear_queue]->rear+1<max_queue_size&&p_text->queues[p_text->rear_queue]->rear+1!=p_text->queues[p_text->rear_queue]->front) { is_true=true; if(p_text->queues[p_text->rear_queue]->is_empty) { p_text->queues[p_text->rear_queue]->is_empty=false; } else { p_text->queues[p_text->rear_queue]->rear++; } p_text->queues[p_text->rear_queue]->text[p_text->queues[p_text->rear_queue]->rear]=in; } return is_true; } text_word extract(text_queue* p_hyper) { text_word temp; temp =p_hyper->queues[p_hyper->front_queue]->text[p_hyper->queues[p_hyper->front_queue]->front]; if(p_hyper->queues[p_hyper->front_queue]->front==p_hyper->queues[p_hyper->front_queue]->rear) { p_hyper->queues[p_hyper->front_queue]->is_empty=true; if(p_hyper->front_queue==p_hyper->rear_queue) { p_hyper->is_empty=true; } if(p_hyper->front_queue+1==max_queue_number) { p_hyper->front_queue=0; } else { p_hyper->front_queue++; } } else if(p_hyper->queues[p_hyper->front_queue]->front+1==max_queue_size) { p_hyper->queues[p_hyper->front_queue]->front=0; } else {p_hyper->queues[p_hyper->front_queue]->front++;} return temp; } /*wir haben text_word extract verwendet, da diese Variante mit weniger erzeugten Variablen auskommt /*und das Problem eines nicht vorhandenen Wortes über bool is_empty gelöst wird*/ bool append(text_queue* p_text, word_queue* p_queue) { bool is_true=false; if(p_text->rear_queue+1==max_queue_number) { if(p_text->front_queue==0) { return is_true; } else { p_text->rear_queue=0; } } else { if(p_text->rear_queue+1==p_text->front_queue) { return is_true; } else p_text->rear_queue++; } is_true=true; return is_true; }danke für jede hilfe - auch abseits des angesprochenen bugs.
-
Wo bleibt der Debugger denn hängen?
Ich glaube nicht, dass sich jemand freiwillig durch diesen Code gräbt.
-
hat sich soeben erledigt - thread kann geschlossen werden

-
hyper_hyper
Hmm ... wie heißt der DJ noch gleich? Aja Scooter-Fan?
