Fehler EAccessViolation



  • Hallo!
    Ich hab ein Problem bei einem Programm. Ich möchte Strings dem Alphabet nach sortieren lassen, aber es kommt immer der Zugriffsfehler EAccessViolation. Ich hab den Teil fett gekennzeichnet.
    Hat jemand eine Idee, warum der Fehler kommt?

    #pragma argsused
    //Klassendeklaration
    class IntArraySorter {
    private:
    int t;
    char **arr;
    int anzahl;
    void tausche(char **a, char **b);
    public:
    void Eingeben();
    void Ausgeben();
    void Sortieren();
    IntArraySorter();
    ~IntArraySorter() {}
    };

    //Methodendefinitionen
    IntArraySorter :: IntArraySorter()
    {
    arr = NULL;
    }

    //Eingabe der Anzahl Wörter, die sortiert werden sollenund der Wörter
    void IntArraySorter :: Eingeben()
    {
    char text[100];

    cout <<"\nWie viele Woerter wollen Sie sortieren?";
    cin >> anzahl;

    for (t=0; t < anzahl; t++)
    {
    //Eingabe der Wörter und Speichern im String
    arr[t] = new char[strlen(text) +1];
    strcpy(arr[t], text);
    cin >> arr[t];
    }
    }

    //Ausgabe der Wörter vor und nach dem Sortieren
    void IntArraySorter :: Ausgeben()
    {
    for (t=0; t < anzahl; t++)
    cout <<arr[t]<<" ";
    cout <<"\n";
    }

    //Sortieren der Wörter nach dem Alphabet
    void IntArraySorter :: Sortieren()
    {
    for (int anzahl = t-1; anzahl > 0; anzahl--)
    {
    for (t=0; t < anzahl; t++)
    {
    strcmp (arr[t], arr[t+1]);
    if (arr[t] > arr[t+1])
    tausche(&arr[t], &arr[t+1]);
    }
    }
    }

    //Tauschen der Wörter, wenn die Reihenfolge falsch ist
    void IntArraySorter :: tausche(char **a, char **b)
    {
    int *tmp;
    *tmp = **a;
    **a = **b;
    **b = *tmp;
    }

    //Hauptprogramm
    void main()
    {
    IntArraySorter ias;

    ias.Eingeben();
    ias.Ausgeben();

    ias.Sortieren();
    ias.Ausgeben();

    getch();
    }



  • Weil du auf arr via arr[t] zugreifst aber arr immer noch NULL ist. du musst vorher via arr = new char*[anzahl_strings]; speicher für das array bereitstellen

    und den dann später im Destruktor via

    if(arr)
      {
         for( int i = 0; i < anzahl; ++i )
           delete[] arr[i];
         delete[] arr;
      }
    

    wieder freigeben.

    BR
    evilissimo

    //Edit quote entfernt



  • Danke, der Fehler ist jetzt weg. Nur funktioniert das mit dem Sortieren leider nicht. Irgendwas beim Vergleichen der Strings stimmt noch nicht



  • Ja, C-Strings (char*) vergleicht man auch nicht mit < (das vergleicht nur die Speicher-Adressen, an denen die Strings abgelegt sind), sondern mit man: strcmp.

    (Kleiner Tip: In C++ fährst du übrigens besser, wenn du die STL-Klassen wie std::string und std::vector statt stumpfer Pointer-Arithmetik verwendest)

    PS: Und deine Tausche-Methode sieht auch nicht so auch, als ob sie das richtige macht.



  • okay, die tausche- Methode tauscht nur einen Buchstaben wenn ich den Code ändern in
    if(arr[t][0] > arr[t+1][0])
    tausche(...)

    Aber wie lös ich die tausche- Methode aus, wenn ich nur strcmp nehme? Das hab ich ja schon drin, aber ich brauch dann doch ne If-Anweisung oder nicht?
    Das mit den LST- Anweisungen hatten wir noch nicht... Schule ist eben etwas rückständig :p



  • ich meinet STL- Anweisung *g*



  • Erstens: Die Tausche-Funktion sollte die kompletten Zeiger umbiegen:

    void tausche(char**a,char**b)
    {
      char* tmp=*a;
      *a=*b;
      *b=tmp;
    }
    

    Zweitens: Noch einmal: C-Strings vergleicht man mit strcmp:

    if(strcmp(arr[t],arr[t+1]>0)
      tausche(arr[t],arr[t+1]);
    

    Drittens: Die STL bietet mehr als nur "Anweisungen" - das ist eine komplexe Sammlung aus Containerklassen, Algorithmen, etc.



  • danke für die Hilfe. Endlich funktioniert es


Anmelden zum Antworten