Arduino und char-Tabelle

Gast #5934586
Hallo

ich habe folgende Tabelle erstellt:

const char* Wtag_text[] = {"So ","Mo ","Di ","Mi ","Do ","Fr ","Sa ","-- 
"};

und zeige auf dem LCD mit

lcd.print(Wtag_text[Wtg]);  // Wochentag

zb "Mo " an, was gut klappt.

Aber wie kann ich "Mo" in einzelne Zeichen zerlegen um sie Zeichenweise 
zu einer anderen Anzeige zu senden.

Hier bräuchte ich einen Denkanstoss.

mfg

harald g.
Gast
hallo,

aus den Antworten entnehme ich, das ich die char-Tabelle genauso 
ansprechen kann wie ein 2-dimensionales Array.
habe ich das richtig verstanden?

was ist wenn die einzelnen Texte unterschiedlich lang sind ?

mfg
harald g.
harald.g schrieb:
> was ist wenn die einzelnen Texte unterschiedlich lang sind ?

Dann muss sich das am Längsten ausrichten. Der Rest wird dann je nach 
Umständen (Compiler/System...) initialisiert, NULL, Müll o. wat auch 
immer.

harald.g schrieb:
> das ich die char-Tabelle genauso
> ansprechen kann wie ein 2-dimensionales Array.

Du kannst nicht nur, das IST eins! Is nur ne Faulenzer Schreibweise. 
Der Compiler übernimmt den Rest der Arbeit.
Gast
Hallo Teo D.

wenn ich meine char-Tab so defienert habe:

const char* Wtag_text[] = {"So ","Mo ","Di ","Mi ","Do ","Fr ","Sa ","--
"};

liefert mir also

Byte wert = Wtag_text[1][0]  den asciiwert von "M" und
Byte wert1 = Wtag_text[1][1] den asciiwert von "o"

habe ich das richtig verstanden.

Den Gedanken mit den verschieden langen Texten kann ich wohl begraben.

 Harald g.
Gast
harald.g schrieb:
> const char* Wtag_text[] = {"So ","Mo ","Di ","Mi ","Do ","Fr ","Sa ","--
> "};

Wie kommt man eigentlich auf die Idee, den Sonntag als ersten Tag zu 
nehmen?
Noch nichts geschafft, aber schon mal mit Ausruhen anfangen ;-(
harald.g schrieb:
> Byte wert = Wtag_text[1][0]  den asciiwert von "M" und
> Byte wert1 = Wtag_text[1][1] den asciiwert von "o"
>
> habe ich das richtig verstanden.

Ja. (o. Probieren geht ü...)

my2ct schrieb:
> Wie kommt man eigentlich auf die Idee, den Sonntag als ersten Tag zu
> nehmen?

"Nach der 1975 von der Internationalen Organisation für Normung (ISO) 
aufgestellten Empfehlung haben die Wochentage seit Januar 1976 die 
folgende Reihenfolge: Montag, Dienstag, Mittwoch, Donnerstag, Freitag, 
Samstag/Sonnabend und Sonntag.

Nach jüdischer und christlicher Tradition beginnt die Woche mit dem 
Sonntag. Genauso wird es heute auch in den USA, in Israel, in arabischen 
Ländern sowie in Japan[1] und China[2] gehandhabt. Auch die deutsche 
Bezeichnung „Mittwoch“ bezieht sich auf einen Wochenbeginn am Sonntag 
und nicht am Montag. Jedoch vermerken die Kalender der meisten 
europäischen Staaten den Montag als ersten Tag der Woche, wie in der 
Norm ISO 8601 vorgesehen. Nach altpersischer Tradition beginnt die Woche 
mit Samstag."
(https://de.wikipedia.org/wiki/Woche)
Gast
Hallo,

mit strlen() muss ich mich noch befassen.

Mir geht es erst einmal darum ob ich mit die char-Tab mit [][] 
Adresieren
kann.

Die Tabelle:
const char* text[] = {"Mein text","Gut"};

würde dann 18 Zeichen enthalten, wobei die Zeichen nach "Gut" 
undefiniert sind ? oder sind es 20 Zeichen mit den /0 am ende ?



übrigens ist bei einigen RTC 0=Sonntag !

harald g.
Gast
am PC:
1
   char* text[] = {"Sonntag ","Monday","Dien ","Mi ","Do ","Friday!!! ","Sa ","--"};
2
    
3
    size_t arr_len=sizeof(text)/sizeof(text[0]);
4
    
5
    for(size_t i=0; i<arr_len; i++){
6
    
7
        size_t str_len=strlen(text[i]);
8
        for(size_t j=0; j<str_len; j++){
9
            printf("%c", text[i][j]); 
10
        }
11
        puts("");
12

13
    }

am Mikrocontroller wären andere Datentypen wahrscheinlich sinnvoller ;-)
Gast
harald.g schrieb:
> Die Tabelle:
> const char* text[] = {"Mein text","Gut"};
>
> würde dann 18 Zeichen enthalten, wobei die Zeichen nach "Gut"
> undefiniert sind ? oder sind es 20 Zeichen mit den /0 am ende ?

Na teste das doch selbst aus:
1
    printf("%zd\n", sizeof(text));


Du hast ein Array von Zeigern, die auf Strings zeigen. (die wiederum 
char-Array sind). Also [][].
harald.g schrieb:
> Die Tabelle:
> const char* text[] = {"Mein text","Gut"};
>
> würde dann 18 Zeichen enthalten, wobei die Zeichen nach "Gut"
> undefiniert sind?

Die Tabelle enthält zwei Zeiger auf C-Strings.
Dies C-Strings liegen woanders im Speicher und sind 10 und 4 Bytes groß.

Du verwechselst das mit
const char text[][10]= {"Mein text","Gut"};

Dies ist ein echtes 2D-Array. Das ist etwas anderes, wird aber genauso 
angesprochen.


> oder sind es 20 Zeichen mit den /0 am ende ?

Bei Stringliteralen wird immer eine \0 angehängt.
(Das Zeichen zur Einleitung einer Escapesequence ist der Backslash \)

> übrigens ist bei einigen RTC 0=Sonntag !

liegt wohl daran, dass die. meisten aus der USA kommen bzw. kamen.

PS. du plenkst
Teo D. schrieb:
> Nach jüdischer und christlicher Tradition beginnt die Woche mit dem
> Sonntag.

Für die Juden ist der Sabbat (Samstag) der Ruhetag.
Für die Christen der Sonntag.

Da nach der Genesis der 7. Tag der Ruhetag sein soll, haben einige 
Länder den Montag als ersten Tag der Woche gewählt.
Gast
Manchmal hilft auch ein richtiges Buch, sich in der Programmiersprache 
einzuarbeiten.

Selbst im K&R aus den 70er Jahren ist schon eine Beschreibung der 
Stringfunktionen wie strlen() und strcat().
Gast
my2ct schrieb:
> Wie kommt man eigentlich auf die Idee, den Sonntag als ersten Tag zu
> nehmen?

Möglicherweise, weil die RTC den Wert 0 für Sonntag liefert.

Irgendwo hatte ich mal einen Kalender, der lieferte 1-7 für So-Sa, 1-31 
für die Tage des Monats aber 0-11 für die Monate.
harald.g schrieb:
> ich habe folgende Tabelle erstellt:
>
> const char* Wtag_text[] = {"So ","Mo ","Di ","Mi ","Do ","Fr ","Sa ","--
> "};

es gibt immer mehrere Wege.

kannst du auch so machen
const char MONTHNAMES[]PROGMEM ="JanFebMarAprMayJunJulAugSepOctNovDec";

also

const char Wtag_text[]PROGMEM = "So Mo Di Mi Do Fr Sa ";

Abstand ist ja konstant 3

kannst aus dem Namen pointer + 3 mal (wochentag-1) der Pointer begint 
mit 0  der erste Wochentag ist aber 1 und die Zeichen rausholen.

wie schon gesagt wurde fange mit Montag an

nette Kalender Routinen gabs mal in der CT auch mit bewegliche Feiertage
1
char *strWochentagname_form( uint8_t TagNummer ) {
2
  switch (TagNummer) {
3
    case 1:
4
      return "Montag    ";
5
    case 2:
6
      return "Dienstag  ";
7
    case 3:
8
      return "Mittwoch  ";
9
    case 4:
10
      return "Donnerstag";
11
    case 5:
12
      return "Freitag   ";
13
    case 6:
14
      return "Samstag   ";
15
    case 7: //  RTC
16
      //case 0: //  C'T
17
      return "Sonntag   ";
18
    default: 
19
      return "ERROR     ";
20
  } // switch (TagNummer)
21
} // char *strWochentagname_form( uint8_t TagNummer )
22
char *strWochentagname( uint8_t TagNummer ) {
23
  static char WtName[11];
24
  strcpy( WtName, strWochentagname_form(TagNummer));
25
  *strstr( WtName, " ")=0;
26
  return WtName;
27
} // char *strWochentagname( uint8_t TagNummer )
28
char *strWochentagname_kurz( uint8_t TagNummer ) {
29
  static char WtName_kurz[3];
30
  strcpy(WtName_kurz, leftstr(strWochentagname_form(TagNummer), 2));
31
  return WtName_kurz;
32
} // char *strWochentagname_kurz( uint8_t TagNummer )
Angehängte Dateien:
Gast
Hallo

danke an alle für die Denkanstöße.

Die Version mit den beiden Zeigern bei Wtag_text[][] und strlen()
war das wonach ich gesucht habe. Es funktioniert.

Mit Arduino und C++ muß ich mich erst noch anfreunden.

Harald.g

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 7 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.