string-array erstellen aber mit char*
-
hallo community,
also ich benutzt den devc++ compiler und dort ist es nicht möglich string als datentyp zu verwenden.
Daher benutzt ich char* var;
was eigentlich das selbe ist
nunja jetzt möchte ich aber ein stringarray erstellen und das dann dynamisch erweiterenalso habe ich mir gedacht mache folgendes:
char *menuPunkt[0]; //einzelne Menüpunktedann habe ich eine methode in meiner klasse, die einen neuen menüpunkt erzeugt
/***| neuer Menüpunkt |*/
void Cmenu::set_menupunkt(char punkt)
{
anzMenupunkt++;
menuPunkt[anzMenupunkt]=(char) malloc((strlen(punkt)+1)*sizeof(char));
}aber irgendwie funktioniert das nicht so.
ich will halt, dass wenn ich einen neuen menupunkt erstellen ein neuer index dazu kommt
aber halt alles dynamisch, damit der speicherplatz klein bleibt
hoffe ihr versteht mein anliegen, bekomme hie rnoch ne krise:)danke für jede antwort
bye
-
nimm std::vector, das erspart dir viel Zeit und Arbeit

#include <vector> std::vector<char*> menuepunkte; //... void neuerMenupunkt(char* punkt) { menuepunkte.push_back(punkt); }
-
swissboy schrieb:
hallo community,
also ich benutzt den devc++ compiler und dort ist es nicht möglich string als datentyp zu verwenden.Dev-C++ ist eine IDE, kein Compiler. Der ist wahrscheinlich MinGW und hat (wie jeder C++-Compiler) sehr wohl einen "Datentyp" für Strings, wenn auch nicht fest eingebaut. Du musst dafür den entsprechenden Header mit "#include <string>" einbinden, dann steht dir std::string mit all seinen Bequemlichkeiten zur Verfügung.
Zu Menüs: http://www.c-plusplus.net/forum/viewtopic-var-t-is-152690.html
Lern mal fleißig weiter C++ (!) und schau dir die Standardbibliothek genauer an.
-
ich glaube ihr versteht nicht mein problem
das mit den strings ist ja egal
da gibt es haufen mthoden die zumachen
mir geht es um die speichererweiterung.
damit haut es nicht ganz hin
ich habe am anfang nur ein index
aber bei jedem neuen menüpunkt soll ein index dazu kommenhoffe wisst wie ich das meine
byee
-
Erstens: Dein Array ist null Elemente lang - da passt nichtmal ein String rein (auch wenn Du für den String selbst noch so viel Speicher reservierst).
Zweitens: Es ist garantiert, dass sizeof(char) eins ist.
Drittens: In C++ nimmt man new/delete (und in C castet man den Rückgabewert von malloc nicht)Wenn Du auf dem Gewurschtel bestehst, musst Du vorher für den Array selbst Speicher reservieren, und dann für jedes Element nochmal:
char** menuPunkt = 0; int anzMenuPunkt = 0; { char** newMenuPunkt = new char*[ anzMenuPunkt + 1 ]; std::copy( menuPunkt, menuPunkt + anzMenuPunkte, newMenuPunkt ); menuPunkt[ anzMenuPunkt ] = new char[ std::strlen( punkt ) + 1 ]; std::strcpy( menuPunkt[ anzMenuPunkt ], punkt ); delete[] menuPunkt; menuPunkt = newMenuPunkt; ++anzMenuPunkt; }Aber std::string und std::vector machen die Sache bissi einfacher

-
Hmm das ist immer ein widerliches Zeigergeschubse...
naja ... es geht aber so:
class CMenu { public: void AddItem(const char* const); private: char** m_ppszItems; unsigned short m_nItemCount; //... }CMenu::CMenu(void) : m_nItemCount(0), m_ppszItems(NULL) { } CMenu::~CMenu(void) { if (m_ppszItems != NULL) { delete [] m_ppszItems; m_ppszItems = NULL; } m_nItemCount = 0; }So ... damit haben wie eine Variable die die Anzahl der Items zählt und eine die auf die zeigt ... im Destruktor räumen wir halt wieder auf ...
void CMenu::AddItem(const char* const lpszItem) { char** ppszTmp = NULL; // Temp char pointer pointer if (m_ppszItems != NULL) // Haben wir schon Items? { ppszTmp = new char*[m_nItemCount]; // ja also tmp genauso groß wie den momentanen machen ... memcpy(ppszTmp, m_ppszItems, sizeof(char*) * m_nItemCount); // alles rüberkopieren } delete [] m_ppszItems; // den alten löschen m_ppszItems = new char*[m_nItemCount + 1]; // einen um 1 größeren erstellen if (ppszTmp != NULL) // wenn schon items da waren diese jetzt wieder reinkopieren memcpy(m_ppszItems, ppszTmp, sizeof(char*) * m_nItemCount); delete [] ppszTmp; // tmp wieder freigeben unsigned int nLen = (unsigned int)lstrlen(lpszItem) + 1; // die länge des hinzuzufügenden char-arrays ermitteln (+ 1 für '\0') m_ppszItems[m_nItemCount] = new char[nLen]; // nen char array mit dieser größe anlegen memcpy(m_ppszItems[m_nItemCount], lpszItem, nLen); // da dann den string im mem reinkopieren ... ++m_nItemCount; }Damit wird nen Item hinzugefügt...
[edit]
zu spät
[/edit]