непонимаю в чем проблема - перевод символов
А тут и приплетать ничего не надо. Если в функции нет модификатора const - то она может принимать любые значения (в том числе и флеш). А если есть - то вы внутри ее не можете изменить переменную (нельзя по стандарту), компилятор не позволит (опять-таки он контролирует).
Последний раз редактировалось ИС-пытатель Сб мар 29, 2014 00:46:33, всего редактировалось 2 раза.
- Реклама
нет, в РС все копируется в ОЗУ потому, что только из ОЗУ код может быть выполнен процессором. и в этом самом ОЗУ только на уровне операционной системы (не всякой!) можно сделать часть ячеек недоступными на запись, т.е. настоящими константами, однако и в этом случае попытка записи в них будет приводить к исключениям, т.е. эффекту ОС.ИС-пытатель писал(а):Просто в PC все копируется в ОЗУ потому что та работает быстрее. А здесь смысла нет. Тогда какое тут противоречие? В стандарте прописано, что константы обязательно должны в ОЗУ храниться?
в стандарте прописано значение ключевого слова const. чувствуете разницу? и еще в стандарте прописано, для каких объектов это ключевое слово применимо - для переменных. чувствуете? этого достаточно. термин "константа" в стандарте так же определен довольно четко, вот пример настоящих констант "по стандарту Си": 12, 'f', "test"
я не говорю, что нарушать стандарты невозможно. на красный свет тоже можно переходить улицу. но если понимать, что именно написано в коде - не будет повода для всяких измышлизмов, а это неизбежно приблизит вас (или кого-либо еще) к уровню ежа, которому все понятно.
Последний раз редактировалось ARV Сб мар 29, 2014 00:07:26, всего редактировалось 2 раза.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
прототип функции я вам привел - вы утверждаете, что в нее нельзя передать в качестве параметра переменную?! с вами все ясноИС-пытатель писал(а):Если в функции нет модификатора const - то она может принимать любые значения (в том числе и флеш). А если есть - то вы в нее не можете загрузить переменную (нельзя по стандарту). Т.е. только из флеш можете ее грузануть.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
Ну естественно, что он хранит их во flash в любом случае - иначе откуда он их прочтет при старте. Вопрос в копировании (и целесообрасности этого) этих констант из flash в ОЗУ. Для чего, по вашему мнению, нужно это? Еще раз повторюсь - я вижу и понимаю, что avr-gcc это делает. Только вопрос для чего это нужно.
Если мне надо хранить констант больше чем объем ОЗУ я должен буду применять нестандартные модификаторы доступа.
Вопрос почему вы называете ОЗУ единым адресным пространством. Допустим, MSP430 - фон Неймановская архитектура. Я могу получить доступ к любой ячейке, будь то флэш или ОЗУ, не важно. И каждый указатель будет уникален. Т.е. единое адресное пространство это и флэш и ОЗУ вместе.
И исполняется программа непосредственно из флэш памяти, в ОЗУ ничего не загружается.
Если мне надо хранить констант больше чем объем ОЗУ я должен буду применять нестандартные модификаторы доступа.
Вопрос почему вы называете ОЗУ единым адресным пространством. Допустим, MSP430 - фон Неймановская архитектура. Я могу получить доступ к любой ячейке, будь то флэш или ОЗУ, не важно. И каждый указатель будет уникален. Т.е. единое адресное пространство это и флэш и ОЗУ вместе.
И исполняется программа непосредственно из флэш памяти, в ОЗУ ничего не загружается.
Для ARV.
Прошу прощения, перепутал. Это подразумевает, что переданная переменная не должна меняться в функции. А вот здесь уже работает сам компилятор. И больше никто. Так что опять-таки - никаких противоречий. К тому же, Вы сами говорите, что реализовать константу можно разными способами (Ваш пример с областью памяти с ограниченным доступом). Можно организовать и через флеш, а можно и программно (за счет компилятора). Так где в стандарте сказано, что можно использовать только конкретный способ? Вообще мы здесь вроде как собрались человеку помочь, а мы письками меряемся. Может, если Вы такой умный, расскажете ТС в чем проблема?
Прошу прощения, перепутал. Это подразумевает, что переданная переменная не должна меняться в функции. А вот здесь уже работает сам компилятор. И больше никто. Так что опять-таки - никаких противоречий. К тому же, Вы сами говорите, что реализовать константу можно разными способами (Ваш пример с областью памяти с ограниченным доступом). Можно организовать и через флеш, а можно и программно (за счет компилятора). Так где в стандарте сказано, что можно использовать только конкретный способ? Вообще мы здесь вроде как собрались человеку помочь, а мы письками меряемся. Может, если Вы такой умный, расскажете ТС в чем проблема?
Последний раз редактировалось ИС-пытатель Сб мар 29, 2014 00:37:28, всего редактировалось 2 раза.
- Реклама
На мой взгляд это просто недоделанная реализация компилятора, а не слепое следование стандартам. Ибо никакого противоречия.BCluster писал(а): Только вопрос для чего это нужно.
Если мне надо хранить констант больше чем объем ОЗУ я должен буду применять нестандартные модификаторы доступа.
Кстати, как ТС расшифровывается? Надеюсь не Тупая Скотина? ))) Не в обиду, конечно, создавшему тему.
тут связи такой как раз нет. Это косвенный эффект. Вопрос с том, что в зависимости от архитектуры, память либо разделена на память программы и данных, либо нет. В первом случае важно, указатель на флэш или на ОЗУ, во втором - адресное пространство едино, соответственно значения не имеет. Это и есть точка совместимости, и, на мой взгляд, причина копирования константных данных в ОЗУ на гарвардских процессорах.ИС-пытатель писал(а):Прошу прощения, перепутал. Это подразумевает, что переданная переменная не должна меняться в функции.
топик стартерИС-пытатель писал(а):Кстати, как ТС расшифровывается?
Так даже если области разделены (гарвард), то обе они читаются откуда-то при старте. И один фиг эти константы там прописаны. Так вопрос зачем копировать все в ОЗУ?? Единственное оправдание этому - это то, что на некоторых архитектурах увеличивается скорость обращения к переменным. Но не более того. Либо как вариант - невозможность прочитать flаsh из кода программы. Но это уж слишком.. Достаточно было бы невозможности записать ее.
именно при старте, они читаются из флеш в ОЗУ. Ибо это - данные. Никаких причин для этого, кроме повышения скорости обращения к ним - я не вижу. Может наш старший товарищ ARV объяснит в чем еще причина. Следование стандарту весьма абстрактная сущность в данном контексте. Вопрос в том, что считать за память. АРМы считают за память, например, все что есть в МК (ОЗУ и флэш). На ПК память это ОЗУ. Оба фон Нейман.ИС-пытатель писал(а):то обе они читаются откуда-то при старте
Пусть лучше ТС поможет. ) А мы уж тут с ним разберемся! ))) Вдвоем осилим! ))
Вообще, насколько я понимаю, модификатор Const - не более, чем защита от ошибок. Если эта защита пересекается с какой-то другой функцией (без конфликтов) - то в чем проблема?
Вообще, насколько я понимаю, модификатор Const - не более, чем защита от ошибок. Если эта защита пересекается с какой-то другой функцией (без конфликтов) - то в чем проблема?
весьма интересная беседа, жалко что не по теме.
У меня лично есть пара темных пятен, и я рад подискутировать по этому вопросу
А у товарища ARV есмь серьезный опыт и мозг. Поэтому его слушать полезно.
Насчет ТС - у него проблема в кодировке. Я в молодости когда на кодвижене баловался, имел данное счастье. Благо автор этого компилятора (румын
) придумал прагму, меняющую кодировку выводимых строк
У меня лично есть пара темных пятен, и я рад подискутировать по этому вопросу
А у товарища ARV есмь серьезный опыт и мозг. Поэтому его слушать полезно.
Насчет ТС - у него проблема в кодировке. Я в молодости когда на кодвижене баловался, имел данное счастье. Благо автор этого компилятора (румын
Про мозг я не спорю, но тут ARV явно не прав. Я в этом просто уверен на 1000%. Все его доводы про ОЗУ и про стандарт тщетны.
вы пытаетесь натянуть свое понимание префикса const на реальность, я же не пытаюсь этого делать, а просто говорю, как следует понимать const. а понимать его следует только в том контексте, как он описан в стандарте - чтобы не было каких-то непоняток. как определяет const стандарт - я кратко описал. точка.ИС-пытатель писал(а):Про мозг я не спорю, но тут ARV явно не прав. Я в этом просто уверен на 1000%. Все его доводы про ОЗУ и про стандарт тщетны.
теперь о том, как ведет себя компилятор. если забыть про то, что мы с вами знаем о разных местах хранения данных, то кажется, что компилятор имеет полное право разделять данные на меняющиеся и не меняющиеся по своему усмотрению и хранить одни в ОЗУ, а другие в ПЗУ. но это только кажется, потому что благодаря таким вот отступлениям от стандартного понимания const мы имеем проблемы с доступом по указателям. для нестандартных мест хранения данных придумали нестандартный префикс flash - для того, чтобы хотя бы формально стандарт не нарушать.
повторяю: вы путаете наше обычное слово константа (неизменная величина) с ключевым словом языка Си const (который почему-то просто переводите на русский, теряя его смысл). так вот, константа в Си - это действительно неизменяемая величина программы, но const - это квалификатор переменной!!! см. пример:
Код: Выделить всё
int test1 = 12; // здесь test1 - переменная, а 12 - константа
const int test2 = 33; // здесь test2 - неизменяемая переменная, а 33 - константа
char str[] = "test3"; // здесь str - переменная (массив, строка), а "test3" - константаКод: Выделить всё
char *badptr;
badptr = (void*)&test2;
*badptr = 22; // должно прокатитьчто же касается проблемы ТС, то я перестал ковыряться в чужом говнокоде (без обид). мне это неинтересно. если продумать алгоритм его задачи и реализовать его аккуратно, все проблемы пропадут. а так у него "ввод в массив" означает на самом деле "вывод в массив" - даже тут путаница...
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
Если ОЗУ и ПЗУ в разных адресных пространствах - согласен. Если в одном - смысла не имеет.ARV писал(а):теперь о том, как ведет себя компилятор. если забыть про то, что мы с вами знаем о разных местах хранения данных, то кажется, что компилятор имеет полное право разделять данные на меняющиеся и не меняющиеся по своему усмотрению и хранить одни в ОЗУ, а другие в ПЗУ. но это только кажется, потому что благодаря таким вот отступлениям от стандартного понимания const мы имеем проблемы с доступом по указателям
Для ARV
Вы оперируете терминами, совершенно не вдумываюясь, на что они опираются. И к тому же, любите придираться к мелочам не несущим полезной нагрузки и ни на что не влияющим.
И "константа" и "модификатор переменной const" - это всего лишь программная реализация (компилятор). То что некоторые компиляторы позволяют изменить переменную с модификатором const - это всего лишь недочет компилятора. С таким же успехом можно написать компилятор, который позволит присвоить числу 12 число 5. И далее в программе если Вы напишете х = 12, переменной х присвоится значение 5. Тогда если рассуждать по Вашему, то получится, что константа 12 (в широком понимании этого слова) вовсе не константа.
Вообще это два разных понятия и сравнивать между собой константу и модификатор - бессмысленно.
А числу 12 Вы не можете присвоить значение потому что это Not Left Value (т.е. не может использоваться с левой стороны от знака равно). Есть даже защита от распространненой ошибки в условиях. Бывают программисты проверяя условие, вместо (a==10) пишут (a=10). Т.е. фактически вместо проверки условия присваивают переменной новое значение. Чтобы этого не происходило рекомендуют проверять так: (10==а) Здесь если пропустить по невнимательности одно равно, то компилятор Вас обматерит и не сгенерит программу. Т.е. опять-таки все упирается в конкретную реализацию компилятора.
К тому же конвертация из void в любой другой тип запрещена по вашему же стандарту. А вот обратная возможна. Так что если у Вас компилятор позволяет конструкцию, которую Вы соорудили - у Вас плохой компилятор, который не соответствует стандарту.
Вы оперируете терминами, совершенно не вдумываюясь, на что они опираются. И к тому же, любите придираться к мелочам не несущим полезной нагрузки и ни на что не влияющим.
И "константа" и "модификатор переменной const" - это всего лишь программная реализация (компилятор). То что некоторые компиляторы позволяют изменить переменную с модификатором const - это всего лишь недочет компилятора. С таким же успехом можно написать компилятор, который позволит присвоить числу 12 число 5. И далее в программе если Вы напишете х = 12, переменной х присвоится значение 5. Тогда если рассуждать по Вашему, то получится, что константа 12 (в широком понимании этого слова) вовсе не константа.
Вообще это два разных понятия и сравнивать между собой константу и модификатор - бессмысленно.
А числу 12 Вы не можете присвоить значение потому что это Not Left Value (т.е. не может использоваться с левой стороны от знака равно). Есть даже защита от распространненой ошибки в условиях. Бывают программисты проверяя условие, вместо (a==10) пишут (a=10). Т.е. фактически вместо проверки условия присваивают переменной новое значение. Чтобы этого не происходило рекомендуют проверять так: (10==а) Здесь если пропустить по невнимательности одно равно, то компилятор Вас обматерит и не сгенерит программу. Т.е. опять-таки все упирается в конкретную реализацию компилятора.
К тому же конвертация из void в любой другой тип запрещена по вашему же стандарту. А вот обратная возможна. Так что если у Вас компилятор позволяет конструкцию, которую Вы соорудили - у Вас плохой компилятор, который не соответствует стандарту.
Последний раз редактировалось ИС-пытатель Сб мар 29, 2014 12:09:29, всего редактировалось 2 раза.
Опять-таки все от компилятора зависит. Если тот отследит, адрес какого адресного пространства мы присваиваем указателю и правильно сгенерит код - то эта проблема теряет смысл. Доброе утро! )BCluster писал(а):Если ОЗУ и ПЗУ в разных адресных пространствах - согласен. Если в одном - смысла не имеет.
как он отследит? Если, например, есть адрес 0x0010 как в ОЗУ так и в ПЗУ. Откуда компилятор должен узнать к какой памяти мы хотим обратиться?ИС-пытатель писал(а): Если тот отследит, адрес какого адресного пространства мы присваиваем указателю и правильно сгенерит код
доброе!Доброе утро! )
А переменная у Вас при объявленнии в какой памяти проинициализирована? ))BCluster писал(а):как он отследит? Если, например, есть адрес 0x0010 как в ОЗУ так и в ПЗУ. Откуда компилятор должен узнать к какой памяти мы хотим обратиться?
На этапе присваивания указателю адреса переменной компилятор сделает пометку к какой области памяти та относится. И при использовании указателя сориентируется на эту пометку.
Другое дело, если программист присваивает указателю числовое значение. Но тут (раз он настолько в себе уверен) программист сам уже должен отслеживать всяческие операции и корректировать их при помощи модификаторов
во-первых, я оперирую терминами исключительно опираясь на стандарт, и не домысливая за стандарт по-своему. как написано - так и понимаю, так и оперирую. считаю, что подобного подхода вам и не хватает - вы слишком много думаете сами, не опираясь на стандарт.ИС-пытатель писал(а):Вы оперируете терминами, совершенно не вдумываюясь, на что они опираются. И к тому же, любите придираться к мелочам не несущим полезной нагрузки и ни на что не влияющим.
во-вторых, я не считаю мелочью неверное толкование стандартных вещей, поэтому к ним и "придираюсь". чем меньше фантазий по поводу стандарта, тем меньше ошибок и проблем в коде.
это опять ваши фантазии? по-вашему выходит вот что:ИС-пытатель писал(а):А переменная у Вас при объявленнии в какой памяти проинициализирована? ))На этапе присваивания указателю адреса переменной компилятор сделает пометку к какой области памяти та относится. И при использовании указателя сориентируется на эту пометку.
Код: Выделить всё
int *ptr;
_flash int f1;
int r1;
ptr = &f1;
int test = *ptr; // сейчас мы прочли из flash
ptr = &r1;
test = *ptr; // а сейчас прочли RAMесли рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
Именно так. Почему бред? ) Очень даже ничего получается! ) Главное, удобно! )
А кто сказал, что думать плохо? )) желаю и Вам начать.ARV писал(а): вы слишком много думаете сами


