mikrocontroller.net

Forum: Compiler & IDEs String aus __TIME__ & __DATE__


Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo!

Ich wollte gern in meiner Firmware einen String bzw. char-Array 
definieren, indem das Build-Datum &-Uhrzeit stehen.
Leider bekomme ich das mit dem Makros _TIME__ und __DATE_ nicht. hin.
Hab auch mit dem Glue-Befehl (##) probiert.

Weiß jemand, wie das geht?

Danke.

Gruß
Peter

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Du denkst zu kompliziert ;-).

Da
 "a" "b" 
 dem String "ab" entspricht, reicht sowas wie
 __DATE__ " " __TIME__ 
 bereits aus.

Autor: Hc Zimmerer (mizch)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vielleicht schreibst Du erst, wo die Schwierigkeit liegt und warum Du 
ein „#“ zu benötigen glaubst.
const char date_and_time[] = __DATE__ " " __TIME__;

Blödsinnig ist dabei allenfalls das amerikanische Datumsformat, der Rest 
bietet keine Besonderheiten.

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
War wirklich einfacher als gedacht. Das man mit
" "
 die Strings zusammenfassen kann, war mir neu...

Danke.

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Kannst " " auch weglassen, nur sieht das Ergebnis unbefriedigend aus.

Es ist schlicht so, dass mehrere Strings direkt hintereinander 
automatisch verkettet werden.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Peter schrieb:
> War wirklich einfacher als gedacht. Das man mit
" "
 die Strings
> zusammenfassen kann, war mir neu...
>


Das würde auch mit "+++" gehen oder mit "abcd" oder mit "hotzenplotz" 
oder mit "" ...

Punkt ist, das mehrere Strings die hintereinanderfolgen vom Compiler zu 
einem zusammengefasst werden.
Das ist besonders praktisch, wenn man einen sehr langen String im Editor 
so darstellen möchte, dass er auch ohne Verrenkungen im Editor lesbar 
wird
const char* HelpText = "Dies ist ein Helptext\n"
                       "Er geht über 2 Zeilen.\n"
                       "Optionen:\n"
                       "-h      zeige Help Text\n"
                       "-f      formatiere Platte\n";

> war mir neu...
Steht in jedem C-Buch. Soviel dazu was du alles noch nicht kennst.

Autor: Klaus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Karl heinz Buchegger schrieb:
> Steht in jedem C-Buch. Soviel dazu was du alles noch nicht kennst.

Naja, nicht alles was in einem C-Buch steht, muss man bis ins kleinste 
Detail auswendig wissen.  ;-)

Ich programmiere auch schon einige Jahre in C und kannte dieses Detail 
noch nicht. Habs bisher einfach nicht gebraucht. Vielleicht irgendwann 
mal gelesen und wieder vergessen.

Der Hinweis mit dem C-Buch ist dann doch eher bei fehlendem 
Grundlagenwissen angebracht.

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Klaus schrieb:
> Ich programmiere auch schon einige Jahre in C und kannte dieses Detail
> noch nicht. Habs bisher einfach nicht gebraucht.

Wurde mit der 1989er Version eingeführt.  Nur auf diese Weise ist
es nämlich möglich, eine "\x"-Escapefolge zu beenden, wenn danach
gleich wieder eine Ziffer folgt.  "\x12345" würde nicht etwa
interpretiert als das Zeichen "\x12", gefolgt von "345", sondern
es würde interpretiert als String, bestehend aus einem Zeichen mit
dem Wert 0x12345 (der sicherlich alle gängigen Zeichensatzsysteme
überschreitet).  Das ist ein Unterschied zu oktalen Zeichen, die
spätestens nach der dritten Ziffer beendet wurden.

Der C89-Ausweg daraus war, dass man obigen String als "\x12" "345"
schreiben kann und muss.

Wo sich das Feature auch recht nett macht ist, wenn man bestimmte
Teile eines Strings als #define auslagern möchte.  Nehmen wir an,
du hast ein LCD an deinem Controller, das das Zeichen 'µ' in der
Zeichensatzposition 0x89 stehen hat, dann kannst du schreiben:
#define MY "\x89"

...
  printf("Kapazität: %f " MY "F", cap);

Autor: Rolf Magnus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Bei printf ist es vor allem praktisch, wenn man sich einen Typedef für 
z.B. einen Integer-Typ anlegt, aber irgendwo den Wert einer Variable 
dieses Typs mit printf ausgeben will. Da kann man nicht direkt sowas 
schreiben wie printf("Der Wert ist %d\n", wert); weil es ja ein Typ sein 
könnte, auf den %d nicht paßt. Also schreibt man sowas wie
printf("Der Wert ist %" MYTYPE_FORMAT "\n", wert"); und kann dann das 
MYTYPE_FORMAT da definieren, wo auch das typedef steht. Die 
C-Standardbibliothek macht das auch so, zumindest seit C99, z.B. die 
Typen uint*_t.

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich kenne die Verknüpfung von Strings mit einem + (Plus-Zeichen).
Das habe ich ursprünglich Verwendet, aber das war eben nicht vom Erfolg 
gekrönt.
Und trennen tue ich jetzt _DATE_ & _TIME_ mit "*".

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Peter schrieb:
> Ich kenne die Verknüpfung von Strings mit einem + (Plus-Zeichen).

C++, überladener Operator.

Autor: Klaus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Peter schrieb:
> Ich kenne die Verknüpfung von Strings mit einem + (Plus-Zeichen).

Ja, in C++. Weil dort ein String eine Klasse mit überladenem + Operator 
ist, welcher die Verkettung ausführt.

In C ist ein string jedoch nur ein char*. Und da das Addieren von 2 
Zeigern keinen Sinn macht, darf man auch kein + zwischen 2 Strings 
schreiben.

Autor: Andreas Ferber (aferber)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Klaus schrieb:
>> Ich kenne die Verknüpfung von Strings mit einem + (Plus-Zeichen).
> Ja, in C++. Weil dort ein String eine Klasse mit überladenem + Operator
> ist, welcher die Verkettung ausführt.

Allerdings wird hier dann die Verkettung zur Laufzeit durchgeführt, 
während die Verkettung durch Hintereinanderschreiben (die auch in C++ 
geht) zur Compilezeit gemacht wird. und deshalb zur Laufzeit weder 
Speicher noch Zeit kostet.

Andreas

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.