www.mikrocontroller.net

Forum: PC-Programmierung Hilfe zu STRUCT


Autor: Rainer (Gast)
Datum:

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

Autor: Μαtthias W. (matthias) Benutzerseite
Datum:

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

Autor: Rainer (Gast)
Datum:
Angehängte Dateien:

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

Autor: The Daz (Gast)
Datum:

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

Autor: Rainer (Gast)
Datum:

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

Autor: Μαtthias W. (matthias) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

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

Matthias

Autor: Rainer (Gast)
Datum:

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

Autor: The Daz (Gast)
Datum:

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

Autor: Rainer (Gast)
Datum:

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

Autor: The Daz (Gast)
Datum:

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

Autor: Karl heinz Buchegger (heinzi)
Datum:

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

Autor: Rainer (Gast)
Datum:

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

Autor: Karl heinz Buchegger (heinzi)
Datum:

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

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.