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);
    
    #endif
    

    main

    #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? 😛


Anmelden zum Antworten