Gültigkeitsbereich



  • Hallo Leute,

    ich verliere in KDevelop immer den Zeiger auf eine Variable.

    void readtoarray(FILE *fp,double **C,unsigned int &n);
    
    int main(int argc, char *argv[]){
    	...
    	double **C;
    	...
    	readtoarray(fp,C,n);
    	...
    	cout << C[0][0] << C[0][1] << endl; // Hier bekomme ich SIGSEGV
    	// Die Adresse des Zeigers auf C ist 0x0
    	...
    }
    
    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];
    	... // Hier hat C noch eine gültige Adresse und gültige Werte
    	cout << C[0][0] << C[0][1] << endl; // Funktioniert einwandfrei
    }
    

    Warum verliere ich beim herausspringen aus der Funktion die Adresse des Zeigers?
    Ich habe ihn doch dynamisch auf dem Heap angelegt?


  • Mod

    Deine Funktion nimmt C als call-by-value. Das heißt, wenn du den Wert von C in der Funktion änderst, wird nicht der Wert der übergebenen Variable im Hauptprogramm geändert.
    Du musst entweder einen Zeiger auf C übergeben oder C per Referenz übergeben.



  • SeppJ schrieb:

    ...

    Ich stehe gerade auf dem Schlauch, wieso call by value? ich übergebe doch nur adressen mit den Zeigern? Könntest du mir kurz den Prototyp der richtigen Funktion und den FUnktionsauf zeigen?

    Ist es das übliche Vorgehen?



  • std::vector<std::pair<double> > readtoarray(std::istream& in)
    

    SCNR 🙂



  • Nukularfüsiker schrieb:

    std::vector<std::pair<double> > readtoarray(std::istream& in)
    

    SCNR 🙂

    Danke.. aber damit kann ich als Anfänger noch nichts anfangen. Ich meinte eher so in dem Stil wie ich ihn gepastet habe. Das Andere kommt wahrscheinlich etwas später in der Lektüre.

    Ist wahrscheinlich das übliche vorgehen... hmm..


  • Mod

    darkfate schrieb:

    Ich stehe gerade auf dem Schlauch, wieso call by value? ich übergebe doch nur adressen mit den Zeigern? Könntest du mir kurz den Prototyp der richtigen Funktion und den FUnktionsauf zeigen?

    Entweder so:

    void readtoarray(FILE *fp,double **&C,unsigned int &n); // Prototyp
    
    readtoarray(fp,C,n); //Aufruf
    

    oder so:

    void readtoarray(FILE *fp,double ***C,unsigned int &n); // Prototyp
    
    readtoarray(fp,&C,n); //Aufruf
    

    Wobei Fall 1 besser geeignet ist, weil du da außer dem Funktionskopf nichts zu verändern brauchst, während du im zweiten Fall Änderungen an der Funkton selbst vornehmen musst.

    Mach dir aber unbedingt klar, warum diese Vorschläge funktionieren und deines nicht. Das zu verstehen ist ungeheuer wichtig.

    Ist es das übliche Vorgehen?

    Nein, das übliche Vorgehen wäre eine C++-artige Lösung wie Nukularfüsiker vorgeschlagen hat. Insbesondere bedeutet dies, dass man weder mit rohen Arrays hantiert, noch dass man vom Nutzer verlangt, sich selber um die richtige Speicherverwaltung kümmern zu müssen.



  • darkfate schrieb:

    Danke.. aber damit kann ich als Anfänger noch nichts anfangen. Ich meinte eher so in dem Stil wie ich ihn gepastet habe. Das Andere kommt wahrscheinlich etwas später in der Lektüre.

    Eine Lektüre die Anfänger mit Pointern auf Pointer, new/delete und C-Altlasten quält, ist nicht sehr viel wert.

    Wenn du auf diesen mittelalterlichen Stil angewiesen bist, klappts vielleicht so:

    double** readtoarray(FILE *fp, unsigned int &n){
       double** C = new double*[n]
     ...
       return C;
    


  • jetzt bekomme ich für den Prototyp:

    void readtoarray(FILE *fp,double ***C,unsigned int &n);
    

    und den Aufruf

    readtoarray(fp,&C,n);
    

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

    in den beiden Zeilen:

    C = new double*[n];
    for(unsigned int i=0;i<n;i++) C[i] = new double[2];
    

  • Mod

    darkfate schrieb:

    jetzt bekomme ich für den Prototyp:

    void readtoarray(FILE *fp,double ***C,unsigned int &n);
    

    und den Aufruf

    readtoarray(fp,&C,n);
    

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

    in den beiden Zeilen:

    C = new double*[n];
    for(unsigned int i=0;i<n;i++) C[i] = new double[2];
    

    SeppJ schrieb:

    Wobei Fall 1 besser geeignet ist, weil du da außer dem Funktionskopf nichts zu verändern brauchst, während du im zweiten Fall Änderungen an der Funkton selbst vornehmen musst.

    Ich verrate dir aber nicht, wie das jetzt richtig ist. Das Thema ist viel zu wichtig, als dass du einfach eine Lösung vorgesetzt bekommst und diese ohne tieferes Verständnis benutzt.

    Da dein Buch ja anscheinend mächtig viel mit Pointern macht, solltest du dir die entsprechenden Kapitel nochmal genau durchlesen. Dann wirst du auch auf die Lösung kommen.

    Oder du schmeißt das Buch weg, vergisst alles was du daraus gelernt hast und holst dir ein gutes C++-Buch.



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


Anmelden zum Antworten