Archiv verlassen und diese Seite im Standarddesign anzeigen : Frage zu case
Hallo,
ich suche nun schon eine Weile im Forum, bin aber leider nicht fündig geworden.
Ich möchte mit Case einen Zahlenbereich abfregen. Einzeln klappt es ja so:
while(1)
{
switch(Zaehler2)
{
case 100: LED1 = 10;
case 200: LED1 = 20;
}
nun möchte ich aber z.B. in der ersten Anweisung einen Bereich von 0..100 haben und in der Zweiten Anweisung 101..200.
Geht das auf diese Weise? ich habe nämlich nicht herausgefunden wie ich einen Bereich definieren kann.
Kann mir da jemand auf die Sprünge helfen?
Danke schon einmal
Hallo Henry,
das Testen, ob eine Variable in einen Bereich fällt, ist ein klassicher Fall für geschachtelte "if"-, nicht für "switch/case"-Anweisungen. Ich gehe mal davon aus, dass "Zaehler2" "unsigned" ist:
<pre>
uint8_t Zaehler2;
// bla bla bla
if (Zaehler2<=200) {
if (Zaehler2>100) { // 101 <= Zaehler2 <= 200
}
else { // 0 <= Zaehler2 <= 100
}
}
</pre>
MfG
Fred
Danke erst einmal für Deine Antwort.
Das Problem ist nur das es dann eine ganz schöne schachtelei werden wird, es werden ca. 20-30 Bereiche werden.
Da ich bis jetzt noch nicht durch die Erzeugung einer Zufallszahl durchgeblickt habe, muss ich mir nämlich irgendetwas basteln womit ich durcheinander wirkende folge zu erstellen.
Da kam mir case am übersichtlichsten vor.
Also das macht man wirklich besser mit if, aber wenn man es geschickt anstellt braucht nix geschachtelt zu werden...
int x;
if(x >= 100)
{
}
else if(x >= 90)
{
}
else if(x >= 80)
{
}
else if(x >= 70)
{
}
. . .
else
{
}
Der Compiler sollte das so umsetzen, daß nach der ersten zutreffenden Bedingung alle folgenden ignoriert werden. Das ist dann auch nicht unübersichtlicher als ein switch-Block.
Hallo Henry,
wenn es immer 100er (oder andere fixe) Stufen sind, die Du einordnen willst, kannst Du sicher auch mit einer geschickten Integer-Division (evtl. nach Runden und/oder Verschieben des Nullpunkts) die Bereiche finden und dann mit switch/case weiterverarbeiten!
Gruß
Fred
Leider soll die Stufung unterschiedlich sein, da ja eine gewisse Zufälligkeit vorgegaukelt werden sollen.
Bin nebenbei auch am weitersuchen, ob ich die Erzeugung von Zufallszahlen nicht doch irgendwie hin bekomme
Hi!
Wie wäre es wenn du mit if-Abfragen zuerst die Bereiche abstichst,
und dann dementsprechend eine Variable setzt?
Pseudocode:
if ((x>= bla1) && (x<= bla2)) var=1;
if (bedingung bereich 2) var=2;
usw...
Diese Variable benutzt du dann zur Case-Abfrage.
So hättest du einen Teil zum Bereichefestlegen,
und einen Teil um festzulegen was passieren soll.
Gruß
Das würde schon so ähnlich aus wie meine case Idee.
Das werde ich mal im Hinterkopf behalten, denn ich habe mittlerweile schon Fortschritte mit Zufallszahlen machen können.
Ich danke euch für eure Hilfe und Vorschläge.
Hallo Henry,
welche Probleme Du mit der Erzeugung von Zufallszahlen hast, ist mit nicht klar. In diesem Thread im Nachbarforum (http://www.mikrocontroller.net/topic/90419) gibt es etwas C-Code dazu und auch eine Assembler-Routine, die ich mal geschrieben habe (leicht auf C änderbar; nur Ganzzahlen).
Gruß
Fred
SprinterSB
21.08.2008, 09:41
int foo (int x)
{
int r;
switch (x)
{
default: r = 0; break;
case 100 ... 199: r = 1; break;
case 200 ... 299: r = 2; break;
}
return r;
}
Danke, super, Georg-Johann. Diese Option hatte ich absolut nicht mehr in Erinnerung!
Gruß
Fred
Diese Option hatte ich absolut nicht mehr in Erinnerung!
Das ist auch kein Standard-C.
Also mit Vorsicht zu genießen, da nicht unbedingt portabel.
Oder anders gesagt: es ist auch ganz gut so, wenn man sich nicht daran erinnert. ;-)
Hallo Henry,
welche Probleme Du mit der Erzeugung von Zufallszahlen hast, ist mit nicht klar. In diesem Thread im Nachbarforum (http://www.mikrocontroller.net/topic/90419) gibt es etwas C-Code dazu und auch eine Assembler-Routine, die ich mal geschrieben habe (leicht auf C änderbar; nur Ganzzahlen).
Gruß
Fred
Hallo Fred,
nach Assembler Code habe ich nie geachtet, da ich da überhaupt nicht durchblicke.
Warum es Probleme gab kann ich nicht so genau sagen, vermutlich weil ich mein srand(TCNT1) immer in meiner endlosschleife aufgerufen habe.
Nun rufe ich srand(TCNT1); einmal beim Programmstart auf und mit zufall1 = rand() % 200 + 1; erzeuge ich mir dann meine Zufallszahl (hoffe ich jedenfalls). Es ändert sich auf jeden Fall schon einmal etwas im Ablauf meiner Abfolge in die gewünschte richtung. Nun were ich noch etwas damit expirimentiren.
Bin noch ziemlich am Anfang mit der Programmierung von µC in C. Was ich vorerst für meine Zwecke verwenden möchte habe ich schon (wenn auch nicht auswendig) einigermaßen verstanden.
Aber ich finde ja hier Hilfe bevor ich verzweifel ;-)
Powered by vBulletin® Version 4.2.5 Copyright ©2024 Adduco Digital e.K. und vBulletin Solutions, Inc. Alle Rechte vorbehalten.