**char dynamisch allokieren?!



  • folgendes:

    char **queue;
    *queue = new char[13];
    

    da bekomm ich ein segmentation fault?! jemand ne erklärung? ich könnte auch

    char *queue;
    queue = new char[13];
    

    machen, aber dann bekomm ich bei späteren aufrufen von sowas hier:

    queue[posinsert] = new char (strlen(pufferfeld));
    

    immer invalid conversion from 'char*' to 'char' 😞

    kann mir da jemand weiterhelfen wie ich das sonst realisieren kann?



  • // 10*10 Feld allokieren:
    
    char** feld = new char [10];
    for(int i = 0; i < 10; ++i)
        feld = new char [10];
    

    Was soll das hier bewerkstelligen:

    // Einem char* einem char zuweisen der mit strlen(pufferfeld) initialisiert wird
    queue[posinsert] = new char (strlen(pufferfeld));
    
    // Ich glaube du meintest soetwas:
    queue[posinsert] = new char [strlen(pufferfeld)];
    

    BTW: Seit wann ist eine queue ein char**?

    MfG SideWinder



  • icies schrieb:

    folgendes:

    char **queue;
    *queue = new char[13];
    

    da bekomm ich ein segmentation fault?! jemand ne erklärung?

    Hier greifst du auf Speicher zu, der dir nicht gehört.
    Du hast einen Zeiger-auf-Zeiger-auf-char namens queue definiert. Dieser ist uninitialisiert, zeigt also irgendwo hin.

    In der nächsten Zeile dereferenzierst du deinen Zeiger (*queue ist das selbe wie queue[0]) und weist dem Ergebnis das Ergebnis von new char[13] zu. Durch die Dereferenzierung landest du aber im Nirgendwo. In deinem Fall in einem Bereich den das BS vor unbefugten Zugriffen schützt - glück für dich.

    Lösung: Du brauchst Speicher:

    char** queue = new char*[13]; // 13 Zeiger auf char
    // oder einfach:
    char* queue[13];
    
    // und später - posinsert ist hoffentlich < 13
    queue[posinsert] = new char [strlen(pufferfeld)];
    


  • ich weiß ja nicht was du da allokieren willst, aber probier's mal mit

    *queue = new char * [13];
    

    statt

    *queue = new char [13];
    

    z.B.:

    char ** queue;
    *queue = new char * [13];
    for(int row=0; row<13 ;row++){
        queue[row] = new char[anzahlSpalten];
    }
    

    post scriptum

    //Speicher freigeben nicht vergessen ;) 
    for(int row=0; row<13 ;row++){							
        delete []queue[row];
    }
    delete []queue;
    


  • dankee, funzt jetzt mit dem new char*[13]

    aber mir is nicht recht klar, was dort gemacht wird 😕

    für die interessierten, es soll eine dynamische speicherverwaltung gemacht werden mit einer warteschlange! sind aber noch n paar schönheitsfehler drin ..

    #include <iostream>
    #include <string.h>
    
    using namespace std;
    
    void showmenu () {
    	cout << "i(n)it, (i)nsert, (d)elete, (c)lear all, (p)rint all, print an(z), queue (a)endern (e)xit\n";
    }
    
    int main() {
    
    	int anz = 0;
    
    	char **queue;
    	queue = new char*[13];
    
    	unsigned int posinsert = 0;
    	int posremove = 0;
    	int count, select, initqueue;
    
    	int i = 1, j;
    	cout << "         #################################" << endl;
    	cout << "         #### Zyklische Warteschlange ####" << endl;
    	cout << "         #################################" << endl;
    	while (i != 0) {
    		char input;
    		//cout << "Bitte waehlen Sie einen Menuepunkt aus:\n\n"; 
    		showmenu ();
    		cin >> input;
    		getchar();
    		switch(input) {
    			case 'n':
    				delete [] queue;
    				cout << "Wie gross soll die Queue werden? " << endl;
    				cin >> initqueue;
    				//char *queue;
    				queue = new char*[initqueue];
    			break;
    
    			case 'i':
    				if (posinsert == 13) {
    					posinsert = 0;
    					cout << "Posinsert wurde inkrementiert und somit zurueckgesetzt" << endl;
    				}
    				if (anz == 13) cout << "Queue ist voll" << endl;
    				else {
    					cout << "Bitte geben Sie einen String ein: ";
    					char pufferfeld[30];
    					cin >> pufferfeld;
    					queue[posinsert] = new char [strlen(pufferfeld)];
    					strcpy(queue[posinsert], pufferfeld);
    
    					anz++;
    					posinsert++;
    				}
    
    			break;
    
    			case 'd':
    				if (posremove == 13) 
    					posremove = 0;
    				if (anz == 0)
    					cout << "Es gibt keine Elemente zum loeschen" << endl; 
    				else {
    					queue[posremove] = "";
    					posremove++;
    					anz--;
    					cout << "Item geloescht" << endl;
    				}	
    
    			break;
    
    			case 'c':
    				if (anz != 0) {
    					for(count = 0; count <= anz; count++) {
    						queue[count] = "";
    					}
    				} else {
    					cout << "Die Queue is noch leer !!! " << endl;
    				}
    				cout << "Alle Items geloescht" << endl;
    				anz = 0;
    				posinsert = 0;
    				posremove = 0;
    
    			break;
    
    			case 'p':
    				for (j = 0; j < 13; j++) {
    					cout << (j+1) << " : " << queue[j] << endl;
    				}	
    			break;
    
    			case 'z':
    				cout << "Die Queue besitzt " << anz << " Elemente" << endl; 
    			break;
    
    			case 'a':
    
    			case 'e':
    				cout << "Ende\n";
    				i = 0;
    			break;
    
    			default:
    				cout << "Falsche Eingabe\n";
    			break;
    		}
    	}
    
    }
    

    hatte schonma was drüber gepostet, aber das hat sich dann erledigt! 🙄



  • - new char* [13] wieder löschen
    - queue auf 0 setzen
    - bei jeder operation zuerst auf queue!=0 prüfen
    - bei 'n' der queue mit new char* [anzahl] speicher zuweisen
    - jedem element speicher zuweisen
    - ansi-c-strings (char*) niemals mit = zuweisen
    - stattdessen strcpy(queue[pos],STR); machen
    - dazu muss aber wie gesagt jedem element (siehe meine for-schleife oben) speicher zugewiesen werden
    - viel einfacher wäre es die elemente als std::string zu realisieren, das sind c++-strings die sich um den speicher selbst kümmern dann hast du mehr zeit für die queue selbst und musst dich nicht mit char* rumschlagen
    - wäre dann std::string* queue = new queue [size]; und fertig, ist auch kein zeiger-auf-zeiger dabei

    MfG SideWinder



  • SideWinder schrieb:

    // 10*10 Feld allokieren:
    
    char** feld = new char [10];
    for(int i = 0; i < 10; ++i)
        feld = new char [10];
    

    MfG SideWinder

    Falsch.

    freshman schrieb:

    ich weiß ja nicht was du da allokieren willst, aber probier's mal mit
    C/C++ Code:
    *queue = new char * [13];

    z.B.:
    C/C++ Code:
    char ** queue;
    *queue = new char * [13];
    for(int row=0; row<13 ;row++){
    queue[row] = new char[anzahlSpalten];
    }

    Auch falsch.

    HumeSikkins schrieb:

    C/C++ Code:
    char** queue = new char*[13]; // 13 Zeiger auf char
    // oder einfach:
    char* queue[13];

    // und später - posinsert ist hoffentlich < 13
    queue[posinsert] = new char [strlen(pufferfeld)];

    Richtig.



  • Oha stimmt, da fehlt ein Sternchen.

    MfG SideWinder



  • Na ja, aber noch besser wäre doch hier vector<string> einfach nur... Oder eben queue<string>, dann wäre sogar der Name berechtigt. 😃



  • Ich glaube kaum, dass ihm queue<string> sehr viel beim Verständnis von Datenstrukturen hilft 🤡

    MfG SideWinder



  • so habs jetzt soweit mal alles abgeändert, mir fehlt jetzt noch folgendes!

    es soll einen menüpunkt geben, um die länge der warteschlange zu ändern!

    also z.b folgendes ist schon so:

    char **queue;
    queue = new char*[5];
    

    jetzt soll aber z.b die queue um 2 erhöht werden, auf 7! Das problem daran dass die einträge in der warteschlange erhalten bleiben sollen?!

    ich hab da kein plan wie man das mit new realisieren soll? gibt es da ne alternative?

    also dies hier hab ich ma, aber is halt falsch mit new, weil mir echt nix anderes einfällt 😕

    cout << "wieviel an die queue anhängen?" << endl;
    cin >> initq2;
    queue = new char*[initq1+initq2];
    

    jemand ne idee?



  • du musst neu auf nen tmpzeiger allokieren... dann die alten werte kopieren, dann den alten speicher löschen und den arrayzeiger auf den tmpzeiger zeigen lassen



  • @interpreter: sorry, hast natürlich recht! ein sternlein zu viel 😞



  • du musst neu auf nen tmpzeiger allokieren... dann die alten werte kopieren, dann den alten speicher löschen und den arrayzeiger auf den tmpzeiger zeigen lassen

    hmm wenn ich das so richtig verstehe funktionieren dann aber doch die anderen menüelemente nicht mehr?!
    oder ich allokiere einen tmpzeiger mit dem neuen wert, schreib die werte da rein, allokiere dann queue neu und kopier wieder zurück?! umständlich oder??


Anmelden zum Antworten