Hallo Forum,
ich lasse meinen Atmega 8, über drei ADC_Kanäle, die Werte von drei
verschidenen analogen Spannungen in den Datentyp uint16_t speichern. Die
Variablen haben die Namen rot, blau und grün.
Über einen Bubblesort lass ich den Atmega die Werte von klein nach groß
sortieren. Um dann mit den sortierten Werten einzelne Ausgänge
anzusteuern.
Nun zu meiner Frage. Kann ich über eine if Kontrollstruktur vergleichen
welche Farbe die kleinste ist? Bzw. sortiert das Bubblesort mir nur die
Werte und lässt die Bezeichnung eifach an der Adresse stehen wo ich sie
hin geschrieben hab?
Ich hoffe ihr versteht die Frage. Vielleicht versteht man es mit dem
Auszug meines Quelltextes besser.
rot = ADC_Read(0); // Messung an Kanal 0 in rot speichern
blau = ADC_Read(1); // Messung an Kanal 1 in blau speichern
gruen = ADC_Read(2); // Messung an Kanal 2 in gruen speichern
/* das Array zum Sortieren */
int sort_array[] = { rot, blau, gruen };
int N = sizeof(sort_array)/sizeof(int);
bubble(sort_array, 7);
if ( sort_array[0] == blau) {
PORTB = (1<<0) & (0xff);
}
1 | if ( rot < blau ) |
2 | {
|
3 | // blau kann schon mal nicht das kleinste sein, denn rot ist kleiner |
4 | |
5 | if ( rot < grün ) |
6 | {
|
7 | // rot ist also kleiner als blau und kleiner als grün |
8 | // da es sonst nichts mehr gibt, muss also rot die kleinste sein |
9 | } |
10 | |
11 | else |
12 | {
|
13 | // da rot kleiner als blau ist, und grün kleiner als rot |
14 | // bleibt nur 1 SChluss: grün muss auch kleiner als blau sein |
15 | // da grün kleiner als rot UND kleiner als blau ist, muss daher |
16 | // grün die kleinste sein |
17 | } |
18 | } |
19 | |
20 | else |
21 | {
|
22 | // blau ist schon mal kleiner oder zumindest gleich wie rot |
23 | // was ist mit grün |
24 | |
25 | if( blau < grün ) |
26 | {
|
27 | // wenn blau kleiner als rot ist und auch noch kleiner als |
28 | // grün, dann ist blau die kleinste |
29 | } |
30 | else |
31 | {
|
32 | // blau ist nicht kleiner als grün. |
33 | // Also muss grün kleiner als blau sein |
34 | // -> grün ist die kleinste |
35 | } |
36 | } |
Bei Gleichstand werden gewisse Farben präferiert. Schliesslich ist ja auch nicht definiert, welcher der 5-er in rot:5, blau:5, grün: 5 der kleinere ist :-) Bei 3 Werten kann man das noch ausprogrammieren. Bei 100 Werten geht das nicht mehr. Da benutzt man dann eine andere Technik.
Bei drei verschidenen Werten ist das mit if else ja noch möglich. Aber
ich will das später mit nen anderen µC auf 7 verschidene Werte erhöhen.
Da wird es meiner Meinung relativ viel und unübersichtlich mit if else.
Daher das bubblesort. Nimmt der Sortierbefehl den Namen des uint- Wertes
beim sortieren mit?
als Beispiel: rot = 2
blau = 1
gruen = 3
nach der Sortierung : bau = 1
rot = 2
gruen =3
oder setht dann da rot = 1
blau =2
gruen =3
Ich frage das, weil mir jemand sagte, dass der Sortierbefehl nur die
Zahlen sortieren würde aber nicht den Namen Variable mit nimmt.
Ron S. schrieb: > Bei drei verschidenen Werten ist das mit if else ja noch möglich. Aber > ich will das später mit nen anderen µC auf 7 verschidene Werte erhöhen. > > Da wird es meiner Meinung relativ viel und unübersichtlich mit if else. da hast du nicht unrecht :-) das macht man dann zb so (es gibt da mehrere Möglichkeiten). Anstatt der Werte lässt du dir einen 'Index' entsprechend umsortieren. Du nummerierst einfach die Werte durch. Deine Werte Index rot 25 1 grün 28 2 blau 17 3 Das Index-Array gibst du zum Sortieren. Aber anstelle dass du in der Vergleichsfunktion die beiden int-Zahlen i und j vergleichst, die du bekommst, basierst du deinen Vergleich auf Wert[i] und Wert[j]. D.h. die Sortierreihenfolge der 2-ten Spalte basiert auf den Werten der ersten Spalte. Als Ergebnis erhältst du 3 1 2 mit der Bedeutung: blau ist am kleinsten, danach kommt rot, gefolgt von grün.
also ich verusch mich grade daran, das umzusetzen was du geschrieben
hast.
Ich versteh wie du das meinst. Aber irgendwie komm ich nicht weiter.
Muss ich das array so schr.:
int Farbe [3];
Farbe [1] = rot;
Farbe [2] = blau;
Farbe [3] = gruen;
den Farben hab ich bereits Werte zu gewiesen.
oder muss ich im Array direkt den Wert zu weisen?
Oder ist das ganz und gar der falsche Ansatz?
Ron S. schrieb: > also ich verusch mich grade daran, das umzusetzen was du geschrieben > hast. > Ich versteh wie du das meinst. Aber irgendwie komm ich nicht weiter. > Muss ich das array so schr.: > > int Farbe [3]; > Farbe [0] = 0; Farbe [1] = 1; Farbe [2] = 2; Und jetzt sortierst du das Array Farbe, wobei du die kleiner-Beziehnung, welche die Sortierung steuern von sort_array abhängig machst
1 | ....
|
2 | |
3 | // bubble sort
|
4 | sorted = false; |
5 | |
6 | while( ! sorted ) { |
7 | |
8 | sorted = true; |
9 | |
10 | for( i = 0; i < N-1; i++ ) |
11 | {
|
12 | // AChtung jetzt kommts!
|
13 | if( sort_array[ Farbe[i] ] < sort_array[ Farbe[i+1] ] ) |
14 | {
|
15 | tmp = Farbe[i]; |
16 | Farbe[i] = Farbe[i+1]; |
17 | Farbe[i+1] = tmp; |
18 | |
19 | sorted = false; |
20 | }
|
21 | }
|
22 | }
|
23 | |
24 | // In Farbe stehen die Nummern der Farben in der richtigen Reihenfolge
|
25 | // 0 = rot, 1 = blau, 2 = grüen
|
26 | //
|
27 | // dies deshalb, weil du in dieser Reihenfolge dein sort_array
|
28 | // int sort_array[] = { rot, blau, gruen };
|
29 | // angefüllt hast.
|
30 | // ist also Farbe[0] gleich 2, dann ist grün die kleinste
|
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.