dynamischer string array?



  • Hi,

    mein Problem besteht darin das die Größe meines String-Arrays erst während der Laufzeit feststeht. Ich hab dann sofort an einen dynamischen array gedacht. könnte mir das jemand mal kurz erklären?

    Mfg
    KingV1k



  • Hallo

    nimm besser gleich std::string.

    bis bald
    akari



  • versuch's doch mal mit std::vectorstd::string.

    Für genauere Erklärungen, was du damit machen kannst, empfehle ich dir im Magazin (recht weit unten hier im Forum) die Artikel "Aufbau der STL 1" und "Stringverarbeitung in C++".



  • danke eure tips probier ich gleich aus, aber in der zwischenzeit hab ich etwas selber probiert und das läuft nicht so wie ich es mir vorgestellt habe.

    privat:
    string *pArray;

    ....
    ....
    ....

    pArray = new string[name_counter]; //name_counter ist eine integer-variable die zur laufzeit generiert wird.
    string test = "test";

    for(int i=0; i<10; i++) //werte in den array laden
    {
    pArray[i] = test;
    }

    for(int j=0; j<10; ´j++) // ausgeben des arrays
    {
    cout<<pArray[j]<<endl;
    }

    Der Codeschnipsel ist einfach nur ein Test zum Erstellen von dynamischen Arrays. Und ich weiß das man das Problem auch mit einem normalen array lösen könnte. Aber da ich den originalen Code hie nicht einfügen darf, muss ich diesen Umweg gehen. Also mein Problem ist hierran das nichts ausgegeben wird. woran liegt das????

    Mfg
    KingV1k



  • Erstens: Wie groß ist name_counter? (wenn der Wert kleiner als 10 ist, bekommst du Probleme)

    Zweitens: Stehen die beiden Schleifen so direkt hintereinander? Wenn ja, solltest du dir das Programm mal im Debugger ansehen.



  • Der name_counter ist ca. 41 zeilen groß. wieso bekomm ich probleme, wenn er kleiner als 10 ist. Die beiden Schleifen stehen leider nicht so dicht aneinander.

    edit:
    sorry für meine blöde frage, hab dich grafeben falsch verstanden. 🙂



  • mein problem hat sich gelöst. ich hatte ein oferflow drinne. ich hab probiert ca 170 werte in mein array zu schreiben, obwohl er grad mal 41 groß ist. (das problem ließ sich lösen indem ich mir einen filter schrieb.)



  • KingV1k schrieb:

    Der name_counter ist ca. 41 zeilen groß. wieso bekomm ich probleme, wenn er kleiner als 10 ist.

    Weil du dann auf Speicherbereiche zugreifen würdest, die dir nicht gehören (das nennt sich "undefiniertes Verhalten" und kann alles mögliche bewirken).

    Die beiden Schleifen stehen leider nicht so dicht aneinander.

    Dann solltest du sie mal testweise direkt hintereinandersetzen. (die Fragmente, die du angegeben hast, sehen OK aus, also liegt der Fehler vermutlich in dem Code, der dazwischensteht)



  • also ich weiß ja nicht wie du das meinst. Aber im prinzip willst du doch das selbe wie ich auch oder?
    Bei mir ist das ein abgewandelter Ausschnitt aus einer Logfileclass...

    #include <cstdlib>
    #include <iostream>
    #include <stdio.h>
    #include <windows.h>
    
    using namespace std;
    
    void fTextout(const char *Text, ...);
    
    int main(void)
    {
        char Eingabe[50];       
        cin.get (Eingabe, 49);   // hier wird der String eingegeben
        int Zahl = 9;
        fTextout(Eingabe, Zahl); // der hier an die Funktion Textout übergeben wird
        system("PAUSE");         // man kann sogar %i reinschreiben dann setzt der (in der Laufzeit) 9 ein
        return EXIT_SUCCESS;
    }
    
    void fTextout(const char *Text, ...)
    {
         int counter;
         for(int i = 0; i < 25; i++)       // hier wird nun überprüft, wie lang der übergebene String ist...
         {
                 const char *plol = Text + i;
                 if(*plol == 0x00)
                 {
                          counter++;
                          break;
                 }
                 else
                 {
                     counter++;
                 }
         }
         char Buffer[counter];           // hier wird ein entsprechend großer Array erstellt
         va_list pArgList;
         va_start(pArgList, Text);
         vsprintf(Buffer, Text, pArgList);
         va_end(pArgList);
         cout << "\nBuffer: " << Buffer << endl << "Counter: " << counter << endl;
    }
    

    also doch im Prinzip das was du wolltest oder? Allerdings könnte es auch sein, dass das nur geht, weil Eingabe[50] vorher von der Größe her beschränkt ist.
    Des weiteren muss ich zu geben warum das obige funktioniert, aber nicht:

    int main(void)
    {
        int Groesse;
        cin >> Groesse;
        char Test[Groesse];
        return 0;
    }
    

    Compilieren funktioniert ja noch, aber sobald man die Eingabe macht ist es auch schon wieder vorbei =))

    mfg thecoolman



  • auto-arrays (also "am stack" angelegte arrays) mit nicht konstanter grösse sind ein c feature dass es in c++ nicht gibt.
    wenns trotzdem ein compiler compiliert dann kann ich auch nixe dafür 😉

    wie es funktionieren kann (also in c jetzt)? naja, gleich wie alloca() funktioniert. den stack pointer kann ich ja net bloss um eine konstatne verschieben, den kann ich ja auch um ne variable verschieben. was ihr immer alle so kompliziert denkt... 🙂


Anmelden zum Antworten