Zufallszahl | switch case | Variable | Fehler



  • Hallo,

    leider komme ich nicht weiter 😕

    SINN :
    - ich habe Methode zufall(), diese erzeugt Zufallszahlen
    - Variable WERT ist als Hilfsvariable da. In diese soll die erzeugte Zufallsvariable der Methode zufall() übergeben werden
    - dann sollte in Abhängigkeit von WERT ein case genommen werden oder halt nicht.

    in .h

    ....
    ....
    ....
    
       // diese Methode erzeugt Zufallszahlen
        int zufall(int WERT);
        // diese Methode ist mein erster Scheduler (Eigenentwicklung)
        void doProbDropTail(int max_burst_size, int *scheduled_packets_size);
    ....
    ....
    ....
    

    in .cc

    ....
    ....
    ....
    int zufall(int a) {
    
            int r = 0;
    
            //  int M = 0;
            srand( (unsigned) time(NULL) ) ;
            for (int i=0; i<10; i++) {
            r = 1 + rand() % 10;
    
            return (r);
            }
    }
    ....
    ....
    ....
    void CommonPartSublayerScheduling::handleMessage( cMessage *msg ) {
        int WERT = 0;
    
    	if ( msg->isSelfMessage() ) {
    	}
    	else if ( msg->arrivalGateId() == upperLayerGateIn) {
    Ieee80216GenericMacHeader *upper_msg = heck_and_cast<Ieee80216GenericMacHeader*>(msg);
    		cPar *mac_entry_time = new cPar();
    			mac_entry_time->setName("mac_entry_time");
    			mac_entry_time->setDoubleValue( simTime() );
    		upper_msg->addPar( mac_entry_time );
    
    		IPDatagram *upper_ipd = check_and_cast<IPDatagram*>(upper_msg->encapsulatedMsg());
    		Ieee80216TGControlInformation *ipd_control = check_and_cast<Ieee80216TGControlInformation*>(upper_ipd->controlInfo());
    
    		if ( scheduler == "FIFO" ) {
    			if ( queue_fifo.size() < 3000 )
    				queue_fifo.push_back(*upper_msg);
    		}
    
    		else if ( scheduler == "PDT" ) {
    			switch ( ipd_control->getTraffic_type() ) {
    				case UGS:
    					WERT = zufall(WERT);
    					if ( 0 < WERT < 100 ) {
    					if ( queue_ugs.size() < 250)
    						queue_ugs.push_back(*upper_msg);
    							      }
    					break;
    
    				case RTPS:
    					WERT = zufall(WERT);
    					if ( 0 < WERT < 100 ) {
    					if ( queue_rtps.size() < 500 )
    						queue_rtps.push_back(*upper_msg);
    							      }
    					break;
    
    				case ERTPS:
    					int WERT = zufall(WERT);
    					if ( 0 < WERT < 60 ) {
    					if ( queue_ertps.size() < 500 )
    						queue_ertps.push_back(*upper_msg);
    							      }
    					break;
    
    				case NRTPS:
    					int WERT = zufall(WERT);
    					if ( 0 < WERT < 40 ) {
    					if ( queue_nrtps.size() < 500 )
    						queue_nrtps.push_back(*upper_msg);
    							      }
    					break;
    
    				case BE:
    					int WERT = zufall(WERT);
    					if ( 0 < WERT < 20 ) {
    					if ( queue_be.size() < 500 )
    						queue_be.push_back(*upper_msg);
    							      }
    					break;
    			}
                else
    			       delete upper_msg;
             delete msg;
    		}
    
    	}
    
    	updateDisplay();
    }
    ....
    ....
    ....
    

    natürlich ist es alles nur ein kleiner Fragment der Software.

    Aber ich bekomme ständig einen Fehler :

    In member function »virtual void :
    Fehler: Sprung zur case-Marke
    Fehler:   überschneidet Initialisierung von »int WERT«
    139: Fehler: redeclaration of »int WERT«
    131: Fehler: »int WERT« previously declared here
    146: Fehler: Sprung zur case-Marke
    131: Fehler:   überschneidet Initialisierung von »int WERT«
    147: Fehler: redeclaration of »int WERT«
    131: Fehler: »int WERT« previously declared here
    154: Fehler: expected `}' before »else«
    163: Fehler: »ipd_control« wurde in diesem Gültigkeitsbereich nicht definiert
    166: Fehler: »upper_msg« wurde in diesem Gültigkeitsbereich nicht definiert
    171: Fehler: »upper_msg« wurde in diesem Gültigkeitsbereich nicht definiert
    176: Fehler: »upper_msg« wurde in diesem Gültigkeitsbereich nicht definiert
    181: Fehler: »upper_msg« wurde in diesem Gültigkeitsbereich nicht definiert
    186: Fehler: »upper_msg« wurde in diesem Gültigkeitsbereich nicht definiert
    191: Fehler: »upper_msg« wurde in diesem Gültigkeitsbereich nicht definiert
    At global scope:
    197: Fehler: expected constructor, destructor, or type conversion before »;« token
    198: Fehler: expected declaration before »}« token
    

    ich glaube etwas stimmt mit der Variable "WERT" und der Verwendung in der Switch-Anweisung nicht ....

    Danke für die Hilfe!



  • Du kannst innerhalb von switch keine Variablen mehrfach definieren. Du kannst aber einen separaten Block dafür öffnen. Aber da du mit Wert sowieso immer das Gleiche machst, kannst du die Deklaration ja vorher vornehmen.

    Zudem solltest du srand() genau einmal aufrufen, und zwar am Anfang des Programms!



  • Nochmal als Beispiel:

    switch(x) {
      case 1:
        int i;  //geht nicht
    }
    
    switch(x) {
      case 1:
      {
        int i;  //geht
      }
    }
    


  • _matze schrieb:

    switch(x) {
      case 1:
        int i;  //geht nicht
    }
    

    Doch, das geht. 😉

    Aber nur mit skalaren Datentypen und nur einmal pro switch .



  • Nexus schrieb:

    _matze schrieb:

    switch(x) {
      case 1:
        int i;  //geht nicht
    }
    

    Doch, das geht. 😉

    Aber nur mit skalaren Datentypen und nur einmal pro switch .

    Hui, du hast Recht! Da war ich in Gedanken wohl eher bei C... 🤡



  • Hallo,

    erstmal danke für die Hilfe. Zumindest läuft die Compilierung weiter.

    Leider gibt es noch Fehler 😞

    ich glaube es fehlt nur noch eine Klammer? Aber auch beim 10tem durchgehen kann ich kein Fehler finden!?!
    oder ist der Fehler vielleicht woanders und ich sehe es nicht?

    155: Fehler: expected `}' before »else«
    165: Fehler: »ipd_control« wurde in diesem Gültigkeitsbereich nicht definiert
    168: Fehler: »upper_msg« wurde in diesem Gültigkeitsbereich nicht definiert
    173: Fehler: »upper_msg« wurde in diesem Gültigkeitsbereich nicht definiert
    178: Fehler: »upper_msg« wurde in diesem Gültigkeitsbereich nicht definiert
    183: Fehler: »upper_msg« wurde in diesem Gültigkeitsbereich nicht definiert
    188: Fehler: »upper_msg« wurde in diesem Gültigkeitsbereich nicht definiert
    193: Fehler: »upper_msg« wurde in diesem Gültigkeitsbereich nicht definiert
    199: Fehler: expected constructor, destructor, or type conversion before »;« token
    200: Fehler: expected declaration before »}« token
    

    hier der CODE | .cc

    void CommonPartSublayerScheduling::handleMessage( cMessage *msg ) {
      int WERT = 0;
    	if ( msg->isSelfMessage() ) {
    	}
    
    	else if ( msg->arrivalGateId() == upperLayerGateIn) {
    
    		Ieee80216GenericMacHeader *upper_msg = check_and_cast<Ieee80216GenericMacHeader*>(msg);
    
    		cPar *mac_entry_time = new cPar();
    			mac_entry_time->setName("mac_entry_time");
    			mac_entry_time->setDoubleValue( simTime() );
    		upper_msg->addPar( mac_entry_time );
    
    		IPDatagram *upper_ipd = check_and_cast<IPDatagram*>(upper_msg->encapsulatedMsg());
    		Ieee80216TGControlInformation *ipd_control = check_and_cast<Ieee80216TGControlInformation*>(upper_ipd->controlInfo());
    
    		if ( scheduler == "FIFO" ) {
    			if ( queue_fifo.size() < 3000 )
    				queue_fifo.push_back(*upper_msg);
    		}
    
    		else if ( scheduler == "PDT" ) {
    			switch ( ipd_control->getTraffic_type() ) {
    				case UGS:
    					WERT = zufall(WERT);
    					if ( 0 < WERT < 100 ) {
    					if ( queue_ugs.size() < 250)
    						queue_ugs.push_back(*upper_msg);
    							      }
    					break;
    
    				case RTPS:
    					WERT = zufall(WERT);
    					if ( 0 < WERT < 100 ) {
    					if ( queue_rtps.size() < 500 )
    						queue_rtps.push_back(*upper_msg);
    							      }
    					break;
    
    				case ERTPS:
    					WERT = zufall(WERT);
    					if ( 0 < WERT < 60 ) {
    					if ( queue_ertps.size() < 500 )
    						queue_ertps.push_back(*upper_msg);
    							      }
    					break;
    
    				case NRTPS:
    					WERT = zufall(WERT);
    					if ( 0 < WERT < 40 ) {
    					if ( queue_nrtps.size() < 500 )
    						queue_nrtps.push_back(*upper_msg);
    							      }
    					break;
    
    				case BE:
    					WERT = zufall(WERT);
    					if ( 0 < WERT < 20 ) {
    					if ( queue_be.size() < 500 )
    						queue_be.push_back(*upper_msg);
    							      }
    					break;
    			}
                else
    			       delete upper_msg;
             delete msg;
        }
    
    		else if ( scheduler == "WRR" || scheduler == "APQ" ){
    			switch ( ipd_control->getTraffic_type() ) {
    				case UGS:
    					if ( queue_ugs.size() < 250 )
    						queue_ugs.push_back(*upper_msg);
    					break;
    
    				case RTPS:
    					if ( queue_rtps.size() < 500 )
    						queue_rtps.push_back(*upper_msg);
    					break;
    
    				case ERTPS:
    					if ( queue_ertps.size() < 500 )
    						queue_ertps.push_back(*upper_msg);
    					break;
    
    				case NRTPS:
    					if ( queue_nrtps.size() < 500 )
    						queue_nrtps.push_back(*upper_msg);
    					break;
    
    				case BE:
    					if ( queue_be.size() < 500 )
    						queue_be.push_back(*upper_msg);
    					break;
    			}
    		}
    		else
    			delete upper_msg;
    
    		delete msg;
    	}
    
    	updateDisplay();
    }
    

    Wieso kann ich srand() nur 1mal verwenden? geht es nicht anders? oder würde es auch so gehen?



  • Michi8080 schrieb:

    ich glaube es fehlt nur noch eine Klammer? Aber auch beim 10tem durchgehen kann ich kein Fehler finden!?!
    oder ist der Fehler vielleicht woanders und ich sehe es nicht?

    Das wundert mich nicht bei dieser Einrückung. Wie wärs, wenn du uns noch sagen würdest, in welcher Zeile der Fehler vorkommt?

    Michi8080 schrieb:

    Wieso kann ich srand() nur 1mal verwenden? geht es nicht anders? oder würde es auch so gehen?

    Weil srand() dazu dient, den Seed (Startwert) des Zufallsgenerators zu setzen. Und das sollte nur einmal gemacht werden, wenn dir etwas an der (Pseudo-)Zufälligkeit der erzeugten Werte liegt. Siehe auch hier.



  • sorry!!

    erster Fehler kommt in der Zeile 68 .....



  • Michi8080 schrieb:

    sorry!!

    erster Fehler kommt in der Zeile 68 .....

    So, wie ich das sehe fehlt da ein }. Aber Rück deinen Code anständig ein, dann findest du den Fehler selbst..
    Die IDE sollte dich da auch unterstützen, indem sie die Paare kennzeichnet..



  • ja das ist ja das komisch dabei .... eigentlich sind da nur 2 Klammern ..
    die erste schließt die switch-Anweisung und die zweite die schließt die IF-Anweisung des "PDT"-schedulers....

    da sollte "mein ich" keine andere noch dazu ?!?!?!

    PS: Ich nutze Kate & CodeBlocks unter Linux ....



  • Michi8080 schrieb:

    ja das ist ja das komisch dabei .... eigentlich sind da nur 2 Klammern ..
    die erste schließt die switch-Anweisung und die zweite die schließt die IF-Anweisung des "PDT"-schedulers....

    Ja, und schau mal, wo das else steht...

    Aber wenn du einheitlich einrücken würdest (dazu gehört öffnende und schliessende Klammern auf gleicher Höhe), wäre das auch gleich viel klarer. Ausserdem könntest du den Code in mehrere kleine Funktionen aufteilen, dann hast du ein viel bessere Übersicht.



  • Ich weiss jetzt, wo der Fehler ist, aber du sollst deinen Code einrücken lernen und am besten auch gleich auslagern. So kommst du nicht weit.

    Du hast ein } am falschen Ort.. Wenn du den Code eingerückt hättest, dann hättest du das gemerkt..



  • Danke! .. ja das stimmt .... in Funktionen aufteilen ist eine gute IDEE, bin noch Anfänger...

    ich habe jetzt es mit mehr oder weniger Klammern versucht und leide ohne Erfolg 😞 ...
    aber dann sobald ich den den letzten else-Zweig :

    else
       delete upper_msg;
    delete msg;
    

    entfernt habe.... lief die Compilierung weiter 😉

    aber jetzt ein ganz komischer Fehler ?? 😞

    sagt euch

    In function `CommonPartSublayerScheduling::handleMessage(cMessage*)':
    (.text+0x14a2): undefined reference to `CommonPartSublayerScheduling::zufall(int)'
    (.text+0x14ed): undefined reference to `CommonPartSublayerScheduling::zufall(int)'
    (.text+0x1538): undefined reference to `CommonPartSublayerScheduling::zufall(int)'
    (.text+0x1583): undefined reference to `CommonPartSublayerScheduling::zufall(int)'
    (.text+0x15ce): undefined reference to `CommonPartSublayerScheduling::zufall(int)'
    collect2: ld gab 1 als Ende-Status zurück
    

    etwas?????



  • Warum sollte man als Anfänger keine Funktionen benutzen können?! - Du benutzt ja auch schon eine, also wo ist das Problem?!

    Was auch hilft ist den unwichtigen Code mal rauszunehmen. Dann hast du auch einen besseren Überblick..



  • Du scheinst die Funktion CommonPartSublayerScheduling::zufall(int) nicht definiert zu haben. Zumindest nicht an einem Ort, wo sie der Linker findet.

    Und den else -"Zweig" (nur das erste delete gehörte dazu) solltest du nicht entfernen, wenn du damit den Speicher nicht mehr freigibst. Besser die Klammer verschieben.



  • - nein natürlich kann ich auch Funktionen verwenden und werde es mir vornehmen, noch mehr zutun als bis jetzt!

    - zu dem Fehler :
    Kann es sein das ein Linker-Fehler deswegen auftrifft weil man die Funktion nicht bei der ::initialize Funktion gesondert definiert hat?
    Ich habe ja die zufall() im Header mit

    int zufall(int WERT);
    

    deklariert und wie man an dem Code sehen kann , dann in der .cc auch Definiert.

    reicht es vielleicht nicht aus???

    die Methode zufall() ist im Header als private , es sollte glaube ich kein Problem sein, oder?



  • Was ist zufall nun? Eine freie Funktion oder Memberfunktion?

    Die Linkermeldung spricht für Memberfunktion, dass sie private ist auch, aber die Deklaration ist ja global? 😕



  • also, ich erweitere Code das schon fertig ist. Und es sind um die 50.h und .cc drin enthalten.

    Ich bin noch Anfänger.

    Ich wollte den vorhanden Code einfach um einen "scheduler" erweitern, der eine neue Methode zufall() benutzt.

    Ich weis das Memberfunktion die Funktionen von z.B. Strukturen sind. Ich habe Klassen, was kein Unterschied macht oder?

    Ich dachte das wenn ich in Header die Funktion als Prototyp deklariere, dann reicht es aus, um in der .cc auf diese Deklaration zuzugreifen und die Definition zuschreiben. Sobald das steht, DACHTE ich mir dass ich dann innerhalb dieser .cc auf diese Funktion problemlos zugreifen kann.

    ich sehe bestimmt etwas verkehrt? 😕



  • Michi8080 schrieb:

    Ich dachte das wenn ich in Header die Funktion als Prototyp deklariere, dann reicht es aus, um in der .cc auf diese Deklaration zuzugreifen und die Definition zuschreiben. Sobald das steht, DACHTE ich mir dass ich dann innerhalb dieser .cc auf diese Funktion problemlos zugreifen kann.

    Das stimmt eigentlich schon.

    Doch wie gesagt sehe ich das Problem wo anders: Die Definition scheint nicht mit der Deklaration übereinzustimmen. Genauer gesagt vermischst du Memberfunktionen und freie Funktionen.

    Wenn du die Klasse im Header hast, also so...

    class CommonPartSublayerScheduling
    {
        public:
            int zufall(int WERT);
    };
    

    ...dann ist die Memberfunktion zufall() bereits deklariert. Dann kannst du die Definition in die .cc- oder .cpp-Datei schreiben, und sofern du diesen Header einbindest, sollte alles gut sein.

    Wenn du die Methode dann einsetzt, musst du ein zugehöriges Objekt haben. Oder du machst sie gleich statisch, sodass sie sich ähnlich wie eine freie Funktion verhält, aber dem Scope und Zugriff der Klasse unterworfen ist.



  • GESCHAFFT 😉

    also erstmal die Frage : wenn ich die Funktion in Header als static deklariert hätte, dann hätte es also geklappt?

    so habe ich die zugehörige Klasse hinzugefügt, bzw. den Scope davor gesetzt (bestimmt falsche Ausdrucksweise)
    int CommonPartSublayerScheduling::zufall(int a) {
    ....

    gibt es eigentlich Vorteile wenn ich static benutzt hätte?



  • Michi8080 schrieb:

    wenn ich die Funktion in Header als static deklariert hätte, dann hätte es also geklappt? [...] gibt es eigentlich Vorteile wenn ich static benutzt hätte?

    Das kann ich so nicht sagen, weil ich dein Problem immer noch nicht genau kenne.

    Beispielsweise sehe ich immer noch nicht ein, warum zufall() jetzt eine Memberfunktion ist. Greift sie auf private Membervariablen der Klasse zu? Gehört sie zu einem Objekt und reagiert je nach Objekt anders?

    Ansonsten kannst du eine statische Klassenfunktion machen, wenn du findest, die Funktion gehöre logisch zur Klasse (zum Beispiel weil sie auf statische Member zugreift), sei aber unabhängig von deren Instanzen. Wenn sie nichts direkt mit der Klasse zu tun, machst du am besten eine freie, globale Funktion.


Anmelden zum Antworten