mikrocontroller.net

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


Autor: Holger Meier (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Matthias (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wenns nicht zuviele Werte sind, kannst du ja
 SWITCH-CASE 
 nehmen.

Oder folgen die Eingangswerte einer bestimment Regel? zB Zehnerschritte?

Autor: Holger Meier (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Stefan Kleinwort (_sk_)
Datum:

Bewertung
0 lesenswert
nicht 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
if (z > 90){

  if (z > 400){
    switch(z){
      case 600:   ...
      case 1000:  ...
      case 4000:
      default:
    }
  }
  else{
    switch(z){
      case ...
    }
  }

else{
  if (z > 16){
    switch(z){
      case ...
    }
  }
  else{
    switch(z){
      case ...
    }
  }
}

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

Gruß, Stefan

Autor: Holger Meier (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Perfekt.

Danke!

Holger

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.