Auf Pointer als Array zugreifen



  • Hi,

    das ist ganz klar eine dumme Frage, aber ich sehe es gerade nicht. Ich möchte auf mehrere Lookup-Tables zugreifen können und will diese - je nach dem, welche verwendet werden soll - auf einen Pointer setzen, von dem aus dann auf die richtige LUT zugegriffen wird:

    // zuerst die Lookup-Table
    const unsigned char rainbow_table[256][3]={
                                               {131,0,255},
                                               {128,0,255},
                                               {125,0,254},
                                               ...}}
    
    // der Pointer, mit dem jeweils gerechnet werden soll
    unsigned char *m_falseColourTable;
    
    // Zuweisung der zu verwendenen LUT
    m_falseColourTable=rainbow_table;
    
    //Zugriff auf die LUT
    red=m_falseColourTable[*d][0]; c++;
    green=m_falseColourTable[*d][1]; c++;
    blue=m_falseColourTable[*d][2]; c++;
    

    *d ist die Graustufe im Bereich 0..255. Leider beschwert sich der Compiler in den letzten Drei zeilen aber jeweils mit

    error C2109: subscript requires array or pointer type

    Was habe ich übersehen? Seit wann kann ich auf einen Pointer nicht mehr mit Array-Indices zugreifen?

    Danke!



  • Dmpf schrieb:

    Was habe ich übersehen? Seit wann kann ich auf einen Pointer nicht mehr mit Array-Indices zugreifen?

    Kannst du doch. Bis hierher: m_falseColourTable[*d] geht auch alles gut, das Ergebnis ist ein unsigned char. Aber du willst darauf nochmal einen Index anwenden: m_falseColourTable[*d][0] -- das ergibt dann keinen Sinn mehr.

    Es ist also klar, dass "Zeiger auf unsigned char" nicht der richtige Typ ist. Du willst "Zeiger auf Array[3] von unsigned char":

    unsigned char (*m_falseColourTable)[3];
    


  • Bashar schrieb:

    unsigned char (*m_falseColourTable)[3];
    

    Was soll das bringen, der Zugriff wäre gleich zum Zugriff auf das Original-Array, das fehlende const mal ignoriert.

    const unsigned char rainbow_table[256][3]={
                                               {131,0,255},
                                               {128,0,255},
                                               {125,0,254},
                                               ...}}
    ...
    const unsigned char *m_falseColourTable=rainbow_table[*d];
    ...
    red=m_falseColourTable[0]; c++;
    green=m_falseColourTable[1]; c++;
    blue=m_falseColourTable[2]; c++;
    


  • Wutz schrieb:

    Bashar schrieb:

    unsigned char (*m_falseColourTable)[3];
    

    Was soll das bringen, der Zugriff wäre gleich zum Zugriff auf das Original-Array, das fehlende const mal ignoriert.

    Das ist ja auch so gewollt (das fehlende const mal ignoriert). Es gibt mehrere Original-Arrays, und der Zeiger wird am Anfang auf das richtige gesetzt.

    Deine Lösung dagegen geht an der Problemstellung vorbei.



  • Dmpf schrieb:

    Ich möchte auf mehrere Lookup-Tables zugreifen können und will diese - je nach dem, welche verwendet werden soll - auf einen Pointer setzen, von dem aus dann auf die richtige LUT zugegriffen wird:

    Klingt für mich stark nach Wutz Lösung. Es wird ein Zeiger auf eine "Farbe" erstellt.
    Bashar erstellt einen Zeiger auf das Original. Sollte dieser nicht verändert werden, um z.B. Farben zu durchlaufen, kann man genauso gut das Original verwenden.



  • Es gibt mehrere Colormaps, z.B. die Rainbow Colormap, aber, da die normalerweise nichts taugt, auch viele andere. Eine Colormap ist ein Array, das jedem Skalar (von 0 bis 255 im Beispiel) einen RGB-Farbcode zuweist. Der Code soll mit der Colormap parametrisiert werden, nicht mit der Farbe, was sollte auch der Sinn von letzterem sein?


Log in to reply