Страница 3 из 4
Re: непонимаю в чем проблема - перевод символов
Добавлено: Пт мар 28, 2014 23:56:00
ИС-пытатель
А тут и приплетать ничего не надо. Если в функции нет модификатора const - то она может принимать любые значения (в том числе и флеш). А если есть - то вы внутри ее не можете изменить переменную (нельзя по стандарту), компилятор не позволит (опять-таки он контролирует).
Re: непонимаю в чем проблема - перевод символов
Добавлено: Пт мар 28, 2014 23:58:54
ARV
ИС-пытатель писал(а):Просто в PC все копируется в ОЗУ потому что та работает быстрее. А здесь смысла нет. Тогда какое тут противоречие? В стандарте прописано, что константы обязательно должны в ОЗУ храниться?
нет, в РС все копируется в ОЗУ потому, что только из ОЗУ код может быть выполнен процессором. и в этом самом ОЗУ только на уровне операционной системы (не всякой!) можно сделать часть ячеек недоступными на запись, т.е. настоящими константами, однако и в этом случае попытка записи в них будет приводить к исключениям, т.е. эффекту ОС.
в стандарте прописано значение ключевого слова const. чувствуете разницу? и еще в стандарте прописано, для каких объектов это ключевое слово применимо - для переменных. чувствуете? этого достаточно. термин "константа" в стандарте так же определен довольно четко, вот пример настоящих констант "по стандарту Си":
12,
'f',
"test"
я не говорю, что нарушать стандарты невозможно. на красный свет тоже можно переходить улицу. но если понимать, что именно написано в коде - не будет повода для всяких
измышлизмов, а это неизбежно приблизит вас (или кого-либо еще) к уровню ежа, которому все понятно.
Re: непонимаю в чем проблема - перевод символов
Добавлено: Пт мар 28, 2014 23:59:48
ARV
ИС-пытатель писал(а):Если в функции нет модификатора const - то она может принимать любые значения (в том числе и флеш). А если есть - то вы в нее не можете загрузить переменную (нельзя по стандарту). Т.е. только из флеш можете ее грузануть.
прототип функции я вам привел - вы утверждаете, что в нее нельзя передать в качестве параметра переменную?! с вами все ясно

Re: непонимаю в чем проблема - перевод символов
Добавлено: Сб мар 29, 2014 00:19:48
BCluster
Ну естественно, что он хранит их во flash в любом случае - иначе откуда он их прочтет при старте. Вопрос в копировании (и целесообрасности этого) этих констант из flash в ОЗУ. Для чего, по вашему мнению, нужно это? Еще раз повторюсь - я вижу и понимаю, что avr-gcc это делает. Только вопрос для чего это нужно.
Если мне надо хранить констант больше чем объем ОЗУ я должен буду применять нестандартные модификаторы доступа.
Вопрос почему вы называете ОЗУ единым адресным пространством. Допустим, MSP430 - фон Неймановская архитектура. Я могу получить доступ к любой ячейке, будь то флэш или ОЗУ, не важно. И каждый указатель будет уникален. Т.е. единое адресное пространство это и флэш и ОЗУ вместе.
И исполняется программа непосредственно из флэш памяти, в ОЗУ ничего не загружается.
Re: непонимаю в чем проблема - перевод символов
Добавлено: Сб мар 29, 2014 00:21:21
ИС-пытатель
Для ARV.
Прошу прощения, перепутал. Это подразумевает, что переданная переменная не должна меняться в функции. А вот здесь уже работает сам компилятор. И больше никто. Так что опять-таки - никаких противоречий. К тому же, Вы сами говорите, что реализовать константу можно разными способами (Ваш пример с областью памяти с ограниченным доступом). Можно организовать и через флеш, а можно и программно (за счет компилятора). Так где в стандарте сказано, что можно использовать только конкретный способ? Вообще мы здесь вроде как собрались человеку помочь, а мы письками меряемся. Может, если Вы такой умный, расскажете ТС в чем проблема?
Re: непонимаю в чем проблема - перевод символов
Добавлено: Сб мар 29, 2014 00:25:03
ИС-пытатель
BCluster писал(а): Только вопрос для чего это нужно.
Если мне надо хранить констант больше чем объем ОЗУ я должен буду применять нестандартные модификаторы доступа.
На мой взгляд это просто недоделанная реализация компилятора, а не слепое следование стандартам. Ибо никакого противоречия.
Кстати, как ТС расшифровывается? Надеюсь не Тупая Скотина? ))) Не в обиду, конечно, создавшему тему.
Re: непонимаю в чем проблема - перевод символов
Добавлено: Сб мар 29, 2014 00:37:19
BCluster
ИС-пытатель писал(а):Прошу прощения, перепутал. Это подразумевает, что переданная переменная не должна меняться в функции.
тут связи такой как раз нет. Это косвенный эффект. Вопрос с том, что в зависимости от архитектуры, память либо разделена на память программы и данных, либо нет. В первом случае важно, указатель на флэш или на ОЗУ, во втором - адресное пространство едино, соответственно значения не имеет. Это и есть точка совместимости, и, на мой взгляд, причина копирования константных данных в ОЗУ на гарвардских процессорах.
ИС-пытатель писал(а):Кстати, как ТС расшифровывается?
топик стартер

