Problem/pytanie które przedstawię, wynika z zastosowania nowego toolchaina z ATmela (wcześniej na winAVR wszystko działało bez problemów)
Mam zdefiniowane takie zmienne (TD_MENU moja struktura):
Kod: Zaznacz cały
extern const TD_MENU main_menu[MENU_NR_MAIN] PROGMEM;
extern const TD_MENU conf_menu[MENU_NR_CONF] PROGMEM;
extern const TD_MENU out_menu[MENU_NR_OUT] PROGMEM;
W programie przypisuję do innej zmiennej, wskaźnik do aktualnego wyświetlanego menu w taki oto sposób:
Kod: Zaznacz cały
M_tab_kierunku[poziom_menu].wsk_menu = (void *)main_menu;
Dla winAVR program dobrze działał bez tego rzutowania, ale jak zmieniłem toolchaina na atmelowskiego to pojawiły się znane już błędy z danymi umiejscowionymi w pamięci FLASH. Po dodaniu rzutowania void błąd zniknął.
Czy jest to prawidłowe i mogę tak to stosować, czy muszę zmienić jednak typ zmiennej do której przypisywany jest wskaźnik (jeżeli dobrze rozumiem to musiałbym dodać specyfikator const dla typu wskaźnika)?
Błąd jaki miałem bez tego rzutowania, brzmiał:
Kod: Zaznacz cały
assignment discards 'const' qualifier from pointer target type [enabled by default]
I jeszcze takie wyjaśnienie co do tablicy kierunku:
Kod: Zaznacz cały
TD_TRACE M_tab_kierunku[MAX_POZIOM]; //zapis drogi szkodnika po menu
a struktura TD_TRACE, wygląda tak:
Kod: Zaznacz cały
typedef struct{
TD_MENU *wsk_menu; //wskaźnik do aktywnego menu
uint8_t il_menu; //ile dane menu ma pozycji
uint8_t pozycja_menu; //pozycja wybranego następnego menu
}TD_TRACE;