Forum: PC-Programmierung Hilfe zu STRUCT


von Rainer (Gast)


Lesenswert?

Hi, ich habe in ANSI C diese Struktur mit Unterstruktur Geburtstag
vollgendermaßen so erstellt. Wenn ich mit SCANF die Jahreszahl einlesen
will: scanf("%i",&studi.geburtstag.jahr); Dann erscheint vom Compiler
eine Fehlermeldung.
Fehlermeldung:
warning C4832: Das Token '.' ist nach UDT 'student::geburtstag'
illegal

struct student
 {
  char name[20];
  int semester;

  struct geburtstag
   {
    int tag;
  int monat;
  int jahr;
   };
 };
int main()
{
 char datum[20];
 struct student studi; //= //{"Henning", 2, 03, 01, 1978};
 printf("Geburtsdatum eingeben:");
 scanf("%i",&studi.geburtstag.jahr);
 printf ("Alter: %d \n", alter (studi));
}

int alter(struct student st)
{
 int alter_stud = 2005 - st.geburtstag.jahr; //st.geburtstag.jahr;

 return alter_stud;
}

von Μαtthias W. (matthias) Benutzerseite


Lesenswert?

Hi

du deklarierst die innere Struktur Geburtstag nur. Sie wird damit nicht
zum Mitglied der Struktur student. Versuch mal:

struct student
 {
  char name[20];
  int semester;

  struct geburtstag
   {
    int tag;
  int monat;
  int jahr;
   } birthday;
 };

und dann

scanf("%i",&studi.birthday.jahr);

Matthias

von Rainer (Gast)


Angehängte Dateien:

Lesenswert?

Danke für die Info! Es funktioniert bei mir.
Und zwar hab ich noch ein Problem. Ich möchte jetzt mit meiner
definierten Struktur (siehe Anhang) jetzt die Daten für insgesamt 20
Studenten eingeben. WIe kann ich dies in ANSI C realisieren?

von The Daz (Gast)


Lesenswert?

Was meinst du damit ? Willst du wissen, wie man die Tastatur-Eingabe
bekommt ? Wie man nen array baut, weisst du ja.

von Rainer (Gast)


Lesenswert?

Ja ich habe da ein Problem wie ich das ganze jetzt so verpacken kann,
damit ich die Daten für 20 Studenten eingeben kann?
Ich weiss net wie ich das jetzt angehen kann!

von Μαtthias W. (matthias) Benutzerseite


Lesenswert?

Hi

du erstellst ein array deiner Strukturen und liest die in einer
Schleife ein.

Matthias

von Rainer (Gast)


Lesenswert?

Hmm...ok gut. Trotzdem weiss ich nicht wie.
Ich brächte ein kleines Beispiel!

von The Daz (Gast)


Lesenswert?

#define NUM_STUDIES 20
struct student studenten[NUM_STUDIES];
for (int idx=0; idx < NUM_STUDIES; idx ++)
{
   readStudentData(&studenten[idx]);
}

Reicht das als Anschubhilfe ?

von Rainer (Gast)


Lesenswert?

Hei Danke!

Ich habe jetzt mal eine Funktion erstellt, mit der ich das Alter
berechnen und wieder zurückgeben will.
Mit dem printf Ausdruck in MAIN mekert mein compiler.


int main()
{
 struct student studi[20];
 .
 .
 .
 // so funktioniert es nicht!
 printf ("Alter: %d \n", alter(studi[1]));
 // so funktioniert es auch nicht!
 printf ("Alter: %d \n", alter(studi));

 return 0;
}

int alter(struct student st[20])
{
 ausgabe = 2005 - atoi(st[1].u.datum.jj);
 return ausgabe
}

von The Daz (Gast)


Lesenswert?

Ist doch klar. Deine alter() Funktion erwartet einen array mit 20
Elementen und du uebergibst nur eines ! Machs besser so :

int alter(struct student st)
{
 ausgabe = 2005 - atoi(st.u.datum.jj);
 return ausgabe
}

von Karl heinz B. (heinzi)


Lesenswert?

> Ich habe jetzt mal eine Funktion erstellt, mit der ich das Alter
> berechnen und wieder zurückgeben will.

Du moechtest das Alter berechnen. Von wem?
Von EINEM Studenten

Also kann Deine Funktion schon mal nicht diese Signatur haben:

int alter(struct student st[20])

sondern muss so aussehen:

int alter( struct student st )
{
  return 2005 - atoi( st.u.datum.jj );
}

Aufgerufen wird die Funktion dann, indem Du eben EINEN Studenten
aus Deinem Array auswahlst und die Funktion alter damit aufrufst.
zb so:

   printf( "Alter %d \n", alter( studi[0] ) );

Ausserdem: Sag bitte niemals: da ud da meckert mein Compiler.
Das ist genauso hilfreich, als wenn Du uns gar nichts mitteilst.
Der Compiler gibt Dir eine Fehlermeldung. Meistens, nicht immer,
ist diese Fehlermeldung der Schluessel dazu um rauszufinden, was
Du falsch gemacht hast. Also halt sie nicht hinterm Berg, sondern
gib uns diese Fehlermeldung, damit wir Dich lotsen koennen.


(*) Ich weiss, atoi() ist eine der Funktionen die aus C verbannt
werden sollten. strtol() statt dessen verwenden!

(*) Ich weiss, so eine Struktur uebergibt man normalerweise
nicht als Ganzes, sondern per Pointer. Erstens wollte ich den
OP nicht ueberfordern und nur dass benutzen was er (wahrscheinlich)
schon kennt und zweitens ist das sicherlich Hausuebung und wozu
hat er denn einen Lehrer ....

von Rainer (Gast)


Lesenswert?

Dank Eurer Hilfe habe ich es hinbekommen! Danke nochmals!

Ich habe wie gesagt eine feste Struktur.
Wie kann ich dann mit strcat nachträglich statt für den Monat z.B.
"01" den Monat ausgeschrieben "Januar" dort plazieren?

union
   {
  char  dat_b[11];
  struct
  {
    char tt[2];
    char p1;
    char mm[2];
    char p2;
    char jj[4];
    char end;
  } dat;
   }u;

von Karl heinz B. (heinzi)


Lesenswert?

Gar nicht.

  ...
  char mm[2];
  ...

die Monatsstelle hat also Platz fuer genau 2 character.
Und "Januar" verbraucht in C 7 character.

BTW: Ich sehe in Deiner Struktur diese p1, p2, end Member Variablen.
Zusammem mit dem Rest der Struktur draengt sich mir der Verdacht
auf, dass Du hier einen Fehler gemacht hast.

Wenn du zb machst:
   strcpy( dat.mm, "12" );
dann brauchst Du dafuer 3 character.
In C wird jeder String mit einem Zeichen '\0' abgeschlossen!
Der String "12" ist also 3 Zeichen lang, nicht 2! '1' '2'
'\0'

Da du die Tag, Monat, Jahr Member als character strings ausfuehrst
(warum auch immer) muessen die Felder daher um 1 groesser sein,
damit die Strings da auch hineinpassen:

struct
{
  char tt[3];
  char mm[3];
  char jj[5];
} dat;

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.