Forum: Mikrocontroller und Digitale Elektronik AVR GCC: "Array"/Look Up Table mit Lücken > Zahlen zuordnen


von Holger Meier (Gast)


Lesenswert?

Hallo,

ich habe einen int Wert der "nur" 16 verschiedene (keine Zahlenfolge) 
Zustände annehmen kann: z.B. 4, 16, 48, 68, 120 ... 1025, 1059
Diese Werte würde ich gerne in andere Zahlen (char) überführen. Die 
Berechnung würde eigentlich über eine sin und Binomialverteilung gehen, 
also zu kompliziert/rechenintensiv für den 8-bitter. Um dem uC das zu 
ersparen, würde ich also gerne eine Art Look Up Table haben, d.h. z.B. 
dem Wert 48 wird fest 143 zugeordnet (da die Berechnung eh dieses 
Ergebnis liefern würde und ich die entsprechenden Werte vorab am PC 
ausrechnen kann).
Wenn die Werte von 0 bis 15 gehen würden, würde ich das einfach über ein 
Array machen. Das müsste hier aber von 0 bis 1058 gehen (mit 
entsprechend vielen "Lücken"/Nulleinträgen) und nimmt dann viel Speicher 
ein. Gibt es für dieses Problem in C (AVR-GCC) eine elegante Lösung?

Danke,

Holger

von Matthias (Gast)


Lesenswert?

Wenns nicht zuviele Werte sind, kannst du ja
1
 SWITCH-CASE
 nehmen.

Oder folgen die Eingangswerte einer bestimment Regel? zB Zehnerschritte?

von Holger Meier (Gast)


Lesenswert?

Hallo,

gar nicht dran gedacht, vor die Strin klatsch.
Wie gesagt, sind nur 16 Werte, die sind auch schnell in einer switch 
case Struktur drin. Wobei da die Laufzeit sehr unterschiedlich ist, 
evtl. müssen ja im Maschinencode zuerst 15 Werte überprüft/verglichen 
werden, bis dann endlich der letzte passt.
Trotzdem danke für die schnelle Antwort.

Holger

von Stefan K. (_sk_)


Lesenswert?

Dann teile es halt in mehrere kleine Teile auf:

angenommen diese Zahlen:

4 8 12 16      25 39 70 90     110 200 300 400     600 1000 2000 4000
1
if (z > 90){
2
3
  if (z > 400){
4
    switch(z){
5
      case 600:   ...
6
      case 1000:  ...
7
      case 4000:
8
      default:
9
    }
10
  }
11
  else{
12
    switch(z){
13
      case ...
14
    }
15
  }
16
17
else{
18
  if (z > 16){
19
    switch(z){
20
      case ...
21
    }
22
  }
23
  else{
24
    switch(z){
25
      case ...
26
    }
27
  }
28
}

So hast Du max. 2 Vergleiche und 4 case-Schritte pro Durchlauf.

Gruß, Stefan

von Holger Meier (Gast)


Lesenswert?

Perfekt.

Danke!

Holger

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.