Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » VC++ / MFC » Heap Fehler bei dynamischen Array eines komplexen Datentyps

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
30.06.2012, 16:03 Uhr
klausuwe



Hallo zusammen,

ich hoffe ich bin hier richtig und mir kann geholfen werden. Ich habe ein MFC Projekt, das eine Binärdatei zeilenweise auslesen soll. Dabei habe ich an sich auch keine Probleme, mein Problem ist eher, dass ich ein dynamisches Array eines selbsterstellten Datentyps füllen möchte und dabei das Programm abstürzt, weil es zu einer Beschädigung des Heaps führt

hier mal mein Datentyp:


C++:
class lin {
    
    short x1,y1,x2,y2;
    unsigned char r,g,b;

    public:
        lin(void);
        lin(short X1, short Y1, short X2, short Y2, char R, char G, char B);
        ~lin();

        void setX1(short X1);
        void setY1(short Y1);
        void setX2(short X2);
        void setY2(short Y2);
        void setR(char R);
        void setG(char G);
        void setB(char B);

        short getX1();
        short getY1();
        short getX2();
        short getY2();
        char getR();
        char getG();
        char getB();
};



und hier die methode in der MFC-Klasse:


C++:
void CChildView::OnAufgabenQuadrate()
{
    typedef struct line { short x1, y1, x2, y2; unsigned char r, g, b; } sLine;
    sLine lines;

    FILE *data = fopen("./Linien.pra", "rb");
    FILE *output = fopen("./LinenBin2ANSI.txt", "wt");
    
    //Dynamische Array erzeugen, Anfangslänge auf 1 festlegen
    int z=1;
    lin* dynamicArray = NULL;
    dynamicArray = (lin*) calloc(z, sizeof(lin));

    //Schleife zum durchlaufen der Binärdatei
    while(fread(&lines, sizeof(sLine), 1, data) != NULL) {
        fread(&lines, sizeof(sLine), 0, data);
        fprintf(output, "%d %d %d %d        %d %d %d\n",    lines.x1,
                                                            lines.y1,
                                                            lines.x2,
                                                            lines.y2,
                                                            lines.r,
                                                            lines.g,
                                                            lines.b);

        try {
                lin retVal(lines.x1,lines.y1,lines.x2,lines.y2,lines.r,lines.g,lines.b);
                dynamicArray[z-1] = retVal;
                ++z;

                //Nach jedem Durchlauf um 1 Feld erhöhen
                dynamicArray = (lin *) realloc (dynamicArray,1*sizeof(lin));

        } catch (int e) {
            printf("Fehler Nr: "+e);
        }
    }    
}



Kann noch nicht ganz nachvollziehen wo mein Fehler steckt, um den ganzen vorzubeugen, es ist eine Uniaufgabe und ich soll nach möglichkeit mit Arrays arbeiten und keine container etc verwenden! Ansich müsste das doch auch so klappen oder?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
30.06.2012, 16:09 Uhr
Tommix



Hallo,
bei realloc mußt Du angeben auf welchen Wert Du den Speicher erhöhen willst, nicht um welchen.

Gruß, Tommix

Dieser Post wurde am 30.06.2012 um 16:09 Uhr von Tommix editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
30.06.2012, 21:36 Uhr
FloSoft
Medialer Over-Flow
(Administrator)


ansonsten würde ich überlegen, ob du nicht gleich das array um X-Elemente erhöhst und erst dann wieder (z.b verdoppelst), sonst kopierst du ununterbrochen den speicher hin und her und das dürfte u.U etwas langsam werden.
--
class God : public ChuckNorris { };
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ VC++ / MFC ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: