Задача для непрограммистов
- Войдите на сайт для отправки комментариев
Чт, 08/09/2016 - 21:03
Парни, я тут пишу давно обещанный этюд по работе с динамической памятью. Нужна Ваша помощь. Очень хочется посмотреть ваши соображения по поводу одного кода. Вопрос простой:
Очень прошу профессионалов не подсказывать. Для написания материала мне очень важно почитаь мнения новичков и непрограммистов.
Вот собственно код:
void awfulShitCode(const char * s) { *((long*)s+1)=1702125896l; } void setup(void) { Serial.begin(115200); awfulShitCode("Oh!"); Serial.println("Love you!"); } void loop(void) {}
Ни че не понимаю в этом скетче...но если букву "l" убрать из длинного числа в строке 2, и вместо нее поставить 1, то пишет уже немного другое (СМ<ц you !).
Шайтан!
.
помня о почтенном цинизме автора я даже не стал таблицу ASCII кодов проверять, там ведь Hate получится? Так? ;) ;) ;)
помня о почтенном цинизме автора я даже не стал таблицу ASCII кодов проверять, там ведь Hate получится? Так? ;) ;) ;)
я, к своему стыду, на f..k подумал
Блин, все "новички" собрались. Ну, я же просил, мужики :)))
Блин, все "новички" собрались. Ну, я же просил, мужики :)))
а сакральное никто не выдавал...
А что Вы хотели? Новички, увидев адресную арифметику и приведенный к другому типу указатель офигевают и валят из этой темы.
А что Вы хотели? Новички, увидев адресную арифметику и приведенный к другому типу указатель офигевают и валят из этой темы.
вы не правы
вы не правы
Тогда где бага?
вы не правы
Тогда где бага?
при чем тут?
просили-же суть не выдавать...
просили-же суть не выдавать...
Значит Вы не новичок, а говорите за них )
От имени новичков говорю: "Сдаемся." Я вообще не понимаю как работает функция, обозначенная в строке 1. Что там за звездочки, и вообще что там за фигня, похожая на длинное число...Если букву "l" поменять на другую, то компилятор выдает всякие непонятные сообщения, типа "инвалид суффикс", или "тип с фиксированной точкой не поддерживается в С".
Гуглением нашел, что это что-то, связанное с адресами, что память там "read only", но разные компиляторы ведут себя по-разному......короче, темный лес для новичка.
Нам что-то бы попроще:)
функция, обозначенная в строке 1.
Ну, с ангийским-то нормально? На всякий случай - эта функция назывывается "ужасный говнокод" - так вот, он и есть!
Если букву "l" поменять на другую,
Ну, поменяйте на "L" - тоже нормально сработает. Можно даже на "UL".
Думаю, мнение новичков ptr уже высказал, и Joiner его подтвердил полностью. ужасный говнокод тут конечно присутсвует .. но на конкретно этом выводе это отразиться вроде как не должно. Доберусь домой - проверю, уже интересно.
Хотя, да .. вывод изменится. Блин .. проверять надо. Если PROGMEM то нет, ничего не произойдет .. или он во флеш "перепишет" или скопипастит в SRAM и там "нагадит"? .. забыл ужо.
но на конкретно этом выводе это отразиться вроде как не должно. Доберусь домой - проверю, уже интересно.
Что тут проверять, если невооруженным глазом видно, что константа записывается вместо букв "Love"?
Ответ новичка: У мну сейчас ардуино нет, но онлайн эмулятор почему то выдал значек ø.что явно не соответствует тому чего мы просили сделать. А в говновойде мы берем чар переменную с какими то звездочками и пытаемся сделать ее лонгом, причем тоже с какими то звездочками, при этом добавляем 1 и приравниваем к какому то большому числу. как это повлияло на нашу прозьбу написать в сириал о любви не понятно...
Гы .. как раз интересно проверить он во флеш изменит константу через lpm или таки нагадит в SRAM? :)
Так и хочется воскликнуть рекламным слоганом: "говнее кода не видал!" ;) Шутка, это далеко не самый страшный говнокод.
MSVS2013 свалился в exception.
Ассемблерный листинг после ардуины - голову сломаешь :)
Гы .. как раз интересно проверить он во флеш изменит константу через lpm или таки нагадит в SRAM? :)
Архат! Вы меня пугаете! Это не прогмем константа, какой, в жоппу, флеш?????????
Это просто литерал в памяти. Они, млеать, лежат последовательно, по порядку объявления в программе.
Добавьте в луп еще один прит ТАКОЙ ЖЕ "лав ю", и не будет "хейт ю" первым, а добавите в луп принт ЛЮБОЙ ДРУГОЙ строки, будет первым "хейт", а потом то, что в лупе.
Кстати, Евгений, это хороший вопрос новичкам: А почему эфект пропадет, если такой же литерал использовать в лупе? Это как раз особенность ИДЕ, который проделывает нечто ДО запуска компилятора.
-------------------------
Архат! Смотришь на Ваш код - вроде хороший програмист, читаешь то, что Вы пишите - жуть с кошмариками! Как это в одном человеке помещается?
Гы .. как раз интересно проверить он во флеш изменит константу через lpm или таки нагадит в SRAM? :)
А Вы в курсе, чем различается запись:
и
?
да, кстати и китайская нанка и амперковская леонардо - ОК.
Только для леонардо пришлось делей поставить, чтобы успеть на монитор порта переключится, она у меня после ресета дурит с портом. Возможно пора загручик переписать.
Кстати, еще про платы: китайская нанка немного быстрее. У меня есть тест с синусами степенями и прочей мутью, причем специально так сделанный, чтобы шибко умный компилятор не оптимизировал, что не надо. Так вот на Амперковской леонарде и на нанке - разные средние времена и нанка быстрее процентов на 10, если я правильно помню результаты. Хотя вычислительное ядро вроде одинаковое.
Да забыл ужо что он const во флеш сам не преобразует .. конечно всё будет изгажено в SRAM ..
P.S. могу и не писать .. говнокодьте себе на здоровье .. может как раз "код вроде хороший" (спасибо конечно, никогда вот сам не уверен что он действительно хорош), потому что пишу так, как считаю верным не взирая на "догмы"? Об чем и Вам донести пытаюсь .. может стоит вчитаться раньше чем оголтело возражать, не? :)
Кстати, Евгений, это хороший вопрос новичкам: А почему эфект пропадет, если такой же литерал использовать в лупе? Это как раз особенность ИДЕ, который проделывает нечто ДО запуска компилятора.
Да, нет, должно быть всё нормально. наверное, там у Вас ещё какая константа затесалась.
Константы располагаются в памяти подряд. В данном случае первой идёт 4-байтовая "Оh!", а за ней "Love you". Поэтому, когда я к адресу "Оh!" прибавляю 4 (прибаляю 1, но указатель уже преобразван к long *), то как раз попадаю на начало строки "Love you". Если между ними затешется ещё одна константа - то адреса сместятся.
Кстати, Евгений, это хороший вопрос новичкам: А почему эфект пропадет, если такой же литерал использовать в лупе? Это как раз особенность ИДЕ, который проделывает нечто ДО запуска компилятора.
Да, нет, должно быть всё нормально. наверное, там у Вас ещё какая константа затесалась.
Константы располагаются в памяти подряд. В данном случае первой идёт 4-байтовая "Оh!", а за ней "Love you". Поэтому, когда я к адресу "Оh!" прибавляю 4 (прибаляю 1, но указатель уже преобразван к long *), то как раз попадаю на начало строки "Love you". Если между ними затешется ещё одна константа - то адреса сместятся.
все, интриги больше не будет?
порядок меняется, после обработки ИДЕ loop компилируется раньше, чем setup. и "Oh!\" + 4 не попадает на "Lov..."/
Вот снимки экрана:
==================================
Я же много раз писал, что спорить со мной не только неприятно, но и бесполезно, уж простите.
====================
ЗЫ: Это китайская нанка на 328
Пез...дец! Новички тренируются! Нахрена новичков было звать? Туман полнейший!
Нахрена новичков было звать?
Я же говорю, чтобы лучше написать этюд. Хотел послушать, что скажут люди, какие идеи выдвинут.
Пез...дец! Новички тренируются! Нахрена новичков было звать? Туман полнейший!
А что именно Вам непонятно?
Тема посвящена тому, что неаккуратным обращением с памятью можно так загадить свою программу, что, вместо "Лав", "Хейт" получится. На эту тему Евгений будет писать новый, полезный начинаюшим, этюд.
Если непонятно - то очень советую разобраться в этом примере. Это спасет от разной херни в будущем.
==============================================================
Пример про память из моей жизни, если интересно:
Пишу кусок сетевого кода на АРМ процессоре под линухом. Давно. TCP - вариант работает на ура, UDP - вообще не работает. На третий день начинаю сходить с ума! Вставляю отладочные принты по очереди прямо в ядро. Дохожу ДО САМОГО НИЗА. До драйвера сетевой карты на борту платы.
Там kalloc -ом выделается память для приема пакета. БЕЗ ВЫРАВНИВАНИЯ НА 4 байта!!!!!!!!!!!!!
А в АРМ, не знаю как в современных, а тогда было так, что если читать 32-битное слово с адресе НЕ ДЕЛЯЩЕГОСЯ на 4, то первое и второе полусова меняются местами. Вот так вот, это даже не документировано, потому, что ТАК НЕ ПРОГРАМИРУЮТ, разработчик чипа не думал о ебанутых индусах.
А правка последствий этой дряни была в коде даже не IP, а UDP_recv. Там два индуса слова просто переставили, с коментарием, типа того, что неведомая херня, но так работает. ;) ;) %). Вот Вам и память.
А в АРМ, не знаю как в современных, а тогда было так, что если читать 32-битное слово с адресе НЕ ДЕЛЯЩЕГОСЯ на 4, то первое и второе полусова меняются местами. Вот так вот, это даже не документировано, потому, что ТАК НЕ ПРОГРАМИРУЮТ, разработчик чипа не думал о ебанутых индусах.
Один и тот же код может в М3 работать, а в М0 - нет, выскакивает в исключение. Так что, в новых получше, но бдительность один фиг нужна.
Пез...дец! Новички тренируются! Нахрена новичков было звать? Туман полнейший!
вторая буква "и"
Пез...дец! Новички тренируются! Нахрена новичков было звать? Туман полнейший!
При условии, что ни одна зараза в памяти по указателям не порылась :)