#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...
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.
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
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.
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).
Karl heinz Buchegger schrieb: > strcpy(temp.name, name); Das hatte ich gar nicht gesehen. Dein Lieblingsspruch: Er braucht ein gutes C-Buch :-)
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)
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.
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 :-)
>> 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...
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.
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
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)
Bis zum nächsten der 789 Standardfehler in C, die man nicht macht, wenn man seine wertvolle Zeit für ein Buch opfert...
Murry schrieb: > Dankschön ^^ funzt Und jetzt tu DIR einen Gefallen und erkläre mal warum es jetzt funzt!
> (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
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 ); |
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.