Forum: Mikrocontroller und Digitale Elektronik Übergabe Parameter in Unterprogrammen


von Achim S. (achims)


Lesenswert?

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
return Wert1
8
}
9
10
void_prg2(wert1)
11
{
12
anweisungen
13
Berechnung Wert1
14
return Wert2
15
}
16
17
int main()
18
{ 
19
.....
20
prg1()
21
22
prg2(Wert1)
23
24
Anzeige des berechneten Wertes 2
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

von Manax (Gast)


Lesenswert?

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

von al3ko (Gast)


Lesenswert?

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.

von Lutz (Gast)


Lesenswert?

Diese Hilfe hat so keinen Sinn, da die absoluten Grundlagen fehlen. Also 
wie immer: C-Buch nehmen und am PC lernen. Aushilfsweise auch sowas:
http://openbook.galileocomputing.de/c_von_a_bis_z/

von Achim S. (achims)


Lesenswert?

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

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

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.

von Achim S. (achims)


Lesenswert?

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
.. int bignum(int a, int b){
2
if(a>b)
3
   return a:
4
else if(a<b)
5
   return b:
6
else 
7
   return 0:
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

von Vn N. (wefwef_s)


Lesenswert?

Wie wäre es, wenn du C lernst, anstatt irgdwelche Codefetzen 
zusammenzusetzen?

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

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.

von ... (Gast)


Lesenswert?

Im Gegensatz zu div. Basicdialekten benötigt man in C Typdeklarationen 
für Variablen und Funktionen.

von Lutz (Gast)


Lesenswert?

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.

von Pako (Gast)


Lesenswert?

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?

von Programmierer (Gast)


Lesenswert?

Du suchst nach C Funktionen und Rückgabewerten. Schau dir dazu auch 
Prototypen und Implementationen einfacher Funktionen an.

von Achim S. (achims)


Lesenswert?

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

von Karl H. (kbuchegg)


Lesenswert?

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.

von Karl H. (kbuchegg)


Lesenswert?

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.

von Kan a. (Firma: Basta) (kanasta)


Lesenswert?

Karl Heinz Buchegger schrieb:
> Ein Lehrbuch einer Programmiersprache MUSS man von vorne her Kapitel für
> Kapitel durcharbeiten!

Ach Karl Heinz du Don Quichotte.

von Achim S. (achims)


Lesenswert?

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

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

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).

von Karl H. (kbuchegg)


Lesenswert?

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.

von PIC (Gast)


Lesenswert?

Um Gottes Willen... Lies bitte ein Buch!

von Achim S. (achims)


Lesenswert?

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

von Karl H. (kbuchegg)


Lesenswert?

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.

von Pako (Gast)


Lesenswert?

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.

von Lutz (Gast)


Lesenswert?

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.

von Achim S. (achims)


Lesenswert?

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

von Karl H. (kbuchegg)


Lesenswert?

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.

von Karl H. (kbuchegg)


Lesenswert?

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.

von Achim S. (achims)


Lesenswert?

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

von Karl H. (kbuchegg)


Lesenswert?

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.

von al3ko (Gast)


Lesenswert?

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.

von Karl H. (kbuchegg)


Lesenswert?

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.

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.