Цитата(CAHTA_1939 @ Nov 2 2007, 04:55)

эм... да я на С пишу. сам удивился при чем там класс , если я структуру юзаю
Возможно, у вас в настройках компилятора включен режим С++. Но это не страшно. Смотрите внимательно:
Код
struct _window_ {
const struct sMENU_WIN _win[20];
};
Вы объявили новый тип _window_, в котором есть константный член. С точки зрения С, константный - это значит "только для чтения". В то время как сами структуры типа _window_ могут быть объявлены как неконстантные. Компилятор предупреждает: а как, собственно, вы будете инициализировать члены read-only? Вам надо объявить члены без const, а const указать именно для каждой объявляемой переменной типа _window_:
Код
struct _window_
{
sMENU_WIN _win[20];
};
_window_ const Win1 =
{
{.....}, // _win[0]
{ }, // _win[1]
};
В режиме С вы должны получить примерно аналогичные предупреждения. И еще - если вы пишете на С, лучше использовать запись typedef struct { fields } my_type; в С++ - или такую же с typedef или ее эквивалент struct mytype { fields };, таким образом вы заводите новый самостоятельный тип, и в дальнейшем вам достаточно писать просто mytype variable, вместо struct mytype variable.
Еще раз про
const: стандарт С про флеш-память не знает. Его задача - положить константные данные в сегмент констант. На архитектурах с одним адресным пространством (MSP, ARM) можно разместить сегмент констант непосредственно по адресам флеш. Для архитектур с разными адресными пространствами (AVR) приходится вводить дополнительные расширения (__flash), чтобы указать что данные располагаются во флеш и что для доступа к ним нужны другие ассемблерные команды.
для MSP имеем:
обычная глобальная переменная (int i;)- расположена в ОЗУ, ее можно читать и писать. Компилятор группирует все такие переменные в сегмент DATA_Z и перед запуском main() одним циклом записывает 0x00 во все ячейки сегмента. Таким образом все глобальные переменные оказываются обнулены.
обычная глобальная переменная, объявленная с квалификатором __no_init (__no_init int i;)- расположена в ОЗУ, ее можно читать и писать. Компилятор группирует все такие переменные в сегмент DATA_N. Этот сегмент перед стартом main() не трогается.
обычная глобальная переменная, инициализированная значением ( int i = 0; )- расположена в ОЗУ, ее можно читать и писать. Компилятор группирует все такие переменные в сегмент DATA_I. Все начальные значения компилятор группирует в том же порядке в сегмент DATA_ID. Перед запуском main(), одним циклом содержимое DATA_ID копируется в DATA_I. Таким образом сразу инициализируются все инициализированные глобальные переменные. Именно такая переменная у вас получится, если вы объявите неконстантную структуру, у которой часть членов будет константной.
глобальная константная проинициализированная переменная ( int const i = 0; ) - ее можно только читать. Все такие переменные компилятор группирует в сегмент DATA_C. Для MSP вы можете в файле линкера указать размещение этого сегмента во флеш (и так и сделано в файлах, которые идут с компилятором). Для AVR сегмент DATA_C будет расположен в ОЗУ, при старте в него будут скопированы из флеш начальные значения (как и в варианте с парой DATA_I, DATA_ID) и компилятор будет следить, чтобы вы не попытались изменить эти значения. Если на AVR вы хотите, чтобы данные располагались только во флеш и брались сразу оттуда - надо использовать расширение компилятора - ключевое слово __flash. Сделано так потому, что согласно стандарту вы можете указателю на константный тип присвоить указатель на неконстантный такой же тип, и это будет говорить лишь о том, что данные через этот указатель нельзя изменить.
Несколько сумбурно, но, надеюсь, понятно.