Forum: Compiler & IDEs Structur mit Rückgabe


von Murry (Gast)


Lesenswert?

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

struct person {
char *name;
int alter;
};

struct person *erzeuge(char *name, int alter) {
struct person temp;
strcpy(temp.name, name);
temp.alter = alter;
 return  &temp;

}
void main(void) {
struct person *p;
p = erzeuge("Meier", 25);

printf("Name: %s, Alter: %d\n", p->name, p->alter );

}


Find den Fehler meines Programms nicht, weiß jemand woran das liegt...

von Klaus W. (mfgkw)


Lesenswert?

Ein Programm ist richtig, wenn es deine Anforderungen erfüllt.
Solange du keine benennen kannst und sagst, inwiefern es die
Anforderungen nicht erfüllt, ist es richtig.

Der einzige Fehler daran ist die fehlende Formatierung, die
ist nämlich Pflicht, wenn andere das lesen sollen.

von U.R. Schmitt (Gast)


Lesenswert?

Murry schrieb:
> struct person *erzeuge(char *name, int alter) {
> struct person temp;
...
> return  &temp;

Klasse! Hast Du schon mal was von lokalen Variablen und Stack gehört?
Gegenfrage: Wie lange sind solche Variablen gültig?

Du brauchst ein C-Buch

von Karl H. (kbuchegg)


Lesenswert?

Murry schrieb:

> Find den Fehler meines Programms nicht, weiß jemand woran das liegt...


Nur weil du eine Pointer Variable hast, hast du noch lange nicht den 
Speicher auf den dieser Pointer zeigen könnte um darin etwas abzulegen

struct person temp;
strcpy(temp.name, name);


temp.name ist nur ein Pointer. Dahinter steckt kein Speicher (kein 
char-Array) in dem der Name gespeichert werden könnte. Du als 
Programmierer bist dafür verantwortlich, dass dieser Pointer auch auf 
tatsächlichen Speicher zeigt und nicht einfach nur ins Nirvana.

 return  &temp;

Die Adresse einer lokalen Variablen zurückgeben ist der nächste Punkt 
für ein sicheres Desaster.

von Klaus W. (mfgkw)


Lesenswert?

Ansonsten lieferst du die Adresse einer lokalen Variable zurück.
Das ist meistens falsch, wenn das Programm nicht nicht abstürzen
soll.
Deshalb steht in jedem C-Buch, daß man das nicht machen
soll und der gcc erzeugt eine Warnung.
Falls du bestimmte Anforderungen an die Funktionsfähigkeit
deines Programms hast, solltest du solche Warnungen nicht
ignorieren (und immer mir -Wall kompilieren, falls du den gcc
nimmst).

von U.R. Schmitt (Gast)


Lesenswert?

Karl heinz Buchegger schrieb:
> strcpy(temp.name, name);

Das hatte ich gar nicht gesehen.
Dein Lieblingsspruch: Er braucht ein gutes C-Buch :-)

von Karl H. (kbuchegg)


Lesenswert?

U.R. Schmitt schrieb:
> Karl heinz Buchegger schrieb:
>> strcpy(temp.name, name);
>
> Das hatte ich gar nicht gesehen.
> Dein Lieblingsspruch: Er braucht ein gutes C-Buch :-)

Allerdings.
In so wenig Code 2 derart schwerwiegende Fehler. Und keinen davon selber 
gesehen.

Das schreit förmlich danach, dass hier wieder mal wer ohne Literatur 
unterwegs ist.

(Und natürlich wieder eine scheusliche Code-Formatierung)

von Klaus W. (mfgkw)


Lesenswert?

U.R. Schmitt schrieb:
> Das hatte ich gar nicht gesehen.

Deshalb wehre ich mich auch dagegen, einen unformatierten
Misthaufen genau zu lesen.
Schon in ein paar Zeilen verstecken sich da Fehler.

Karl heinz Buchegger schrieb:
> (Und natürlich wieder eine scheusliche Code-Formatierung)

Welche Formatierung?
Naja, ok. Es gibt Zeilenenden.

von U.R. Schmitt (Gast)


Lesenswert?

Klaus Wachtler schrieb:
> Naja, ok. Es gibt Zeilenenden.

Eben, in den ersten Basic Computern hatten wir uns sogar die 
Zeilenumbrüche gespart (bzw alles auf 40 oder 80 Zeidhen pro Zeile 
zusammengequetscht, daß ein paar Bytes mehr an Code in den Speicher 
gepasst haben :-)

von Murry (Gast)


Lesenswert?

>> Dein Lieblingsspruch: Er braucht ein gutes C-Buch :-)

Das heißt mit anderen Worten wenn jeder ein C-Buch hat braucht man kein 
Forum mehr.


Ja und wie schreibt man es jetzt am besten um...

von Karl H. (kbuchegg)


Lesenswert?

Murry schrieb:
>>> Dein Lieblingsspruch: Er braucht ein gutes C-Buch :-)
>
> Das heißt mit anderen Worten wenn jeder ein C-Buch hat braucht man kein
> Forum mehr.

