Zeiger auf Vektor



  • StinkePunk schrieb:

    Wie bereits gesagt, hab ich das auch schon versucht und es kommt der selbe Fehler. Das mit dem Zeiger war dann halt der zweite Verscuch und da er zu den selben Fehler führte muss er wohl irgendwo anders begründet liegen. Leider hab ich keine Idee wo.

    Ja genau. Der Fehler liegt wo anders, denn dieser Quelltext hier klappt ohne Probleme.

    #include <cstdlib>
    #include <vector>
    #include <iostream>
    
    using namespace std;
    
    vector<int> MakeFib() {
    
        vector<int> vec;
    
        vec.push_back(1);
        vec.push_back(1);
    
        for (int i = 0; i < 10; i++) {
            vec.push_back( vec[i] + vec[i+1]);
        }
    
        return vec;
    }
    
    int main(int argc, char* argv[]) {
    
        vector<int> num = MakeFib();
    
        for (int i = 0; i < num.size(); i++) {
            cout<<num[i]<<" ";
        }
        cout<<endl;
    
        return EXIT_SUCCESS;
    }
    

    Du solltest mal die entsprechenden Fehlermeldungen und die dazugehörigen Quelltext-Zeilen posten.



  • Also die Fehlermeldung lautet:

    Debug Asssertion Failed!

    Programm: ... (Name und Pfad der *.exe)
    File: f:\dd\vctools\crt_bld\self_x86\crt\src\dbgdel.cpp
    Line: 52

    Expression: _Block_TYPE_IS_VALID(pHead->nBlockUse)

    Von diesen Fehlerfenster tauchen immer andere leicht varierende auf, wenn ich immer auf "ignorieren" drücke. Irgendwann hören die dann auf und mein Vektor wurde ans Hauptprogramm übergeben (das mit dem Zeiger hab ich mittlerweile sein gelassen).

    Hier mal der relevante Teil meines Quelltextes:

    vector<DVD> DvdArchivLaden(){
    	vector<DVD> DVDvec;
    	FILE *fp;
    
        // Einlesen des Dateinamens
    
        ...
    
        fp = fopen(dateiname, "rb")
    
        // Laden der Menge der DVDs die in der Datei liegen
        int AnzahlDVDs;
        int *AnzahlDVDsZgr = &AnzahlDVDs;
        fread(AnzahlDVDsZgr, sizeof(AnzahlDVDs), 1, fp);
    
        // laden der DVD-Elemente
        int i = 0;
        int groesseVonDvd;
        int *groesseVonDvdZgr = &groesseVonDvd;
        DVD neueDVD("", "", 0, 0, ""); // Initialisieren eines neuen Objektes
        DVD *dvdZgr = &neueDVD;
        for (i = 0; i < AnzahlDVDs; i++){
    		fread(groesseVonDvdZgr, sizeof(groesseVonDvd), 1, fp);
    		fread(dvdZgr, groesseVonDvd, 1, fp);
    		DVDvec.push_back(neueDVD);
        }
    
        return(DVDvec);
    }
    

    So, noch währrend ich dabei bin diese Antwort zu erstellen, hab ich meinen Fehler gefunden. Mit

    DVD *dvdZgr = new DVD("", "", 0, 0, "");
        for (i = 0; i < AnzahlDVDs; i++){
    		fread(groesseVonDvdZgr, sizeof(groesseVonDvd), 1, fp);
    		fread(dvdZgr, groesseVonDvd, 1, fp);
    		DVDvec.push_back(*dvdZgr);
        }
    

    funktioniert es.

    Ich bedanke mich für eure Hilfe.


  • Mod

    Nein! Das ist nicht Dein Fehler. Du verstehst einfach nicht wann Zeiger eingesetzt werden und wie Objekte auf Heap und Stack verwendet werden.

    Versuch mal ein Grundlagen Tutorial zu lesen oder ein Buch...



  • Da hast du auch Recht. Ich hab grad erst vor ein paar Wochen mit C++ angefangen und hab vorher nur mit ANSII-C gearbeitet. Bin grad dabei dieses Buch "Visual C++ 2008" von André Willms durchzuarbeiten, wobei ich das Buch insgesamt nicht sehr gelungen finde.



  • Martin Richter schrieb:

    Variante 1:
    Übergib eine Referenz an den Vector für die Funktion. Würde ich anaten.
    Variante 2:
    Allokiere den vector mit new in der Funktion. Da ist das was ProgChild meinte.

    die sind aber beide nicht so hübsch, wie einfach das sternchen wegzumachen, wie ProgChild gerne hätte.


  • Mod

    volkard schrieb:

    die sind aber beide nicht so hübsch, wie einfach das sternchen wegzumachen, wie ProgChild gerne hätte.

    "Hübsch" und "Geht nicht" was ist Dir lieber.

    BTW: "Hübsch" ist eine neue sehr subjektive Kategorie für Code, finde ich.



  • Martin Richter schrieb:

    "Geht nicht"

    Warum sollte es nicht gehen?



  • ProgChild schrieb:

    Martin Richter schrieb:

    "Geht nicht"

    Warum sollte es nicht gehen?

    weil die klasse DVD keinen kopierkonstruktor hat, fürchte ich. mal überlegen, warum nicht. nee, das wäre seltsam. ich glaube auch, daß es doch geht.


  • Mod

    Ja sicher geht es... Ich habe mich falsch ausgedrückt.

    Das Problem ist der Umgang mit Zeigern an dieser Stelle oder auch damit dass hier ein Objekt kopiert werden muss.
    Bei einer Referenz ist dieser Overhead nicht nötig.



  • Martin Richter schrieb:

    Bei einer Referenz ist dieser Overhead nicht nötig.

    da habe ich mal start auf die RVO gebaut.


  • Mod

    volkard schrieb:

    Martin Richter schrieb:

    Bei einer Referenz ist dieser Overhead nicht nötig.

    da habe ich mal start auf die RVO gebaut.

    Oft greift die nicht im Debug-Mode und das bedeutet für uns in den Beta Phasen zu viel Performance Verlust. Deshalb verlase ich mich hier auf gar nichts, wenn ich es selbst einfachst beeinflussen kann.



  • Martin Richter schrieb:

    volkard schrieb:

    Martin Richter schrieb:

    Bei einer Referenz ist dieser Overhead nicht nötig.

    da habe ich mal start auf die RVO gebaut.

    Oft greift die nicht im Debug-Mode

    die muß im debug-modus natürlich nicht greifen. http://msdn.microsoft.com/en-us/library/ms364057(VS.80).aspx sagt, /O2 wäre nett. die sprachen von vs 2005. heute ist 2009.

    und das bedeutet für uns in den Beta Phasen zu viel Performance Verlust.

    kümmert euch lieber um sauberen code, das bringt übersicht und dadurch mehr optimierungsmöglichkeiten, als wenn ihr frühzeitig solche zaubereien macht.

    Deshalb verlase ich mich hier auf gar nichts, wenn ich es selbst einfachst beeinflussen kann.

    mit der einstellung solltest du aber C programmieren. und vor allem switch(typ) machen statt virtuelle funtionen aufzurufen, die das inlining kaputtmachen.


  • Mod

    [quote="volkard"]

    Martin Richter schrieb:

    und das bedeutet für uns in den Beta Phasen zu viel Performance Verlust.

    kümmert euch lieber um sauberen code, das bringt übersicht und dadurch mehr optimierungsmöglichkeiten, als wenn ihr frühzeitig solche zaubereien macht.

    Deshalb verlase ich mich hier auf gar nichts, wenn ich es selbst einfachst beeinflussen kann.

    mit der einstellung solltest du aber C programmieren. und vor allem switch(typ) machen statt virtuelle funtionen aufzurufen, die das inlining kaputtmachen.

    Ich verstehe Deine Argumentation nicht ganz. Warum soll ich mich auf die Unsicherheit einer Optimierung einlassen, die evtl. gar nicht greift, wenn ich durch die Nutzung einer Referenz das gezielte gewümschte Verhalten erreiche.
    Deshalb verlasse ich mich "in so einem Fall" also "hier" auf Nichts!
    Jetzt verstanden?

    Die Anmerkung mit dem "C-Programmieren" überhöre ich mal einfach...



  • Martin Richter schrieb:

    Ich verstehe Deine Argumentation nicht ganz.

    das mit der referenz rein und wieder raus ist einfach unhübsch und drückt gar nicht aus, daß die funktion den vector erzeugt und zurückgibt. ist ist nicht wie bei integers.

    Martin Richter schrieb:

    Warum soll ich mich auf die Unsicherheit einer Optimierung einlassen, die evtl. gar nicht greift, wenn ich durch die Nutzung einer Referenz das gezielte gewümschte Verhalten erreiche.

    weil das meiner meinung nach der ganz falsche weg ist.

    Martin Richter schrieb:

    Deshalb verlasse ich mich "in so einem Fall" also "hier" auf Nichts!
    Jetzt verstanden?

    verstanden. aber der weg führt inst abseits.
    die stl mit ihren unzähligen winzig-funktionen ist im debug-modus schneckenlahm. kein inlining, das tut ihr echt weh. deswegen die stl nicht zu nehmen, wäre unklug. lieber fette rechner nehmen, wenn der debug-code zu lahm ist oder das problem sonstwie lösen. und natürlich nicht immer den standard-debug-mode benutzen, sondern beim debuggen schon einige optimierungen anmachen, nur eben alle asserts stehen lassen.


Anmelden zum Antworten