PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : [ERLEDIGT] Ist eine struct Definition als Stringarray möglich ??



oderlachs
15.06.2013, 10:26
Hallo C und GCC Kenner,
kann ich ein Stringarray in einer Structur verwirklichen, etwa so ?


// Zeitvariablen
typedef struct
{
char Sekunde,Minute,Stunde,Wochentag,Tag,Monat,Jahr; // Hier ist alles klar... oder ??
}
RTC_TIME;

typedef struct
{
char[] "Mon","Die","Mit","Don","Fre","Sam","Son"; // W_TAG[0] = "Mon" ??
}
W_TAG;


Habe das noch nie praktizieren können, was ist Falsch daran, oder muss ich jeden String einzeln zuweisen ??

Danke schon mal....

Gerhard

markusj
15.06.2013, 10:32
Zu RTC_TIME: Das sind nur sieben Zeichen/Bytes (char)
Zur W_TAG: Was willst du damit realisieren? Ich glaube das soll eher ein enum werden? Oder ein Array das du über RTC_TIME.Wochentag indizierst? So funktioniert das auf jeden Fall nicht!

mfG
Markus

oderlachs
15.06.2013, 10:52
Also mal einfach so formuliert : print(W_TAG[0]) sollte dann "Mon" ausgeben....,
das mit RTC_TIME das funzt ja ,keine Fehler vom Compiler.
Ich weiss auch nicht meine C Ausbildung ist über 10 Jahre her, kann das auch mit Javaausbildung verwechseln war zur selben Zeit...da haben wir mit Stringlisten/Arrays gearbeitet. Nur habe ich nun erst jetzt wieder angefangen mit C zu "Arbeiten" (AVR), die ganzen Jahre habe ich Delphi/Pascal gemacht und da ist ja einiges anders...

PS: enum wird auch bekritelt...

Habe ein Bsp. gefunden das wird mir glaube ich helfen....ja ja die Zeiger und Pointers ;)



#include <stdio.h>

typedef char * string;

int main(void)
{
string strs[5]; // Make 5 strings
int i;

strs[0] = "first string";
strs[1] = "second string";
strs[2] = "third string";
strs[3] = "this is the fourth string";
strs[4] = "and finally this is the fifth string";

for(i = 0;i < 5;++i)
puts(strs[i]);

return 0;
}

shedepe
15.06.2013, 11:01
Dann sollte ein Enum das richtige für dich sein.
Ansonsten kann deine Deklaration der chars in W_TAG so nicht funktionieren. In C deklariert man ein array z.B. so : char meinArray[ARRAYGRÖSSE]
Um dein Ziel mit einem Struct umzusetzen:

typedef struct
{
char montag[] = "Mon";
char dienstag[] = "Die";
//usw.
}W_TAG;

Zugreifen kannst du dann über W_TAG.montag auf den string Montag

robocat
15.06.2013, 12:50
Ich glaube, dass Oderlachs etwas in der Art sucht (quasi ein Array aus char-Arrays):

const char *bla[7]={"Montag","Dienstag","Mittwoch","Donnerstag","Freitag","Samstag","Sonntag"};
for(int i=0;i<7;i++)
{
printf("%s",bla[i]);
}
Keine Ahnung ob man das so machen darf, aber es funktioniert.

Edit:
Laut http://publications.gbdirect.co.uk/c_book/chapter6/initialization.html geht das so (man kann sogar statt "const char *bla[7]" einfach nur "char *bla[]" schreiben).

oderlachs
15.06.2013, 13:02
ich habe einen Returnwert von 0...6 // 0 = Montag also muss mit print WERT[0] "Montag" ausgegeben werden, wie soll das Programm W_TAG.montag wenn es nicht weiss welcher Tag ist und dieser nur im numerischem Wert von 0 bis 6 zur Verfügung steht.
ENUM soll lt Beschreibung nur für Int-Werte gehen... ??
Mehr Probleme habe ich mit der Einbindung der Variablen/Funktionen in die Main, die in der Header- und "Nichtmain"- datei definiert sind.

in der "my_ds1301.h" steht es so:


/* ================================================== ======================== */
/* */
/* Zeitfunktionen */
/* */
/* ================================================== ======================== */
extern void time_init(void);
extern void set_jahr(unsigned char);
extern void set_monat(unsigned char);
extern void set_tag(unsigned char);
extern void set_wtag(unsigned char);
extern void set_stunde(unsigned char);
extern void set_minute(unsigned char);
extern void set_secunde(unsigned char);


Die funktion "time_init" ist in der my_ds1307.c wie folgt


/* ================================================== ======================== */
/* */
/* Funktionen für RTC usw. */
/* */
/* */
/* ================================================== ======================== */
typedef char * string;
string W_TAG[7]; // 7 Strings


void time_init(void)
{
W_TAG[0] = "MON";
W_TAG[1] = "DIE";
W_TAG[2] = "MIT";
W_TAG[3] = "DON";
W_TAG[4] = "FRE";
W_TAG[5] = "SAM";
W_TAG[6] = "SON";
return 0;
}


aber in der Main kann ich nicht auf W_TAG zugreifen:


/* ================================================== ======================== */
#include <avr/io.h>
#include <stdio.h>
#include "my_ds1307.h"
/* ================================================== ======================== */
/* */
/* */
/* ================================================== ======================== */
/* */
/* */
/* */
/* ================================================== ======================== */
extern string W_TAG[7]; // 7 Strings

int main(void)
{
int i;
for(i = 0;i < 7;++i)
puts(W_TAG[i]); /// W_TAG wird nicht erkannt
;
}
ich kann doch W_TAG[] nicht noch einmal definieren in der Main ??

Fehlermeldung:
../my_rtc_clock.c:54: error: expected '=', ',', ';', 'asm' or '__attribute__' before 'W_TAG'
../my_rtc_clock.c: In function 'main':
../my_rtc_clock.c:60: error: 'W_TAG' undeclared (first use in this function)

shedepe
15.06.2013, 13:32
Dann deklariere W_TAG nicht in der my_ds1307.c sondern mit extern in der dazu gehörigen h Datei und binde diese über include in deine main.c ein

oderlachs
15.06.2013, 13:53
Besten Dank!!!
Lach nun frisst doch der Teufel Fliegen, so hatte ich es ja in der UR-Version und da hat die "my_ds1307.c " gemecktert das das W_TAG für sie bei time_init unbekannt ist..und nun geht es...

Na ja kann sein das ich was übersehen habe, oder falsch gedeute, jedenfalls bin ich ein "paar Kilometer" weiter jetzt bei meinem Vorhaben. Ich habe schon an mich selber gezweifelt tzzz.

Danke sagt
Gerhard