An eine Array (char*) ein Element anhängen



  • Hallo!

    Danke für deine Antwort. Ich hatte schon befürchtet, dass ich dies nur mit umkopieren zu machen ist. Gibt es also keine Möglichkeit direkt hinter dem Array zusätzlichen Speicher zu bekommen, ohne dieses umkopieren zu müsssen?

    Kann man eigentlich einen Array verkleinern ohne diese umkopieren zu müssen?

    Viele Grüße
    pmw



  • pmw schrieb:

    Hallo!

    Danke für deine Antwort. Ich hatte schon befürchtet, dass ich dies nur mit umkopieren zu machen ist. Gibt es also keine Möglichkeit direkt hinter dem Array zusätzlichen Speicher zu bekommen, ohne dieses umkopieren zu müsssen?

    Das geht schon, nur soweit ich weiß nicht so 😉
    Nimm z.B. einen std::vector. Diesen kannst du genau wie ein normales Array nutzen, allerdings sehr viel komfortabler. D.h. z.B. das der Vektor sich selbst um die Speicherverwaltung kümmert.

    Kurzes Beispiel: (Ungetestet)

    #include <iostream>
    #include <vector>
    using namespace std;
    
    int main()
    {
         vector<char> arr(5); // Vektor mit 5 Elementen vom Typ char anlegen.
    
         // Vektor mit Werten füllen und ausgeben.
         for(unsigned int i = 0; i < arr.size(); ++i)
         {
                arr[i] = 'a' + i;
                cout << arr[i] << ", ";
         }
    
         // Drei Elemente an Vektor anhängen
         arr.push_back('x');
         arr.push_back('y');
         arr.push_back('z');
    
         // Erneute Ausgabe
         for(unsigned int i = 0; i < arr.size(); ++i)
               cout << arr[i] << ", ";
    
         return 0;
    }
    

    Zu Containern in diesem Falle speziell zu Vektoren lässt sich noch viel mehr sagen (z.B. bzg. Iteratoren; Dieses Beispiel sollte aber auch ohne funktionieren). Am besten mal in ein Tutorial/Buch deiner Wahl reinschauen.

    Kann man eigentlich einen Array verkleinern ohne diese umkopieren zu müssen?

    Viele Grüße
    pmw

    std::vektor hilft dir auch hier. Die Methoden heißen in diesem Falle pop_back() und erase(). Einfach mal darüber informieren.

    Caipi



  • Hi!

    Leider bin ich auf char* angwiesen, da das Konsolenprogramm auf jeden Fall kleiner als 100KB sein soll. Und wenn ich Vectoren benutze wird das Programm zu groß und außerdem sind Vectoren auch langsamer als eine char*-Array.

    Caipi schrieb:

    pmw schrieb:

    Gibt es also keine Möglichkeit direkt hinter dem Array zusätzlichen Speicher zu bekommen, ohne dieses umkopieren zu müsssen?

    Das geht schon, nur soweit ich weiß nicht so 😉

    Weiß jemand wie das geht?

    Viele Grüße
    pmw



  • Hallo Leute,

    char* ist ein Zeiger auf eine >konstante< Zeichenkette und kein Array.
    Ein Array ist so definiert: char ar[4];

    Eine Lösung habe ich gefunden in:

    Dietrich May: Grundlagen der Software-Entwicklung mit C++ (siehe bei Amazon)

    Wie der es gemacht hat weiss ich allerdings nimmer (zu lange her).

    Gruss Jerry 🙂



  • jerry schrieb:

    char* ist ein Zeiger auf eine >konstante< Zeichenkette und kein Array.

    Nein, dann ist es ein const char* .



  • Hi!

    Eine Lösung habe ich gefunden in:

    Dietrich May: Grundlagen der Software-Entwicklung mit C++ (siehe bei Amazon)

    Wie der es gemacht hat weiss ich allerdings nimmer (zu lange her).

    Hat jemand zufällig das Buch und weiß wie man einen einen Array (char*) verkleinert ohne diese umkopieren zu müssen?

    Viele Grüße
    pmw



  • Aus reiner Neugier nachgefragt. 😃

    Warum ist eine Programmgrösse von mehr als 100KB ein Problem. 😕



  • vector<char> kann man sehr wohl als char* verwenden -> &vec[0]
    vector ist nicht langsamer als ein mit new allokiertes array
    vector bläht den code nicht sonderlich auf, da es nur eine template klasse ist. was aufbläht ist die IO Library.

    man kann mit standardmitteln nicht schrumpfen/wachsen lassen ohne umzukopieren. einzig was möglich wäre, ist realloc zu verwenden. nur wird das meistens auch kopieren, weil um eine 'inplace' vergrößerung technisch durchführen zu können, muss ja auch genaug platz da sein.



  • Hallo!

    Ich programmiere zur Zeit einen Packer. Da man damit auch selbsextrahierende Archive erstellen kann, muss der Entpacker entsprechend klein sein. Ansonsten bringt das Packen ja nicht viel 😉 Daher sollte der Packer bzw. Entpacker nicht größer als 100KB werden.

    man kann mit standardmitteln nicht schrumpfen/wachsen lassen ohne umzukopieren. einzig was möglich wäre, ist realloc zu verwenden. nur wird das meistens auch kopieren, weil um eine 'inplace' vergrößerung technisch durchführen zu können, muss ja auch genaug platz da sein.

    Dass man beim Wachsen in der Regel den Array umkopieren muss ist logisch und leuchtet mir auch ein. Aber das Schrumpfen müsste doch theoretisch kein Problem sein. Wie geht das denn?

    Viele Grüße
    pmw



  • Weiß jemand Rat? Mir geht es nur noch darum, ein Array zu verkleinern. Also einen Teil des zugewiesen Speicher am Ende des Arrays freizugeben.


Anmelden zum Antworten