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 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
9 | |
10 | |
11 | |
12 | |
13 | |
14 | |
15 | |
16 | |
17 | |
18 | |
19 | |
20 | |
21 | |
22 | |
23 | |
24 | |
25 | |
26 | |
27 | |
28 | |
29 | |
30 | |
31 | |
32 | |
33 | |
34 | |
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 | |
4 | |
5 | |
6 | |
7 | |
8 | |
9 | |
10 | |
11 | |
12 | |
13 | |
14 | |
15 | |
16 | |
17 | |
18 | |
19 | |
20 | |
21 | |
22 | |
23 | |
24 | |
25 | |
26 | |
27 | |
28 | |
29 | |
30 | |
Antwort schreiben
Bitte melde dich an, um einen Beitrag zu schreiben.