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 ***linefield

    Ich kriege es aber nicht gebacken ,die anzahl der
    spalten und die anzahl der auszulesenden datensätze in dieser
    Konstellation auf dem Heap anzulegen

    Jemand 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...39

    cu 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;


Anmelden zum Antworten