PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Frage zu case



Henry
20.08.2008, 18:40
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

fhs
20.08.2008, 19:35
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

Henry
20.08.2008, 19:41
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.

Felix G
20.08.2008, 19:54
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.

fhs
20.08.2008, 19:57
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

Henry
20.08.2008, 20:01
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

error41
20.08.2008, 22:22
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ß

Henry
20.08.2008, 22:33
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.

fhs
21.08.2008, 06:08
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, 08: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;
}

fhs
21.08.2008, 08:43
Danke, super, Georg-Johann. Diese Option hatte ich absolut nicht mehr in Erinnerung!

Gruß

Fred

sternst
21.08.2008, 08:59
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. ;-)

Henry
21.08.2008, 21:47
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 ;-)