DynamicArray<char*>



  • Hallo ich habe ein Problem mit nem dynamischen Array.

    mein Code sieht so aus :

    DynamicArray<char*> cStrings;
    cStrings.Length++;
    cStrings[0][0] = 't';

    Es kommt aber die Fehlermeldung:
    EAccessViolation (versucht, auf eine Speicheradresse zuzugreifen, für die der Anwendung kein virtueller Speicher zugewiesen wurde)

    Kann mir bitte einer helfen ??
    Gruß Thomas



  • 1. Codetags
    2. Mehr Code
    3. Welche Bibliotheken?

    Desweiteren versuchst du mit xx[0][0] auf einen undefinierten Bereich zuzugreifen. Ich kenn DynamicArray<T> nicht, da du aber nur die Länge veränderst, reservierst du so nur Platz für einen char*. Und dieser zeigt wild in die Gegend und da versuchst du dann beliebig drin herumzukritzeln?



  • Wo hast du denn dieses "DynamicArray<>" her?

    Aus dem Fragment ist schonmal ersichtlich, daß die Klasse entweder miserabel (interne Daten wie "Length" sollten nicht direkt von außen erreichbar sein, dafür gibt es Getter/Setter) oder genial (wenn sich die Anweisung "cStrings.Length++" tatsächlich um die Speicherreservierung kümmern sollte) designt ist.
    Wenn der Length++ Aufruf tatsächlich das Array vergrößert, hast du aber immer noch das Problem, daß niemand das Element cStrings[0] auf eine gültige Adresse umbiegt - und das zu dereferenzieren führt zum Absturz (wobei ich vermute, daß schon der Zugriff auf cStrings[0] schiefgehen dürfte).



  • Sorry hab vergessen dazu zu schreiben, dass ich mit dem Borland C++ Builder arbeite. Er sagt in der Hilfe nämlich das hier:

    Beschreibung
    Ein dynamisches Array ist eine größenveränderliche Kollektion, die als Array implementiert ist. C++Builder stellt zu diesem Zweck die Vorlage DynamicArray zur Verfügung. Diese Vorlage verwendet ein binäres Layout, das zur Implementierung dynamischer Arrays von Delphi kompatibel ist. So können Sie dynamische Arrays, die sowohl zu Delphi als auch zu C++Builder kompatibel sind, in Pascal und in C++ Code verwenden.

    Länge dynamischer Arrays
    Die Größe eines DynamicArray kann über die Eigenschaft Length festgelegt oder abgerufen werden:

    DynamicArray<int> arrayOfInt;
    arrayOfInt.Length = 10;
    cout << "ArrayLength: " << arrayOfInt.Length << endl;

    Um ein DynamicArray freizugeben, weisen Sie ihm die Länge 0 zu.

    Zugriff auf Daten
    Der Zugriff auf die Elemente eines dynamischen Arrays erfolgt über den Indizierungsoperator []:

    void InitArray(DynamicArray<char> &c_array)

    {
    c_array[0] = 'A';
    c_array[1] = 'B';
    cout << "Third char is: " << c_array[2];
    }

    Danke übrigens schonmal für die Antworten!!



  • Okay, aber du verwaltest mit dem DArray ja nur char*. Und diese zeigen eben nirgends hin. Da müsste dann in etwa sowas stehen wie cString[0] = new char[1024];
    Und dann kannst du cString[0][0] = 'x'; oder sowas machen, weil cString[0] dann auf einen gültigen Speicherbereich verweist.

    Der Kompatibilität wegen, solltest du aber eher std::vector verwenden.

    EDIT: Und wenn nichts dagegen spricht std::string statt char*.



  • OK, dann bringt die Längenänderung tatsächlich etwas - aber trotzdem mußt du die neu angelegten Elemente noch vernünftig initialisieren, bevor du etwas damit machen kannst:

    cString.Length++;
    cStrings[0] = new char[100];//da wirst du nicht herumkommen
    cStrings[0][0] = 't';
    ...
    delete[] cStrings[0];
    

    Aber der Borland Builder sollte auch Klassen zur Verwaltung von Strings haben.



  • Dieser Thread wurde von Moderator/in CStoll aus dem Forum C++ in das Forum VCL (C++ Builder) verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • Der Code

    cString.Length++;
    

    sollte nicht funktionieren. Ich hab zwar noch nie mit DynamicArray gearbeitet, aber wenn es wie alle anderen Borland-Klassen implementiert ist, dann ist Length eine __property und intern werden Getter/Setter verwendet. Ausgeschrieben wäre der Code dann:

    cString.getLength()++;
    

    was natürlich nix bringt. Wirkungsvoll hingegen ist:

    cString.Length=cString.Length+1;
    //Langform:
    cString.setLength(cString.getLength()+1);
    

    mfg
    xXx



  • Ich würde eher sagen vergiss DynamicArray und char* hier und nimm eines von denen:

    std::vector<std::string>
    std::vector<AnsiString>
    TStringList
    

    Ich tendiere mehr zum ersten davon.



  • Vielen Dank euch allen es hat nun dank eurer Hilfe funktioniert.


Log in to reply