...und im Code oben kann die Abfrage von COUNTER auch in einer anderen Funktion geschehen, die das switch nich beinhaltet. Due Abfrage muss lediglich nach dem letzten CASE platziert sein, weil COUNTER vom GCC Präprozessor aufgelöst wird.
Kann man irgenwie mit einer Funktion während dem Programmverlauf die
Anzahl der Cases einer switch-case-Verzweigung herausfinden ?
Bei solchen Lösungsansätzen würde mich das zugrundeliegende Problem interessieren. Oder andersrum: was bringt es, wenn man weiß, wieviele if- oder case-Abfragen ein Programm an einer bestimmten Stelle hinter sich hat?
Bei solchen Lösungsansätzen würde mich das zugrundeliegende Problem
interessieren.
War tatsächlich nur aus neugier. Ich bin kein anfänger, aber auch kein Profi und ich versuche immer alles so zu programmieren, dass ich bei Änderungen so wenig andere Codeteile anpassen muss.
Ich erzeuge eine Random zahl und führe dann den entsprechenden Case aus. Dafür muss ich ja wissen wie viele ich habe. Hatte mich dann gefragt, ob man das statt händisch auch irgendwie auslesen kann. Villeicht lernt man ja was neues :)
Ich erzeuge eine Random zahl und führe dann den entsprechenden Case aus.
Dafür muss ich ja wissen wie viele ich habe. Hatte mich dann gefragt, ob
man das statt händisch auch irgendwie auslesen kann. Villeicht lernt man
ja was neues :)
Dann ist switch/case sicherlich das falsche Sprachmittel.
Denn eine durchnummerierte case "Aufzählung" ist ein Sonderfall, welcher genau so, oder gar noch effektiver, mit eine Sprungleiste, oder einem FunktionPointerArray abgehandelt werden kann.
Und die Größe eines Arrays, oder einer Liste, lässt sich jederzeit herausfinden.
Hatte mich dann gefragt,
Vermutlich eine falsche Frage, weil dein C++, welches du verwendest, das nicht hergibt.
Ich erzeuge eine Random zahl und führe dann den entsprechenden Case aus.
Nein, der Compuer führt zu deiner Zahl passende case-Statements aus. Meist eins, aber mit Fall-Through gehen auch mehr für eine Zahl.
Dafür muss ich ja wissen wie viele ich habe.
Die Aussage ergibt keinen Sinn. "wie viele" von was? Und warum musst du das "wissen". Du arbeitest mit einem mentalen Modell was keinen Sinn ergibt, aber du willst uns auch nicht verraten was das wirklich soll.
Du hast die case-Statements geschrieben. Die sind fest in deinem Code. Die kannst du abzählen. 1, 2, 3, ... ganz viele.
Dann ist switch/case sicherlich das falsche Sprachmittel.
Denn eine durchnummerierte case "Aufzählung" ist ein Sonderfall, welcher
genau so, oder gar noch effektiver, mit eine Sprungleiste, oder einem
FunktionPointerArray abgehandelt werden kann.
Nein. Jeder halbwegs brauchbare C-Compiler erkennt das und legt für sequenzielle case-Statements Sprungtabellen an. Wenn es sein muss abschnittsweise und mit zusätzlichen eingestreuten Tests für nicht-sequenzielle Werte.
Und die Größe eines Arrays, oder einer Liste, lässt sich jederzeit
herausfinden.
Und warum will man das tun? Man schreibt z.B. sechs case-Statements, dann hast man sechs Statements. Das werden zur Laufzeit nicht mehr oder weniger. Das sind genau die, die du hin geschrieben hast.
Nein. Jeder halbwegs brauchbare C-Compiler erkennt das und legt für
sequenzielle case-Statements Sprungtabellen an. Wenn es sein muss
abschnittsweise und mit zusätzlichen eingestreuten Tests für
nicht-sequenzielle Werte.
Case Kaskaden werden nicht garantiert zu Sprungtabellen.
Stark abhängig von den Optimierungseinstellungen.
Sie degenerieren auch mal zu einer Vergleichs/Entscheidungskette, vergleichbar mit einer if/else Kaskade.
Und das kann total ekelig werden.
Kleinste Änderungen im Code ändern dann massiv die Größe des generierten Codes und vor allen Dingen die Laufzeit.
Und die Größe eines Arrays, oder einer Liste, lässt sich jederzeit
herausfinden.
Und warum will man das tun?
Zur Erleichterung? Zur Vermeidung von Fehlern?
Man schreibt z.B. sechs case-Statements, dann hast man sechs Statements.
Das werden zur Laufzeit nicht mehr oder weniger.
Nein, aber zur Programmierzeit können es mehr oder weniger werden. Und dann ist es geschickt, wenn man nicht jedes mal daran denken muss, noch irgendwo eine magic number anpassen zu müssen. Der Computer ist eigentlich ziemlich gut im Zählen, also warum soll man das dann für ihn erledigen?
Nein, aber zur Programmierzeit können es mehr oder weniger werden. Und
dann ist es geschickt, wenn man nicht jedes mal daran denken muss, noch
irgendwo eine magic number anpassen zu müssen.
Wozu soll diese Magic-Number dienen? Das konnte keiner von euch Helden bisher beantworten.
Wer die Kontrolle über seine Case-Statements verloren hat, der hat die Kontrolle über sein Leben verloren. Da hilft auch eine Magic-Number nichts.
Nein, aber zur Programmierzeit können es mehr oder weniger werden. Und
dann ist es geschickt, wenn man nicht jedes mal daran denken muss, noch
irgendwo eine magic number anpassen zu müssen.
Nein, aber zur Programmierzeit können es mehr oder weniger werden. Und
dann ist es geschickt, wenn man nicht jedes mal daran denken muss, noch
irgendwo eine magic number anpassen zu müssen.
Wozu soll diese Magic-Number dienen? Das konnte keiner von euch Helden
bisher beantworten.
Das hat der TO doch schon geschrieben. Du Held hast es wohl nur überlesen. Sie soll dazu dienen, dem Zufallsgenerator den Zahlenbereich vorzugeben:
Wenn dem so ist (z.B. Zufallsgenerator mit N Ergebnissen, etwa "elektronischer" Würfel) dann ist switch-case vermutlich das falsche Mittel:
N ändert sich nie → switch / case ist kein Problem
N ändert sich zur Compilezeit, d.h. es gibt X Generierungsvarianten für "Würfel" mit unterschiedlich vielen Seiten / Würfelmöglichkleiten. Abhängig vom Problem und davon, wie groß X ist, kann man:
X Generierungsvarianten vorhalten, wenn sich die X's schlecht generalisieren lassen.
Lassen sich die X's gut generalisieren, kann man direkt algorithmisch rangehen, oder auto-Generierung der Codestelle in Betracht ziehen.
N ändert sich zur Laufzeit → Ähnlich wie im vorherigen Fall: Bei X möglichen Varianten kann man for jedes mögliche X Code vorhalten (per if-else oder switch-case oder virtuelle Methoden etc); das trifft zu wenn X überschaubar ist. Bei Zillionen von Möglichkeiten für X geht's dann wieder algorithmisch.
Ich erzeuge eine Random zahl und führe dann den entsprechenden Case aus.
Dafür muss ich ja wissen wie viele ich habe.
Das würde aber voraussetzen, dass die verschiedenen Fälle von 0 bis N fortlaufend numeriert sind – was nun absolut nicht selbstverständlich ist.
Ich würde switch/case z.B. für Verzweigungen in Abhängigkeit von Protokollnummern etc. einsetzen, und da hat man normalerweise nur ein paar interessante Werte und viele Lücken dazwischen.
Ich erzeuge eine Random zahl und führe dann den entsprechenden Case aus.
Dafür muss ich ja wissen wie viele ich habe.
Das würde aber voraussetzen, dass die verschiedenen Fälle von 0 bis N
fortlaufend numeriert sind – was nun absolut nicht selbstverständlich
ist.
Warum sollte man sie anders nummerieren, wenn der Zweck ist, sie per Zufallsgenerator auszuwählen?
Ich würde switch/case z.B. für Verzweigungen in Abhängigkeit von
Protokollnummern etc. einsetzen, und da hat man normalerweise nur ein
paar interessante Werte und viele Lücken dazwischen.
Ich erzeuge eine Random zahl und führe dann den entsprechenden Case aus.
Dafür muss ich ja wissen wie viele ich habe. Hatte mich dann gefragt, ob
man das statt händisch auch irgendwie auslesen kann. Villeicht lernt man
ja was neues :)
Du willst die Anzahl der erzeugten "Random Zahlen" wissen?
Was glaubst du warum es "Random" heisst?
Weil beim nächsten Durchlauf wieder genau die selben Zahlen
erzeugt werden?