C: int-Array mit Werten füllen

Hallo,

ein (vermutlich ziemlich simples) Programmierproblem in C:

ich habe per

int\* b;
b=(int\*) malloc(10\*sizeof(int));

eine Startadresse für ein Array mit 10 int-Variablen reserviert.

Nun kann ich mittels

b[0]=3;
b[1]=0xFF;
b[7]=12;

dieses Array b mit Zahlenwerten belegen.

ABER: geht das auch in einer einzigen Zeile (Initialisierung), und eventuell sogar mit Lücken bei Werten, die ich noch nicht kenne?

Also vielleicht so:

b={0,1,2,0xFF,3,4,5,6,7,8,9};

Danke für jeden Tipp und viele Grüße,
Crypto.

Hallo,

ABER: geht das auch in einer einzigen Zeile (Initialisierung),
und eventuell sogar mit Lücken bei Werten, die ich noch nicht
kenne?

Also vielleicht so:

b={0,1,2,0xFF,3,4,5,6,7,8,9};

Das nennt sich ‚compound literals‘ und
wird ab C99 unterstützt (imho) => http://gcc.gnu.org/onlinedocs/gcc/Compound-Literals…

Ansonsten kannst Du versuchen, mit structs zu arbeiten:

 ...

 typedef struct { int \_[10]; } IS10;

 void stuff() 
{
 // soll spaeter initialisiert werden
 IS10 p; 
 // ...

 { // neuer Block, C
 IS10 oOo= { 0, 1, 2, 3, 4, 5, 6, 7 ,8, 9 };
 // Das geht - weil 'struct':
 p = oOo;
 }
 // ...

 { // neuer Block, Werte ueber q[i] ausgeben
 int \*q = p.\_;
 int i;
 for(i=0; i %d\n", i+1, q[i]);
 }
}
...

Grüße

CMb

Hallo

Also für sehr simple Fälle in denen du zum Zeitpunkt der Deklaration schon alles weist was du zum Füllen des Arrays brauchst geht das so:

int b[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };

oder eben mit Angabe der Länge:

int b[10] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };

Du musst blos in Kauf nehmen, dasd du das Ganze mit [] stat * schreibst, was aber in der Handhabung kaum einen Unterschied macht.

MfG IGnow

Hallo,

danke erstmal für Deine Hinweise.

Das nennt sich ‚compound literals‘ und
wird ab C99 unterstützt (imho) =>
http://gcc.gnu.org/onlinedocs/gcc/Compound-Literals…

Das scheint mir eine ziemlich neue Art der Initialisierung zu sein - ich benötige die Initialisierung für C-Code für den sdcc, und bin nicht sicher, ob dieser compound literals unterstützt.

Ansonsten kannst Du versuchen, mit structs zu arbeiten:

typedef struct { int _[10]; } IS10;

void stuff()
{
// soll spaeter initialisiert werden
IS10 p;
// …

{ // neuer Block, C
IS10 oOo= { 0, 1, 2, 3, 4, 5, 6, 7 ,8, 9 };
// Das geht - weil ‚struct‘:
p = oOo;

Habe ich das richtig verstanden mit den Kringeln? Kringel = irgend.ein.name?

Viele Grüße,
Crypto.

Hallo

Also für sehr simple Fälle in denen du zum Zeitpunkt der
Deklaration schon alles weist was du zum Füllen des Arrays
brauchst geht das so:

int b[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };

oder eben mit Angabe der Länge:

int b[10] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };

Yep, so würde ich das auch gern machen.

Das Problem ist, die Arrays sind zunächst nicht genau bekannt.

Ich reserviere zunächst Speicher für Strukturen, darin ist die letzte Komponente ein int* (Zeiger auf Int bzw. Zeiger auf Int-Array). Die Strukturen sind der Größe nach genau bekannt, somit kann ich problemlos mit malloc() Speicher dafür reservieren.

Die Größe der „nachgehängten“ Int-Arrays ist zwar auch bekannt und ich kann jeweils mit malloc() Speicher dafür reservieren, nur die anschließende Initialisierung mit Datenwerten bereitet mir Kopfzerbrechen. Ob ich den spannenden Vorschlag mit den compound literals umsetzen kann, ist noch fraglich, da ich nicht weiss, ob mein Compiler das unterstützt (sdcc).

Du musst blos in Kauf nehmen, dasd du das Ganze mit [] stat *
schreibst, was aber in der Handhabung kaum einen Unterschied
macht.

MfG IGnow

Thx und viele Grüße,
Crypto.

Hallo

Ich weis nicht ob ich das jetzt richtig verstanden habe!
Also du hast irgendeine Struktur

struct ABC
{
 // andere Felder
 int \*ipointer;
};

und willst jetzt den Zeiger darin initialisieren.
Das geht dann natürlich nicht so wie ich zuerst gezeigt habe. Das angelegte Array würde auch am Ende des umschließenden Blocks wieder freigegeben wenn ich mich nicht täusche.
Mir ist da leider keine Möglichkeit bekannt, wie man das machen könnte.

Ich glaube bei deinem Problem geht es ja im Endeffekt nur um die Ästhetik des Codes und nicht um die Effizienz!

MfG IGnow