Forum: Mikrocontroller und Digitale Elektronik struct mit char array initialisieren?


von Olli R. (downunderthunder42)


Lesenswert?

Hallo,

ich wollte eine Datenstruktur erstellen, die ich als Datentyp definiere.
Diese Struktur enthält auch ein char array. Leider kann ich dieses char 
array nicht initialisieren?

typedef struct _time
{         /* deklariert den Datentyp time_t */
   int   second;
   int   minute;
   int   hour;
   int   day;
   int   week;
   char * month;
   int   year;
} time_t;

time_t time;

char maerz[5]= {'M',1,'r','z',0};


time.month[]= {"Januar", "Februar", maerz, "April",
                 "Mai", "Juni", "Juli", "August",
         "September", "Oktober", "November",
         "Dezember"};

Diese letzte Zuweisung ist nicht möglich?
Es gibt immer eine Meldung:

error: expected '=', ',', ';', 'asm' or '__attribute__' before '.' token


Wie geht denn das genau mit der Initialisierung eines solchen char 
array?

von Peter II (Gast)


Lesenswert?

Olli R. schrieb:
> Wie geht denn das genau mit der Initialisierung eines solchen char
> array?

char * month;

dort kann man aber keine monate speichern, es ist nur 1 string oder 
array von einzelnen zeichen.

> time.month[]= {"Januar", "Februar", maerz, "April",
>                 "Mai", "Juni", "Juli", "August",
>         "September", "Oktober", "November",
>         "Dezember"};
das ganze ist eine zuweisung und keine Initialisierung.

von Olli R. (downunderthunder42)


Lesenswert?

Peter II schrieb:
> das ganze ist eine zuweisung und keine Initialisierung.

Ok es ist eine Zuweisung.
Aber wie könnte man dieses Problem den lösen: also das Array mit den 
Strings der Monate in das Struct bringen?

von Peter II (Gast)


Lesenswert?

Olli R. schrieb:
> Aber wie könnte man dieses Problem den lösen: also das Array mit den
> Strings der Monate in das Struct bringen?

was sollen sie da drin? du speicherst doch auch nicht mehrer wochen in 
week ab, warum sollen da mehere Monate rein - das ergibt doch überhaupt 
keinen sinn?

von Olli R. (downunderthunder42)


Lesenswert?

Peter II schrieb:
> was sollen sie da drin? du speicherst doch auch nicht mehrer wochen in
> week ab, warum sollen da mehere Monate rein - das ergibt doch überhaupt
> keinen sinn?

Das hätte ich dann später noch gemacht. Mir geht es darum das alles in 
einer Datenstruktur zu haben, um die Variable dieses Typs ganz einfach 
den entsprechenden Funktionen zu übergeben!

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Olli R. schrieb:
> Aber wie könnte man dieses Problem den lösen: also das Array mit den
> Strings der Monate in das Struct bringen?

Ich verstehe den Sinn nicht. Selbst wenn es gehen würde, dann hättest Du 
in jeder Struct-Variablen eine Kopie der 12 String-Konstanten. Was soll 
das?

Wenn, dann müsste man das bei der Definition der Struct-Variablen 
machen:
1
time_t time = { ... };

Aber ich bin jetzt zu faul, das hier explizit aufzuschreiben - einfach, 
weil es unsinnig ist.

Abgesehen davon stimmt - wie bereits erwähnt - das
1
   char * month;

nicht. Da bekommst Du lediglich einen Pointer auf einen String, aber 
nicht 12 Stück von diesen rein.

Lass mal in der time_t-Struct schön das
1
   int month;              // 0 - 11

stehen, so wie das ursprünglich vor knapp 40 Jahren unter Unix erdacht 
wurde. Das hat schon seinen Sinn so.

Du kannst dann nämlich time.month als Index für ein Array
1
char * months[]= {"Januar", "Februar", maerz, "April",
2
                  "Mai", "Juni", "Juli", "August",
3
                  "September", "Oktober", "November",
4
                  "Dezember"};

nutzen, z.B.:
1
   time.month = 3;             // Index auf April
2
   months[time.month]          // ist "April

Gruß,

Frank

von Olli R. (downunderthunder42)


Lesenswert?

Frank M. schrieb:
> Du kannst dann nämlich time.month als Index für ein Arraychar * months[]= 
{"Januar", "Februar", maerz, "April",
>                   "Mai", "Juni", "Juli", "August",
>                   "September", "Oktober", "November",
>                   "Dezember"};
>
> nutzen, z.B.:   time.month = 3;             // Index auf April
>    months[time.month]          // ist "April

Ok so werde ich es jetzt auch machen.
Vielen Dank.

von Jörg G. (joergderxte)


Lesenswert?

Schreib doch dein Sonderzeichen gleich in den String:
1
char * months[]= {
2
  "Januar", "Februar", "M\1rz",
3
  "April", "Mai", "Juni", 
4
  "Juli", "August", "September",
5
  "Oktober", "November", "Dezember"
6
};

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.