PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : ZahlenBereiche



NickR
21.02.2006, 18:46
Hi

Fragen über Fragen :Ostern

Also ich hab das Problem das ich Werte ( 0...255) von einem Poti bekomme und ich will jetzt darauf entsprechent reagieren. Möchte nun Bereiche Einteilen heisst für den Zahlenbereich 0..30 soll er einen festen Wert zuordnen für 60...90 einen Anderen usw.
Der Abstand kann sich aus konstanten Bereichen zusammen setzen oder am besten freiwählbar, sprich 0-30,30-40,40-60 usw.

Ich könnte das jetzt nur in eine Umständliche if Anweisung verpacken:

if (Value1 < 30)
Wert1;
if (Value1>= 30 && Value1< 60)
Wert2;

usw.

Bin jetzt auf der Suche nach einer besseren Formulierung in C, am besten wär eigentlich ein fester Algorithmus, aber wär schon überglücklich wenn ich die Zahlenspanne irgentwie besser darstellen könnte O:)

also die darzugehörige Werte wären
0 0
1-7 100
7-14 200
14-21 300

usw.

Freue mich über jede Antwort

Cheers \:D/

ogni42
21.02.2006, 19:12
Du kannst das auch über eine Tabelle machen. Kostet dann aber etwas Speicher (sinnvollerweise dann in den Flash legen, falls möglich). Der Einfachheit halber mal ohne Progmem:



uint8_t valArray[] = {
0, 100, 100, 100, 100, 200, 200, 200, 300, 400, 400
};


Zugreifen dann mit:


int value;
int result;

value = readValueFromSomewhere();
result = valArray[value];

SprinterSB
21.02.2006, 22:11
Oder so:

switch (wert)
{
case 0: return 0;
case 1 ... 7: return 100;
case 8 ... 14: return 200;
default: return -1;
}
Und den Blank vor und nach den ... nicht vergessen. Das geht aber nur für Integer-Konstanten (und enums etc.)

Du musst dich schon entscheiden, ob 7 nach 100 soll oder nach 200.

Oder so was, wenn's wirklich linear ist:

return (wert) ? 100*(1+(wert-1)/7) : 0;

NickR
22.02.2006, 11:22
Knaller =D> vielen Dank hilft mir auf jeden Fall sehr weiter :)


und aus reiner Neugierde =P~ wie geht ihr an so eine Aufgabe ran um nen allgemein gültigen Algorithmus s.o. herauszubekommen?

Bei mir läuft des einfach über Probieren und des kann dauern 8-[

ogni42
23.02.2006, 18:57
Herangehensweise bei mir ist:

was soll das Ergebnis sein?
wie schnell muss das Ergebnis berechnet werden?
wieviel Platz darf das brauchen?
muss das mal erweitert werden?
Es sollte die einfachste Lösung sein die es für das Problem gibt
Sie sollte leicht zu verstehen sein.


Z.B. ist es hier so, dass für die angegebenen Bereiche Sprinters Lösung weniger Platz braucht, meine Lösung aber auf den meisten Architekturen schneller ausgeführt wird (hängt von den verfügbaren Adressierungsarten ab). Es kommt eben darauf an, wie die Randbedingungen sind. Manchmal kann die eine, manchmal die andere Lösung angemessener sein.