Dynamische Speicherverwaltung....



  • ne das geht ja ned.....denn wenn man dem script eine feste länge der variablen gibt kann man die auch nicht mehr ändern...zumindestens nicht wärend das programm läuft....darum soll erst gefragt werden wie lang das array sein soll und dann wird es erstellt....nur wie?



  • LordSash schrieb:

    ne das geht ja ned.....denn wenn man dem script eine feste länge der variablen gibt kann man die auch nicht mehr ändern...zumindestens nicht wärend das programm läuft....darum soll erst gefragt werden wie lang das array sein soll und dann wird es erstellt....nur wie?

    Jetzt verstehe ich nichts mehr. Du hast das doch alles schon in deinem Programm.
    Du hast nirgends gesagt dass du die länge aller strings abspeichern willst. (wozu auch du hast ja die strings ) du wolltest ja nur wissen wie lange der längste ist



  • achso dann schein ich das etwas falsch formuliert gehabt zu haben 😞

    Also, wären das Progrmam läuft soll abgefragt werden wie lang der längste name ist und dann die länge des Arrays erstellt werden...also das array was jetzt erstellt wird hat ja eine feste länge von 30 zeichen.....dies soll aber auch dynamisch gemacht werden das abgefragt wie viele speicherplätze dafür resaviert werden....zB. sagt der User dann ich möchte 4 Namen eingeben mit einer maximal länge von 10 zeichen.....so in edwa



  • Ah so

    int n,l,i,j;
           char (**namen),*puffer;
    
           cout << "Wie viele Namen moechten sie eingeben? ";
           cin >> n;
           cout << "Wie lange sollen die Namen werden? ";
           cin >> l;
           cin.ignore();
    
           puffer = new char[l+1];
           namen = new char[n][l+1];
           for(i=0;i<n;i++){
                   cout << "Geben Sie den " << i+1 << "ten Namen ein => ";
                   cin.getline(namen[i],l+1);
           }
    


  • Die Länge des längsten Strings ist für das Array unerheblich, die Strings müssen nicht alle gleichlang sein.

    char** namen = new char*[n];
    

    Stattdessen kannst du das ganze in der Schleife über den Buffer machen:

    cin.getline (puffer, 30);
    strcpy (namen[i] = new char[strlen (puffer) + 1], puffer);
    namen[i][strlen (puffer) + 1] = '\0';
    

    Das muss nicht komplett richtig sein, aber du fragst ja auch mit dem cstring Kram an der falschen Stelle ;). Eigentlich gehörts so:

    #include <iostream>
    #include <queue>
    #include <string>
    #include <functional>
    
    int main ()
    {
        std::priority_queue<std::string, std::vector<std::string>, std::greater<std::string> > namen;
    
        for (int i = 1; ; ++i)
        {
            std::cout << i << "ten Namen eingeben:";
            std::string s;
            getline (std::cin, s);
            if (s == "") break;
            else namen.push (s);
        }
    
        for (int i = 1; !namen.empty () ; ++i)
        {
            std::cout << "Der " << i << "te Name ist " << namen.top () << std::endl;
            namen.pop ();
        }
    
        return 0;
    }
    

    :xmas1:



  • hm das mag er wohl nicht so ganz?
    ich bekomme vollgende Fehlermeldung:

    D:\Coden\cpp\schule\test2.cpp(19) : error C2540: Kein konstanter Ausdruck als Feldgrenze
    D:\Coden\cpp\schule\test2.cpp(19) : error C2440: '=' : 'char (*)[1]' kann nicht in 'char ** ' konvertiert werden
    Die Typen, auf die verwiesen wird, sind nicht verwandt; die Konvertierung erfordert einen reinterpret_cast-Operator 
    oder eine Typumwandlung im C- oder Funktionsformat
    

    @filmor
    funktionen hatten wir noch nicht...wenn ich die nu mit einbau meckert mein Lehrer nur wieder rum....



  • Ich seh da keine Funktionen (der Header <functional> ist was anderes), aber das untere war eh nur als "reine" C++-Lösung ohne C-Header gedacht. So würde ich es zumindest machen. Das für dich interessante steht darüber.



  • Ich bin ganz zerknirscht. Das geht so natürlich nicht.

    namen = new char*[n];
           for (int idx= 0; idx < n; ++idx )
               namen[idx] = new char[l+1];
    

    freigeben:

    for (int idx= 0; idx < n; ++idx )
               delete [] namen[idx];
           delete [] namen;
    


  • ZuK schrieb:

    Ich bin ganz zerknirscht.

    Zu recht :xmas2:



  • aahhhh...alles klar so gehts....hätte ich auch selber drauf kommen können 😞

    naja recht vielen dank an euch beide 👍

    :xmas1:


Anmelden zum Antworten