Darth Vader 0 20 сентября, 2020 Опубликовано 20 сентября, 2020 (изменено) · Жалоба 9 часов назад, artemkad сказал: Если компилятор не размещает константы во флеше, то не будет даже предупреждения. А если размещает константы именно во флеше, тогда что? Ошибка? Предупреждение? В моем примере константа Space как раз и размещается во флеше. Можно убедиться в этом, открыв .map-файл. А переменная Symb в ОЗУ. Предупреждений и ошибок нет. Это значит, что функция не ждет строго аргумента типа const char*. Она вполне примет аргумент типа char*. Т.е. функции не важно, является ли объект, адресуемый указателем, константой или переменной. Она будет одинаково работать с ними обоими. Т.е. квалификатор const, применительно к типу аргумента функции-указателю, не требует обязательной константности от объекта, адресуемого этим указателем при вызове функци. Он всего лишь гарантирует отсутствие изменений объекта по указателю на него внутри тела функции. Не более того. Это согласуется с тем, что говорил jcxz ранее, и со статьёй, на которую я приводил ссылку. Изменено 20 сентября, 2020 пользователем Darth Vader Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
artemkad 53 20 сентября, 2020 Опубликовано 20 сентября, 2020 · Жалоба 3 часа назад, haker_fox сказал: Этим занимается линкер. Компилятору по барабану на адреса. Это верно только для платформ в которых ко всей памяти одинаковый способ доступа(ARM, x86). Т.е. компилируемый код для доступа к ОЗУ и ПЗУ одинаков и отличается только адресами. К примеру, для AVR это не так. Потому ему там совсем не "по барабану". 1 час назад, Darth Vader сказал: В моем примере константа Space как раз и размещается во флеше. Можно убедиться в этом, открыв .map-файл. А переменная Symb в ОЗУ. Предупреждений и ошибок нет. Значит твой пример компилировался для ARM или x86. Для AVR вылезло бы предупреждение, потому как его ядро использует разные команды для доступа к разным типам адреса. 1 час назад, Darth Vader сказал: Это согласуется с тем, что говорил jcxz ранее, Это вообще не касается того, что мы там обсуждали. Мы там обсуждали изменяемость значения во время работы функции или иначе говоря - наличие и отсутствие квалификатора volatile. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
haker_fox 60 20 сентября, 2020 Опубликовано 20 сентября, 2020 · Жалоба 3 hours ago, artemkad said: К примеру, для AVR это не так. Потому ему там совсем не "по барабану". Я тоже программировал для AVR. Там был линкер. Или что вы имеете в виду? Лучше ссылочкой на документ) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Herz 4 20 сентября, 2020 Опубликовано 20 сентября, 2020 · Жалоба 14 hours ago, artemkad said: Читай внимательно 3 hours ago, artemkad said: Значит твой пример Я к Вам уже персонально обращаюсь: на Форуме принято уважительное обращение к собеседникам на "вы". Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
artemkad 53 20 сентября, 2020 Опубликовано 20 сентября, 2020 · Жалоба 1 час назад, Herz сказал: Я к Вам уже персонально обращаюсь: на Форуме принято уважительное обращение к собеседникам на "вы". Забавно у вас отношение к уважительности. Оказывается это не аккуратное цитирование, не выслушивание оппонента, не внимательное чтение ответов, не ответы по делу. Оказывается уважительность это обращение в множественном числе, появившаяся в русском языке из правил обращения подчиненных чиновников Царской России к вышестоящему начальству. Так может сразу вернуть и обращения "милостивый государь", "ваше превосходительство" или "ваша светлость"? PS. Кстати, вы в курсе, что этим "персональным обращением" сами формально нарушили пункт 2.1а данного форума? 1 час назад, haker_fox сказал: Я тоже программировал для AVR. Там был линкер. Я где-то говорил что линкера для АВР нет? Где? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Darth Vader 0 20 сентября, 2020 Опубликовано 20 сентября, 2020 · Жалоба 18.09.2020 в 02:01, artemkad сказал: Идеологически переменная объявлена как "может поменяться в любой момент сама", а аргумент как - "никто кроме функции её не поменяет". Вот это всё к чему. Этим вы говорите следующее: 1. Объявление переменной как volatile char A значит, что А может поменяться в любой момент сама. 2. Объявление функции Foo(const char *p) говорит, что никто кроме самой функции Foo не изменит объект (*р). С первым согласен, не возражаю. А вот второе весьма сомнительно. Ни в одном найденном мной источнике не дается никаких гарантий неизменности объекта (*р) вне пределов тела функции Foo. Зато гарантируется, что функция его не изменит. Т.е. выражение (*р) не будет встречаться в теле функции слева от оператора присваивания. И компилятор проследит за этим. Если программист напишет внутри функции, что-то типа *р = 0х20; компилятор обязуется выдать на это ошибку. Об этом говорил jcxz, на это давал ссылку я. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
artemkad 53 20 сентября, 2020 Опубликовано 20 сентября, 2020 · Жалоба 26 минут назад, Darth Vader сказал: Ни в одном найденном мной источнике не дается никаких гарантий неизменности объекта (*р) вне пределов тела функции Foo. Я даже не могу себе представить на кой может понадобиться гарантии неизменности аргумента функции за её пределами. Если это аргумент функции, то логично, что он и меняется за её пределами. 1 час назад, Darth Vader сказал: Зато гарантируется, что функция его не изменит. Спорно утверждение - к примеру, выше уже упомянули самопрограммирование которым функция вполне способна поменять содержимое константной строки расположенной во флеше. И это не будит ни хаком, ни нарушением правил Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Tanya 4 20 сентября, 2020 Опубликовано 20 сентября, 2020 · Жалоба Господа, предупреждаю, что в техническом топике посторонние рассуждения будут оцениваться с занесением. Замечания модераторов обсуждаются в другом месте. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Darth Vader 0 21 сентября, 2020 Опубликовано 21 сентября, 2020 · Жалоба 10 часов назад, artemkad сказал: не могу себе представить на кой может понадобиться гарантии неизменности аргумента функции за её пределами. Если это аргумент функции, то логично, что он и меняется за её пределами. Вы сами, а не я и никто другой написали это: "...а аргумент как - никто кроме функции её не поменяет." Это относилось к аргументу функции, объявленному, как const char *p. А теперь не понимаете, зачем это надо? Что вы имели ввиду этой фразой? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
artemkad 53 21 сентября, 2020 Опубликовано 21 сентября, 2020 · Жалоба 4 часа назад, Darth Vader сказал: Вы сами, а не я и никто другой написали это: "...а аргумент как - никто кроме функции её не поменяет." Ну, я ж не мог предположить, что кто-то в здравом уме мог предположить, что я говорю про весь код, а не про время работы функции. Более того, в следующем сообщении я уточнил: 18.09.2020 в 08:08, artemkad сказал: Это относится ко всем переменным не имеющим квалификатора volatile. Внутри функции они сами не меняются. Нет никакого прерывания DMA или другого потока который может внутри кода функции такую переменную изменить без её ведома. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться