Zeiger auf Zeiger auf Zeiger auf char
-
Hallo Zusammen,
habe folgendes Problem.
Bin gerade dabei mir meine abgeleitete Parser Klasse zu optimieren.
Die Klasse zerlegt eine Dateizeile auf Bestandteile(Ascii Variabel)
und füllt die Arrays mit den werten.
Die Klassen Member sollen alle dynamisch gestaltet werden
das heißt:z bsp member char *line legt dynamisch die anzahl der zeilen
und legt zur laufzeit den speicher für die zeile fest etwa so:
//lege dynamisch die anzahl der strings der Membervariable zeile fest
CFileOperations::line=new char[CFileOperations::linecount+1];
//alokiere den speicher für die zeile
CFileOperations::line[nr]=new char[255];
Funzt prima!Jetzt kommt mein Problem.
Im nächsten Step möchte ich
einen Zeiger auf Zeiger auf Zeiger auf char definieren.
Dieser "füllt" die Variable mit den Felderwerten
Etwa so:
//Zeilenfeld alte Version! funzt prima
//char *linefield[2000][40];und so möchte ich es gerne haben:
//Zeilenfeld neue version soll
char ***linefieldIch kriege es aber nicht gebacken ,die anzahl der
spalten und die anzahl der auszulesenden datensätze in dieser
Konstellation auf dem Heap anzulegenJemand eine Idee?
wäre wie immer lieb!
epidemic
-
etwa so?
int x=10;
int y=20;
// wäre folgendes
// linefield[10][20] = ...
// wenn dein array 2000 "spalten" und 40 "zeilen" groß ist, dann kannst du so drauf zugreifen:(linefield+x+y2000) = ...
evtl. musst du x und y vertauschen, da ich nicht weiß, wie du draufzugreifen willst.
allerdings muss dein pointer trotzdem "nur" ein zeiger auf einen zeiger auf einen char sein (nicht dreimal) da du ein 2dimensionales array verwendest
pointer waren schon immer son geiles thema...
cu todo
-
Hi,
Vielen Dank für Deine Mühe!
Zugriff war allerdings nicht mein Problem.
Es ging mir mehr um Allokation.
So iss es kein Problem:
//Zeilenfelder pro zeile alte version
//char *linefield[2000][40];
//allok.
linefeld[0][2]=new char[bla bla];
//wet für zeile 1 spalte 3
ist zbsp. "test"
strcpy.....
iss aber nicht dynamisch!und so möchte ich es gerne haben:
//Zeilenfelder pro zeile neue version soll
char ***linefield
-
was willst du allokieren? wenn du pointer deklarierst, ist es doch klar, das noch kein speicher reserviert ist - im gegensatz dazu, wenn du arrays deklarierst. oder willst du das hier:
char ***line_ptr;
line_ptr = new char **[2000];
*line_ptr = new char *[40];nun kannst du mittels
((line_ptr+x)+y) = new char[...]
strcpy (((line_ptr+x)+y), "test");
x = 0...1999
y = 0...39cu todo
-
das ist doch irgendwie krank :o
-
Hi Jungs,
@todo: Danke für Deine Mühe ich werds ausprobieren.
@nix:
krank vielleicht auch, aber doch recht flexibel wenns läuft
epidemic
-
Habe es mittels einer Struktur gelöst.
Scheint mir übersichtlicher.Trotztdem , Danke!
struct SLines
{
char **zeilenfeld;
};typedef SLines *SListe;
SListe lines;
//anzahl der zeilen festlegen
lines=new SLines[3];//speicher für zeilenfelder pro Zeile
lines[0].zeilenfeld=new char*[10];//speicher pro feld
lines[0].zeilenfeld[0]=new char[10];
lines[0].zeilenfeld[1]=new char[10];
lines[0].zeilenfeld[2]=new char[10];
strcpy(lines[0].zeilenfeld[0],"test");
strcpy(lines[0].zeilenfeld[1],"test1");
strcpy(lines[0].zeilenfeld[2],"test2");//speicher für zeilenfelder pro Zeile
lines[1].zeilenfeld=new char*[10];lines[1].zeilenfeld[0]=new char[10];
lines[1].zeilenfeld[1]=new char[10];
lines[1].zeilenfeld[2]=new char[10];
strcpy(lines[1].zeilenfeld[0],"test11");
strcpy(lines[1].zeilenfeld[1],"test12");
strcpy(lines[1].zeilenfeld[2],"test13");//speicher für zeilenfelder pro Zeile
lines[2].zeilenfeld=new char*[10];lines[2].zeilenfeld[0]=new char[10];
lines[2].zeilenfeld[1]=new char[10];
lines[2].zeilenfeld[2]=new char[10];
strcpy(lines[2].zeilenfeld[0],"test11");
strcpy(lines[2].zeilenfeld[1],"test12");
strcpy(lines[2].zeilenfeld[2],"test13");MessageBox(NULL,lines[0].zeilenfeld[2],"",0);
MessageBox(NULL,lines[1].zeilenfeld[2],"",0);delete []lines;