Forum: Mikrocontroller und Digitale Elektronik MSP430 2d-Array sortieren


von B. B. (bebu1)


Lesenswert?

Hallo!

Ich hätte mal wieder eine Frage an euch. Und zwar muss ich zu 5 
unterschiedlichen Zeiten einen Ausgang für eine gewisse Dauer schalten.

Ich verwende einen MSP430F5510. Die Echtzeit hätte ich mit dem RTC_A 
gemacht.
Nun habe ich in einem 2d Array 5 unterschiedliche Zeiten die ich vorher 
eingegeben habe. In jeder Zeile steht zuerst die Stunde dann Minute, 
Dauer und Drehrichtung.Der RTC besitzt eine Alarmfunktion.
Meine Idee wäre jetzt folgende:

Nach Eingabe der Zeiten sortiere ich dass Array aufsteigend im Vergleich 
zur aktuellen Uhrzeit. Den obersten Eintrag schreibe ich dann ins 
Alarm-Register vom RTC. Wird dieser Ausgeführt wird der nächste Eintrag 
im Array übergeben.

Der Controller läuft dabei bis auf die Eingabe im LPM3.

Nun zu meiner Frage: Wie sortiere ich ein 2d Array? Falls der 
Stundeneintrag gleich ist muss ich zustäzlich noch die Minuten 
überprüfen.

Wie haltet ihr überhaupt von der Durchführung? Habt ihr ev. eines 
bessere Idee?

Danke!

von Peter II (Gast)


Lesenswert?

Bernhard B. schrieb:
> Nun zu meiner Frage: Wie sortiere ich ein 2d Array? Falls der
> Stundeneintrag gleich ist muss ich zustäzlich noch die Minuten
> überprüfen.

wie vergleichst du denn Uhrzeiten?

12:10 und 12:30?

genauso muss es die Software machen.

von Karl H. (kbuchegg)


Lesenswert?

Bernhard B. schrieb:

> Nun habe ich in einem 2d Array 5 unterschiedliche Zeiten die ich vorher
> eingegeben habe. In jeder Zeile steht zuerst die Stunde dann Minute,
> Dauer und Drehrichtung.

Wieso hast du da ein 2D-Array?

Diese Daten gruppieren sich nicht logisch in ein 2D-Array.

Sie gruppieren sich aber logisch gesehen in eine Struktur, die einen 
'Datensatz' beschreibt. Nämlich einem Datensatz, der aus einem Zeitpunkt 
und einer daran angeknüpften Aktion besteht.
1
struct TimeRec_t
2
{
3
  uint8_t  Hour;
4
  uint8_t  Minute;
5
  uint16_t Duration;
6
  uint8_t  Direction;
7
};

und von so einem Datensatz, hat man dann ein Array mit 5 Stück
1
struct TimeRec_t TimeRecords[5];

die Aufgabe ist es dann, diese 5 Records so umzusortieren, dass die 
Zeiten aufsteigend sind.

Dazu kannst du jedes beliebige Sortierverfahren nehmen, da in C 
Strukturen zuweisbar sind.


> Nach Eingabe der Zeiten sortiere ich dass Array aufsteigend im Vergleich
> zur aktuellen Uhrzeit. Den obersten Eintrag schreibe ich dann ins
> Alarm-Register vom RTC. Wird dieser Ausgeführt wird der nächste Eintrag
> im Array übergeben.

Klingt vernünftig.


> Nun zu meiner Frage: Wie sortiere ich ein 2d Array? Falls der
> Stundeneintrag gleich ist muss ich zustäzlich noch die Minuten
> überprüfen.

Ja, darauf wird es wohl hinaus laufen.
Tip, man kann sich die Sache auch vereinfachen, indem man sich aus den 
STunden und Minuten die Anzahl der MInuten seit Mitternacht errechnet. 
Dann hat man eine einzige Zahl, die über den Tag gesehen schön 
fortlaufend aufsteigend ist. Man könnte diese Zahl auch direkt anstelle 
der Stunden und Minuten speichern. Kommt immer drauf an, was man im 
Programmcode häufiger benötigt: Die Darstellung als Minuten seit 
Mitternacht, oder die Darstellung als Stunden/Minuten.
Machbar ist beides und vom einen ins andere umrechnen ist auch nicht 
wirklich schwer.


> Wie haltet ihr überhaupt von der Durchführung? Habt ihr ev. eines
> bessere Idee?

Bei 5 Einträgen?
Da brauchst du dir keinen Kopf machen. Bei 5 Einträgen kannst du dich 
gar nicht so ungeschickt anstellen, dass das nicht in einem 
Wimpernschlag abgearbeitet wird.

: Bearbeitet durch User
von B. B. (bebu1)


Lesenswert?

Danke Karl für die rasche Antwort.
Ich werde mir mal deine Hinweise näher ansehen. Da ich Anfänger bin weiß 
ich nicht auf Anhieb was eine Struktur ist. ;)

