www.mikrocontroller.net

Forum: Compiler & IDEs Strukturen, vergleichen, Operatoren


Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Joerg Wunsch (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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 */
    ...
  }

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo

Ja, das funktioniert, Danke!!

Autor: Andreas Schwarz (andreas) (Admin) Benutzerseite Flattr this
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Joerg Wunsch (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Stefan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi Joerg,

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

Gruß, Stefan

Autor: Joerg Wunsch (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.