Nein das heißt es nicht.
Auch in einem C-Buch werden immer Detailfragen offen bleiben.

Aber: Wer ein C-Buch hat und es systematisch durcharbeitet, fällt nicht 
mehr auf jeden Pipifax herein.
Ein Forum ist kein Ersatz für das Erlernen der absoluten Grundlagen. 
Denn sonst bräuchte man keine Bücher mehr, sondern ein paar Dodeln 
schreiben dir in 5 jeweils 30 zeiligen Postings die Kurzfassung dessen, 
wozu ein Buch 250 Seiten braucht.

Schon mal überlegt, warum wohl ein C-Buch nicht unter 200 Seiten 
wegkommt? Das wird ja wohl kaum so sein, dass dem Autor fad gewesen wäre 
und er deshalb die Seiten irgendwie gefüllt hat.

> Ja und wie schreibt man es jetzt am besten um...

So dass es richtig ist.
Wie es richtig ist, steht in jedem, und ich meine jedem, C-Buch.
Und zwar schon lange vor dem Kapitel an dem dann Strukturen auftauchen! 
Denn das ist nämlich das eigentlich interessante an der Sache. Wer so 
weit fortgeschritten ist, dass er zu Strukturen kommt, sollte zb mit 
Stringverarbeitung eigentlich überhaupt keine Problemen mehr haben.

Nicht nur, dass du kein Buch hast. Du hast auch noch midestens die 
Hälfte aller nicht gelesenen Kapitel übersrpungen und wunderst dich 
jetzt, dass alles auf dich hereinstürzt. Da will ich erst gar nicht 
wissen, was du noch alles nicht weißt.

von Murry (Gast)


Lesenswert?

Danke für die aufbauenden Worte.
> Nicht nur, dass du kein Buch hast. Du hast auch noch midestens die
> Hälfte aller nicht gelesenen Kapitel übersrpungen und wunderst dich
> jetzt, dass alles auf dich hereinstürzt. Da will ich erst gar nicht
> wissen, was du noch alles nicht weißt.

Aber jetzt mal ehrlich, wie kann man es am besten umschreiben

von Karl H. (kbuchegg)


Lesenswert?

Indem man die angesprochenen Dinge bereinigt.

Du brauchst Speicher um einen String zu speichern.

Hier ist er zb
1
struct person {
2
  char name[20];
3
  int alter;
4
};

Dann geht schon mal der strcpy.

Du kannst nicht die Adresse einer lokalen Variablen zurückgeben.
Na dann tus einfach nicht!
1
struct person erzeuge(char *name, int alter)
2
{
3
  struct person temp;
4
5
  strcpy(temp.name, name);
6
  temp.alter = alter;
7
8
  return temp;
9
}

Ob das 'die beste Lösung' ist sei dahingestellt. Aber zumindest ist es 
eine Lösung die funktioniert.

Und das war jetzt so schwer?


(Eine Änderung musst du noch machen. Aber die machst jetzt du. Denn du 
sollst ja schliesslich auch etwas dazu beitragen, ausser dass du dir 
möglichst rasch ein Buch kaufst und das Versäumte nachholst)

von Murry (Gast)


Lesenswert?

Dankschön ^^ funzt

von Klaus W. (mfgkw)


Lesenswert?

Bis zum nächsten der 789 Standardfehler in C, die man nicht macht,
wenn man seine wertvolle Zeit für ein Buch opfert...

von U.R. Schmitt (Gast)


Lesenswert?

Murry schrieb:
> Dankschön ^^ funzt

Und jetzt tu DIR einen Gefallen und erkläre mal warum es jetzt funzt!

von Olaf (Gast)


Lesenswert?

> (Und natürlich wieder eine scheusliche Code-Formatierung)

Wie geht sowas eigentlich?

Ich benutze ja Emacs und das sorgt von sich aus schonmal fuer
eine gewisse Grundformatierung und ich dachte bisher
das soetwas der Normalfall ist auch bei irgendwelchen
integrierten Oberflaechen.

Und erzaehl mir jetzt keiner die Anfaenger schreiben ihre Programme in 
Word. :-D

Olaf

von Wirklich? (Gast)


Lesenswert?

Murry schrieb:
> Dankschön ^^ funzt


Dann probier mal
1
p = erzeuge("Meier", 25);
2
q = erzeuge("Schmidt", 99);
3
printf("Name: %s, Alter: %d\n", p->name, p->alter );
4
printf("Name: %s, Alter: %d\n", q->name, q->alter );

von Klaus W. (mfgkw)


Lesenswert?

Olaf schrieb:
>> (Und natürlich wieder eine scheusliche Code-Formatierung)
>
> Wie geht sowas eigentlich?

Wenn man sich bemüht, bekommt man auch mit dem EMACS und jeder
IDE einen gruseligen Quelltext hin.
Hier war es wahrscheinlich aber im Editor noch gar nicht so
schlimm; dann muß man zumindest auf
1
[c]
2
...
3
[/c]
verzichten, um es zu schaffen.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.