PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : structs initialisieren



Siro
17.02.2011, 10:20
Frage zum initialisierten struct:

struct
{
int a;
char b;
unsigned int c;
signed char d;
} myStruct = {100,'X',30,100};

Wenn ich nur einige wenige Werte habe, kann ich das noch überblicken.
Aber ich habe eine komplette EEPROM Structur angelegt mit über 200 verschiedenen Werten, welche ich initialisieren möchte.
Das wird dann aber extrem unübersichtlich. Welcher Wert gehört zu wem.....

Gibt es in "C" eine Möglichkeit die struct Elemente mit Angabe des Namens zu initialisieren ?
so zum Beispiel:

{
int a;
char b;
unsigned int c;
signed char d;
} myStruct = {a=100,b='X',c=30,d=100};

Wenn da einfach nur hunterte von Werten hintereinander stehen, muss ich echt anfangen zu zählen, welcher Wert wohin gehört. oder alle untereinander schreiben und mit Kommenatren versehen.

Oder ich muss die Software so umbauen, daß ich die Initialisierung im Programm ausführe.
also:

main()
{
myStruct.a = 100
myStruct.b = 'X';
myStruct.c = 30;
myStruct.d = 100;
....
....

ich vermute aber mal, daß dies "wesentlich" mehr Programmcode in Anspruch nimmt.

Danke für Eure Info.
Siro

TobiKa
17.02.2011, 10:27
Hi

Einfacher wird es nicht gehen.
Aber, für sowas gibt es Dokumentationen, da guckt man einmal rauf und weiss wie die Struktur aussieht.

Edit:
Wenn du, z.B. das Visual Studio benutzt, dann zeigt es dir beim programmieren die Membervariablen an. So musst du nur noch ei8ndeutige Namen verwenden und gut is.

Siro
17.02.2011, 11:43
und dachte an den Syntax von Delphi:

const eeprom : record
a : Integer;
b : char;
c : Word;
d : Short;
end = (a:10; b:'x'; c:30; d:100);

aber was nicht geht, geht halt nicht. Schade...

TobiKa
17.02.2011, 11:47
Vielleicht kennt ja doch noch jemand einen anderen Weg.

Jaecko
17.02.2011, 11:52
So schön einfach wie in PHP ("assoziative Arrays") gehts leider nicht.
Was ich aber oft verwend, sind einfache Kommentare:



struct
{
int a;
char b;
unsigned int c;
signed char d;
} myStruct = {
/* a = */ 100,
/* b = */ 'X',
/* c = */ 30,
/* d = */ 100};


Ist zwar etwas mehr Aufwand, aber so weiss man, was wohin gehört. Und solang man die Reihenfolge nicht durcheinanderschmeisst, passt das auch.

sternst
17.02.2011, 12:49
Gibt es in "C" eine Möglichkeit die struct Elemente mit Angabe des Namens zu initialisieren ? In C im Allgemeinen nicht, aber wenn du den GCC benutzt, dann schon:

myStruct = { .a=100, .b='X', .c=30, .d=100 };

Siro
17.02.2011, 16:38
zu Jaecko:
So in etwa habe ich es auch gemacht. Solange man die Struktur nicht ändert geht es ja auch.

zu sternst:
Da staune ich ja, daß der GCC so etwas zuläst. Guter Compiler, her damit....
Mein IAR Compiler weigert sich aber, ich habe es eben mal in verschiedenen Varianten probiert.

Na was solls, kein Weltuntergang.
Siro

oberallgeier
17.02.2011, 23:15
Hallo sternst,

danke für diese Auskunft! Bitte könntest Du dazu die Quelle nennen? Nicht dass ich misstrauisch bin, ich verfolge ja Deine Beiträge und bin immer beeindruckt. Aber in der Quelle stehen sicher noch mehr, andere interessante Details - und ich weiß nicht, wo ich das herkriege. Ich nutze für C neben dem KR immer (nur) die AVR Libc auf nongnu.org.

Danke im Voraus

Felix G
17.02.2011, 23:37
Solche Informationen stehen z.B. im GNU C Reference Manual (http://www.gnu.org/software/gnu-c-manual/gnu-c-manual.pdf)

sternst
18.02.2011, 00:25
Man findet die Infos im GCC-Manual (http://gcc.gnu.org/onlinedocs/) unter "Designated Initializers".

Und seit C99 ist es offizieller Bestandteil des C-Standards und dort zu finden im Kapitel "6.7.9 Initialization".

Siro
18.02.2011, 09:08
Hallo Stefan,
das war genau die richtige Info mit dem C99 Standard.
Ich habe meinen IAR-Compiler eben umgestellt und siehe da, es funktiniert wie Du es beschrieben hast.

myStruct = { .a=100, .b='X', .c=30, .d=100 };

Wissen heist wissen wo es steht, oder Wissen wen man fragen kann, der es wissen könnte, wenn man es dann wirklich wissen will.
Und deshalb bin ich hier....
Danke Dir.
Siro

oberallgeier
18.02.2011, 09:30
Danke für die schnelle und gute Antwort.

... Wissen heist ...DAS ist aber eine schöne Definition zum Forum:
>>> Wissen heist wissen wo es steht ... wen man fragen kann, der es wissen könnte, wenn man es dann wirklich wissen will ...
Deshalb Dank allen Wissenden die antworten.

Jaecko
18.02.2011, 09:53
Wissen heist wissen wo es steht

Genau das hat mein Geschichte-Lehrer damals auch immer gesagt. Und tatsache: Wenn man in ner Schulaufgabe auf eine Frage nicht die Antwort hingeschrieben hat, sondern nur was wie "Buch XY, Seite 23, Absatz 4", hat man trotzdem volle Punkte bekommen, wenn genau dort die Frage beantwortet wurde.