Zufallszahl | switch case | Variable | Fehler
-
_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 »}« tokenhier 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
elsesteht...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ücketwas?????
-
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 erstedeletegehö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 mitint 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
zufallnun? Eine freie Funktion oder Memberfunktion?Die Linkermeldung spricht für Memberfunktion, dass sie
privateist 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.
-
alles klar!
Also ich bin wie gesagt, kein Experte
...
aber ich sehe den Code ... & im Code waren in dieser .cc alle Funktionen, Methoden der Klasse und wurden mit Scope-Operator benutzt.
Logisch gehört für mich zufall() natürlich nicht zu der Klasse, da ich ja nur Zufallszahlen erzeugen will und diese dann für meine case´s nutzen will.Aber naja...es läuft & ich bin HAPPY

nun zu dem Thema mit srand()...das mann es nur 1 mal aufrufen sollte und nicht jedesmal wenn ein von fünf case´s genommen wird.
D.h. ich muss diese Zeile
srand( (unsigned) time(NULL) ) ;aus der Methode zufall() herausnehmen?
Und Global z.b. direkt invoid CommonPartSublayerScheduling::initialize() { ...... ...... srand( (unsigned) time(NULL) ); ..... .....reinnehmen?
Ich habe noch nie mit srand() gearbeitet. Ich weis nur dass wenn man Zufallszahlen erzeugen will, dann kommen immer wieder die gleichen raus. Und srand mit Time , erzeugt die Zufallszahlen in Abhängigkeit von der aktuellen Zeit. Also besser randomisiert. Allerdings hört hier schon mein WISSEN über srand() auf
-
srand machst du am besten bereits in der main rein. Funktionen können ja mehrmals aufgerufen werden und eigenen sich daher nicht.
srand initialisiert den Zufallsgenerator mit einem seed, den du übergeben musst, damit auch "zufällige" Zahlen rauskommen. Wenn man z.B einen festen Wert eingibt, kann man seine "zufällige" Applikation testen und immer mit den gleichen Werten rechenen. (also der gleichen Abfolge). Für Debuggen Gold Wert.