www.mikrocontroller.net

Forum: Compiler & IDEs Structur mit Rückgabe


Autor: Murry (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: Klaus Wachtler (mfgkw)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: U.R. Schmitt (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Klaus Wachtler (mfgkw)
Datum:

Bewertung
0 lesenswert
nicht 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).

Autor: U.R. Schmitt (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Karl heinz Buchegger schrieb:
> strcpy(temp.name, name);

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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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)

Autor: Klaus Wachtler (mfgkw)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: U.R. Schmitt (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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 :-)

Autor: Murry (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Murry (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Indem man die angesprochenen Dinge bereinigt.

Du brauchst Speicher um einen String zu speichern.

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

Dann geht schon mal der strcpy.

Du kannst nicht die Adresse einer lokalen Variablen zurückgeben.
Na dann tus einfach nicht!
struct person erzeuge(char *name, int alter)
{
  struct person temp;

  strcpy(temp.name, name);
  temp.alter = alter;

  return temp;
}

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)

Autor: Murry (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Dankschön ^^ funzt

Autor: Klaus Wachtler (mfgkw)
Datum:

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

Autor: U.R. Schmitt (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Murry schrieb:
> Dankschön ^^ funzt

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

Autor: Olaf (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Wirklich? (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Murry schrieb:
> Dankschön ^^ funzt


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

Autor: Klaus Wachtler (mfgkw)
Datum:

Bewertung
0 lesenswert
nicht 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
[c]
...
[/c]
verzichten, um es zu schaffen.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.