Totales Problem bin am verzweifeln



  • Hallo!
    Ich habe mal wieder angefangen c++ zu programmieren, aber irgendwie gibt es ein riesen Problem und zwar wird eine Endlosschleife produziert und ich weiß einfach nicht warum!!!! Ich drehe bald durch.

    Teil des codes:

    cout <<"Setting default values for seats...";	
    	for(k=241;k<281;k++)//Blöcken werden Reihennummern zugewiesen
    	{	
    		blck[k].reihe=k-240;
    		blck[k].belegt=0;
    		blck[k].status1=0;
    		blck[k].person=0;
    
    	};
    	cout <<"Done"<<endl;
    

    Hier wird eine Endlosschleife produziert warum???? Keine Ahnung.

    cout <<"Setting default values for seats...";	
    	for(k=241;k<281;k++)//Blöcken werden Reihennummern zugewiesen
    	{	
    		blck[k].reihe=k-240;
    		blck[k].belegt=0;
    		//blck[k].status1=0;
    		blck[k].person=0;
    
    	};
    	cout <<"Done"<<endl;
    

    Dies produziert keine Endlosschleife! Arg was soll das? Was hat das Array blck mit meinem Schleifenzähler zutun? Im obigen Fall fängt die Schleife immer wieder bei 1 an (obwohl sie ja bei 241 anfängt)

    Wer das ganze Programm nochmal sehen möchte:

    #include <iostream>
    #include <fstream>
    #include <cstdlib>
    #include <stdlib.h>
    #include <time.h>
    #include <math.h>
    #include <unistd.h>
    
    using namespace std;
    struct block{
    	int belegt;
    	int status1;
    	int person;
    	int reihe;
    };
    
    struct person{
    	int reihe;
    	int platz;
    	int t1;
    	int t2;
    	int t3;
    	int zeit;
    	int wait;
    };
    
    int main (int argc, char * const argv[]) 
    {
    	int i;
    	int k;
    	int r;
    	int t;
    	long j;
    	int ready;
    	int tick;
    	//Intialisierung
    	cout << "Intializing:"<<endl;
    	cout <<"Arrays...";
    	block blck[280];
    	person pers[240];
    	cout <<"Done"<<endl;	
    	cout <<"Random...";
    	srand( (unsigned)time( NULL ) );
    	cout <<"Done"<<endl;
    	cout <<"Setting default values for passangers...";
    	for (i=1;i<=240;i++)
    	{
    		k=k+1;
    		if (k>6){k=1;r++;}
    		pers[i].platz=k;
    		pers[i].reihe=r;
    		pers[i].t1=1; //Laufzeit
    		pers[i].t2=20; //Packzeit
    		pers[i].t3=10; //Sitzzeit // noch nicht
    		pers[i].zeit=0;
    		blck[i].person=i;
    		blck[i].belegt=100;
    		blck[i].status1=1;
    		blck[i].reihe=0;
    	};
    	cout <<"Done"<<endl;
    	cout <<"Setting default values for seats...";	
    	for(k=241;k<281;k++)//Blöcken werden Reihennummern zugewiesen
    	{	
    		blck[k].reihe=k-240;
    		blck[k].belegt=0;
    		blck[k].status1=0;
    		blck[k].person=0;
    
    	};
    	cout <<"Done"<<endl;	
    	//Mixen
    	cout <<"Setting default values for vars...";
    	ready=0; //Es sitzt noch niemand
    	cout <<"Done all intializing"<<endl;
    cout<<"Starting"<<endl;
    	do
    	{
    		for(i=280;i>=1;i=i-1)
    		{
    			if(blck[i].status1!=0)
    			{
    				if(blck[i].belegt>=100) //Wenn belegt bei 100%, dann ist Person in der Lage weiter zu gehen.
    				{
    					if(blck[i].status1==1)
    					{
    						if(blck[i+1].status1==0) //Wenn der nächste Block frei ist, dann:
    						{
    							//Kann weitergehen und sich, falls richtige Reihe, hinsetzen
    							if(blck[i+1].reihe==pers[blck[i].person].reihe)
    							{
    								blck[i+1].status1=2;
    								blck[i+1].belegt=(int)100/pers[blck[i].person].t2;
    							}
    							else
    							{
    								blck[i+1].status1=1;
    								blck[i+1].belegt=(int)100/pers[blck[i].person].t1;
    							}							
    							blck[i+1].person=blck[i].person;
    							//Alten Block frei machen
    							blck[i].status1=0;
    							blck[i].belegt=0;
    							blck[i].person=0;
    						}
    						else
    						{
    							pers[blck[i].person].wait+=(int)100/pers[blck[i].person].t1;
    						}
    					}
    					else if(blck[i].status1==2)
    					{
    						ready++;
    						pers[blck[i].person].zeit=t;
    						blck[i].status1=0;
    						blck[i].belegt=0;
    						blck[i].person=0;
    						cout <<"Time: "<<t<< ": Passagier Nr. " <<ready<<" hat Platz genommen. Waitingtime: "<<pers[blck[i].person].wait<<endl;
    					}
    					else if(blck[i].status1==3)
    					{
    						//Noch nicht implementiert.
    					}
    				}
    				else  //Belegt ist noch nicht bei 100%
    				{
    					if (blck[i].status1==1) // Person geht
    					{blck[i].belegt+=(int)100/pers[blck[i].person].t1;}
    					else if(blck[i].status1==2) //Person packt
    					{blck[i].belegt+=(int)100/pers[blck[i].person].t2;}
    					else if(blck[i].status1==3) //Person setzt sich
    					{blck[i].belegt+=(int)100/pers[blck[i].person].t3;}
    				}
    			}
    		}
    
    	t++;
    	cout <<"Time: " <<t;
    	}while(ready<240); //Solange noch nicht alle sitzen
    
    return 0;
    }
    
    int zufall(int o,int u)
    {
    	return (int)(((double)rand() / RAND_MAX) * (o + 1 - u) + u);
    }
    

    (Programm ist noch nicht fertig, ist auch egal, was es macht, ich verstehe einfach nicht, wo die Endlosschleife herkommt)

    Benutze Ubuntu und diesen g++ compiler. Keine Ahnung, welcher Compiler das nun ist.
    Bitte helft mir!!! Ich bin verzweifelt!



  • Du hast

    block blck[280];
    

    definiert, also 280 mal blck von 0..279 (in C/C++ sind Arrays imer Nullbasiert). In deiner Schleife greifst du aber auf blck[280] zu und überschreibst das was hinter den Array liegt.

    Korrigier das mal, vielleicht geht es dann...

    LG
    Bernd



  • Dasselbe passiert auch bei person.

    svebert schrieb:

    ...

    ...
    
    int main (int argc, char * const argv[]) 
    {
    ...
    	person pers[240];
    ...
    	for (i=1;i<=240;i++)
    	{
    		k=k+1; // BTW: k ist noch nicht initialisiert
    ...
    		pers[i].platz=k;
    

    und: Ja, solche Speicherzugriffsverletzungen können zu solchen Fehlerbildern führen.
    Sowas kann man übrigens prima von std::vector prüfen lassen.
    1.) "block blck[280];" => "std::vector<block> blck(280);"
    2.) "blck[...]" => "blck.at(...)" (std::vector hat zwar auch operator[], aber das braucht keinen boudary check zu machen)
    3.) ums Ganze einen try/catch-Block...

    Gruß,

    Simon2.



  • DANKE!!!!!!!!!
    Ich habe in letzter Zeit Basic programmiert und dort wird dann 0...280 definiert. Nun ist alles klar!
    Tschüss!
    Sven



  • svebert schrieb:

    DANKE!!!!!!!!!
    Ich habe in letzter Zeit Basic programmiert und dort wird dann 0...280 definiert. ...

    hmmm, nicht eher 1...280 ?
    Ich fände es jedenfalls komisch, in einem Array[280] 281 Elemente zu haben.

    Gruß,

    Simon2.



  • Simon2 schrieb:

    svebert schrieb:

    DANKE!!!!!!!!!
    Ich habe in letzter Zeit Basic programmiert und dort wird dann 0...280 definiert. ...

    hmmm, nicht eher 1...280 ?
    Ich fände es jedenfalls komisch, in einem Array[280] 281 Elemente zu haben.

    Es ist zwar befremdlich, aber wenn Du in (zumindest Visual) Basic Nullbasiert arbeitest (kann man einstellen) und ein Array(280) definierst, hast Du 0..280, also 281 Elemente.

    Besonders schlimm ist das dann in VisualBasic.NET, denn dort sind VB-Collections 1-basiert, VB-Arrays 0-basiert wie oben, und die .NET-Collections wiederum so, wie wir es gewohnt sind.



  • Nimm Ada, da kannst Array von und zu machen wie du willst. Neben modularen Datentypen etc. ein sinniges Feature.



  • LordJaxom schrieb:

    ...Basic Nullbasiert arbeitest (kann man einstellen) ...

    😮 😮 😮
    OK - das wusste ich nicht (meine Basic-Zeiten sind schon eeeewig her und waren auch nicht glorreich).

    Aber das finde ich ja mal übelst bedenklich, wenn das mal so mal so ist...
    Naja, ich werde hoffentlich sowieso nie mehr (ernsthaft) mit Basic arbeiten müssen.
    😃

    Gruß,

    Simon2.


Anmelden zum Antworten