Arduino und char-Tabelle

Gast #5934586
Lesenswert?

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 #5934610
Lesenswert?

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.
#5934630
Lesenswert?

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 #5934655
Lesenswert?

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.
#5934666
Lesenswert?

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 #5934676
Lesenswert?

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 #5934682
Lesenswert?

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 #5934685
Lesenswert?

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 [][].
#5934784
Lesenswert?

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
Gast #5934820
Lesenswert?

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.
#5934851
Lesenswert?

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 #5935061
Lesenswert?

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

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren