WHILE 0 15 июля, 2015 Опубликовано 15 июля, 2015 · Жалоба Не понимаю, что от меня хочет компилятор. #ifndef FLASH #define FLASH _Pragma("location=\"FLASH\"") #endif FLASH const unsigned char UART_BUFFERSIZE = 8; unsigned char UART1_RX_Buffer[UART_BUFFERSIZE]; Error[Pe028]: expression must have a constant value D:\PROGEKTS\microcontrollers\C8051\Silabs\No_RTOS\TEST\SRC\main.c 10 на строке с объявлением буффера UART1_RX_Buffer. На IAR-е для AVR и для ARM все нормально. Как объяснить компилятору, что UART_BUFFERSIZE таки является константой? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
zltigo 0 15 июля, 2015 Опубликовано 15 июля, 2015 · Жалоба Как объяснить компилятору, что UART_BUFFERSIZE таки является константой? Написать вменяемый и понятный как компилятору, так и человеку текст, а не то умопомрачение, которое Вы наваляли. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
WHILE 0 15 июля, 2015 Опубликовано 15 июля, 2015 · Жалоба Написать вменяемый и понятный как компилятору, так и человеку текст, а не то умопомрачение, которое Вы наваляли. эээ... а чуть-чуть развернуть вашу мысль можете?В смысле с примером правильного объявления. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
zltigo 0 15 июля, 2015 Опубликовано 15 июля, 2015 · Жалоба эээ... а чуть-чуть развернуть вашу мысль можете?В смысле с примером правильного объявления. #define UART_BUFFERSIZE (8) FLASH const unsigned char uart_buffersize = UART_BUFFERSIZE; unsigned char UART1_RX_Buffer[UART_BUFFERSIZE]; Остался только вопрос, а на кой вообще иметь эту 'uart_buffersize' константу в памяти. Поскольку ответить, полагаю, не сможете, то тогда так: #define UART_BUFFERSIZE (8) unsigned char UART1_RX_Buffer[UART_BUFFERSIZE]; Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
WHILE 0 15 июля, 2015 Опубликовано 15 июля, 2015 · Жалоба Остался только вопрос, а на кой вообще иметь эту 'uart_buffersize' константу в памяти. Поскольку ответить, полагаю, не сможете, то тогда так: #define UART_BUFFERSIZE (8) unsigned char UART1_RX_Buffer[UART_BUFFERSIZE]; Ну попытаюсь ответить.. Вроде в умных книжках пишут что лучше где возможно обхо- диться без макросов и препроцессор не обеспечивает проверку типов. И все-таки почему такие-же объявления работают в IAR for AVR и IAR for ARM и не проходят в IAR for 8051. Почему компилятор не считает константой переменную объявленную как const и лежащую во флэши? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
zltigo 0 15 июля, 2015 Опубликовано 15 июля, 2015 · Жалоба Ну попытаюсь ответить.. Вроде в умных книжках пишут что лучше где возможно обхо- диться без макросов и препроцессор не обеспечивает проверку типов. Даже если слушать теоретиков зацикленных на "улучшении" Си и выcасывании "проблем", то здесь уж точно даже не этот случай. А что-бы понять всю скудоумость подобных советов - включите-ка MISRA проверку - потом расскажите :) о впечателении. И все-таки почему такие-же объявления работают в IAR for AVR и IAR for ARM и не проходят в IAR for 8051. Почему компилятор не считает константой переменную объявленную как const и лежащую во флэши? Более удивителен вариант, что СЧИТАЕТ. Для Си компилятора сие совершенно удивительно. Для С++ там уже немного своя жизнь с закидонами. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
SSerge 4 15 июля, 2015 Опубликовано 15 июля, 2015 · Жалоба Конструкция с объявлением массива, у которого в качестве размера указана переменная или выражение в С допустима, но в общем случае такой массив будет создан во время выполнения, посредством выделения памяти из кучи. IAR для 8051 даже позволяет такое делать если в настройках выбрать С99 и поставить галку Allow VLA, но только для локальных массивов, объявленных внутри функции. В любом случае для 8051 подобные излишества скорее вредны чем полезны. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
WHILE 0 15 июля, 2015 Опубликовано 15 июля, 2015 · Жалоба Более удивителен вариант, что СЧИТАЕТ. Для Си компилятора сие совершенно удивительно. Для С++ там уже немного своя жизнь с закидонами. Спасибо, вы ответили на мой вопрос.Я сейчас только сообразил что для AVR и ARM проекты действительно были на плюсах. ОК,сделал через define, все работает. Но для окончательного просветления сознания - в чем разница const C и С++. Насколько я знаю, константность в плюсах можно отменить, а в С это навсегда.И я считал .что строки #define variable (value) и FLASH const variable = value; должны компилироваться компилятором что в режиме С, что в режиме С++ в одинаковый код и трактоваться в обоих случаях как константы.Почему не так? Конструкция с объявлением массива, у которого в качестве размера указана переменная или выражение в С допустима, но в общем случае такой массив будет создан во время выполнения, посредством выделения памяти из кучи. IAR для 8051 даже позволяет такое делать если в настройках выбрать С99 и поставить галку Allow VLA, но только для локальных массивов, объявленных внутри функции. В любом случае для 8051 подобные излишества скорее вредны чем полезны. А чего-это он будет выделен динамически, если это глобальный массив и никаких malloc и близко нет. Галки С99 и Allow VLA стоят изначально и не помогают. О,нашел CLIB does not support any C99 functionality. For example, complex numbers and variable length arrays are not supported. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
zltigo 0 15 июля, 2015 Опубликовано 15 июля, 2015 · Жалоба Конструкция с объявлением массива, у которого в качестве размера указана переменная или выражение в С допустима, но в общем случае такой массив будет создан во время выполнения, посредством выделения памяти из кучи. Ну это Вы круто загнули :). На стеке С99 этот массив размесить сможет. Но описанный ранее случай тоже не об этом. Там простая С++ оптимизация при которой переменая была просто выкинута за ненадобностью. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
SSerge 4 15 июля, 2015 Опубликовано 15 июля, 2015 · Жалоба Но для окончательного просветления сознания - в чем разница const C и С++. В C++ const делает объявленный объект локальным в единице трансляции, в С же такая переменная будет глобальной и на неё можно ссылаться из других файлов. В С++ const эквивалентен static const в С. Чтобы получить в С++ поведение аналогичное const для С, нужно писать extern const. А чего-это он будет выделен динамически, если это глобальный массив и никаких malloc и близко нет. Галки С99 и Allow VLA стоят изначально и не помогают. О,нашел CLIB does not support any C99 functionality. For example, complex numbers and variable length arrays are not supported. Сделал отдельный файл с двумя злополучными строками и проверил в IAR для ARM V7.30, в режиме С++ соглашается, в С (несмотря на С99 +AllowVLA) сообщает об ошибке. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
zltigo 0 15 июля, 2015 Опубликовано 15 июля, 2015 · Жалоба Сделал отдельный файл с двумя злополучными строками и проверил в IAR для ARM V7.30, в режиме С++ соглашается, в С (несмотря на С99 +AllowVLA) сообщает об ошибке. Но что-то типа f( int x ) { char b[x]; } сжевать должен, ибо никаих проблем, кроме формального допущения разрешенного в С99. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться