Zeiger

Liebes Forum!

Ich benutze in einer Klasse einen char* der auf Speicher verweist, in dem Text steht. Jetzt kann es aber sein, dass ich nur einen einzeiligen Text manchmal aber auch einen mehrzeiligen Text verwenden möchte. Es ist mir wichtig, dass ich bei einem mehrzeiligen Text, jede Zeile möglichst einfach ansprechen kann. Ist es möglich einen char* auch als char** zu verwenden (evt. casten) ?

mfg dixxi

Hallo Dixxi!

Ist es möglich einen char* auch als char** zu
verwenden (evt. casten) ?

Nein, ist es nicht, während dein Ansinnen sehr verständlich ist. Ich würde das so machen:

vector dieZeilen;
// und die einzelnen Zeilen rein schieben:
dieZeilen.push\_back( new char[128] );

Später kannst Du sie dann mit

int i;
for (i=0; i 
wieder kriegen. Text rein schreiben geht dann auch ganz ähnlich, wenn Du nicht ohnehin die Rückgabe einer Funktion in den Vector rein schiebst.

lG
Martin B

Howdy,

vector dieZeilen;
// und die einzelnen Zeilen rein schieben:
dieZeilen.push_back( new char[128] );

was aber, wie auch die Ursprungslösung später Probleme machen kann, wenn man keinen entsprechenden Copy-Constructor und Assignment operator vereinbart hat.

Deshalb hier besser

std::vector m\_dieZeilen;
...
m\_dieZeilen.push\_back(sValue);
...
m\_dieZeilen.push\_back(sValue);

wobei sValue der jeweiligen Zeileninhalt ist, der eingefügt werden soll. Spaeter muss dann natuerlich als m_dieZeilen[i] bzw. m_dieZeilen[i].c_str() zugegriffen werden. Falls man die Anzahl N der Zeilen im voraus weiss, empfiehlt sich ein m_dieZeilen.reserve(N) vor dem ersten push_back().

Gruss
norsemanna

Hallo

Ich benutze in einer Klasse einen char* der auf Speicher
verweist, in dem Text steht. Jetzt kann es aber sein, dass ich
nur einen einzeiligen Text manchmal aber auch einen
mehrzeiligen Text verwenden möchte. Es ist mir wichtig, dass
ich bei einem mehrzeiligen Text, jede Zeile möglichst einfach
ansprechen kann. Ist es möglich einen char* auch als char** zu
verwenden (evt. casten) ?

Man könnte, wenn es in blankem C sein soll, so etwas
basteln, z.B. so ähnlich (make_strarray) wie:

#include 
#include 
#include 

 char \*\*make\_strarray(char str[], int \*z);
 void delete\_strarray(char \*\*a, int z);

 int main()
{
 char string[] = 
 "Zeile 1 \n"
 "Zeile 2 \n" 
 "Zeile 3 ";

 char \*\*strings;
 int i, n;

 strings = make\_strarray(string, &n);
 
 printf("%d Zeilen gefunden\n", n);
 for(i=0; i

Grüße

CMБ

Hallo

Ich benutze in einer Klasse einen char* der auf Speicher
verweist, in dem Text steht. Jetzt kann es aber sein, dass ich
nur einen einzeiligen Text manchmal aber auch einen
mehrzeiligen Text verwenden möchte. Es ist mir wichtig, dass
ich bei einem mehrzeiligen Text, jede Zeile möglichst einfach
ansprechen kann. Ist es möglich einen char* auch als char** zu
verwenden (evt. casten) ?

Man könnte, wenn es in blankem C sein soll, so etwas
basteln, z.B. so ähnlich (make_strarray) wie:

#include
#include
#include

char **make_strarray(char str[], int *z);
void delete_strarray(char **a, int z);

int main()
{
char string[] =
„Zeile 1 \n“
„Zeile 2 \n“
"Zeile 3 ";

char **strings;
int i, n;

strings = make_strarray(string, &n);

printf("%d Zeilen gefunden\n", n);
for(i=0; i

Erst mal vielen Dank für diese Lösung, auch wenn sie mein Problem noch nicht ganz aus dem Weg schafft. Vielleicht ist es in meinem Fall sogar besser von vornherein ein zwei dimensionales Array zu benutzen und lediglich die erste Zeile zu verwenden.

Dazu noch schnell eine Frage:
Wie sehen zwei dimensionale Arrays im Speicher (eindimensional) aus? Liegen hier einfach die Zeilen nacheinander in einer Kette im Speicher? Wäre interessant damit ich nacher meinen Stringcontainer auch noch dynamisch gestalten kann. (realloc)

mfg dixxi

Hallo

Erst mal vielen Dank für diese Lösung, auch wenn sie mein
Problem noch nicht ganz aus dem Weg schafft. Vielleicht ist es
in meinem Fall sogar besser von vornherein ein zwei
dimensionales Array zu benutzen und lediglich die erste Zeile
zu verwenden.

Schwer zu sagen, so lange Du Dein Problem nicht nennst.

Dazu noch schnell eine Frage:
Wie sehen zwei dimensionale Arrays im Speicher
(eindimensional) aus? Liegen hier einfach die Zeilen
nacheinander in einer Kette im Speicher? Wäre interessant
damit ich nacher meinen Stringcontainer auch noch dynamisch
gestalten kann. (realloc)

So wie Du willst. Entweder zusammenhängend zeilenweise
oder zusammenhängend spaltenweise oder zeilen/spalten-
weise unzusammenhängend.

Das normale

char[3][3]

liegt so im Speicher, daß jeweils der hintere
(äußere) Index bei [0] einen „Zeilenblock“ startet,
der - so oft wie der vordere (innere) Index bestimmt -
jeweils direkt hintereinanderliegende Zeilenblöcke liefert:

char[0][0] -\> startet Zeile 1 -\> bis char[0][2]
char[1][0] -\> startet Zeile 2 -\> bis char[1][2]
char[2][0] -\> startet Zeile 3 -\> bis char[2][2]

Grüße

CMБ

Schwer zu sagen, so lange Du Dein Problem nicht
nennst.

Na gut:
Ich habe eine Klasse cEdit die im Endeffekt ein Edit-Control wie das von Windows werden soll. In diesem Edit-Control steht dan natürlich Text (kann mit Tastatur hineingeschrieben werden, editiert werden, etc.) Das ganze soll dan über OpenGL gezeichnet werden. Jetzt verwende ich dieses und andere Controls in einem meiner Projekte um ein Consolenfenster darzustellen, dass so aussieht wie das in CS 1.6. Soweit funktioniert alles. Befehle, die über das Edit eingegeben werden, werden korrekt gezeichnet und umgesetzt. Jetzt soll aber im großen Edit über der Eingabezeile einiges gelogt werden. Zum Beispiel sollen alle eingegebenen Befehle aufgezeichnet werden. Alle Befehle aus Configurationsdatein sollen beim parsen aufgelistet werden. etc. Wenn das Programm dan länger läuft, wird der Text in diesem Log-Edit schnell mal einige hunderte Zeilen lang. Deswegen hat mein Edit einen Scrollbar. Jetzt soll es aber so sein, dass abhängig von der Position des Schiebereglers im Scrollbar ein gewisser Ausschnitt des Textes im Log-Edit gezeichnet werden soll. Der ganze Text liegt übrigens in einem eigens programmierten Stringcontainer, der letztendlich einen char* auf einen allokierten Speicher mit dem Text einthält. Ich kann jetzt einen normalen String verwenden und bei jedem ‚\n‘ in die nächste Zeile wechseln. Wenn jetzt mein Text (Log) aber 1000 Zeilen hat und in das Log-Edit aber nur 13 Zeilen gezeichnet werden können, müssen nur Zeile 987 - 1000 gezeichnet werden. Einen elendslangen eindimensionalen String in Zeilen abhängig von den ‚\n‘ umzurechnen und das ganze 60 mal pro Sekunde wäre meines Erachtens ein bisschen aufwendig. Deshalb wäre es einfacher über den Index in einem zweidimensionalen Array auf die einzelnen Zeilen zugreifen zu können. Jetzt muss ich meinen Stringcontainer dementsprechnen umprogrammieren. Die Edit Klasse soll aber trotz allem nur einen Member DString (mein Stringcontainer) haben. Jetzt muss meine DString Klasse so umprogrammiert werden, dass sie für einen String als auch für ein Array aus Strings gerüstet ist. Ein Array aus DStrings ist möglich, hat aber den Nachteil, dass wegen der dynamischen Speicherverwaltung (Bei jeder Eingabe wird der Platzverbrauch berechnet und in 1024-Byte-Schritten Speicher hinzugefügt oder freigegeben) sehr viel Speicher benötigt wird. Bei 1024 Zeilen wäre dass schon 1 MiB. So und jetzt bin ich da, wo ich bei meinem ersten Post war. Eine Klasse DString in die man einen oder mehrere Strings packen kann und die man möglichst effizient dort Speichern und abrufen kann.

mfg dixxi