Hallo Ich versuche gerade eine einfache Zeitschaltuhr zu programmieren. Um ein Datum zu speichern habe ich mir überlegt dieses in einer Struktur abzulegen. typedef struct{ unsigned char second; unsigned char minute; unsigned char hour; unsigned char date; unsigned char month; unsigned int year; }time; time t1, t2; In t1 wird z.B das aktuelle Datum einer DCF77 Funkuhr abgelegt, und in t2 das Datum, an dem ein Schaltvorgang aus gelöst werden soll. Frage: Wie kann ich auf einfache Weise die Variablen t1 und t2 vergleichen, ohne erst große Kontrollstrukturen wie " if (t1.year >= t2.year)... " usw. aufzubauen? Gibt es vielleicht Vergleichsoperatoren mit den z.B so etwas möglich ist wie " if (t1>=t2)..." ? Ich bin C Einsteiger und kenne mich noch nicht so gut aus. Gruß Peter
Unter der Annahme, daß die Strukturen gepackt sind (also kein `padding' zwischen den Feldern enthalten -- müßte bei avr-gcc Standard sein), sollte dies funktionieren: #include <string.h> ... if (memcmp(&t1, &t2, sizeof t1) == 0) { /* sie sind identisch */ ... }
Hmm, angenommen man verwendet C++, dann müsste man doch den Vergleichsoperator überladen können. Unabhängig davon ob es aus diesem Grund Sinn macht C++ zu verwenden, ist das mit avr-g++ möglich, ohne dass der Compiler irgendwelchen Monstercode produziert?
Der Compiler selbst erzeugt keinen Monstercode, aber für C++ auf einem Microcontroller sollte man halt ein gutes Gefühl für diese Sprache entwickelt haben, ansonsten kann man schnell in ein Fiasko rennen. Bereits ein vergessenes & in der Deklaration einer Funktion (oder Klassen-Methode) kann halt gut uneffektiven Code erzeugen. Bei vielen, die mit einem Klickerdiklick-Dingens ,,C++'' programmiert haben, habe ich leider eher nicht den Eindruck, daß sie den nötigen Durchblick für solche Details wirklich haben. Prinzipiell geht das, was Du da willst, aber letztlich ist das natürlich nur eine vereinfachte Schreibweise für eine Funktionalität, die Du trotzdem selbst implementieren mußt: class foo { int member1; char member2[4]; public: int operator == (const foo &them) { return memcmp(this, &them, sizeof(foo)) == 0; }; }; Das wäre so ungefähr das Äquivalent. Aber Dir steht es natürlich dann frei, den Begriff der Gleichheit zweier Elemente der Klasse foo komplett anders zu definieren, vielleicht so: ... int operator == (const foo &them) { return member1 == them.member1; }; ... Was einem bei C++ sehr schnell ,,Monstercode'' einbringen kann sind exceptions, aber da wir für den AVR sowieso keine libstdc++ compiliert bekommen und exceptions zwingend diese benötigen, lassen die sich derzeit mit dem avr-g++ gar nicht benutzen.
Hi Joerg, sehe ich das falsch, oder ist auch ein weiteres Problem, dass C++ sehr viel RAM-Speicher benötigt? Gruß, Stefan
Du siehst das falsch. C++ ist eine Programmiersprache, und die belegt als solches gar keinen RAM. Was Du mit dem RAM machst, hast Du, ähnlich wie bei C, sehr gut selbst in der Hand (anders als vielleicht bei gängigen Java-Implementierungen). Ansonsten siehe oben: jemand, der sich mit C++ an Microcontroller wagt, sollte ein sehr gutes Verständnis für die Implementierungsdetails haben. Wet den Unterschied einer Parameterübergabe mit Referenzoperator zu einer ohne oder solche Geschichten wie einen default copy constructor nicht aus dem Effeff beherrscht, wird wohl auf einem Controller sehr schnell baden gehen.
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.