C++] Strukturen
-
Hey Leute,
ich bin gerade dabei in nem Selbststudium mir die Sprache C++ beizubringen und acker gerade nen Buch durch wo ich ein paar faregn zu den Codezeilen habe, die leider nicht so gut erklärt werden bis garnicht.
Ich hoffe ihr könnt mir da bisschen aushhelfen!Fangen wir mit paar einzelheiten an:
Das & Zeichen kann die Adresse aufm Speicher einer Variable zurückgeben ode als Alias Name dienen, jenachdem was davor steht, richtig?Desweiteren hier mal etwas Code:
struct astruct { int iwert; float fwert; }; [b]void print(const strut astruct *p);[/b] int main(void) { struct astruct atest; ...... [b]print(&atest)[/b] } [b]void print ( const struct astruct * p ) [/b] { ...... }Ich habe jetzt zu den 3 fettgedruckten Dingen mal Fragen:
Was genau bewirkt Zeile 7?
void bedeutet ja dass es kein Rückgabewert gibt, was print macht ist mir schleierhaft, kanns mir aber denken. Auf die Struktur astruct wird nen zeiger p initalisiert, oder?
Aber wofür soll das gut sein?
Ich verstehe davon den Sinn nicht!Zeile 13 frage ich mich wieso Print mit dem & Zeichen benutzt wird, also in diesem Fall wird atest ja als Alias Name benutzt, oder?
Aber wieso?Zeile 16:
Wieso wird da p wieder als Zeiger dekladiert auf astruct?
Müsste das niht auf atest sein?
Und wieso wird überhaupt ein Zeiger Dekladiert wenn er zur Ausgabe nicht gebraucht wird?Hoffe ihr könnt mir helfen!
Liebe Grüße
-
Bist du dir ganz sicher, daß du da wirklich C++ lernst? Der Code sieht eher nach C aus.
Zeile 7 ist eine Funktionsdeklaration für die Funktion print() - diese nimmt einen Zeiger (Adresse) auf deine Struktur (genannt p) und gibt keinen Wert zurück.
Zeiel 13 ruft diese Funktion auf - dazu bildet sie die Adresse der lokal definierten Variablen atest (mit dem Adress-Operator &) und gibt sie als Parameter weiter.
Ab Zeile 16 beginnt die Definition der Funktion - und weil ein Parameter einen Namen benötigt, um ihn ansprechen zu können, wurde dieser ein p genannt.
-
Das Selbststudium kann ich nur loben, aber von Jürgen Wolf kann man nur warnen: siehe hier
-
Also laut dm Buch ist es C++, wenn es C ist, fühle ich mich verarscht

Aber danke nochmals, das hat mir jetzt echt weitergeholfen, das print erst als eine funktion dekladiert wurde, habe ich nicht gesehen bzw. gemerkt

Dickes Danke nochmal ^^
Thema kann geclosed werden!
-
Zum Buch, naja kann dazu nicht viel sagen, werde mir aber sowieso nochmal ein anderes holen

-
Dieser Thread wurde von Moderator/in rüdiger aus dem Forum Rund um die Programmierung in das Forum C++ (auch C++0x) verschoben.
Im Zweifelsfall bitte auch folgende Hinweise beachten:
C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?Dieses Posting wurde automatisch erzeugt.
-
Das ist Code aus dem Buch "C++ von A bis Z", ich kenn den Code nur zu gut!
Es gibt da einen Post über die Bücher von Jürgen Wolf, den find ich aber gerade nicht.
Wichtig ist, dass du aufhörst damit "C++" zu lernen. Das Buch ist ganz doof. Da lernst du kein C++, sondern "C mit Klassen".
Hol dir was besseres, hier eine Auswahl:Empfehlen kann ich Der C++ Programmierer von Ulrich Breymann, DAS ist modernes C++.
-
Incocnito schrieb:
Das ist Code aus dem Buch "C++ von A bis Z", ich kenn den Code nur zu gut!
Es gibt da einen Post über die Bücher von Jürgen Wolf, den find ich aber gerade nicht.
Wichtig ist, dass du aufhörst damit "C++" zu lernen. Das Buch ist ganz doof. Da lernst du kein C++, sondern "C mit Klassen".
Hol dir was besseres, hier eine Auswahl:Empfehlen kann ich Der C++ Programmierer von Ulrich Breymann, DAS ist modernes C++.
Im Moment ist glaub gerade wieder mal so eine WOLF-Phase im Gange

Gab schon einige Threads in den letzten Wochen, die wir dem lieben Herrn Wolf zu verdanken haben
Lg freeG
-
Ich werd dem guten Herr Wolf mal ne Mail schreiben, wer ist dafür?
EDIT: Ich werde diese an "judith.stevens@galileo-press.de" senden (steht dort mit "Für Fragen und Anmerkungen zum Inhalt des Buches").
Ich werde mal auf diesen langen Thread da verweisen und nachdrücklich anhand von Beispielen erläutern, wieso das Buch korrekterweise in "C/C++ von A bis Z" umbenannt werden müsste. Oder was schlagt ihr vor soll ich ihm sagen?
-
Incocnito schrieb:
Ich werd dem guten Herr Wolf mal ne Mail schreiben, wer ist dafür?
Ich.
-
Incocnito schrieb:
Oder was schlagt ihr vor soll ich ihm sagen?
Also ich bin für "C++ von Klassen bis C"

-
Ich hab jetzt mal eine kleine eMail abgesendet - mal sehen, wie sie reagieren..
-
Incocnito schrieb:
Ich hab jetzt mal eine kleine eMail abgesendet - mal sehen, wie sie reagieren..
Kannst du sie auch noch an mich schicken? Mich nimmt es echt Wunder.
-
Oder Titel: Schlechter Stil und Fehler in C/C++ rechtfertigend kommentiert.
-
Eisflamme schrieb:
Oder Titel: Schlechter Stil und Fehler in C/C++ rechtfertigend kommentiert.

