Forum: Compiler & IDEs Strukturen, vergleichen, Operatoren


von Peter (Gast)


Lesenswert?

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

von Joerg Wunsch (Gast)


Lesenswert?

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

von Peter (Gast)


Lesenswert?

Hallo

Ja, das funktioniert, Danke!!

von Andreas S. (andreas) (Admin) Benutzerseite


Lesenswert?

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?

von Joerg Wunsch (Gast)


Lesenswert?

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.

von Stefan (Gast)


Lesenswert?

Hi Joerg,

sehe ich das falsch, oder ist auch ein weiteres Problem, dass C++ sehr
viel RAM-Speicher benötigt?

Gruß, Stefan

von Joerg Wunsch (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.