LG

Edit:

Ich gebe alle meine Daten über Tasten+LCD ein. Jetzt bin ich einfache 
alles Positionen im Array durchgegangen. Durch die Verwendung einer 
Struktur kann ich jetzt nicht einfach auf einen Eintrag zugreifen oder?
Sonst müsste ich jetzt einiges bei meinem Programm ändern.

: Bearbeitet durch User
von Karl H. (kbuchegg)


Lesenswert?

Bernhard B. schrieb:
> Danke Karl für die rasche Antwort.
> Ich werde mir mal deine Hinweise näher ansehen. Da ich Anfänger bin weiß
> ich nicht auf Anhieb was eine Struktur ist. ;)

Tja.
Das ist das Problem: Du versuchst etwas reales zu programmieren und 
kennst von deinem "Werkzeugkasten" noch nicht einmal 20% der 
Möglichkeiten die du hast. In einem gewissen Sinne bist du damit wie ein 
Klempner, der lediglich mit einem Hammer 'bewaffnet' zur Kundschaft zur 
Rohrbruchbehebung fährt.
Dagegen musst du etwas tun. Dagegen gibt es Abhilfe in Form von 
Literatur.


Eine Struktur ist einfach nur eine logische Zusammenfassung von 
unterschiedlcihen Datentypen, die einen logischen Zusammenhang haben.
Wie zb. Die Daten, die eine Person beschreiben. Eine Person wird zb 
beschrieben durch: Vorname, Nachname, Geburtstag, Geburtsmonat, 
Geburtsjahr, Sozialversicherungsnummer.

Selbst wenn das alles immer der gleiche Datentyp wäre, ist der logische 
'Zusammenhang' zwischen diesen Einzelinformationen so stark, dass man 
das auch in der Sprache ausdrücken möchte. In Form einer Struktur
1
struct person
2
{
3
  char    Vorname[20];
4
  char    Nachnahme[30];
5
  uint8_t Geburtstag;
6
  uint8_t Geburtsmonat;
7
  uint8_t Geburtsjahr;
8
  char    Sozialversicherungsnummer[10];
9
};

eine einzelne Person ist mit so einem 'Datensatz' komplett beschrieben.
Um auf die einzelnen Felder zuzugreifen, braucht man erst mal eine 
enstrepchende Variable dieses Typs (no, an)
1
int main()
2
{
3
  struct person PersonA;
Diese Variable PersonA ist so ein Datensatz. Da es sich um eine Struktur 
handelt, hat diese PersonA eine Feinstruktur ... eben jene aus der 
Strukturbeschreibung. Mit der Punktnotation kann man darauf zugreifen
1
  PersonA.Geburtstag = 28;
2
  PersonA.Geburtsmonat = 5;
3
  PersonA.GeburtsJahr = 2001;

Das liest sich dann doch gleich viel besser, als bei einem 2d Array, wo 
man wissen muss, dass der Index 3 in der 2-ten Dimension das Monat 
darstellt.

Das ganze hat noch weitere Vorteile. zb kann ich das hier machen
1
  struct person PersonA;
2
  struct person PersonB;
3
4
  strcpy( PersonA.Vorname, "Hans" );
5
  strcpy( PersonA.Nachname, "Mueller" );
6
  PersonA.Geburtstag = 28;
7
  PersonA.Geburtsmonat = 5;
8
  PersonA.GeburtsJahr = 2001;
9
  strcpy( PersonA.Sozialversicherungsnummer, "4711" );
10
11
  PersonB = PersonA;
ich konnte ganz zum Schluss die komplette PersonA in die Variable 
PersonB kopieren. Und zwar ohne dass ich mich darum kümmern muss, wie so 
eine Person eigentlich aufgebaut ist. Alle Daten aller Felder der 
Struktur-Variablen wurden kopiert. So eine Struktur wirkt wie ein 
Container, den ich als ganzes ohen Ansehen der Feinheiten behandeln 
kann, aber auch über die Punktnotation auf die Details dieses Containers 
zugreifen kann, wenn ich das benötige.

: Bearbeitet durch User
von Karl H. (kbuchegg)


Lesenswert?

> Sonst müsste ich jetzt einiges bei meinem Programm ändern.

Das müsstest du sowieso.
Aber so wie es an manchen Stellen etwas aufwändiger wird, wie zb 
Eingabe, Ausgabe, so wird im Gegenzug an manchen Stellen im Programm 
vieles einfacher.

Lass dich nicht vom ertsen Eindrucvk täuschen. Nur weil du deine Eingabe 
mit einem 2D Array einfach realisieren konntest, bedeutet das nicht, 
dass deshalb ein 2D Array die angemessene Datenstruktur dafür ist.

von B. B. (bebu1)


Lesenswert?

Ok Danke.

Vergiss meine Ergänzung in meinem Post. Da sah ich deinen neuen Eintrag 
noch nicht.

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.