Strukturen mit Pointern

Schnelle objektorientierte, kompilierende Programmiersprache.
Antworten
DANrulz81
Beiträge: 53
Registriert: Fr Dez 23, 2011 9:40 pm

Strukturen mit Pointern

Beitrag von DANrulz81 » Do Jan 26, 2012 8:06 pm

Hallo zusammen,

ich bin nun im meinem Buch bei Strukturen angekommen, leider hab ich dort ein wenig Probleme. Ich versuch nun seit ein paar Stunden, den Code zu verstehen, allerdings scheitere ich :(

Hier der Code:

Code: Alles auswählen

/* struct4.c */
#include <stdio.h>
#include <stdlib.h>
#define MAX 30

struct adres {
   char vname[MAX];
   char nname[MAX];

   long PLZ;
   char ort[MAX];
   int geburtsjahr;
};

/* Funktion zur Ausgabe des Satzes */
void ausgabe(struct adres *struct_ptr) {
   printf("\n\nSie gaben ein:\n\n");
   printf("Vorname.........:%s",struct_ptr->vname);
   printf("Nachname........:%s",struct_ptr->nname);
   printf("Postleitzahl....:%ld\n",struct_ptr->PLZ);
   printf("Ort.............:%s",struct_ptr->ort);
   printf("Geburtsjahr.....:%d\n",struct_ptr->geburtsjahr);
}

struct adres *eingabe(void) {
   static struct adres *adressen;
   adressen = malloc(sizeof(struct adres));
   printf("Vorname : ");
   fgets(adressen->vname, MAX, stdin);
   printf("Nachname : ");
   fgets(adressen->nname, MAX, stdin);
   printf("Postleitzahl : ");
   do {scanf("%ld",&adressen->PLZ);} while(getchar()!= '\n');
   printf("Wohnort : ");
   fgets(adressen->ort, MAX, stdin);
   printf("Geburtsjahr : ");
   do {
      scanf("%d",&adressen->geburtsjahr);
   }while(getchar()!='\n' );
   return adressen;
}

int main(void) {
   struct adres *adresse1, *adresse2;

   adresse1=eingabe();
   adresse2=eingabe();

   ausgabe(adresse1);
   ausgabe(adresse2);
   return EXIT_SUCCESS;
}
Mal abgesehen davon, das der Code schlecht formatiert ist(ich hab ihn 1:1 übernommen), wieso zum Kuckkuck verwendet der Autor für die Postleitzahl eine long - Variable, für das Geburtsjahr aber eine int? Wieso verwendet man eigentlich für die Ausgabe von int nicht %i sondern %d?

Desweiteren habe ich das nicht ganz verstanden:

Code: Alles auswählen

struct adres *eingabe(void)
{
   static struct adres *adressen;
   adressen = malloc(sizeof(struct adres));
   return adressen;
}

int main(void)
{
struct adres *adresse1, *adresse2;

   adresse1=eingabe();
   adresse2=eingabe();
}
*adresse1 + 2 zeigen auf den Speicherort von eingabe()?

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8862
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: Strukturen mit Pointern

Beitrag von Xin » Do Jan 26, 2012 9:41 pm

DANrulz81 hat geschrieben: Mal abgesehen davon, das der Code schlecht formatiert ist(ich hab ihn 1:1 übernommen), wieso zum Kuckkuck verwendet der Autor für die Postleitzahl eine long - Variable,
int ist nur für 16 Bit garantiert. Eine 16-Bit int geht von -32738 bis +32737. Das reicht nicht für Postleitzahlen. Also besteht er auf eine Long, eine 32-Bit Zahl.
DANrulz81 hat geschrieben:für das Geburtsjahr aber eine int?
Das Alter von 32737 Jahren reicht für die meisten Menschen
DANrulz81 hat geschrieben:Wieso verwendet man eigentlich für die Ausgabe von int nicht %i sondern %d?
Hinter dem Prozentzeichen kommt die Art und Weise der Ausgabe. %d für Dezimal oder auch %x für Hexadezimal. In beiden Fällen wird ein int ausgegeben, es sieht aber anders aus.
DANrulz81 hat geschrieben: Desweiteren habe ich das nicht ganz verstanden:

Code: Alles auswählen

struct adres *eingabe(void)
{
   static struct adres *adressen;
   adressen = malloc(sizeof(struct adres));
   return adressen;
}

int main(void)
{
struct adres *adresse1, *adresse2;

   adresse1=eingabe();
   adresse2=eingabe();
}
*adresse1 + 2 zeigen auf den Speicherort von eingabe()?
Nein, eingabe() besorgt sich mit Hilfe von malloc() Speicher und liest dort Daten ein. Die Adresse, wo der Speicher liegt, wird zurückgegeben und in adresse1 bzw. adresse2 gespeichert.
Eigentlich solltest Du den Speicher auch wieder frei geben. (free(adresse1); etc.)

In welchem Jahr ist das Buch gedruckt? ^^
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

DANrulz81
Beiträge: 53
Registriert: Fr Dez 23, 2011 9:40 pm

Re: Strukturen mit Pointern

Beitrag von DANrulz81 » Do Jan 26, 2012 9:58 pm

In welchem Jahr ist das Buch gedruckt? ^^
28. September 2009 es handelt sich um dieses:
http://www.amazon.de/von-bis-umfassende ... im_sbs_b_1

Zum int steht im Wiki aber was anderes:
http://www.proggen.org/doku.php?id=c:type:int

O.k. Soweit habe ich das jetzt verstanden. Wird durch *eingabe eine Call_by_reference durchgeführt? Und wieso wird dann adressen zurück gegeben und nicht *adressen? Irgendwie steh ich auf dem Schlauch. Ich dachte bis dato, dass ich das mit den Pointern kapiert habe.

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8862
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: Strukturen mit Pointern

Beitrag von Xin » Do Jan 26, 2012 10:39 pm

DANrulz81 hat geschrieben:
In welchem Jahr ist das Buch gedruckt? ^^
28. September 2009 es handelt sich um dieses:
http://www.amazon.de/von-bis-umfassende ... im_sbs_b_1
Okay, das "adres"-Beispiel wirkt nicht so top auf mich... aber was ich im Wiki mache, kann auf andere Autoren sicherlich auch befremdlich wirken.
DANrulz81 hat geschrieben: Zum int steht im Wiki aber was anderes:
http://www.proggen.org/doku.php?id=c:type:int
Inwiefern was anderes?

Schau mal bei "Fehlerquelle": Auch wenn int heutzutage mit einer Breite von 32-Bit (4 Byte) üblich ist, so garantiert der Standard nur 2 Byte. Wer Software für alte C-Compiler schreiben muss und in jedem Fall eine 32-Bit-Zahl benötigt sollte sich mit long int auf mindestens 32-Bit festlegen.
DANrulz81 hat geschrieben:O.k. Soweit habe ich das jetzt verstanden. Wird durch *eingabe eine Call_by_reference durchgeführt? Und wieso wird dann adressen zurück gegeben und nicht *adressen? Irgendwie steh ich auf dem Schlauch. Ich dachte bis dato, dass ich das mit den Pointern kapiert habe.
*eingabe?

eingabe ist der Funktionsname. Zurückgegeben wird (struct adres *) - der * gehört zum Rückgabe-Datentyp, nicht zum Funktionsnamen!
Es wird ein Zeiger auf struct adres zurückgegeben.

In Deinem Buch wird vermutlich zwischen Call-By-Reference und Call-By_Value unterschieden. C selbst unterstützt kein Call-By-Reference, erst ab C++.
Lies Dir dazu doch mal meinen Text zu durch: Strukturen und meine Ausführungen zu Call-By-Value, denn das wäre auch meine Erklärung hier.
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

canlot
Beiträge: 393
Registriert: Di Mär 08, 2011 11:01 pm
Wohnort: NRW

Re: Strukturen mit Pointern

Beitrag von canlot » Sa Feb 04, 2012 8:58 pm

Hi DANrulz81
das Buch benutze ich auch zum lernen.
Habe mir es auch vor kurzem gekauft, übrigens hier ist die kostenlose Online Ausgabe:
http://openbook.galileocomputing.de/c_von_a_bis_z/
Lerne aus dem Buch und benutze Wiki als Ergänzung :D
Unwissenheit ist ein Segen

Antworten