-
Ja ich hab da einen 2 Seiten Beschwerdebrief hingeschickt.
Ihr könnt euch da ja auch mal melden. Euch stört dass, dann ändert es.
Eine Mail kann ignoriert werden - 5 hingegen schwer. Ih rmüsst ja nicht unglaublich viel schreiben, sagt einfach, was euch stört. Schaden kann es ja nicht..Und wenn jemand fragen zum Buch hat, ich hab hier ein Exemplar liegen.
So sieht mein Beschwerdebrief aus, er muss ja nicht unbedingt formell sein, wir schreiben ja an eine Privatperson und an keine Firma:
-
Incocnito schrieb:
Ja ich hab da einen 2 Seiten Beschwerdebrief hingeschickt
Und was bringt das? Vom Markt wird das Buch wohl kaum gehen. Das beste was passieren kann, ist, dass er das Buch überarbeitet und wenn er tatsächlich keine Ahnung von C++ hat, wie ihm ja von einigen unterstellt wird, bringt das rein gar nichts.
Ich denke sinnvoller ist es, ganz spezifisch auf einzelne Codebeispiele eingehen und versuchen, Schadensbegrenzung zu betreiben.
Jürgen Wolf schrieb:
struct astruct { int iwert; float fwert; };Ungarische Notation ist in C++ verpönt ...
Jürgen Wolf schrieb:
int main(void)... genauso verpönt wie das void in der Parameterliste.
Jürgen Wolf schrieb:
struct astruct atest;Das ist etwas, was mich aufregt. In C++ schreibt niemand und wirklich gar niemand
structvor Strukturen. Das wird allein wegen der C-Kompatibilität vom Compiler gebilligt. Hier wird ein Anklagepunkt von Incocnito klar: C mit Klassen.Jürgen Wolf schrieb:
void print ( const struct astruct * p )Igitt Zeiger. Das ist genau der Anwendungsfall, für den Referenzen eingeführt wurden. Hier
solltemuss man Referenzen benutzen.
Aber ich tue dem Autor Unrecht. Er sagt doch:Jürgen Wolf schrieb:
Natürlich lässt sich das auch mit den Referenzen nachbilden.
Allerdings muss man dann wieder mit dem Punktoperator auf die einzelnen Elemente zugreifen, und der Funktionsaufruf erfolgt ohne den Adressoperator:Von einer Wertung sehe ich da nichts. Und genau die müsste hier erfolgen um einem Anfänger die folgende Funktion anzugewöhnen:
Jürgen Wolf schrieb:
void print ( const struct astruct& p ) {Diese Funktionsdeklaration gehört ins ABC von jedem C++-Programmierer und nicht die Variante mit den Pointern.
Aber J.W. hat etwas gegen Referenzen:
Jürgen Wolf schrieb:
Eine Referenz in C++ ist nichts anderes als ein anderer Name (Alias-Name) für ein Speicherobjekt.
Im ganzen Abschnitt über Referenzen fragt man sich, was diese denn eigentlich sollen. Und in der Tat: innerhalb einer Funktion nutzen sie wirklich nichts. Man verwendet sie als Parameter von Funktionen. Als syntaktisch schönere Alternative zu konstanten Pointern. Und meistens anstelle von konstanten Pointern auf konstanten Speicher.
Der Abschnitt über die Referenzen sollte unbedingt ausgebaut werden und mit einem realistischen Beispiel.
-
Ich fande es auch lustig, dass er immer wieder sagt, dass alte Zeiger im C-Style da nicht hingehören, veraltet und unsicher sind. Trotzdem benutzt er sie das ganze Buch über - was soll das?
Er widerspricht sich selbst andauernd. Und alles mit dem Argument:Jürgen Wolf: C++ von A bis Z, Kapitel 2. C-Strings, S. 164 schrieb:
Ihnen ist sicher aufgefallen, dass die Verwendung von C-Strings recht umständlich ist, und häufig kann eine falsche Verwendung zu gefährlichem Code, wie zum Beispiel Pufferüberläufeb (Buffer Overflow), führen. [...]
Leider hat die Vergangenheit gezeigt, dass sich viele Programmierer einfach nicht an diese Regeln gehalten haben, so dass heute kein Tag vergeht, an dem nicht wiede reine Sicherheitslücke in einem programm gefunden und gegebenenfalss ausgenutzt wurde. [...]
Und aus dem Grund, dass die C-Strings recht umständlich zu bedienen sind und der Sicherheitsaspekt häufig vernachlässigt worden ist, wurde in C++ die
string-Klasse eingeführt, die erheblich einfacher zu verwenden ist, mehr Funktionalität bietet und vor allem erheblich sicherer ist. Aber wie bereits erwähnt - da es noch viele Zeilen C-Code gibt, müssen Sie sich als ernsthafter C++-programmierer auch mit C-STrings befassen. Und wenn die Ausführgeschwindigkeit auch noch von Bedeutung ist (aber nur dann), sind die C-Strings immer noch wesentlich effizienter. [...]Die Klasse string wird dann auf Seite 695 beschrieben, davor wird immer const char* verwendet.. Aha.

Er sagt ja auch, dass sich ein C++-programmierer häufig mit altem C-Code rumprügeln muss. Ich kann das bis jetzt nicht bestätigen (außer wenn sich hier Leute melden, die aus einem völlig veraltetem Buch [C++ von A bis Z :D] oder einem alten Kurs C++ lernen) - was sagt ihr dazu?
-
Na ja, WinAPI, OpenGL und diverse Bibliotheken arbeiten noch mit C-Strings. Im alten Standard muss man für fstream auch die Strings zu C-Strings machen... Die begegnen einem schon überall und immer wieder. Und es ist wichtig, dass man den internen Aufbau versteht. Ich würde die Dinger schon erklären und lehren, aber halt nicht bis zum Erbrechen.
Cool fände ich in C++ aber den Ansatz Strings vor Arrays zu erklären und bei der Erklärung von Arrays dabei langsam wieder string zu erklären (so ist ein string eigentlich auch nur eine Verkettung von chars). Und dann: Was, wenn wir nicht nur Zeichen verketten wollen, sondern ganz andere Objekte? Und dann kommt der Sprung zu den Containern.
Hm, ich hätte Lust ein C++-Tut zu schreiben.

-
Eisflamme schrieb:
Ich würde die Dinger schon erklären und lehren, aber halt nicht bis zum Erbrechen.
..und nicht gleich zu Beginn. Ich würde erst erklären wie man sie benutzt, dann erklären, wie sie denn funktionieren. Vorher sollte man auf std::vector und co eingehen, finde ich.
-
Durch zitierst den letzten Satz meines ersten Absatzes, um einen Teil meines zweiten umzuformulieren? :p SCNR