не переживайте ))))
Re: непонимаю в чем проблема - перевод символов
Добавлено: Сб мар 29, 2014 00:41:36
ИС-пытатель
Так даже если области разделены (гарвард), то обе они читаются откуда-то при старте. И один фиг эти константы там прописаны. Так вопрос зачем копировать все в ОЗУ?? Единственное оправдание этому - это то, что на некоторых архитектурах увеличивается скорость обращения к переменным. Но не более того. Либо как вариант - невозможность прочитать flаsh из кода программы. Но это уж слишком.. Достаточно было бы невозможности записать ее.
Re: непонимаю в чем проблема - перевод символов
Добавлено: Сб мар 29, 2014 00:47:29
BCluster
ИС-пытатель писал(а):то обе они читаются откуда-то при старте
именно при старте, они читаются из флеш в ОЗУ. Ибо это - данные. Никаких причин для этого, кроме повышения скорости обращения к ним - я не вижу. Может наш старший товарищ ARV объяснит в чем еще причина. Следование стандарту весьма абстрактная сущность в данном контексте. Вопрос в том, что считать за память. АРМы считают за память, например, все что есть в МК (ОЗУ и флэш). На ПК память это ОЗУ. Оба фон Нейман.
Re: непонимаю в чем проблема - перевод символов
Добавлено: Сб мар 29, 2014 00:52:58
ИС-пытатель
Пусть лучше ТС поможет. ) А мы уж тут с ним разберемся! ))) Вдвоем осилим! ))
Вообще, насколько я понимаю, модификатор Const - не более, чем защита от ошибок. Если эта защита пересекается с какой-то другой функцией (без конфликтов) - то в чем проблема?
Re: непонимаю в чем проблема - перевод символов
Добавлено: Сб мар 29, 2014 00:58:43
BCluster
весьма интересная беседа, жалко что не по теме.
У меня лично есть пара темных пятен, и я рад подискутировать по этому вопросу
А у товарища ARV есмь серьезный опыт и мозг. Поэтому его слушать полезно.
Насчет ТС - у него проблема в кодировке. Я в молодости когда на кодвижене баловался, имел данное счастье. Благо автор этого компилятора (румын

) придумал прагму, меняющую кодировку выводимых строк
Re: непонимаю в чем проблема - перевод символов
Добавлено: Сб мар 29, 2014 01:11:38
ИС-пытатель
Про мозг я не спорю, но тут ARV явно не прав. Я в этом просто уверен на 1000%. Все его доводы про ОЗУ и про стандарт тщетны.
Re: непонимаю в чем проблема - перевод символов
Добавлено: Сб мар 29, 2014 08:34:12
ARV
ИС-пытатель писал(а):Про мозг я не спорю, но тут ARV явно не прав. Я в этом просто уверен на 1000%. Все его доводы про ОЗУ и про стандарт тщетны.
вы пытаетесь натянуть свое понимание префикса
const на реальность, я же не пытаюсь этого делать, а просто говорю, как следует понимать
const. а понимать его следует только в том контексте, как он описан в стандарте - чтобы не было каких-то непоняток. как определяет
const стандарт - я кратко описал. точка.
теперь о том, как ведет себя компилятор. если забыть про то, что мы с вами знаем о разных местах хранения данных, то
кажется, что компилятор имеет полное право разделять данные на меняющиеся и не меняющиеся по своему усмотрению и хранить одни в ОЗУ, а другие в ПЗУ. но это
только кажется, потому что благодаря таким вот отступлениям от стандартного понимания
const мы имеем проблемы с доступом по указателям. для
нестандартных мест хранения данных придумали
нестандартный префикс
flash - для того, чтобы хотя бы формально стандарт не нарушать.
повторяю: вы путаете наше обычное слово
константа (неизменная величина) с ключевым словом языка Си const (который почему-то просто переводите на русский, теряя его смысл). так вот, константа в Си - это действительно неизменяемая величина программы, но const - это квалификатор
переменной!!! см. пример:
Код: Выделить всё
int test1 = 12; // здесь test1 - переменная, а 12 - константа
const int test2 = 33; // здесь test2 - неизменяемая переменная, а 33 - константа
char str[] = "test3"; // здесь str - переменная (массив, строка), а "test3" - константа
в доказательство попробуйте изменить константу 12

