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).
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
structperson{
2
charname[20];
3
intalter;
4
};
Dann geht schon mal der strcpy.
Du kannst nicht die Adresse einer lokalen Variablen zurückgeben.
Na dann tus einfach nicht!
1
structpersonerzeuge(char*name,intalter)
2
{
3
structpersontemp;
4
5
strcpy(temp.name,name);
6
temp.alter=alter;
7
8
returntemp;
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)
> (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
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