mikrocontroller.net

Forum: PC-Programmierung Hilfe Struct in einem Array


Autor: Anna S. (tasi)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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!
struct irgendwas
{
  int a;
}

struct irgendwas werte[10];

int main()
{
  werte[0].a = 5;
}

Und kauf dir ein Buch!

Autor: Anna S. (tasi)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Klaus Wachtler (mfgkw)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das steht auch in jedem C-Buch...

Autor: Klaus Wachtler (mfgkw)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
z.B. so:
struct irgendwas
{
  int a;
}

struct irgendwas werte[10];

int main()
{
  struct irgendwas *p;

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

Autor: Klaus Wachtler (mfgkw)
Datum:

Bewertung
0 lesenswert
nicht 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).

Autor: Anna S. (tasi)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
vielen Dank !!!

Autor: Sascha (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
  for( p=werte; p<werte+10; ++p )
  {
    p->a = 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"

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

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

Autor: yalu (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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
  werte[i].a = 5;

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

Autor: Simon K. (simon) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sascha schrieb:
>
  for( p=werte; p<werte+10; ++p )
>   {
>     p->a = 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:
>
>
>   int i;
>   p = werte;
>   for( i=0; i<10; ++i )
>   {
>     (p+i)->a = 5;
>   }
> 

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?

Autor: Klaus Wachtler (mfgkw)
Datum:

Bewertung
0 lesenswert
nicht 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 :-)

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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 :-)

Autor: Simon K. (simon) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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". ;)

Autor: yalu (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.