# Array im Struct



## Oc86 (3. Dezember 2007)

Hallo !

Ich habe ein Problem. Unzwar bin ich gerade dabei ein Client für einen PizzaService zu erstellen.  Dabei Stehen mir folge strukturen/typedefs zu Verfügung.

*typedef unsigned char*            pizzatype_t;  ///< type of pizza
*typedef unsigned char*         pizzasize_t;  ///< size of pizza
*typedef unsigned short*           toppings_t;   ///< toppings (bit mask)
*typedef unsigned short*           count_t;      ///< number of pizzas
*typedef unsigned short*           order_id_t;   ///< id of an order
*typedef char*                     padding_t;    ///< padding byte

*typedef struct* pizza_s {
  pizzatype_t type;
  pizzasize_t size;
  toppings_t  toppings;
} pizza_t;

*typedef struct* order_s {
  count_t   numPizzas;
  padding_t pad[2];
  pizza_t   pizzas[1];
} order_t;

Der Benutzer muss bei jeder Bestellung angeben, wieviele Pizzen er bestellen will! Und hier liegt mein Problem ! Wie kann ich die größe des arrays im nachhinein ändern ?
Mit pointer und malloc das Problem zu lösen, funktioniert leider nicht. Das kommt mit einer nachfolgenden implementierung(nicht änderbar) ins gehege. !
Ich hoffe, ihr könnt mir helfen  Bin schon verschweifelt !


Oc86

P.s.: Programmiersprache C !


----------



## Teambeta (3. Dezember 2007)

Zum Erweitern/Verkleinern des Speichers, musst du realloc ( o.Ä. ) anwenden.


----------



## mm2knet (5. Dezember 2007)

Hehe, wenn das dein Tutor wüsste  aber ich helf mal ganz nett!


Wenn du nen neuen Eintrag erstellen willst, dann mach folgendes:

order_t* data=malloc(sizeof(order_t)+(data->numPizzas-1)*sizeof(pizza_t));
 Das alloziiert dir den passenden Speicher. Dann annst du auch per


```
data->pizzas[I]
```
 auf die einzelnen zugreifen. und wenn du ne lsite erstellst musst du dran denen,d ass da definitiv nix hinter dem order_t steht..

```
typedef struct element_s
{
  struct element_s* r;
  order_id_t id;  
/*... andere daten, zum beispeil, ob die Pizza ausgeliefert wurde ;)*/
  order_t data;    /* muss der letzte eintrag sein 1ELF!*/
} element_t;
```


Wenn du nun hierfür Speicher allocierst, musst du an die zusätzlichen Pizzen denken:

```
element_t* e = malloc(sizeof(element_t) + (data ->numPizzas -1)*sizeof(pizza_t));
```
 

wenn ich jetzt noch mehr schreibe, is hier fast meien ganze Lösung, daher is das bitte nur als anregung von mir zu sehen.


MfG. Dafür, das ich dir die letzte aufgabe rete, erwarte ich auch auf ein Bier eingeladen zu werden  wir sehen uns aufm Campus


----------

