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!
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.
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
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
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
> 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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.