[C/C++] Problem mit Programm

Dieses Thema im Forum "Programmierung & Entwicklung" wurde erstellt von KdG, 12. Juni 2008 .

Schlagworte:
Status des Themas:
Es sind keine weiteren Antworten möglich.
  1. 12. Juni 2008
    Zuletzt von einem Moderator bearbeitet: 14. April 2017
    Problem mit Programm

    Hi,

    also Ich habe folgendes Problem: Ich habe zum Spaß eine Klasse geschrieben, die Schreibzugriffe im RAM puffern soll. Es soll also ein Puffer gefüllt werden, den man zu einem beliebigen Zeitpunkt dann in eine Datei schreiben kann. Funktioniert soweit auch ganz gut, solange nicht mehr als 12 Zeichen verwendet werden, bei 13 Zeichen verhält es sich komisch und ab 14 stützt es ab. Weiß hier jemand was ich flasch gemacht habe??? Hab auch noch ne kompilierte Version angehängt wenns jemand versuchen will. --> No File | xup.in


    hier mal noch der sourcecode:


    Code:
    #include <iostream>
    #include <fstream>
    using namespace std;
    
    class RamBufferedWrite
    {
     
     
     public:
     // Funktionen
     void WriteToFile();
     void WriteToFile(char filename[]);
     void WriteToBuffer(char newstring[]);
     void ShowBuffer();
     
     private:
     void ChangeBufferSize(int pluslength);
     char Buffer[1];
     
     
    };
    
    
    void RamBufferedWrite::ChangeBufferSize(int pluslength)
    {
     int oldlength = sizeof(Buffer);
     char Buffer[oldlength + pluslength];
    }
    
    void RamBufferedWrite::WriteToBuffer(char newstring[])
    {
     //Startpunkt ermitteln
     int WritePosition = strlen(Buffer);
     // Arraygröße anpassen
     int pluslength = strlen(newstring);
     ChangeBufferSize(pluslength);
     // neuen inhalt hinzufügen
     for (int i = 0; i < pluslength; i++)
     {
     Buffer[WritePosition]=newstring[i];
     WritePosition++;
     }
     Buffer[WritePosition]= '\0';
    }
    
    
    void RamBufferedWrite::ShowBuffer()
    {
     cout << "\n";
     cout << Buffer;
     cout << "\n";
    }
    
    
    
    void RamBufferedWrite::WriteToFile()
    {
     WriteToFile("test.dat");
    }
    
    void RamBufferedWrite::WriteToFile(char filename[])
    {
     fstream datei;
     datei.open(filename, ios::out);
     datei << Buffer << endl;
     datei.close();
    }
    
    int main()
    {
     
     RamBufferedWrite test; 
     char d[100];
     for (int i = 0; i<99;i++)
     {
     char lastkey = getchar();
     if (lastkey == 10)
     {
     d[i+1]='\0';
     break;
     }
     d[i]=lastkey;
     d[i+1]='\0';
     }
     
     cout << "\nwie oft?";
     int times;
     cin >> times;
     while (times > 0)
     {
     test.WriteToBuffer(d);
     test.ShowBuffer();
     times--;
     }
     test.WriteToFile();
     test.WriteToFile("test.txt");
     system("pause");
     
     return 0;
    }
     
  2. 12. Juni 2008
    AW: Problem mit Programm

    Hey!

    Denke, dass es daran liegt... Du kannst nicht einfach eine existierende Variable einer Klasse mit einer lokalen Variable 'ersetzen'! Schau dir mal die Funktionen malloc () und realloc () an. Die Variable wird am Ende der Funktion geloescht. Deshalb stuerzt er ab (weil er z.B. irgendwo mal was ueberschreibt (z.B. EIP, ESP)), da du ueber deinen Speicher hinausschreibst.

    Mfg,

    Kolazomai
     
  3. 12. Juni 2008
    AW: Problem mit Programm

    Moooin,

    Was Kolazomai sagt stimmt, es wäre sinnvoller folgendes zu machen :

    Code:
    [...]
     public:
    [COLOR="SeaGreen"] RamBufferedWrite();
     ~RamBufferedWrite();[/COLOR]
    
     private:
     void ChangeBufferSize(int pluslength);
    [COLOR="SeaGreen"] char *Buffer;[/COLOR]
     
     
    };
    
    [COLOR="SeaGreen"]RamBufferedWrite::RamBufferedWrite()
    {
    Buffer=NULL;
    }
    
    RamBufferedWrite::~RamBufferedWrite()
    {
    delete Buffer;
    }[/COLOR]
    
    void RamBufferedWrite::ChangeBufferSize(int pluslength)
    {
    
    [COLOR="SeaGreen"]if(Buffer!=NULL)
    {
     int oldlength = sizeof(Buffer);
     int newlength = oldlength + pluslength;
    
     delete Buffer; // Alten Buffer löschen.
     Buffer=NULL; // Pointer auf NULL setzen.
     Buffer=new char[newlength ]; // Neuen Buffer mit newlength anlegen.
     if(Buffer!=NULL){
     ZeroMemory(Buffer,newlength); // Neuen Speicherbereich leeren.
    
     }
     else
     {
     //Ungenügend Speicher.
     }
    } 
    else
    {
     //Buffer zeigt auf keine Speicheraddresse
    }[/COLOR]
    
    }
    
    
    So ... mal so hingezimmert.
    Dein problem wird sein :
    char Buffer[oldlength + pluslength];

    Du hast diesen aufruf innerhalb einer Funktion gemacht und deklariert damit Lokal für die Funktion (wie schon Kolazomai sagte) eine neue Variable die nach beendigung gelöscht wird.

    PS: Ich persönlich weiß immer noch nicht warum malloc(); und realloc() ^^ pointer tun´s ja genauso, ne erklärung dazu würd ich auch gern mal hören

    njoa ist auch nur ein vorschlag, mehrere Wege führen nach Rom.

    Mfg, Inqui.
     
  4. 12. Juni 2008
    AW: Problem mit Programm

    malloc() und realloc() sind C, und deshalb sollte man sie nich mehr verwenden
    new und delete bzw. delete[] sind C++, und nur die sollte man verwenden. V.a. malloc() bei Klassen ist schlecht, weil da der Konstruktor nich aufgerufen wird, bei new jedoch schon.

    In deinem Code oben ist übrigens noch ein Fehler:
    Du musst den buffer mit delete[] löschen, weils ja ein array ist und keine einzelne variable..
     
  5. 12. Juni 2008
    AW: Problem mit Programm

    Hey!

    Ja, aber mit ich alloziere ja keinen Speicher fuer eine Klasse, sondern fuer ein Char-Array
    realloc () loest das Problem mit new und delete, da nicht immer der ganze Speicherplatz geloescht und neu angelegt werden muss. Vielleicht sollte man das kombinieren (die std::string-Class koennte man dazu mal anschaun).

    In deinem Code ist uebrigens noch ein weiterer Fehler... sizeof (Buffer) wird dir wohl immer 8 byte zurueckgeben (es ist ein Pointer). Und zu deiner Frage: realloc () arbeitet mit Pointern

    Mfg,

    Kolazomai
     
  6. 14. Juni 2008
    AW: Problem mit Programm

    Ok danke problem gelöst...hätt ich auch dauf kommen können-_- bws sind raus
     
  7. Video Script

    Videos zum Themenbereich

    * gefundene Videos auf YouTube, anhand der Überschrift.