Forum: Mikrocontroller und Digitale Elektronik Arduino und char-Tabelle


von harald.g (Gast)


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.

von Oliver S. (oliverso)


Lesenswert?

[][]

Oliver

von Teo D. (teoderix)


Lesenswert?

harald.g schrieb:
> Hier bräuchte ich einen Denkanstoss.

const char Wtag_text[]= {"So ","Mo "... == Wtag_text[][]= .....

Und willst du wirklich ein Array aus Zeigern?

von harald.g (Gast)


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.

von Teo D. (teoderix)


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.

von harald.g (Gast)


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.

von my2ct (Gast)


Lesenswert?

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 ;-(

von zitter_ned_aso (Gast)


Lesenswert?

harald.g schrieb:
> Den Gedanken mit den verschieden langen Texten kann ich wohl begraben.

warum?
mit strlen() die Länge der einzelnen Strings ermittlen und in einer 
for-Schleife alle Zeichen durchlaufen.

von Teo D. (teoderix)


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)

von harald.g (Gast)


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.

von zitter_ned_aso (Gast)


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 ;-)

von zitter_ned_aso (Gast)


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 [][].

von Dirk B. (dirkb2)


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

von Dirk B. (dirkb2)


Lesenswert?

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.

von PittyJ (Gast)


Lesenswert?

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().

von Stefan F. (Gast)


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.

von Joachim B. (jar)


Angehängte Dateien:

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 )

von Joachim B. (jar)


Lesenswert?

harald.g schrieb:
> übrigens ist bei einigen RTC 0=Sonntag !

Joachim B. schrieb:
> case 7: //  RTC
>       //case 0: //  C'T
>       return "Sonntag   ";

kommt auf die LIB an

mir gefällt 0 ERROR besser und 1 als Montag, kann man machen wie man 
mag.

Es gibt ja auch bei Neustart und in meiner RTC den 0.0. ten
Tag 0 und Monat 0 ist error
eintragen kann man alles.

: Bearbeitet durch User
von harald.g (Gast)


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

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.