а вот изменить содержимое переменной можно. повторяю, не любой компилятор позволит, но попробуйте:
Код: Выделить всё
char *badptr;
badptr = (void*)&test2;
*badptr = 22; // должно прокатить
повторяю еще раз: не надо наделять стандартные ключевые слова языка какими-то своими смыслами, даже если они кажутся вам абсолютно логичными - это не приведет ни к чему, кроме путаницы и проблем в будущем, не у вас, так у ваших последователей.
что же касается проблемы ТС, то я перестал ковыряться в чужом говнокоде (без обид). мне это неинтересно. если продумать алгоритм его задачи и реализовать его аккуратно, все проблемы пропадут. а так у него "ввод в массив" означает на самом деле "вывод в массив" - даже тут путаница...
Re: непонимаю в чем проблема - перевод символов
Добавлено: Сб мар 29, 2014 09:58:51
BCluster
ARV писал(а):теперь о том, как ведет себя компилятор. если забыть про то, что мы с вами знаем о разных местах хранения данных, то кажется, что компилятор имеет полное право разделять данные на меняющиеся и не меняющиеся по своему усмотрению и хранить одни в ОЗУ, а другие в ПЗУ. но это только кажется, потому что благодаря таким вот отступлениям от стандартного понимания const мы имеем проблемы с доступом по указателям
Если ОЗУ и ПЗУ в разных адресных пространствах - согласен. Если в одном - смысла не имеет.
Re: непонимаю в чем проблема - перевод символов
Добавлено: Сб мар 29, 2014 10:14:22
ИС-пытатель
Для ARV
Вы оперируете терминами, совершенно не вдумываюясь, на что они опираются. И к тому же, любите придираться к мелочам не несущим полезной нагрузки и ни на что не влияющим.
И "константа" и "модификатор переменной const" - это всего лишь программная реализация (компилятор). То что некоторые компиляторы позволяют изменить переменную с модификатором const - это всего лишь недочет компилятора. С таким же успехом можно написать компилятор, который позволит присвоить числу 12 число 5. И далее в программе если Вы напишете х = 12, переменной х присвоится значение 5. Тогда если рассуждать по Вашему, то получится, что константа 12 (в широком понимании этого слова) вовсе не константа.
Вообще это два разных понятия и сравнивать между собой константу и модификатор - бессмысленно.
А числу 12 Вы не можете присвоить значение потому что это Not Left Value (т.е. не может использоваться с левой стороны от знака равно). Есть даже защита от распространненой ошибки в условиях. Бывают программисты проверяя условие, вместо (a==10) пишут (a=10). Т.е. фактически вместо проверки условия присваивают переменной новое значение. Чтобы этого не происходило рекомендуют проверять так: (10==а) Здесь если пропустить по невнимательности одно равно, то компилятор Вас обматерит и не сгенерит программу. Т.е. опять-таки все упирается в конкретную реализацию компилятора.
К тому же конвертация из void в любой другой тип запрещена по вашему же стандарту. А вот обратная возможна. Так что если у Вас компилятор позволяет конструкцию, которую Вы соорудили - у Вас плохой компилятор, который не соответствует стандарту.
Re: непонимаю в чем проблема - перевод символов
Добавлено: Сб мар 29, 2014 10:20:53
ИС-пытатель
BCluster писал(а):Если ОЗУ и ПЗУ в разных адресных пространствах - согласен. Если в одном - смысла не имеет.
Опять-таки все от компилятора зависит. Если тот отследит, адрес какого адресного пространства мы присваиваем указателю и правильно сгенерит код - то эта проблема теряет смысл. Доброе утро! )
Re: непонимаю в чем проблема - перевод символов
Добавлено: Сб мар 29, 2014 10:25:08
BCluster
ИС-пытатель писал(а): Если тот отследит, адрес какого адресного пространства мы присваиваем указателю и правильно сгенерит код
как он отследит? Если, например, есть адрес 0x0010 как в ОЗУ так и в ПЗУ. Откуда компилятор должен узнать к какой памяти мы хотим обратиться?
Доброе утро! )
доброе!
Re: непонимаю в чем проблема - перевод символов
Добавлено: Сб мар 29, 2014 10:38:37
ИС-пытатель
BCluster писал(а):как он отследит? Если, например, есть адрес 0x0010 как в ОЗУ так и в ПЗУ. Откуда компилятор должен узнать к какой памяти мы хотим обратиться?
А переменная у Вас при объявленнии в какой памяти проинициализирована? ))
На этапе присваивания указателю адреса переменной компилятор сделает пометку к какой области памяти та относится. И при использовании указателя сориентируется на эту пометку.
Другое дело, если программист присваивает указателю числовое значение. Но тут (раз он настолько в себе уверен) программист сам уже должен отслеживать всяческие операции и корректировать их при помощи модификаторов
Re: непонимаю в чем проблема - перевод символов
Добавлено: Сб мар 29, 2014 14:32:53
ARV
ИС-пытатель писал(а):Вы оперируете терминами, совершенно не вдумываюясь, на что они опираются. И к тому же, любите придираться к мелочам не несущим полезной нагрузки и ни на что не влияющим.
во-первых, я оперирую терминами исключительно опираясь на стандарт, и не домысливая за стандарт по-своему. как написано - так и понимаю, так и оперирую. считаю, что подобного подхода вам и не хватает - вы слишком много думаете сами, не опираясь на стандарт.
во-вторых, я не считаю мелочью неверное толкование стандартных вещей, поэтому к ним и "придираюсь". чем меньше фантазий по поводу стандарта, тем меньше ошибок и проблем в коде.
ИС-пытатель писал(а):А переменная у Вас при объявленнии в какой памяти проинициализирована? ))На этапе присваивания указателю адреса переменной компилятор сделает пометку к какой области памяти та относится. И при использовании указателя сориентируется на эту пометку.
это опять ваши фантазии? по-вашему выходит вот что:
Код: Выделить всё
int *ptr;
_flash int f1;
int r1;
ptr = &f1;
int test = *ptr; // сейчас мы прочли из flash
ptr = &r1;
test = *ptr; // а сейчас прочли RAM
бред
Re: непонимаю в чем проблема - перевод символов
Добавлено: Сб мар 29, 2014 15:02:54
ИС-пытатель
Именно так. Почему бред? ) Очень даже ничего получается! ) Главное, удобно! )
ARV писал(а): вы слишком много думаете сами
А кто сказал, что думать плохо? )) желаю и Вам начать.