Dynamisch Array



  • Hallo Leidensgenossen,

    habe da nen kleines Problem.

    Habe ein kleines Programm geschrieben bei dem es um dynamische Array´s geht.
    Kurze erläterung zum Programm:

    Das Programm soll aus einer TXT Datei int bzw. double Werte einlesen und diese dann in einen Array speichern. Die Array größe ist beim Programmstart 2. Sollen mehr daten eingelesen werden ( weil in der Datei mehr als zwei Werte stehen ) so soll dieses beim einlesen erkannt werden und anschließend automatisch das Array verdoppelt werden. Ist dies geschiehen, soll der einlese vorgang weitergeführt werden. Das verdoppeln der Array größe ist so oft zu wiederholen wie es zum einlesen benötigt wird.
    Soweit eigentlich kein Thema.
    Das von mir geschrieben Programm habe ich mit VC++ 6.0 geschrieben, erstellt und Compiliert. Bei beiden ist kein Fehr aufgetreten.

    Beim Programm ausführen passiert auch noch nix. Wählt man nun das Menü aus "Von Datei auslesen", wird dieses auch getan.
    Solange die Anzahl der Werte nicht 4 überschreitet, so läuft das programm einwandfrei. Stehen mehr werte drin als 4 funktioniert das einlesen, leider aber nicht das ausgeben des eingelesenes. Es gibt ein Programmabsturz.
    Lässt man nun den Debugger laufen, treten keine Fehler auf und das Programm macht auch das ausgeben.

    Hier mein geschriebenes Programm:

    #include <string>
    #include <iostream>
    #include <cstdlib>
    #include <fstream>
    #include <sstream>

    using namespace std;

    int einlesen (int);
    void ausgabe ();
    void vonDateiAuslesen ();
    void inDateiSchreiben();
    void arrayErweitern ();

    struct Mess
    {
    int nummer;
    double messung;
    };

    int ArrayGroesse = 2;
    int ArrayGroesseAlt = ArrayGroesse;

    *Mess zeigerMessung = new Mess[ArrayGroesse];
    *Mess zeigerMessungTemp = new Mess[ArrayGroesse];

    void main()
    {
    int eingabeMessung;
    int eingabe;

    bool exit = false;

    for ( int i = 0; i < ArrayGroesse; i++ )
    {
    zeigerMessung[i].nummer = 0;
    zeigerMessung[i].messung = 0;
    }

    while ( exit != true )
    {
    cout<<" 1. Einagbe "<<endl;
    cout<<" 2. Ausgabe "<<endl;
    cout<<" 3. Von Datei auslesen "<<endl;
    cout<<" 4. In Datei schreiben "<<endl;
    cout<<" 0. Beenden "<<endl;
    cout<<endl;
    cout<<" Ihre eingabe: ";
    cin>>eingabe;

    switch ( eingabe )
    {
    case 1:

    cout<<" Messwert eingeben: ";
    cin>>eingabeMessung;

    einlesen (eingabeMessung);

    break;

    case 2:

    ausgabe ();

    break;

    case 3:

    vonDateiAuslesen ();

    break;

    case 4:

    inDateiSchreiben ();

    break;

    case 0:

    exit = true;

    }
    }

    }

    int einlesen (int x)
    {

    for ( int i = 0;i<ArrayGroesse ;i++ )
    {

    if ( zeigerMessung[i].nummer == 0 )
    {
    zeigerMessung[i].nummer = i+1;
    zeigerMessung[i].messung = x;
    break;
    }
    else if ( i == (ArrayGroesse-1))
    {
    arrayErweitern ();
    }

    }

    return 0;

    }

    void inDateiSchreiben()
    {
    fstream fout;

    system ("cls");

    fout.open ( "Datei.txt", ios::out );

    if ( fout.good () )
    {
    cout<<"\n\t\t Datei konnte erstellt werden bzw. geoeffnet werden!"<<endl;

    for ( int i = 0; i<ArrayGroesse; i++)
    {
    if (zeigerMessung[i].nummer != 0 )
    {
    fout<<zeigerMessung[i].messung<<endl;
    }
    else
    break;

    }
    }
    else
    {
    cout<<"\n\t\t Datei konnte nicht erstellt werden bzw. geoeffnet werden!"<<endl;

    }

    fout.close ();

    }

    void vonDateiAuslesen ()
    {
    int mess, laengeZeile;
    string zeile;

    fstream fin;

    fin.open ( "Datei.txt", ios::in );

    while ( !fin.eof () )
    {

    getline ( fin, zeile);

    istringstream auslesen ( zeile );
    laengeZeile = zeile.length ();

    auslesen>>mess;

    if ( laengeZeile > 0 )
    {
    einlesen (mess);
    }
    }

    fin.close ();

    }

    void ausgabe ()
    {
    for ( int i = 0; i<ArrayGroesse; i++ )
    {
    cout<<zeigerMessung[i].nummer<<" "<<zeigerMessung[i].messung<<endl;

    }

    }

    void arrayErweitern ()
    {
    for ( int i = 0; i<ArrayGroesse; i++ )
    {
    zeigerMessungTemp[i].messung = zeigerMessung[i].messung;
    zeigerMessungTemp[i].nummer = zeigerMessung[i].nummer;
    }

    delete zeigerMessung;

    ArrayGroesse *=2;

    zeigerMessung = new Mess[ArrayGroesse];

    for ( i = 0; i < ArrayGroesse; i++ )
    {
    zeigerMessung[i].nummer = 0;
    zeigerMessung[i].messung = 0;
    }

    for ( i = 0; i<ArrayGroesseAlt; i++ )
    {
    zeigerMessung[i].messung = zeigerMessungTemp[i].messung;
    zeigerMessung[i].nummer = zeigerMessungTemp[i].nummer ;
    }

    ArrayGroesseAlt = ArrayGroesse;

    }

    Mir ist klar, das das Programm besser geschrieben werden könnte. Dies sollte aber nicht ausschlaggebend sein. Wichtig ist die Fehlerfreie Funktion des Programms.
    Für eure Hilfe wäre ich euch sehr dankbar.

    Gruß

    sky-server



  • Hi,
    Bei deiner Funktion arrayErweitern vergisst du das zeigerMessungTemp array am Schluß auf die neue Größe zu setzen. Also mit delete[](ändere das auch in der Funktion) den Speicher freigeben und neuen anfordern.

    Tschau,
    Cappo



  • Super, danke dir.

    War ein dummer Fehler!!!

    Man, das ich des net gesehen hab , man man man!!!

    Danke dir nochmal Cappo


Anmelden zum Antworten