#include <www.pronix.de>

Home

 Programmieren
C-Programmieren
Perl
CGI

 Bücher
C von A bis Z
+ Compiler
+ Listings
+ Aufgaben
+ Links
+ Updates
C M&T easy
Rezensionen

 Service
Links
Feedback
Mailingliste
Newsletter

 Sonstiges
FAQ
Impressum
 

Lösungen zu den Aufgaben von Kapitel 17 bis 18


  1. Hier eine möglich Lösung:

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #define MAX 25
    #define DAT 5
    #define BEM 4096
    
    struct daten{
            char vorname[MAX];
            char nachname[MAX];
            char *bemerkung;
            };
    
    
    void eingabe(struct daten *s)
    {
       char vn[MAX], nn[MAX], anmerkung[BEM];
    
       printf("Vorname   : ");
       fgets(vn, MAX, stdin);
       printf("Nachname   : ");
       fgets(nn, MAX, stdin);
       printf("Bemerkung : ");
       fgets(anmerkung, BEM, stdin);
    
       strcpy(s->vorname, vn);
       strcpy(s->nachname, nn);
    
       s->bemerkung = (char *)malloc(strlen(anmerkung)+1);
       if(s->bemerkung == NULL)
       {
               printf("Speichermangel...!!!\n");
               exit(0);
       }
       strcpy(s->bemerkung, anmerkung);
    }
    
    
    void ausgabe(struct daten *s)
    {
        printf("Vorname  : %s",s->vorname);
        printf("Nachname : %s",s->nachname);
        printf("Bemerkung: %s",s->bemerkung);
    }
    
    
    
    int main()
    {
     struct daten satz[DAT];
     int i;
    
     for(i=0; i<DAT; i++)
             eingabe(&satz[i]);
    
     for(i=0; i<DAT; i++)
         ausgabe(&satz[i]);
    
     return 0;
    }
  2. Das Beispiel dazu:

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #define MAX 25
    #define BEM 4096
    
    struct daten{
            char vorname[MAX];
            char nachname[MAX];
            char *bemerkung;
            };
    
    
    void eingabe(struct daten *s)
    {
       char vn[MAX], nn[MAX], anmerkung[BEM];
    
       printf("Vorname   : ");
       fgets(vn, MAX, stdin);
       printf("Nachname   : ");
       fgets(nn, MAX, stdin);
       printf("Bemerkung : ");
       fgets(anmerkung, BEM, stdin);
    
       strcpy(s->vorname, vn);
       strcpy(s->nachname, nn);
    
       s->bemerkung = (char *)malloc(strlen(anmerkung)+1);
       if(s->bemerkung == NULL)
       {
               printf("Speichermangel...!!!\n");
               exit(0);
       }
       strcpy(s->bemerkung, anmerkung);
    }
    
    
    void ausgabe(struct daten *s)
    {
        printf("Vorname  : %s",s->vorname);
        printf("Nachname : %s",s->nachname);
        printf("Bemerkung: %s",s->bemerkung);
    }
    
    
    int main()
    {
     struct daten *satz;
     unsigned int i;
     size_t len;
    
     printf("Wieviele Datensätze benötigen Sie : ");
     scanf("%d",&len);
     getchar();
     printf("...reserviere Speicher...\n");
    
     satz = (struct daten *)calloc(len, sizeof(struct daten *));
     if(satz == NULL)
     {
             printf("Speicherplatzmangel ...\n");
             exit(0);
     }
    
     for(i=0; i<len; i++)
             eingabe(&satz[i]);
    
     for(i=0; i<len; i++)
         ausgabe(&satz[i]);
    
     return 0;
    }
  3. Rein syntaktisch sind union gleichwertig mit struct (abgesehen von der Initialisierung). Der Unterschied ist, dass eine Strukturvariable vom Typ union immer nur eines deren angegebenen Elemente enthalten kann. Sie sollten aber die Übersicht behalten, auf welches Element Sie das letzte mal zugegriffen haben.

  4. Um optimal auf die Daten im Speicher zugreifen zu können, werden diese in einem zwei-Byte-Allignment oder in einem vier-Byte-Alignment angeordnet. Bei einer Struktur, die bspw. in Wirklichkeit nur 14 Bytes an Speicher benötigt, belegt durch ein vier-Byte-Alignment 16 Bytes an Speicher. Die nicht belegten Bytes werden einfach aufgefüllt (Padding).








 

 

© 2000 - 2003 Jürgen Wolf