Strukturen, vergleichen, Operatoren

Gast #40533
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
Gast
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 */
    ...
  }
Gast
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.
Gast
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.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 23 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.