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
-
Das struct ist Teil des Typbezeichners!
struct foo {};
deklariert einen Typen namensstruct foo
. Wichtiger Unterschied zu C++ und vielen anderen Sprachen: Der Typ heißt nichtfoo
! Dementsprechend musst du dann auchstruct personendaten getPerson(void)
schreiben, wenn die FunktiongetPerson
einen Wert mit dem Typstruct 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 einfachbar
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.