Forum: PC-Programmierung Hilfe Struct in einem Array


von Anna S. (tasi)


Lesenswert?

Hallo,
ich brauch dringend Hilfe.
Ich möchte ein Array anlegen welches in jedem Feld ein struct hat. 
Anschließend möchte ich an jede Stelle in diesem Stucht einen Wert 
speichern und danach in das nächste Arrayfeld springen.
Hat jemand eine Idee wie ich das machen kann, ich würde mich freuen, 
wenn mir jemand ein Beispielcode in C schicken würde.

von Karl H. (kbuchegg)


Lesenswert?

Anna S. schrieb:
> Hallo,
> ich brauch dringend Hilfe.
> Ich möchte ein Array anlegen welches in jedem Feld ein struct hat.
> Anschließend möchte ich an jede Stelle in diesem Stucht einen Wert
> speichern und danach in das nächste Arrayfeld springen.
> Hat jemand eine Idee wie ich das machen kann, ich würde mich freuen,
> wenn mir jemand ein Beispielcode in C schicken würde.

So ein Beispiel wirst du wohl in jedem noch so grindigen C-Buch finden.
Was? Du hast keines? Dann wirds aber Zeit!
1
struct irgendwas
2
{
3
  int a;
4
}
5
6
struct irgendwas werte[10];
7
8
int main()
9
{
10
  werte[0].a = 5;
11
}

Und kauf dir ein Buch!

von Anna S. (tasi)


Lesenswert?

Danke für die schnelle Antwort !
Ich würde allerdings gerne den Index weglassen und statdessen Pointer 
benutzen um die einzelnen Felder anzusprechen und in dem stuct sollten 
mehrere Variablen stehen die als erstes beschrieben werden und 
schließend springe ich in das nächste ArrayFeld.

von Klaus W. (mfgkw)


Lesenswert?

Das steht auch in jedem C-Buch...

von Klaus W. (mfgkw)


Lesenswert?

z.B. so:
1
struct irgendwas
2
{
3
  int a;
4
}
5
6
struct irgendwas werte[10];
7
8
int main()
9
{
10
  struct irgendwas *p;
11
12
  for( p=werte; p<werte+10; ++p )
13
  {
14
    p->a = 5;
15
  }
16
  return 0;
17
}

von Klaus W. (mfgkw)


Lesenswert?

Das Feld (oder: array) sind übrigens alle 10 Elemente; ein
einzelnes davon ist kein Feld, sondern eben ein Element (oder
in diesem Fall eine struct).

von Anna S. (tasi)


Lesenswert?

vielen Dank !!!

von Sascha (Gast)


Lesenswert?

1
  for( p=werte; p<werte+10; ++p )
2
  {
3
    p->a = 5;
4
  }

würde ich nicht machen. Zeiger zu inkrementieren ist immer ein bisschen 
gefährlich. Wie du sagen würdest: "Steht auch in einem C-Buch"

besser:
1
  
2
  int i;
3
  p = werte;
4
  for( i=0; i<10; ++i )
5
  {
6
    (p+i)->a = 5;
7
  }

So veränderst du p nicht und er steht am Ende immer noch auf dem ersten 
Arrayeintrag.

von yalu (Gast)


Lesenswert?

>  int i;
>  p = werte;
>  for( i=0; i<10; ++i )
>  {
>    (p+i)->a = 5;
>  }

Und (p+i)->a ist nur eine andere Schreibweise für p[i].a, was in meinen
Augen besser lesbar ist. Da sich p nicht rändert, kann man stattdessen
auch gleich werte schreiben. Heraus kommmt
1
  werte[i].a = 5;

Damit schließt sich der Kreis und wir sind wieder am Anfang beim Post
von Karl Heinz ;-)

von Simon K. (simon) Benutzerseite


Lesenswert?

Sascha schrieb:
>
1
  for( p=werte; p<werte+10; ++p )
2
>   {
3
>     p->a = 5;
4
>   }
5
>
>
> würde ich nicht machen. Zeiger zu inkrementieren ist immer ein bisschen
> gefährlich. Wie du sagen würdest: "Steht auch in einem C-Buch"
In wie fern? Glaub ich nicht.

> besser:
>
>
1
>   int i;
2
>   p = werte;
3
>   for( i=0; i<10; ++i )
4
>   {
5
>     (p+i)->a = 5;
6
>   }
7
>

Ist klar, der Code ist genau so schlecht lesbar.
Besser ist wohl zweifelsohne: p[i].a = 5;
Ist aber langsamer als einen Pointer zu inkrementieren.

> So veränderst du p nicht und er steht am Ende immer noch auf dem ersten
> Arrayeintrag.
Und wofür soll das gut sein?

von Klaus W. (mfgkw)


Lesenswert?

Ich habe übrigens nie gesagt, daß meine Variante schöner ist als ein 
Index.
Aber es wurde explizit nach einer Zeigervariante gefragt, da wollte ich
mal nett sein.
Mir dann vorzuwerfen, daß es mit Index auch geht ist unfair. Die
Welt ist ungerecht...

Aber von wegen gefährlich: was ist daran gefährlicher als alles,
was man mit Zeigern machen kann?
Wem das zu gefährlich ist, muß halt Pascal oder notfalls BASIC
nehmen :-)

von Karl H. (kbuchegg)


Lesenswert?

yalu schrieb:

> Damit schließt sich der Kreis und wir sind wieder am Anfang beim Post
> von Karl Heinz ;-)

Und einem guten Compiler, der von sich aus erkennt, was es mit dem Index 
auf sich hat, und den Zugriff über Index durch einen Pointer und dessen 
Inkrementierung innerhalb der Schleife ersetzt :-)

von Simon K. (simon) Benutzerseite


Lesenswert?

Karl heinz Buchegger schrieb:
> Und einem guten Compiler, der von sich aus erkennt, was es mit dem Index
> auf sich hat, und den Zugriff über Index durch einen Pointer und dessen
> Inkrementierung innerhalb der Schleife ersetzt :-)

WAS? Aber das ist doch "gefährlich". ;)

von yalu (Gast)


Lesenswert?

Klaus Wachtler schrieb:
> Ich habe übrigens nie gesagt, daß meine Variante schöner ist als ein
> Index.

Mein (und auch Simons) Einwand mit der Lesbarkeit bezog sich nicht auf
deinen, sondern auf Saschas Vorschlag mit dem etwas unüblichen Konstrukt
(p+i)->a.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.