char PROGMEM bmp01 [][6] = {
{0x00, 0xfe, 0xde, 0xde, 0xee, 0xee},
......
}
jest typu char[][6], przy czym wielkosc jest dobierana automatycznie przez kompilator, np. char[150][6]
dosłownie rozumiejąc, "wskaznik na to" jest typu char (*)[150][6], a zapis z nazwa:
char (*nazwa)[150][6] = &bmp01;
przy czym uwaga, jest to wskaznik na tę zmienna bmp01, a nie na tablicę o którą Ci chodzi, co zreszta widac w kodzie po ampersandzie
wskaznik na ową tablicę ma zaś typ: char (*)[6], czyli po prostu typ mowiaci 'adres elementu tablicy':
char(*nazwa)[6] = bmp01
jesli teraz chcesz miec tablice takich wskaznikow, bedzie to:
char(*nazwa[])[6] = { bmp01, bmp02, bmp03 }
i bedzie mialo w tym przykladzie typ: char([3])[6] -- tablica trzech elementow typu char()[6] (wsk-na-tablice)
i wlasnie dlatego kompilator krzyczy przy probie uzycia winterfresh'owej x**[], poniewaz taka deklaracja twierdzi ze typ elementu to x** (wsk-na-wsk) a nie (wsk-na-tab)
c++ jest dokladny w tej kwestii i jest to ERROR nie WARNING
char bmp01 [][6] =
{
{0x00, 0xfe, 0xde, 0xde, 0xee, 0xee},
{0xee, 0xfe, 0xf6, 0xf6, 0xf6, 0xf6},
{0xf6, 0xf6, 0xf6, 0xf6, 0xf6, 0xf6},
...i jeszcze 6, razem 9
};
char bmp02 [][6] =
{
{0x00, 0xfe, 0xde, 0xde, 0xee, 0xee},
{0xee, 0xfe, 0xf6, 0xf6, 0xf6, 0xf6},
{0xf6, 0xf6, 0xf6, 0xf6, 0xf6, 0xf6},
..i jeszcze 2, razem 5
};
char (*nazwa1[])[6] = { bmp01, bmp02 }; // OK
char** nazwa2[] = { bmp01, bmp02 }; // ERROR:
error C2440: 'initializing' : cannot convert from 'char [9][6]' to 'char **'
error C2440: 'initializing' : cannot convert from 'char [5][6]' to 'char **'
Types pointed to are unrelated; conversion requires reinterpret_cast, C-style cast or function-style cast</cpp>