Strukturen



  • Hallo zusammen,

    #include <stdlib.h>
    #include <stdio.h>
    #include <math.h>
    #include <string.h>
    
    #define MAXSTRING 100
    
    struct punkt
    {
      float x;
      float y;
    };
    
    struct adresse
    {
      char  vorname[MAXSTRING];
      char  nachname[MAXSTRING];
      char  strasse [MAXSTRING];
      char  ort[MAXSTRING];
      char  PLZ[MAXSTRING];
    };
    
    struct personendaten
    {
      struct adresse adresse;
      int    schuhgroesse;
      float  groesse;
    };
    
    struct personendaten getPerson(void)
    {
      struct personendaten thePerson;	/* lokale strukturvariable die zurueckgegeben wird */
      strncpy(thePerson.adresse.vorname,"Lieselotte",MAXSTRING);
      strncpy(thePerson.adresse.nachname,"Musterschuelerin",MAXSTRING);   
      strncpy(thePerson.adresse.strasse,"adresse",MAXSTRING);
      strncpy(thePerson.adresse.ort,"ort",MAXSTRING);
      thePerson.groesse=172;
      thePerson.schuhgroesse=38;
      return (thePerson);
    }
    
    void printPerson(struct personendaten thePerson)
    {
      printf("Adresse:\n%s\n%s\n%s\n%s\n",thePerson.adresse.vorname,thePerson.adresse.nachname,
        thePerson.adresse.strasse,thePerson.adresse.ort);
      printf("Persoenliche Daten:\n");
      printf("Schuhgroesse:%d\n", thePerson.schuhgroesse);
      printf("Groesse:%f\n", thePerson.groesse);
    }
    
    void main()
    {
      double t;
      struct punkt funktionspunkt;
      struct personendaten das_bin_ich;
    
      for( t = 0.0 ; t <= 7; t += 0.1 )
      {
        funktionspunkt.x = (float)t;
        funktionspunkt.y = (float)sin(funktionspunkt.x);
        printf("funktionspunkt %f, %f \n",funktionspunkt.y,funktionspunkt.x);
      }
    
      das_bin_ich=getPerson();
      printPerson(das_bin_ich);
    
    }
    

    Mein Problem liegt hier im "Unterprogramm":

    struct personendaten getPerson(void)
    {
      struct personendaten thePerson;
      strncpy(thePerson.adresse.vorname,"Lieselotte",MAXSTRING);
      strncpy(thePerson.adresse.nachname,"Musterschuelerin",MAXSTRING);   
      strncpy(thePerson.adresse.strasse,"adresse",MAXSTRING);
      strncpy(thePerson.adresse.ort,"ort",MAXSTRING);
      thePerson.groesse=172;
      thePerson.schuhgroesse=38;
      return (thePerson);
    }
    

    struct ist klar, weil ja der Ruckgabe wert eine Struktur-variable ist, aber warumm musst man schreiben nach "struct" schreiben "personendaten"?

    struct personendaten thePerson; --> das macht man ja schon im Unterprogramm. Muss doch reichen oder?

    Also: Warum musst man das Unterprogramm genau so nennen wie so eine Strukturvariable?

    MfG Tom


  • Mod

    Das struct ist Teil des Typbezeichners! struct foo {}; deklariert einen Typen namens struct foo . Wichtiger Unterschied zu C++ und vielen anderen Sprachen: Der Typ heißt nicht foo ! Dementsprechend musst du dann auch struct personendaten getPerson(void) schreiben, wenn die Funktion getPerson einen Wert mit dem Typ struct personendaten zurückgeben soll.

    Und deswegen sieht man auch so oft Konstrukte wie typedef struct {} bar; , wo dann bar ein typedef auf das (hier namenlose) struct ist, so dass man in Zukunft einfach bar schreiben kann, wenn man das struct meint.



  • zu erwähnen wäre da "bloß" noch:
    - Rückgaben von lokalen Variablen aus Funktionen sind in Anfängerhand zumindest fragil
    - void main ist Anfänger-Müll
    - wegen Unkenntnis "vergessene" typedefs sind ebenso JW Pfusch Niveau
    - strncpy Verwendung für sichereren Code suggeriert dies nur und ist ebenso Unsinn weil es nur eine Unsicherheit gegen eine andere eintauscht
    - struct Variableninitialisierung geht auch sehr viel einfacher und vor allem robuster als o.g.
    - typecasts lassen meist, bei Anfängern immer, auf mangelhaftes Programm/Datendesign schließen
    - ...



  • Ok, danke.

    Ok, danke.

    Um ein bisschen Strukturen zu üben hab ich ein Programm geschreiben das y=sin(x) ausrechnet und dann das ganze in ein Array speichert und den kleinsten wert von y sucht.

    1. steht dann da dass der kleinste wert 0 ist, obwohl die zahl 0 gar nicht vorkommt.
    2. Wenn ich mit Einzelschritt durchgehe dann erscheint in Zeile 26 eine Fehlermeldung(siehe Pic).

    http://img6.imagebanana.com/img/8otq2dm1/thumb/error.png

    #include <stdlib.h>
    #include <stdio.h>
    #include <math.h>
    #include <string.h>
    
    #define MAXLEN 10
    
    struct punkt_struct
    {
      float x;
      float y;
    };
    
    typedef struct punkt_struct punkt;
    
    void getpunkte(punkt point[], int len);
    float fndminimum(punkt point[], int len);
    
    void getpunkte(punkt point[], int len)
    {
      double t=0;
    
      for(t=0.0; t<len; t=t+0.1)
      {
    	  point[(int)t].x=(float)t;
    	  point[(int)t].y=sin((float)t);
    	  printf("sin(%f)=%f\n",point[(int)t].x,point[(int)t].y);
      }
    }
    
    float fndminimum(punkt point[], int len)
    { 
      int i=0;
      int n=0;
      float tmp=0;
      float min=0;
    
      for(n=0; n<len; n++)
      {
        for(i=0; i<len; i++)
        {
          if(point[i].y > point[i+1].y)
    	  {
    	    tmp=point[i].y;
    		point[i].y=point[i+1].y;
    		point[i+1].y=tmp;
    	  }
        }
      }
    
      min=point[0].y;
    
      return(min);
    }
    
    int main()
    {
      punkt point[MAXLEN];
      float min=0;
    
      getpunkte(point,MAXLEN);
    
      min=fndminimum(point,MAXLEN);
    
      printf("Die kleinste Zahl im Array ist:%d\n",min);
    
      return(0);
    }
    

    Was bedeutet das jetzt genau das der Quellcode nicht mehr verfügbar ist?
    Wie man sehn kann mach icih das mit Bubble Sort und da an der 0ten stellen des Arrays dann die kleinste Zahl steht ist das dan die kleinste Zahl .

    Aber das geht sicher einfacher.



  • Erstens: Dein BubbleSort ist nicht ganz korrekt umgesetzt - die Schleifenindizes stimmen nicht.

    Zweitens: Die Meldung vom Debugger hängt vermutlich damit zusammen, daß du mit den falschen Compiler-Einstellungen übersetzt hast. Dadurch fehlen beim Beobachten die Debug-Informationen, anhand derer der Debugger den ursprünglichen Quelltext rekonstruieren kann.


Anmelden zum Antworten