Initialisierung von einer Liste von verschachtelten structs

grandmetre

Mitglied
Hallo zusammen,

Ich würde gerne dieses Array von initialisieren:

C++:
struct ns__info
{
  char *name;
  struct attribute
  {
    char *name;
    char *value;
  } attributes[...];
  int numAttributes;
} clients[...] = {...};

Leider habe ich in der Hinsicht wenig erfahrung. Kann mir da jemand helfen, oder hat jemand einen Vorschlag, wie ich diese Art der Datenhaltung besser formulieren kann?

MfG
Grand
 
Zuletzt bearbeitet von einem Moderator:
Ich möchte eine Verschachtelete Datenstruktur aufbauen. Ein struct lautet attribute und beinhaltet 2 Strings:

Code:
struct attribute {char *name;char *value;};

Dieses Struct soll als Liste in dem nächsten struct vorkommen:

Code:
struct ns__info{char *name; 
                struct attribute{char *name; char *value;} attributes[100];
                int numAttributes;}

von diesem struct möchte ich wiederum eine Liste anlegen:

Code:
struct ns__info{.....} clients[...];
;

Nun weiß ich, dass man die "attribute"-liste in etwa so initialisieren kann:

Code:
struct attribute 
{char *name; char *value;
}  attributes[] = {
   "foo", "bar",
   "dings", "bums",
};

geht das auch in der oben gezeigten verschachtelten struktur?

Kurze Zusatzinfo: ich programmiere in reinem C
 
Zuletzt bearbeitet:
Also du meinst so oder?

C++:
struct attribute
{
    char *name;
    char *value;
};

struct ns__info
{
    char *name;
    struct attribute atts[100];
    int numAttributes;
};

struct ns__info clients[100];

Also das Initialisieren wie du es möchtes mit der geschwungenen Klammer funktioniert nur bei der Definition!
Also zum Beispiel:

C++:
struct ns__info clients[100] = {"Aaa", "a", "a", "a"};

Hier erfolgt dann die Initialisierung der Reihe nach, also wie dir Variablen im Quellcode stehen, ich glaube das ist nicht wirklich sehr hilfreich und unnötig kompliziert. Bei meinem Code würde hier zuerst *name auf das "Aaa" zeigen und dann die einzelnen Arrayelemente von attribute (also eben genau in derselben Reihenfolge wie im Quellcode) auf die "a".
Besser wäre, würde ich sagen, mit dem . Operator einfach die einzelnen Member initialisieren (mit einer Schleife usw. ist das ziemlich praktisch).

Lg
 
Hallo,

schau mal hier:
C:
#include <stdio.h>
#include <stdlib.h>

struct vec4
{
  int x;
  int y;
  int z;
  int w;
} vectors[] = {
  {1,2,3,4},
  {5,6,7,8},
  {9,10,11,12}
};

void print_vector_components(struct vec4 *v){
  printf("v(x=%d,y=%d,z=%d,w=%d)\n"
  ,v->x
  ,v->y
  ,v->z
  ,v->w);     
}

int main(int argc, char *argv[])
{ 
  int i;
  printf("%d %d\n",sizeof(struct vec4),sizeof(vectors));
  
  for(i = 0; i < sizeof(vectors)/sizeof(struct vec4);i++){
    print_vector_components(&vectors[i]);
  }

  system("PAUSE");	
  return 0;
}

Ausgabe:
Code:
16 48
v(x=1,y=2,z=3,w=4)
v(x=5,y=6,z=7,w=8)
v(x=9,y=10,z=11,w=12)
Drücken Sie eine beliebige Taste . . .

Gruß Tom
 
Ich habe ein wenig rumprobiert und habe festgestellt, dass richtiges Klammersetzen nicht unterschätzt werden sollte^^. Auf jeden Fall funktioniert es so:

Code:
struct ns__info {char *name; 
                 struct attribute{char *name; char *value;} attributes[100]; 
                 int numAttributes;} clients[100] =
		{
				{"Fred", {{"age", "30"}, {"weight", "80"}}, 2},
				{"Ted", {{"age", "58"}, {"height", "187"}}, 2},
				{"Paul", {{"age", "19"}, {"weight", "73"}, {"height", "176"}}, 3}
		};

Danke für eure Hilfe
 
Zurück