struct person
{
int personalnummer;
char vorname[10];
char nachnahme[10];
};
int main(void)
{
struct person simon={1010, "simon", "klein"};
struct person_s lucy={1011, "Sally", "Brown"};
struct person_s sally={1012, "Lucy", "van Pelt"};
return 0;
}
wie kann ich nun in iner for-schleife diese daten ausgeben, also zuerst
simon mit 101 und nachnahmen klein, dann sally..
Du musst sie zuerst einer Datenstruktur hinzufügen, die durchlaufen
werden kann. Unten ein beispiel mittels eines Arrays. Wenn man
nachträglich noch elemente hinzufügen will, wären eventuell linked lists
praktischer. Es gibt unzählige weitere möglichkeiten das umzusetzen.
Sofern ein Zugriff auf die einzelnen Variablen "simon", "lucy" und
"sally" nicht benötigt wird, sondern die Variablen immer "durchlaufen"
werden, kann man den Zwischenschritt mit dem Pointerarray auch
weglassen.
// was passiert hier? und was ist der Unterschied zu meiner Variante:
8
// struct person simon={1010, "simon", "klein"}; // ich habe die variable simon vom Typ struct person erstellt. Und bei dir wird irgendwie alles in ein array gepakt oder wie soll ich mir das vorstellen?
stupp schrieb:> // was passiert hier? und was ist der Unterschied zu meiner Variante:> // struct person simon={1010, "simon", "klein"}; // ich habe die> variable simon vom Typ struct person erstellt. Und bei dir wird> irgendwie alles in ein array gepakt oder wie soll ich mir das> vorstellen?
Genau, hier werden die drei Personen in ein Array gepackt. So kann man
danach eben "durchlaufen", was bei einzelnen Variablen nicht so leicht
geht.
stupp schrieb:> //sizeof(people) liefert doch 3 oder? also index 0-2 und was macht das> teilen durch sizeof(people[0])?
sizeof(people) liefert - wie alle sizeof Aufrufe - die Menge an
Arbeitsspeicher, die die Daten brauchen. Das ist 3x die Größe einer
einzelnen struct von people. Und durch sizeof(people[0]) wird geteilt,
um genau diese 3 herauszubekommen.
jz23 schrieb:> sizeof(people) liefert - wie alle sizeof Aufrufe - die Menge an> Arbeitsspeicher, die die Daten brauchen. Das ist 3x die Größe einer> einzelnen struct von people. Und durch sizeof(people[0]) wird geteilt,> um genau diese 3 herauszubekommen
Warum ist das 3x mal die größe die es eigentlich braucht?
Und was macht size_t dabei?
stupp schrieb:> Warum ist das 3x mal die größe die es eigentlich braucht?
Du siehst ein Sofa, und stellst fest, daß es drei Meter breit ist. Und
Du weißt, daß eine (ziemlich wohlgenährte) Person einen Meter Platz
braucht.
Damit kannst Du ausrechnen, daß auf Deinem Sofa wohl drei Personen Platz
haben.
Genau das gleiche Prinzip findet hier Anwendung.
Du hast ein Array im Arbeitsspeicher, das z.B. 300 Bytes groß ist. Und
Du weißt, das jedes einzelne Element, aus denen sich Dein Array
zusammensetzt, 100 Bytes groß ist. Der Rechenweg, um festzustellen, daß
das Array drei Elemente enthält, dürfte Dir jetzt bekannt vorkommen.
stupp schrieb:> und noch eine frage wieso klappt das nicht:
Weil Du hier versuchst, mehrfach Variablen unter dem gleichen Namen
anzulegen.
Wie wäre es, wenn Du, statt herumzuprobieren, einfach mal die Abschnitte
"Variablen", "Arrays" und "Strukturen" in Deinem C-Buch durchlesen
würdest?
Ich habs mir doch 10 mal durchgelesen diese structs bringen alles
durcheinander verstehe da nichts mehr..
Und wieso kann ich auch nicht mehr auf die strukturenelemente zugreifen
will den namen ändern.
people[2].nachname ="was anderes";
Auch hier solltest Du Dir Dein C-Buch durchlesen, hier das Thema
Stringverarbeitung.
Du wirst vermutlich vom Unterschied zwischen Initialisierung und
Zuweisung durcheinandergebracht.
Wenn Dich Dein Buch durcheinanderbringt, dann ist vielleicht das Buch
nicht das richtige?
stupp schrieb:> Und wieso kann ich auch nicht mehr auf die strukturenelemente zugreifen> will den namen ändern.>> people[2].nachname ="was anderes";
Das ginge, wenn du den struct anders deklariert hättest:
1
structperson
2
{
3
intpersonalnummer;
4
char*vorname;
5
char*nachname;
6
};
Statt der char[10] einen Stringpointer char*.
Sonst müsstest du in das char-array kopieren, und das gäbe Probleme,
wenn ein Name länger als 9 Zeichen wäre. Wenn du aber die Arrays größer
deklarierst, ist die Speicherplatzverschwendung auch größer.
Mit den Pointern ist es viel flexibler.
Okay mein Fehler man braucht strcpy.. Aber selbst das geht nicht, oder
auch hier die Zahl? Das Array mit dem Struct bringt mich durcheinander.
Normallerweise würde ich jetzt an die stelle 3 des Arrays eine 1
hinschreiben. Wieso geht das hier nicht...
people[2].personalnummer=1;
stupp schrieb:> und noch eine frage wieso klappt das nicht:> struct person_s people[0]={1010, "Charlie", "Brown"};> struct person_s people[1]={1011, "Sally", "Brown"};> struct person_s people[2]={1012, "Lucy", "van Pelt"};> struct person_s people[3]={1013, "Snoopy", "Dog"}; *> // oder auch das nicht:>> struct person_s people[]={1010, "Charlie", "Brown"};> struct person_s people[]={1011, "Sally", "Brown"};> struct person_s people[]={1012, "Lucy", "van Pelt"};> struct person_s people[]={1013, "Snoopy", "Dog"}; *
Weil du vorher ein Array deklarieren musst, bevor du die einzelnen
Elemente (Strukturen) initialisieren kannst. Du sprichst über den Index
Elemente an, die noch garnicht existieren.
Schau dir außerdem mal das Beispiel hier an:
http://openbook.rheinwerk-verlag.de/c_von_a_bis_z/015_c_strukturen_006.htm#mj558e0e4fc0892fc3f91cd810f7c07860
stupp schrieb:> Okay mein Fehler man braucht strcpy.. Aber selbst das geht nicht, oder> auch hier die Zahl? Das Array mit dem Struct bringt mich durcheinander.> Normallerweise würde ich jetzt an die stelle 3 des Arrays eine 1> hinschreiben. Wieso geht das hier nicht...> people[2].personalnummer=1;
Müsste gehen. Vielleicht woanders noch ein Fehler?
stupp schrieb:> Wieso geht das hier nicht...> people[2].personalnummer=1;
Vermutlich hast du ein array von pointern auf personen, und nicht ein
array von Personen. Dann muss man den mointer Dereferenzieren:
1
structpersonpeople_a[3];// Drei Personen im array
2
structperson*people_b[3];// Drei Pointer auf Personen im array
3
4
structpersonperson;// Eine person
5
structperson*person_ptr=&person;// Ein Pointer auf person
6
structperson**person_ptr_ptr=&person_ptr;// Ein Pointer auf einen Pointer auf person
7
8
person.vorname;// Zugriff auf element in Person
9
10
// Dereferenzieren von person_ptr, und zugriff auf person
11
person_ptr->vorname;// Kurzschreibweise
12
(*person_ptr).vorname;// Dereferenzieren mit * und dann zugriff mit .
13
person_ptr[0].vorname;// Pointer kann als auf ein Array mit einem Element zeigend aufgefasst werden, dereferenzierung von element 0, zugriff auf struct member mit .
14
0[person_ptr].vorname;// Equivalenz von x[0] entspricht *(x+0) entspricht *(0+x) entspricht 0[x]
15
16
// 2 mal Dereferenzieren von person_ptr_ptr, und zugriff auf person
17
(*person_ptr_ptr)->vorname;
18
(**person_ptr_ptr).vorname;
19
person_ptr_ptr[0][0].vorname;
20
// etc.
21
22
// Achtung: sizeof(person_ptr_ptr) entspricht sizeof(struct person**) entspricht sizeof(void*), alle pointer sind gleich gross, aber sizeof(people_b) entspricht sizeof(struct person*[3]) entspricht sizeof(struct person*)*3 entspricht sizeof(void*)*3
struct person_s x={1013, "neu", "name"};
people[2]=x;
das funktioniert, aber wird halt der andere der an stelle 2 ist
überschrieben, wenn ich people[3] gehts nicht.
und drekt people[2] = {1013, "neu", "name"} geht auch nicht.
Wenn du zur Laufzeit neue Einträge erstellen willst, deklarierst du
einfach ein größeres Array:
1
#define MAX_PEOPLE 100
2
3
structpersonpeople[MAX_PEOPLE];
Wie oben schon gesagt, sollten dann aber im struct keine char-Arrays
sein, sondern Pointer.
In einem wirklich sinnvollen Programm initialisiert man solche Daten
sowieso nicht im Programmtext, sondern lässt sie eingeben oder liest sie
aus einer Datei.
stupp schrieb:> Und wie hänge ich eine zusätzliche person an?
Zur Laufzeit ist das nicht möglich.
Um das zu machen, brauchst Du dynamische Speicherverwaltung.
Bist Du Dir sicher, daß Du schon so sattelfest mit Variablen, Arrays,
Strukturen etc. bist, daß Du Dir das ansehen willst?
Ganz sicher?
stupp schrieb:> Und wie hänge ich eine zusätzliche person an?Daniel A. schrieb:> Wenn man nachträglich noch elemente hinzufügen will,> wären eventuell linked lists praktischer.
Hier mal mit doubly linked lists:
1
#include<stdio.h>
2
#include<stddef.h>
3
#include<stdlib.h>
4
#include<string.h>
5
#include<stdbool.h>
6
7
#define UNPACK( ... ) __VA_ARGS__
8
#define ALLODEF( T, X ) allodef( (T[]){{UNPACK X}}, sizeof(T) )
Rufus Τ. F. schrieb:> Ich habe leichte Zweifel daran, daß es hier wirklich hilfreich ist,> solchen Code zu posten.
Für den Fragesteller wohl nicht. Aber es lesen ja noch andere hier.
Jobst Q. schrieb:> Rufus Τ. F. schrieb:>> Ich habe leichte Zweifel daran, daß es hier wirklich hilfreich ist,>> solchen Code zu posten.>> Für den Fragesteller wohl nicht. Aber es lesen ja noch andere hier.
Es ist immer angebracht, weitere Leute von C/C++ fernzuhalten.
Programmiersprachentheaterintendant schrieb:> Es ist immer angebracht, weitere Leute von C/C++ fernzuhalten.
Ist vielleicht besser für C/C++. Wer kein Talent zum Programmieren hat,
sollte sich davon fernhalten.