Hallo
habe ein Problem mit Unterprogrammen und Parametern. Leider finde ich
den bekannten C-Büchern sehr wenig dazu.
1
#include ....
2
#include ....
3
4
void_prg1()
5
{
6
Anweisungen
7
returnWert1
8
}
9
10
void_prg2(wert1)
11
{
12
anweisungen
13
BerechnungWert1
14
returnWert2
15
}
16
17
intmain()
18
{
19
.....
20
prg1()
21
22
prg2(Wert1)
23
24
AnzeigedesberechnetenWertes2
25
26
}
Ich verwende 2 Unterprogramme. Im Uprg 1 wird ein Wert ermittelt. Dieser
Wert soll an das Uprg 2 übergeben werden. Anschliessend soll es wieder
an das Hauptprg gehen und zur Anzeige kommen. Mit dem Beispiel hier im
Netz geht es auch nicht so einfach. Entweder bekomme ich Fehlermeldungen
oder es läuft nicht. Was mach ich falsch? Es geht mir dabei um return.
achim
Ui da haben sich sehr viele Fehler eingeschlichen. Am besten du startest
erstmal mit dem AVr-Gcc Tutorial
http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial Ich finde es
sehr gut beschrieben und es macht den Einstieg sehr leicht.
btw. glaube ich nicht das es hierzu nix in C Büchern gab
mfg Manax
Achim Seeger schrieb:> void_prg2(wert1)> {> anweisungen> Berechnung Wert1> return Wert2> }
Ich bin kein C Profi, aber müssten die Funktionen void_prg1 und
void_prg2 nicht ein Int oder sonst etwas vorangeschrieben haben,
schließlich geben sie ja mit return einen Wert zurück, der ein int oder
sonst was ist.
Ferner müsste doch auch die Funktion void_prg2 in der runden Klammer
sowas wie int wert1 stehen haben.
Das ist simple C Programmierung, da findest du in jeder Literatur etwas
zu, wie man Funktionen deklariert.
Hallo lutz
genau dieses Buch liegt vor mir. Auf Seite 346 ist die Verwendung von
viod Zeigern beschrieben. Es ist die verwendung von return drin, aber
sehr kurz. Im Artikel "Programmcode in Unterprg" ist auch einiges
beschrieben. Leider nicht ganz klar.
Das AVR GCC Tutorial liegt auch vor mir. Habe es eben noch mal durch
gesehen. Es steht viel drin, aber das scheint nicht drin zu sein. Nicht
gefunden. Bei dem kleinen Auszug habe ich ein paar Sachen weggelassen.
Zum Verständnis. Ich arbeite schon länger mit der Funktion void und der
Übergabe von parametren. Dabei z.B. Angabe von Punkten auf dem Display
zur Ausgabe Beispiel: prg_versuch(23,45,76);
Im Unterprg void prg_versuch(int8_t x, int8_t y, int8_t wert1).
Im Prg berechne einen weiteren Wert und diesen möchte ich zurück geben.
Leider bekomme ich bei return Fehler angezeigt.Muss ich bei return
ebenfalls wieder eine Variable angeben?
Der Verweis als erstes auf AVR GCC ist nicht immer Hilfreich. Bei
geschätzten 75 Seiten kann nicht alles drin sein.
achim
Achim Seeger schrieb:> Auf Seite 346 ist die Verwendung von> viod Zeigern beschrieben.
Für das, was Du da tun willst, brauchst Du überhaupt keine Pointer, erst
recht keine void-Pointer.
Wenn Du eine Funktion (so nennt man das, was Du "Unterprogramm" nennst)
mit einem Rückgabewert versehen willst, musst Du dessen Typ angeben.
Dein "Beispiel" prg_versuch aber hat als Typ des Rückgabewert void,
was bedeutet, daß eben nichts zurückgegeben wird.
Wenn Du da stattdessen einen Datentyp wie int angibst, kannst Du in
der Funktion mit return einen entsprechenden Wert zurückgeben, und den
an der Stelle, wo die Funktion aufgerufen wird, auch einer Variablen
zuweisen.
Die Aufrufsyntax ist hier recht nahe an der mathematischen Schreibweise
orientiert:
x = f(y)
Nein, das ist nicht C und kein Beispiel für C-Syntax, die sollte in
Deinem C-Buch beschrieben sein. Stichwort Funktionen.
Hallo Rufus
habe im Buch nach Funktionen und Rückgabewerten gesuchz und gefunden. es
sind ein paar Beispiele drin. Leider versteh ich die Sache nichz ganz
genau. Mal ein Stück Code daraus: (Seite 191 - 196)
1
..intbignum(inta,intb){
2
if(a>b)
3
returna:
4
elseif(a<b)
5
returnb:
6
else
7
return0:
8
}
soweit das Beispiel aus dem Buch. Das Beispiel ist soweit klar. Was ich
nicht verstehe ist das letzte return 0. 0 wird an das Hauptprg zurück
gegeben und kann dort weiter verwendet werden. Wie kann ich festlegen,
welche Variable ich zurück gebe? Im Beispiel ist es die 0. Wie kann ich
das machen, das der berechnete Wert zurück kommt und wie sieht die
Stelle mit der Rückgabe im Hauptprg aus? retirn ist ein C befehl und
Name für eine Variable. Muss ich der 0 eine andere Variable zuweisen?
achim
Achim Seeger schrieb:> Das Beispiel ist soweit klar.
Offensichtlich ist es eben doch nicht klar, sonst würdest Du das hier
nicht fragen:
> Was ich> nicht verstehe ist das letzte return 0. 0 wird an das Hauptprg zurück> gegeben und kann dort weiter verwendet werden. Wie kann ich festlegen,> welche Variable ich zurück gebe? Im Beispiel ist es die 0.
C-Buch. Von VORNE anfangen.
Rufus Τ. Firefly schrieb:> Dein "Beispiel" prg_versuch aber hat als Typ des Rückgabewert void,> was bedeutet, daß eben nichts zurückgegeben wird.
Obacht, die Funktion hat keinen Rückgabewert und sollte daher
automatisch implizit int als Rückgabewert haben. Das void_ gehört hier
zum Funktionsnamen. Ein Lehrbuchbeispiel, warum die Namensvergabe von
Variablen und Funktionen so wichtig ist...
Achim, wenn du das Buch durchgehst, tue es von Anfang an und langsam und
versuche, alles zu verstehen. Erst dann das nächste Kapitel. Nicht das,
was dich gerade am meisten interessiert, sondern das Nächste. Bei guten
Büchern (das verlinkte benutze ich allerdings nur zum Nachschlagen und
kann daher nicht viel dazu sagen) bauen die Kapitel aufeinander auf. Das
ist nicht in 3 Tagen getan. Und vieles ergibt sich erst bei der eigenen
Anwendung; also auch immer schön kleine Programme für den PC schreiben.
Es scheint, als wenn du schon am Anfang etwas falsch oder nicht
verstanden hast: In C muß für jede Funktion ein Rückgabewert angegeben
werden. Wird das nicht getan, interpretiert der Compiler das (leider aus
prähistorischen K&R-Zeiten) als Rückgabewert vom Typ int. Soll die
Funktion keinen Rückgabewert haben, muß das Schlüsselwort void (ganz für
sich alleine ...) angegeben werden.
Hat die Funktion einen Rückgabewert (int, float, char, ...), muß dieser
mit "return" auch explizit zurückgegeben werden.
Achim Seeger schrieb:> 0 wird an das Hauptprg zurück> gegeben und kann dort weiter verwendet werden. Wie kann ich festlegen,> welche Variable ich zurück gebe? Im Beispiel ist es die 0. Wie kann ich> das machen, das der berechnete Wert zurück kommt
S.o.
In diesem Beispiel wird nix berechnet. Es wird nur geprüft, welche Zahl
von beiden die größere ist. Diese wird mit return zurückgegeben. Und
wenn beide Zahlen gleich groß sind (das ist die logische Konsequenz,
wenn keine Zahl größer oder kleiner als die andere ist), liefert die
Funktion die Zahl Null zurück, um das anzuzeigen.
Mit return kann man auch eine Funktion beenden.
Aber all das bitte selber durchlesen.
Achim Seeger schrieb:> soweit das Beispiel aus dem Buch. Das Beispiel ist soweit klar. Was ich> nicht verstehe ist das letzte return 0. 0 wird an das Hauptprg zurück> gegeben und kann dort weiter verwendet werden. Wie kann ich festlegen,> welche Variable ich zurück gebe? Im Beispiel ist es die 0. Wie kann ich> das machen, das der berechnete Wert zurück kommt und wie sieht die> Stelle mit der Rückgabe im Hauptprg aus? retirn ist ein C befehl und> Name für eine Variable. Muss ich der 0 eine andere Variable zuweisen?
1. Du gibst keine Variable zurück, sondern eine Zahl (vom Datentyp
"int").
Wie diese Zahl in der Funktion berechnet wird, ob es eine Konstante oder
ein errechneter Wert ist, in welcher Variable sie gehalten wird usw. ist
außerhalb der Funktion nicht relevant.
2. Man kann einer 0 keine Variable zuweisen. 0 bedeutet 0 im Sinne von
0.
Stell Dir vor, Du fragst jemand, wie spät es ist.
Sagt er dann "a" oder "b"? Oder nennt er Dir eine Zahl?
Hallo Lutz
habe heute einiges gelesen und gesucht. Leider ist die Erklärung mit int
und void schlecht zu finden. Das Beispiel aus dem Buch ist
wahrscheinlich zu einfach. Es geht dabei nicht um einen Vergleich von
mehreren Zahlen, sondern z.B. um das Einlesen von PIN der als Eingang
gesetzt ist. Dort können Spannungen von ca. 2 bis 4,5V anstehen. Diese
werden als Wert ( nach einer Umrechnung ) auf einem Display angezeigt,
damit der Bereich richtig angezeigt wird. Als nächste wollte ich diesen
Wert an die Motorsteuerung weiter geben, um in abhängigkeit der Höhe
entsprechende Drehzahlen zu bekommen oder links oder rechts fahren. Wie
ich Werte in void bekomme ist bekannt. Es geht eigentlich nur um die
Rückgabe. Auch die Rückgbae eines wertes mit return (a) ist bekannt. Ich
kann den Wert in void berechnen. Wie muss aber die Stelle im
Hauptprogramm aussehen?
Noch eine Frage zu der Sache. Habe in einem anderen Prg einen Aufruf
eines Uprg mit dir = (Name Prg ) gesehen. In dem Buch c von a bis z
steht der Befehl aber nicht drin. Bei der Suche im Netz bekomme ich sehr
viele Anzeigen, aber nichts brauchbares. Habe ich da was überlesen?
achim
Achim Seeger schrieb:> habe heute einiges gelesen und gesucht. Leider ist die Erklärung mit int> und void schlecht zu finden. Das Beispiel aus dem Buch ist> wahrscheinlich zu einfach. Es geht dabei nicht um einen Vergleich von> mehreren Zahlen, sondern z.B. um das Einlesen von PIN der als Eingang> gesetzt ist. Dort können Spannungen von ca. 2 bis 4,5V anstehen. Diese> werden als Wert ( nach einer Umrechnung ) auf einem Display angezeigt,> damit der Bereich richtig angezeigt wird. Als nächste wollte ich diesen> Wert an die Motorsteuerung weiter geben, um in abhängigkeit der Höhe> entsprechende Drehzahlen zu bekommen oder links oder rechts fahren. Wie> ich Werte in void bekomme ist bekannt.
Nämlich gar nicht.
Ich seh das ähnlich wie die anderen. Du arbeitest dein Buch nicht
systematisch durch. Und sowas geht in die Hose.
> Es geht eigentlich nur um die> Rückgabe. Auch die Rückgbae eines wertes mit return (a) ist bekannt. Ich> kann den Wert in void berechnen.
Nein kannst du nicht.
Eine Funktion kann einen Wert zurückgeben.
Ein Wert hat aber einen Datentyp! Er ist entweder int oder double oder
long, oder sonst irgendwas.
Eine Funktion muss bekannt geben, welchen Datenytp der Wert hat, den sie
zurückzugeben gedenkt. Eine Funktion
int foo()
{
....
gibt einen int Wert zurück. Eine Funktion
long bar()
{
....
gibt einen long Wert zurück.
Wie dieser Wert zustandekommt, ist eine andere Sache. Der Wert steht
beim return, wobei an dieser Stelle selbstverständlich ein
arithmetischer Ausdruck erlaubt ist. Genauso wie
i = 5;
und
i = j;
oder
i = 3*j + 5;
ein Zuweisung des Wertes eines arithmetischen Ausdrucks ist, genauso
kann derselbe arithmetische Ausdruck selbstverständlich bei einem return
stehen. Und so wie der Wert der rechten Seite vom = erst mal ausgewertet
wird, ehe er dann an i zugewiesen wird, genauso wird bei einem return
erstmal der arithmetische Ausdruck ausgewertet. Daraus ergibt sich ein
(Zahlen-)Wert und dieser Wert tritt die Reise nach ausserhalb der
Funktion an.
Beim Aufrufer
i = foo();
kommt dieser Wert aus foo an und wird (genau wie sonst auch) als Wert
eines Ausdrucks aufgefasst, der ausgewertet wird und dessen Ergebnis an
i zugewiesen wird.
int a = 5;
int foo()
{
return 8*a;
}
int main()
{
i = 2 * foo()
}
Was passiert?
Die Funktion foo wird aufgerufen. Im return wird der Ausdruck 8*a
berechnet und da a den Wert 5 hat, tritt der Wert 40 als int den Rückweg
zum Aufrufer an.
Der Aufrufer verwendet die 40 um damit den Ausdruck
2 * foo()
zu berechnen, welcher 80 ergibt (weil foo ja die 40 geliefert hat), und
damit wird 80 an i zugewiesen.
Das 'void' an dieser Stelle
void foobar()
{
...
bedeutet nichts anderes als: Diese Funktion liefert KEINEN Wert. Damit
ist automatisch klar,
* dass beim return kein arithmetischer Ausdruck stehen kann. Denn wie
kann eine Funktion mittels
return 3*a;
versuchen einen Wert zurückzugeben, wenn gleichzeitig die Funktions-
signatur
void foobar()
{
...
aussagt, dass eben kein Wert zurückgegeben wird
* der Returnwert beim Aufrufer nicht in einem Ausdruck benutzt werden.
Denn wenn foobar() nichts liefert, dann kann ein
i = 2 * foobar();
auch keinen Wert ergeben.
void bedeutet 'Nichts'. Und genau so verhält es sich auch: Da gibt es
nichts Sinnvolles, kein Wert, nichts mit dem man was rechnen könnte.
Karl Heinz Buchegger schrieb:> Achim Seeger schrieb:>>> damit der Bereich richtig angezeigt wird. Als nächste wollte ich diesen>> Wert an die Motorsteuerung weiter geben, um in abhängigkeit der Höhe>> entsprechende Drehzahlen zu bekommen oder links oder rechts fahren. Wie>> ich Werte in void bekomme ist bekannt.>> Nämlich gar nicht.>> Ich seh das ähnlich wie die anderen. Du arbeitest dein Buch nicht> systematisch durch. Und sowas geht in die Hose.
Bitte akzeptiere, dass die Sprache C, so wie die meisten
Programmiersprachen, ein System ist. Auch wenn es manchmal nicht so
aussieht, aber es ist tatsächlich so, dass die Dinge, die einzelnen
Konzepte ineinandergreifen!
Es ist NICHT sinnvoll, in einem Lehrbuch spätere Kapitel zu studieren
ohne die vorhergehenden durchgearbeitet zu haben. Denn dir fehlen
unweigerlich Konzepte und Systematiken, ohne deren Verständnis du das
dich interessierende Kapitel nicht verstehen kannst.
Ein Lehrbuch einer Programmiersprache MUSS man von vorne her Kapitel für
Kapitel durcharbeiten! Lesen alleine reicht auch nicht. Durcharbeiten!
Dazu gehört auch die Übungen zu machen. Und zwar so lange, bis die
jeweiligen Inhalte des jeweiligen Kapitels so einigermassen sitzen.
Alles andere ist sinnlos!
Erst dann, wenn man die erste Programmiersprache beherrscht, kann man
dazu übergehen, die Anfangskapitel nur kurz zu überschlagen (denn viele
Sprachen benutzen ähnlich Konzepte, die man dann schon kennt) um sich zu
vergewissern, dass man diese schon kennt. Aber selbst da empfiehlt es
sich, zumindest im Schnelldurchlauf durch die vorhergehenden Kapitel
drüberzulesen um zu sehen, ob es irgendwo Abweichungen zu bereits
bekanntem gibt.
Karl Heinz Buchegger schrieb:> Ein Lehrbuch einer Programmiersprache MUSS man von vorne her Kapitel für> Kapitel durcharbeiten!
Ach Karl Heinz du Don Quichotte.
Eines muss ich Karl Heinz, voller Freude, zugestehen.
Selbst dein Ärger über das nicht gelesene in den Büchern, bringt mehr
Wissen als eine Woche lesen.
Daher, vielen Dank für deinen konstruktiven Zorn und deine erläuterne
Zurechtweisung.
achim
Lutz schrieb:>> Dein "Beispiel" prg_versuch aber hat als Typ des Rückgabewert void,>> was bedeutet, daß eben nichts zurückgegeben wird.>> Obacht, die Funktion hat keinen Rückgabewert und sollte daher> automatisch implizit int als Rückgabewert haben.
Ich bezog mich hierauf:
> Im Unterprg void prg_versuch(int8_t x, int8_t y, int8_t wert1).
Achim Seeger schrieb:> Eines muss ich Karl Heinz, voller Freude, zugestehen.> Selbst dein Ärger über das nicht gelesene in den Büchern, bringt mehr> Wissen als eine Woche lesen.
Der springende Punkt ist, dass das nur die Ultrakurzform war. Ich hab da
Vieles ausgelassen bzw. gar nicht angesprochen.
Hallo Karl Heinz
egal ob kurz oder lang. Es hat gesessen und viel geholfen. Mach dein
Wissen nicht zu klein. Allein durch das lesen der vielen stillen
Besucher wird es vermittelt. Auch in deinem Kampf gegen die Windmühlen
(delay) hast du mir schon sehr geholfen. Ich gebe die Hoffnung nicht
auf, in meinem Wissen weiter zu kommen.
Danke
(Wen du willst kannst du ja noch zur Klarheit beitragen)
achim
Achim Seeger schrieb:> Hallo Karl Heinz> egal ob kurz oder lang. Es hat gesessen und viel geholfen.
Der Teil vom Argument-Passing war noch nichts im Vergleich zum Thema:
Wie kommen Werte in eine Funktion hinein?
Genau daher ist es wichtig, in einem C-Buch zumindest, ich würde mal
sagen, das erste Drittel durchzuackern. Alles was in diesem ersten
Drittel steht ist selbst auf einem µC absolut notwendige
Mindestausrüstung in deinem Repertoir.
Auf den µC, auf denen wir uns hier bewegen sind dann die Abschnitte
"Fileverarbeitung" bzw. "dynamische Speicherallokierung", die den
Löwenanteil des Restes ausmachen, erst mal nicht so wichtig. Aber alles
davor ist unumgänglich.
Hallo Achim,
es könnte hilfreich sein, Deine C-Übungen mit einem Compiler für den PC
zu machen, anstatt auf einem Microcontroller. Da kann man viel einfach
Debuggen und sich Zwischenergebnisse anzeigen lassen (mit printf).
Und halte Dich erstmal von C++ fern.
Rufus Τ. Firefly schrieb:> Lutz schrieb:>>> Dein "Beispiel" prg_versuch aber hat als Typ des Rückgabewert void,>>> was bedeutet, daß eben nichts zurückgegeben wird.>>>> Obacht, die Funktion hat keinen Rückgabewert und sollte daher>> automatisch implizit int als Rückgabewert haben.>> Ich bezog mich hierauf:>>> Im Unterprg void prg_versuch(int8_t x, int8_t y, int8_t wert1).
Da hatte ich wohl keine Obacht walten lassen...
Zum Glück stimmt aber alles andere.
Hallo Pako
wie kommst du auf C++? Arbeite doch mit C.
Das mit void/return ist klar. Werde es für mich noch im Prg
nachvollziehen bzw. habe es schon teilweise gemacht, indem ich das Prg
soweit abändere, das kein Rückgabewert gebraucht wird.
Muss aber noch was anderes fragen.
Gibt es einen anderen Weg, um auf das gleiche zu kommen mit Rückgabe?
achim
Achim Seeger schrieb:> Gibt es einen anderen Weg, um auf das gleiche zu kommen mit Rückgabe?
Exakt identisch: Nein
Ein Rückgabewert beinhaltet ja 2 Dinge:
* zum einen kommt ein Wert aus einer Funktion heraus
* zum anderen ist dieser Funktionswert etwas, was als
arithmetischer Ausdruck gilt. D.h. man kann mit ihm
beim Aufrufer in Ausdrücken weiterarbeiten
Einen Wert aus einer Funktion herauszubekommen schafft man auch mit
anderen Methoden. Aber in dieser Kombination der beiden Eigenschaften,
gibt es für einen Returnwert keinen Ersatz. Wozu auch? Ein Weg genügt.
Eine Programmiersprache muss in ihren Möglichkeiten nicht redundant
sein.
Je mehr ich dieses Gallileo Buch studiere und querlese, desto weniger
begeistert bin ich davon. Das ist alles sehr, sehr kurz beschrieben.
Als Nachschlagewerk ist es IMHO ok. Aber als Lehrbuch zum Selbststudium
würde ich das momentan mit dem was ich in den letzten 10 Minuten da drin
geschmökert habe, nicht mehr empfehlen.
Es stimmt zwar, dass es DAS ideale Lehrbuch nicht gibt und es ist auch
richtig, dass ich den K&R 2.te Auflage nicht kenne (sondern nur die 1.te
und auch das ist schon lange her), aber in meiner Erinnerung war selbst
die 1.te Auflage (die noch K&R C besprach und nicht ANSI-C) in der engl.
Originalversion um Längen besser.
zb hätte er sich das Kapitel "MySQL und C" besser in die Haare
geschmiert und dafür ein eigenes großes Kapitel über Stringverarbeitung
mit aufgenommen.
Hallo Karl Heinz
deine Meinung erstaunt mich doch sehr. Hatte bisher immer recht grosses
Vetrauen in das Buch. Sagen wir mal so, bis ich über das letzte Problem
relativ wenig gefunden habe. Leider kommt das Thema auch auf anderen
Seiten und Artikeln sehr kurz weg. Daher kommen auch meine Fragen
zustande. Wo nichts steht kann ich nicht nachlesen. Habe ein bisschen im
Netz gefunden und bin beim lesen.
Dann müssen wir die Empfehlung mit C Buch in Zukunft differenzierter
sehen oder wir suchen ein anderes oder wir zapfen dein Wissen verstärkt
an. Was gefällt dir am besten?
achim
Achim Seeger schrieb:> Hallo Karl Heinz> deine Meinung erstaunt mich doch sehr. Hatte bisher immer recht grosses> Vetrauen in das Buch. Sagen wir mal so, bis ich über das letzte Problem> relativ wenig gefunden habe.
Und genau da kommen wir auf des Pudels Kern.
Die Probleme in diesem Thread dürften mit einem Buch überhaupt keine
Probleme sein. Zumindest nicht auf diesem Niveau. Das es ab und an mal
Detailprobleme gibt ... geschenkt. Aber mit dem, was in diesem Buch
alles nicht erzählt wird, füllen andere ganze Bücherregale.
Karl Heinz Buchegger schrieb:> Je mehr ich dieses Gallileo Buch studiere und querlese, desto weniger> begeistert bin ich davon. Das ist alles sehr, sehr kurz beschrieben
Ich finde den Link leider nicht mehr. Allerdings wurde in einem C++
Forum mal näher erläutert, dass das online Buch von J.W. nicht
empfehlenswert ist, weil es schlichtweg viele Fehler beinhaltet.
Fazit:
Finger weg vom Buch.
Ich als Laie kann darüber kein Urteil bilden und zum Wahrheitsgehalt der
o.g. Aussage nichts zu beitragen.
al3ko schrieb:> Karl Heinz Buchegger schrieb:>> Je mehr ich dieses Gallileo Buch studiere und querlese, desto weniger>> begeistert bin ich davon. Das ist alles sehr, sehr kurz beschrieben>> Ich finde den Link leider nicht mehr. Allerdings wurde in einem C++> Forum mal näher erläutert, dass das online Buch von J.W. nicht> empfehlenswert ist, weil es schlichtweg viele Fehler beinhaltet.
OK. Nach Fehlern hab ich jetzt nicht gesucht.
Das ist zb das, was im Buch über Returnwerte gesagt wird
http://openbook.galileocomputing.de/c_von_a_bis_z/009_c_funktionen_015.htm#mj1ee1b27a557aba80141324548a5e2b65
Ja, irgendwie ist schon das Wichtigste vorhanden. Aber irgendwie wird es
meiner Meinung nach nicht richtig angesprochen. Wenn man weiß, wonach
man suchen muss, fällt einem schon so einiges an dem bischen Text und an
den Codebeispielen auf. Aber wenn ich das alles schon weiß, brauch ich
das Buch nicht. Ein Anfänger muss auf gewisse Dinge explizit aufmerksam
gemacht werden. Und das fehlt mir.
Betrachtet das Kapitel mit den Augen eines Anfängers, nicht aus der
Sicht desjenigen, der das alles schon kennt.
1
Zunächst benötigen Sie eine Funktionsdefinition mit einem Rückgabewert.
2
Als Rückgabewert können Sie jeden beliebigen Datentyp verwenden, zum
3
Beispiel:
4
5
int bignum(int a, int b) {
6
if(a > b)
7
return a;
8
else if(a < b)
9
return b;
10
else
11
return 0; /* Beide Zahlen gleich groß. */
12
}
Soweit so gut.
1
Sie erkennen an dieser Funktion durch das Voranstellen des Datentyps
Huch! Wo wird da was vorangestellt? Was soll "Einer Funktion wird ein
Datentyp vorangestellt" bedeuten. Wo findet sich das im Code? Die Zeile
vor der Funktion ist eine Leerzeile. Wo ist da etwas vorangestellt
worden?
1
, dass hier der Rückgabewert ein Integer ist. Und in der Funktion selbst wird mit der Anweisung
2
3
return WERT;
4
ein Wert an die aufrufende Funktion zurückgeliefert.
return WERT; ??????
Wieso auf einmal WERT. Im ganzen Codebeispiel kommt kein Variable WERT
vor!
1
int big;
2
...
3
big = bignum(wert1, wert2);
4
5
Damit wird der Variablen big, die zwingend vom Datentyp int sein muss
Quatsch. Der Rückgabewert einer Funktion ist ein Wert wie jeder andere,
den man selbstverständlich als Teil eines Ausdrucks verwenden kann. Was
er da letztendes fordert ist, dass
int i;
i = 5.0;
ungültig ist.
Ein vorhergehendes ordentliches Kapitel über Expressions und Datentypen,
über Datatyp-Conversions und Casts und der Leser hätte mehr davon.
Und so zieht sich das den ganzen Abschnitt hin. Ich hab mir auch andere
'Kapitel' angesehen. Ist im Wesentlichen das gleiche.
Nicht falsch verstehen. Natürlich ist mir klar, was der Autor sagen will
und wie das zusammen hängt. Aber das ist MIR klar. Ein Anfänger hat
davon noch nie etwas gehört.