Gültigkeitsbereich



  • Was ist ein gutes C++ BUch?

    Ich habe mit C angefangen
    C von A bis Z von Jürgen Wolf.
    und bin jetzt mit
    C++ von A bis Z von Jürgen Wolf

    Im Prinzip bin ich zufrieden weil er entsprechend dem neuen C/C++ Standard schreibt. Könnte zwar besser sein aber man muss es erstmal selber besser machen können 🙂

    Ich bin für Empfehlungen offen.


  • Administrator

    darkfate schrieb:

    Was ist ein gutes C++ BUch?

    Jedenfalls nicht C++ von A bis Z. 🙂
    Hier hast du eine Liste:
    http://www.c-plusplus.net/forum/viewtopic-var-t-is-251551.html

    Ansonsten hatten wir gerade erst ein Thema zu C zu C++ Umsteiger:
    http://www.c-plusplus.net/forum/viewtopic-var-t-is-265356.html

    Grüssli



  • Dravere schrieb:

    darkfate schrieb:

    Was ist ein gutes C++ BUch?

    Jedenfalls nicht C++ von A bis Z. 🙂
    Hier hast du eine Liste:
    http://www.c-plusplus.net/forum/viewtopic-var-t-is-251551.html

    Ansonsten hatten wir gerade erst ein Thema zu C zu C++ Umsteiger:
    http://www.c-plusplus.net/forum/viewtopic-var-t-is-265356.html

    Grüssli

    Ich weiß nicht was ich von Büchern halten soll die teilweise 1992 veröffentlicht wurden. In der Liste ist nur ein einziges Buch, dass von 2009 ist. Von so etwas würde ich jedem grundsätzlich abraten. Ich würde die untere Grenze bei 2006 ziehen. Danach ist einfach zu viel in der Compilerwelt und in der Rechnerarchitektur passiert.

    Damit verwirrt man doch jeden Einsteiger. Es wird weder auf die C99 C-0x Standards eingegangen, noch auf parallele Programmierung oder QT,wXwidgets.

    Gerade diese Dinge machen heute eine gute Anwendung und den Sinn von C++ aus.



  • darkfate schrieb:

    Im Prinzip bin ich zufrieden weil er entsprechend dem neuen C/C++ Standard schreibt.

    Es gibt keine Sprache C/C++, wie oft muss das den noch gesagt werden. Und auch wenn C++ viele C-Konstrukte zulässt, ist C++ dennoch nicht 100%ig zu C kompatibel.

    darkfate schrieb:

    Ich weiß nicht was ich von Büchern halten soll die teilweise 1992 veröffentlicht wurden. In der Liste ist nur ein einziges Buch, dass von 2009 ist.

    Die erste Liste ist durchaus INHALTLICH aktuell (zumindest was Mitleid geschrieben hat, habe ich gerade mal überflogen), man sollte aber (wenn vorhanden) auf aktuelle Auflagen zugreifen.

    darkfate schrieb:

    Ich würde die untere Grenze bei 2006 ziehen. Danach ist einfach zu viel in der Compilerwelt und in der Rechnerarchitektur passiert.

    Der aktuelle C++ Standard ist von 1998, der kommende Standard ist noch nicht fertig (wenn auch kurz vor der Fertigstellung) und Bücher dafür sollten wohl erst um 2011 herum erscheinen (Bis die Compilerhersteller den Standard umsetzen wird dann noch ein wenig dauern).

    Wichtig ist weniger das Erscheinungsdatum, sondern die "Aktualität" des Autors (es gibt noch immer viele aktuelle C++ Bücher, die nicht mal dem C++98 Standard entsprechen).

    darkfate schrieb:

    Damit verwirrt man doch jeden Einsteiger. Es wird weder auf die C99 C-0x Standards eingegangen,...

    C99 ist NICHT Bestandteil von C++, gehört also auch nicht in C++ Lektüre.

    darkfate schrieb:

    ...noch auf parallele Programmierung oder QT,wXwidgets.

    Was allesamt nicht zum Standard gehört, sondern Bibliotheksabhängig ist. Ein Buch das auf die Umsetzung der Threadbibliothek des kommenden Standards eingeht ist C++ Concurrency in Action das aber noch nicht erschienen, und nur als Vorabversion verfügbar ist. Wenn man nahe am kommenden Standard sein möchte was Threading & Co angeht, sollte man sich die Boost-Bibliotehk (und ggf. die Internetseite Die Boost C++ Bibliotheken (Onlinebuch) anschauen).

    UI ist erst dann sinnvoll wenn man die C++ Grundlagen beherrscht, und dann muss man sich erst einmal überlegen WELCHE Bibliothek für seine Aufgaben die sinnvollste ist, da es keine Standardbibliothek hierfür gibt.

    darkfate schrieb:

    Gerade diese Dinge machen heute eine gute Anwendung und den Sinn von C++ aus.

    Aber erfordern zumindest ein Grundlagenwissen von C++. Und was UI Bibliotheken angeht, gibt es hier eigene Unterforen (schon alleine weil sie eben nicht Bestandteil von Standard C++ sind).



  • darkfate schrieb:

    Ich weiß nicht was ich von Büchern halten soll die teilweise 1992 veröffentlicht wurden. In der Liste ist nur ein einziges Buch, dass von 2009 ist. Von so etwas würde ich jedem grundsätzlich abraten. Ich würde die untere Grenze bei 2006 ziehen. Danach ist einfach zu viel in der Compilerwelt und in der Rechnerarchitektur passiert.

    Ironischerweise vermittelt dein aktuell verwendetes, modernes Buch offenbar ein Wissen über C++, das schon 1992 als rückständig gegolten hätte.

    Damit verwirrt man doch jeden Einsteiger. Es wird weder auf die C99 C-0x Standards eingegangen, noch auf parallele Programmierung oder QT,wXwidgets.

    Außer C++0x (falls du das mit C-0x gemeint hast) hat das alles nichts mit C++ zu tun und nichts in einem C++-Lehrbuch zu suchen.


  • Administrator

    @darkfate,
    Es zeigt sich, dass du keine Ahnung hast:
    1. Der letzte vollständige C++ Standard stammt aus dem Jahr 1998.
    2. Es gibt Dinge, welche sich auch in den letzten 20 Jahren nicht geändert haben, wobei man natürlich genau wissen muss, was es ist. So kann auch noch ein etwas älteres Buch sehr aktuell und gut sein.
    3. C gehört in kein C++ Buch rein. Jedes Buch, welches C und C++ lernt kann man grundsätzlich gleich in die Tonne schmeissen. C99 hat schon gar nichts im aktuellen C++ zu suchen.
    4. Bevor man mit QT oder wxWidgets anfängt, sollte man zuerst GRÜNDLICH C++ auf der Konsole lernen. Die Empfehlungen variieren, aber befinden sich im Bereich von 6 bis 12 Monate.
    5. C++ wird bei weitem nicht nur für GUI-Programmierung verwendet.
    6. Parallele Programmierung ist ein Thema für sich, über welches man ein eigenes Buch schreiben kann.
    7. Sinnvolle Bücher über den nächsten Standard gibt es noch nicht. Wie auch? Das Ding ist ja noch nicht mal verabschiedet.

    C++ ist eine sehr komplexe und schwere Sprache. Man sollte sehr behutsam an diese Sprache herangehen. Zuviel auf einmal verwirrt den Anfänger nur oder führt dazu, dass er ein schreckliches C++ schreibt. Zum Beispiel übernimmt er dann das schreckliche C++ von wxWidgets, welches völlig veraltet ist.

    Grüssli



  • Einverstanden.. Vielleicht setze ich mich zu stark auf das vorangegangene C Buch. Ich möchte meine Beratungsresistenz ablegen und gelobe Besserung.

    Könnte mir jetzt einer mal sagen warum:

    void readtoarray(FILE *fp, unsigned int &n);
    
    int main(int argc, char **argv){
    	...
    	double ***C;
    	FILE *fp;
    
    	readtoarray(fp,&C,n);
    
    	cout << C[0][0] << C[0][1] << endl;
    
    	// free Coordinate Array **C
    	for(unsigned int i=0;i<n;i++) delete C[i];
    	delete [] C;
    	...
    }
    
    void readtoarray(FILE *fp,double ***C,unsigned int &n){
    
    	...
    	C = new double*[n];
    	for(unsigned int i=0;i<n;i++) C[i] = new double[2];
    	...
    }
    

    Irgendwie kriege ich es selber nicht gebacken und möchte eigentlich vorankommen anstatt mich stundenlang damit zu beschäftigen.



  • Dravere schrieb:

    C++ ist eine sehr komplexe und schwere Sprache. Man sollte sehr behutsam an diese Sprache herangehen. Zuviel auf einmal verwirrt den Anfänger nur oder führt dazu, dass er ein schreckliches C++ schreibt. Zum Beispiel übernimmt er dann das schreckliche C++ von wxWidgets, welches völlig veraltet ist.

    Grüssli

    Hoppla. Wäre dir dankbar wenn du mir das mal näher erläuterst. Ich bin gerade frisch in ein ebenfalls frisches C/C++ Projekt basierend wxWidgets hineingeworfen worden. Habe gerade mal grundlegende Erfahrungen in C sammeln können und kann dazu noch kein Urteil abgeben. Warum soll wxWidgets so schrecklich sein? Was nimmt man stattdessen lieber? Ich benötige OpenGL Beschleunigung.

    Eigenartigerweise sind beide Bücher von Wolf für C++ gar nicht so schlecht bewertet. Wie kommts? Hat es von euch Jemand schon in der Hand gehabt? Vielleicht ist ja die aktuelle Ausgabe doch gar nicht so schlecht?!?
    http://www.amazon.de/gp/product/3836214296


  • Administrator

    Zu deinem Problem:
    Wie SeppJ gesagt hat, solltest du nochmals das Thema zu Zeigern durchlesen. Auch ein Zeiger kann kopiert werden, da er auch nichts anderes darstellt, als ein paar Bytes im Speicher, welcher eine Adresse speichern. Auch wichtig dürfte dann für dich die Möglichkeit der Derefenzierung sein.

    Zu wxWidgets:
    wxWidgets wurde begonnen noch bevor der erste C++ Standard da war. Die Bibliothek ist also wirklich uralt. Die Entwickler wollen auch immer noch Kompiler unterstützten, welche vor 1998 existiert haben, wodurch sie nicht auf alle Möglichkeiten des C++ Standards setzen können. Sie setzen somit ein völlig veraltest C++ für ihre Bibliothek ein. Die Liste was an wxWidgets schrecklich ist, geht ins unendliche, daher liste ich die jetzt nicht auf 😉

    Gute GUI Alternativen gibt es leider nicht. Viele schwören auf Qt, was ich persönlich aber auch nicht so der Hit finde. Es setzt zumindest etwas moderneres C++ ein. Weder wxWidgets noch Qt bauen auf OpenGL auf. Ein gutes C++ Framework für OpenGL ist SFML. Allerdings hast du in SFML kein GUI.

    Zur Amazon Bewertung:
    Die wird von Laien gemacht ohne irgendwelche Ahnung. C++ von A bis Z täuscht dem Lernenden vor, dass er C++ könnte, weil man schnell mit wxWidgets grossartig aussehendes machen kann. Der Lernende merkt aber nicht, dass er so gar kein richtiges und schönes C++ lernt. Dadurch gibt er eine gute Bewertung ab bei Amazon, ist sich aber nicht bewusst, dass das Buch ihm nur geschadet hat.

    Grüssli


  • Mod

    darkfate schrieb:

    Irgendwie kriege ich es selber nicht gebacken und möchte eigentlich vorankommen anstatt mich stundenlang damit zu beschäftigen.

    Guck doch mal selber hin, der Compiler sagt doch schon, was nicht stimmt:

    error: cannot convert 'double**' to 'double***' in assignment
    

    Jetzt gucken wir mal in die Zeile:

    C = new double*[n];
    

    Gucken wir im Funktionskopf, so sehen wir, C ist vom Typ double***. Und new double*[n] liefert bekanntlich einen double**. Und jetzt beschwert sich der Compiler zurecht, dass dies nicht zusammenpasst, denn wie sollte man einem double*** einen double** zuweisen? Das geht einfach nicht.
    Wenn du jetzt meine Lösung nicht blind übernommen hättest, wüsstest du, warum ich dir im Funktionskopf aus dem double** einen double*** gemacht habe. Und dann wüsstest du auch, wie du deine Zuweisung abändern müsstest, damit es funktioniert wie es soll.
    Aber da dieses thema dermaßen elementar ist, dass du das verstehen musst, verweise ich dich nochmals auf dein Buch. Meinetwegen auch das C Buch, denn du machst hier (bis auf Kleinigkeiten) C kein C++. Guck dort mal die Begriffe call-by-reference und call-by-value nach, dann weißt du Bescheid.



  • Ich frage mich wozu es dieses Forum gibt wenn man es sich selber erarbeiten soll. Wenn ich hier nicht weiterkomme dann hat der Herr Wolf es anscheinend nicht gut genug rübergebracht.

    Wenn mir jemand zu Mathematik/Physik eine Frage stellt, dann versuche ich ihm auch zu antworten und verweise ihn nicht auf ein Kapitel aus dem Buch. Spart zwar Mühe, hat aber Null Lerneffekt.

    Man könnte zumindest mal Tips geben woran es scheitert. Einfach zu sagen überlege doch selber ist ein Unding.



  • SeppJ schrieb:

    ....

    Immerhin ein Anhaltspunkt. Danke.

    PS:
    Achso, was das Thema Elementar angeht. Da hat jeder seine eigenen Stärken. Ich kann auch nicht sagen Tensoren oder die Geometrische 5D Algebra gehören zu elementaren Dingen in der Mathematik, sie sind einfach und jeder sollte Sie können bevor er anfängt vernünftig zu rechnen. Ein bisschen Feingefühl wäre da nicht schlecht.


  • Administrator

    darkfate schrieb:

    Ich frage mich wozu es dieses Forum gibt wenn man es sich selber erarbeiten soll.

    Weil man es so lernt, sonst konsumiert man nur und lernt nichts. Wir haben hier ziemlich viel Erfahrung mit Anfängern. Wenn man ihnen die Lösung gibt, sind sie zufrieden gehen weg und kommen Tage darauf mit dem gleichen Problem wieder, weil sie die Lösung nicht verstanden haben.

    darkfate schrieb:

    Man könnte zumindest mal Tips geben woran es scheitert. Einfach zu sagen überlege doch selber ist ein Unding.

    Es wurden doch verschiedene Tipps gegeben. Viel mehr kann man fast nicht sagen, ausser dir die fertige Lösung zu präsentieren. Und Zeiger könnte man in der Mathematik mit dem Addieren und Subtrahieren vergleichen. Du wirst daher wohl begriefen, dass es wirkliche Grundlagen sind, denn ohne Addition kommst du in der Mathematik überhaupt nirgends hin.

    Falls du zusätzliche Literatur willst, dann findet sich zum Beispiel etwas hier (Kapitel 5):
    http://tutorial.schornboeck.net/inhalt.htm

    Grüssli



  • Dravere schrieb:

    Du wirst daher wohl begriefen, dass es wirkliche Grundlagen sind, denn ohne Addition kommst du in der Mathematik überhaupt nirgends hin.

    Na da siehst du mal, hier haben wir den ersten gravierenden Fehler 🙂 so einfach ist es.



  • Irgendwie komme ich von selber nicht drauf. Habe jetzt mal das ganze ein wenig abstrahiert.

    #include <iostream>
    #include <cstdlib>
    #include <cstring>
    
    using namespace std;
    
    void array1d(int &n);
    void array2d(double *A1, int &n);
    
    int main(int argc, char **argv){
    
    	int n;
    	double *A1;
    
    	array1d(n);
    	array2d(A1,n);
    
    	cout << "n : " << n << endl;
    	cout << "A[0] : " << A1[0] << "A[1] : " << A1[1] << endl;
    
    	return EXIT_SUCCESS;
    }
    
    void array1d(int &n){
    	n = 2;
    }
    
    void array2d(double *A1, int &n){
    
    	A1 = new double[n];
    	A1[0] = 0.1234;
    	A1[1] = 0.5678;
    }
    

    In der Zeile 30 bekommt A1 immer eine neue Speicheradresse. So dass ich beim verlassen der Funktion nicht mehr darauf zugreifen kann. Es funktioniert wenn A1 = new double[n] vor der Funktion aufgerufen wird.

    Mit einem Zeiger auf Zeiger habe ich es selber nicht hingekriegt. Wäre nett wenn mal einer einfach die Antwort postet. Wenn die Zeit noch erlaubt, eine kurze Begründung warum das so ist.

    Danke im Voraus.



  • Hallo,

    Ich hab dein Programm so modifiziert, dass der Zeiger als Referenz übergeben wird:

    #include <iostream>
    #include <cstdlib>
    #include <cstring>
    
    using namespace std;
    
    void array1d(int &n);
    void array2d(double *&A1, int &n);
    
    int main(int argc, char **argv){
    
        int n;
        double *A1;
    
        array1d(n);
        array2d(A1,n);
    
        cout << "n : " << n << endl;
        cout << "A[0] : " << A1[0] << "A[1] : " << A1[1] << endl;
    
        return EXIT_SUCCESS;
    }
    
    void array1d(int &n){
        n = 2;
    }
    
    void array2d(double *&A1, int &n){
    
        A1 = new double[n];
        A1[0] = 0.1234;
        A1[1] = 0.5678;
    }
    

    Beachte die Zeilen 8 und 28. Hier wurde die Funktion so verändert, dass nun der Zeiger selbst und nicht eine Kopie des Zeigers an die Funktion übergeben wird.
    Bei mir klappt es. Ich hoffe ich konnte dir weiterhelfen.

    MfG, Jochen



  • Hallo Jochen, danke für die schnelle Hilfe. Hat in jedem Fall weitergeholfen.

    Referenzen werden doch intern mit Zeigern realisiert, also müsste es doch eine Zeier auf Zeiger Lösung (**A1) Lösung geben. Vielleicht könnte hier mal jemand auch daszu was posten. Ich möchte wissen was ich hier so lange falsch gemacht habe.

    Nachtrag:
    Verstehe ich das jetzt richtig dass bei "&A1" die Adresse vom Zeiger genommen wird (nicht worauf er zeigt). Mit "*&A1" wird ein Zeiger auf die Adresse vom Zeiger an die Funktion weitergegeben? Bin ein wenig verwirrt.


  • Mod

    Ok, dies sieht wenigstens aus, wie C++.

    #include <iostream>
    
    using namespace std;
    
    void foo(int &n){
        n = 2;
    }
    
    int main(){
        int i = 0;
    
        foo(i);
    
        cout << "i : " << i << endl;
    }
    

    Guck dir mal dieses Programm an. Wenn man foo() aufruft, wird n auf 2 gesetzt und diese Änderung wird auch im Hauptprogramm bekannt. Die Variable i im Hauptprogramm hat hinterher auch den Wert 2. Du hast selber eine Funktion geschrieben, die genauso aussieht wie foo(), deshalb kannst du diese Fragen beantworten: Warum funktoniert das so? Und was bedeutet dieses &-Zeichen?

    Und jetzt ändere diese Funktion mal in:

    void foo(int n){
        n = 2;
    }
    

    Du wirst sehen, dass dies immer noch compiliert. Aber dieses Mal bleibt der Wert von i im Hauptprogramm gleich 0. Warum ist das so?

    Und wenn du diese Fragen beantwortet hast, dann guckst du dir nochmal deine Funktion an:

    void array2d(double *A1, int &n){
    
        A1 = new double[n];
        A1[0] = 0.1234;
        A1[1] = 0.5678;
    }
    

    Hier wird der Wert von A1 in der Funktion geändert, aber diese Änderung wird nicht weitergegeben. Warum ist das wohl so?


  • Mod

    darkfate schrieb:

    Hallo Jochen, danke für die schnelle Hilfe. Hat in jedem Fall weitergeholfen.

    Referenzen werden doch intern mit Zeigern realisiert, also müsste es doch eine Zeier auf Zeiger Lösung (**A1) Lösung geben. Vielleicht könnte hier mal jemand auch daszu was posten. Ich möchte wissen was ich hier so lange falsch gemacht habe.

    Ja, das geht intern (häufig) mit Zeigern. Und das ist auch der Ansatz den du zuerst versucht hast, den du aber nicht umsetzen konntest, weil du ihn nicht verstanden hast. Um das zu erklären, müsstest du verstehen, was Zeiger sind - dieses Wissen fehlt dir aber anscheinend (Was in C++ übrigens nicht so schlimm ist, da man Zeiger eher selten braucht). Ich kann aber an dieser Stelle Zeiger nicht erklären. Das Thema ist nicht zu unrecht in den meisten Lehrbüchern ein dickes Kapitel. Du musst dir so ein Lehrbuch schon erstmal durchlesen, bevor ich dir erklären kann, was man mit Zeigern wie machen kann.



  • Zum Thema Zeiger gibt es doch einen schönen Artikel im Magazin.
    http://www.c-plusplus.net/forum/viewtopic-var-t-is-254043.html


Anmelden zum Antworten