|
WinAVR инициализирует все переменные!, Нельзя ли избавить его от этого глупого занятия? |
|
|
|
 |
Ответов
|
Apr 25 2008, 11:39
|
Знающий
   
Группа: Участник
Сообщений: 596
Регистрация: 26-05-06
Из: Москва
Пользователь №: 17 484

|
Цитата(777777 @ Apr 25 2008, 15:27)  сабж, собсно... Это гупостью он занимаеться, для того чтобы соответствовать стандарту языка С. Анатолий.
|
|
|
|
|
Apr 25 2008, 13:16
|

Гуру
     
Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244

|
Цитата(777777 @ Apr 25 2008, 13:56)  Значит такое понятие как "неинициализированная переменная" уже не существует? Существует - для определенности она инициализируется нулем. Для инициализвции случайным числом существуют генераторы случайных чисел, однако. Цитата А если мне нужно инициализировать не нулем, а другим числом? Инициализируйте. Никто не запрещает. Цитата Несколько глупо, не так ли? Глупо, это то, что Вы тут пропагандируете. Цитата(MrYuran @ Apr 25 2008, 14:56)  вроде как перед объявлением переменной без инициализации надо писать _no_init или чё-то в этом духе Смотреть документацию на конкретный компилятор в части расширений языка. Для садомазохистов правится startup и убирается инициализация, вообще.
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Apr 25 2008, 15:16
|

Профессионал
    
Группа: Участник
Сообщений: 1 091
Регистрация: 25-07-07
Из: Саратов
Пользователь №: 29 357

|
Цитата(zltigo @ Apr 25 2008, 17:16)  Существует - для определенности она инициализируется нулем. Для инициализвции случайным числом существуют генераторы случайных чисел, однако. Очень смешно. Цитата(zltigo @ Apr 25 2008, 17:16)  Инициализируйте. Никто не запрещает. Глупо, это то, что Вы тут пропагандируете. Вообще-то инициализация занимает программную память, которой и так немного. Вы считаете глупостью желание ее сэкономить?
Сообщение отредактировал 777777 - Apr 25 2008, 15:17
|
|
|
|
|
Apr 25 2008, 15:24
|

Беспросветный оптимист
     
Группа: Свой
Сообщений: 4 640
Регистрация: 26-12-07
Из: Н.Новгород
Пользователь №: 33 646

|
Цитата(777777 @ Apr 25 2008, 18:16)  Вообще-то инициализация занимает программную память, которой и так немного. Вы считаете глупостью желание ее сэкономить? Откройте любой учебник по си. ВСЕГДА рекомендуется инициализировать переменные, иначе в них может находиться всё что угодно. Хорошо, если компилятор туда хотя бы 0 занесёт. ЗАТО: будет 100% уверенность в том, что находится в переменной
--------------------
Программирование делится на системное и бессистемное. ©Моё :) — а для кого-то БГ — это Bill Gilbert =)
|
|
|
|
|
Apr 28 2008, 04:12
|

Профессионал
    
Группа: Участник
Сообщений: 1 091
Регистрация: 25-07-07
Из: Саратов
Пользователь №: 29 357

|
Цитата(MrYuran @ Apr 25 2008, 19:24)  Откройте любой учебник по си. ВСЕГДА рекомендуется инициализировать переменные Во-первых, далеко не всегда это требуется. Например переменные, в которые считываются данные с каких-либо устройств ввода. Простейший пример if((c = getchar()) != EOF) putchar( с ); Это "выхолощенный" пример, но таких примеров может быть масса. Другой случай - когда в функцию передаются адреса переменных, в которые эта функция поместит некие вычисленные значения (т.е. фактически случай, когда функция возващает несколько значений). int a, b; getvalues(&a, &b); Случай, когда она возвращает одно значение, также не требует предварительной инициализации: int n = getvalue(); Во-вторых, не всегда требуется инициализировать именно нулем, бывает необходимость и в других значениях, в том числе инициализация значением функции (см. выше) В-третьих, твое высказывание "ВСЕГДА рекомендуется инициализировать переменные" предполагает, что это должен делать программист, а не компилятор. С этим я полностью согласен. Цитата(MrYuran @ Apr 25 2008, 19:24)  иначе в них может находиться всё что угодно. Хорошо, если компилятор туда хотя бы 0 занесёт. Наконец, в-четвертых, если переменную надо инициализировать, а ты забыл это сделать, то не стоит надеяться, что от инициалиации ее компилятором программа будет работать правильно. Может случиться, что 0 - такое же недопустимое значение, как и множество других. А может и нет - и тогда программа будет работать, но выдавать неправильный результат, и ты будешь долго искать ошибку. Цитата(zltigo @ Apr 25 2008, 20:08)  С учетом эффектов, которых придется получить при работе с неициализированной памятью - это глупость. А с учетом того, что с неициализированной памятью вообще работать невозможно, <...> Нельзя ли привести цитату, где я предлагал работать с неинициализированной памятью?
Сообщение отредактировал 777777 - Apr 28 2008, 04:19
|
|
|
|
|
Apr 28 2008, 05:47
|

Гуру
     
Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244

|
Цитата(777777 @ Apr 28 2008, 06:12)  Нельзя ли привести цитату, где я предлагал работать с неинициализированной памятью? Можно: Цитата WinAVR инициализирует все переменные!, Нельзя ли избавить его от этого глупого занятия? ....инициализация занимает программную память, которой и так немного. Вы считаете глупостью желание ее сэкономить? И учтите, Ваши постфактум толкования и попытки выкручиваться лично мне совершено неинтересны, посему, дальнейшию "дискуссию" поддерживать не буду.
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Apr 28 2008, 06:52
|

Профессионал
    
Группа: Участник
Сообщений: 1 091
Регистрация: 25-07-07
Из: Саратов
Пользователь №: 29 357

|
Цитата(zltigo @ Apr 28 2008, 09:47)  Нельзя ли привести цитату, где я предлагал работать с неинициализированной памятью? Можно:
QUOTE
WinAVR инициализирует все переменные!, Нельзя ли избавить его от этого глупого занятия? ....инициализация занимает программную память, которой и так немного. Вы считаете глупостью желание ее сэкономить? И из этого вы делаете вывод, что я предлагаю работать с неинициализированными переменными? Неплохо... Постом выше я подробно разъяснил, в каких именно случаях переменные нет смысла инициализировать, но и там где это требоется, это долже делать программист, а не компилятор. Цитата И учтите, Ваши постфактум толкования и попытки выкручиваться лично мне совершено неинтересны, посему, дальнейшию "дискуссию" поддерживать не буду. Очень осмотрительно. Цитата(xelax @ Apr 28 2008, 10:00)  Я немного изменю Вашу мысль. Если нужна какая-то специальная инициализация памяти, отличная от устоявшейся, то это должен делать программист, а не компилятор.
Компилятор всего лишь предоставляет шаблон, устраивающий 99 и 9 в периоде процентов разработчиков. Я полагаю, в 99 и 9 в периоде процентах проектов есть переменные, которые не требуется инициализировать или которые нужно инициализировать не нулем, следовательно код в них будет избыточным. Например массив, в котором хранятся данные для вывода на 7-сегментные индикаторы - для их выключения туда нужно записать все единицы. Комплятор генерирует код, который заполняет их нулями. Вы видите какой-то смысл в том чтобы дважды инициализировать эту область памяти? PS. еще интересно бы проверить, как он относится к объектам классов в режиме С++, неужели тоже сначала все их обнуляет, а потом начинает вызывать конструкторы для настоящей инициализации?
Сообщение отредактировал 777777 - Apr 28 2008, 06:54
|
|
|
|
|
Apr 28 2008, 07:08
|

Гуру
     
Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095

|
Цитата(777777 @ Apr 28 2008, 09:40)  Постом выше я подробно разъяснил, в каких именно случаях переменные нет смысла инициализировать, но и там где это требоется, это долже делать программист, а не компилятор. Еще неплохо бы подумать, должны ли все перечисленные в ваших примерах переменные быть глобальными или статическими. Если ответ "да", то о какой экономии вы тут нас пытаетесь агитировать? Если ответ "нет" - идем читать учебник или стандарт об инициализации автоматических переменных - очень удивитесь. Двигаемся дальше. Цитата(777777 @ Apr 28 2008, 09:40)  но и там где это требоется, это долже делать программист Теперь берите в руки дизассемблированный листинг той самой инициализации и смотрите, как реализовывается желание программиста: для каждой такой переменной начальное значение должно где-то храниться, чтобы при старте программы было известно, каким именно значением захотел инициализировать программист. Вы знаете более другой способ чем копирование начальных значений? Тогда нам интересно будет вас послушать. Развиваем эту мысль. Очень много (подавляющее большинство) переменных программист захочет проинициализировать нулем (поверьте, это так). Вы предлагаете в этом случае хранить во флеше по нулю для каждой переменной вместо того, чтобы очистить их всех скопом в цикле? О какой экономии вы тогда нас агитируете снова? Цитата(777777 @ Apr 28 2008, 09:52)  Я полагаю, в 99 и 9 в периоде процентах проектов есть переменные, которые не требуется инициализировать или которые нужно инициализировать не нулем, следовательно код в них будет избыточным. Вы полагаете неправильно. С точностью до наоборот, в 99 и 9 в периоде процентах глобальные и статические переменные требуется инициализировать нулем. Цитата(777777 @ Apr 28 2008, 09:52)  Например массив, в котором хранятся данные для вывода на 7-сегментные индикаторы - для их выключения туда нужно записать все единицы. Кому как. Это уже от прямоты рук зависит. У меня они гасятся нулями, поэтому массив очищается в цикле вместе с остальными глобальными и статическими переменными (представляете экономию кода - мне не нужно тратить место на еще один цикл заполнения массива единицами) Цитата(777777 @ Apr 28 2008, 09:52)  Комплятор генерирует код, который заполняет их нулями. Вы видите какой-то смысл в том чтобы дважды инициализировать эту область памяти? Код uint8_t Buffer[3] = { 0xFF, 0xFF,0xFF }; Где инициализируется дважды? Я вижу смысл в изучении языка и документации, а также алгоритмов. Вы можете ругать компилятор - от этого ваши программы "прямее" не станут. Цитата(777777 @ Apr 28 2008, 09:52)  PS. еще интересно бы проверить, как он относится к объектам классов в режиме С++, Интересно - проверяйте. Мне достаточно прочитать об этом в учебнике по С++.
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Apr 28 2008, 07:26
|

Профессионал
    
Группа: Участник
Сообщений: 1 091
Регистрация: 25-07-07
Из: Саратов
Пользователь №: 29 357

|
Цитата(Сергей Борщ @ Apr 28 2008, 11:08)  Код uint8_t Buffer[3] = { 0xFF, 0xFF,0xFF }; Где инициализируется дважды? Дважды - если их не инициализировать сразу, а написать свой код для инициализации. Тогда он будет сначала заполнен нулями, а потом моим кодом. А такой код я тоже пробовал. В этом случае, поскольку все байты в общем случае могут быть разными, он создает в памяти программ массив из инициализируемых байт и при старте переписывает их в этот массив. Когда он состоит из 3 байт - это еще терпимо, но если их штук 16-20, я начинаю нервничать, т.к. простой цикл, заполняющий их ff-ами, мог быть и короче.
|
|
|
|
|
Apr 28 2008, 07:47
|

Гуру
     
Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095

|
Цитата(777777 @ Apr 28 2008, 10:26)  Дважды - если их не инициализировать сразу, а написать свой код для инициализации. Тогда он будет сначала заполнен нулями, а потом моим кодом. В таком случае он будет сначала заполнен нулями вместе со всеми остальными обнуляемыми переменными, на это не будет потрачено ни байта дополнительной памяти. Что вы хотите здесь сэкономить? Цитата(777777 @ Apr 28 2008, 10:26)  но если их штук 16-20, я начинаю нервничать, Пейте ромашковый чай. А еще можете попытаться изменить алгоритм, чтобы погашенному состоянию соответствовали нули. На крайний случай можно посоветовать чтение документации, в частности на avr-libc (описание секции .noinit), но, во-первых, такой совет вы стойко игнорируете, а во-вторых, эта секция придумана и реализована совсем для другого и если вы сейчас с ее помощью начнете ставить распорки и расчалки в свою программу, она еще долго будет далека от совершенства. Сделать можно практически все, однако для этого придется изучить язык С, изучить gcc, изучить линкер ld и формат его скриптовых файлов. Но в 99 и 9 в периоде процентах случаев этого не требуется - достаточно выбрать правильный алгоритм.
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
Сообщений в этой теме
777777 WinAVR инициализирует все переменные! Apr 25 2008, 11:27           zltigo Цитата(Сергей Борщ @ Apr 28 2008, 09:47) ... Apr 28 2008, 09:39            Сергей Борщ Цитата(zltigo @ Apr 28 2008, 12:39) Не бу... Apr 28 2008, 11:24             zltigo Цитата(Сергей Борщ @ Apr 28 2008, 13:24) ... Apr 28 2008, 11:36          xelax Цитата(777777 @ Apr 28 2008, 11:26) Дважд... Apr 28 2008, 07:52      xelax Цитата(777777 @ Apr 28 2008, 08:12) Во-вт... Apr 28 2008, 06:00    zltigo Цитата(777777 @ Apr 25 2008, 17:16) Вообщ... Apr 25 2008, 16:08     singlskv Цитата(zltigo @ Apr 25 2008, 20:08) Прогр... Apr 25 2008, 16:40      zltigo Цитата(singlskv @ Apr 25 2008, 18:40) быв... Apr 25 2008, 16:55       singlskv Цитата(zltigo @ Apr 25 2008, 20:55) Типа ... Apr 25 2008, 18:42        IgorKossak Цитата(singlskv @ Apr 25 2008, 21:42) каж... Apr 25 2008, 19:23         singlskv Цитата(IgorKossak @ Apr 25 2008, 23:23) Н... Apr 25 2008, 19:33        zltigo Цитата(singlskv @ Apr 25 2008, 20:42) Ну ... Apr 25 2008, 19:40         singlskv Цитата(zltigo @ Apr 25 2008, 23:40) Это в... Apr 25 2008, 19:56  aesok Цитата(777777 @ Apr 25 2008, 15:56) Да ну... Apr 25 2008, 13:56   ReAl Цитата(777777 @ Apr 25 2008, 14:56) Да ну... Apr 25 2008, 14:48 MrYuran где-то я это уже видел...
не помню где...
вроде ка... Apr 25 2008, 12:56 Aleksandr Baranov Так ведь это уже обсуждалось пару дней назад.
The... Apr 25 2008, 13:43 singlskv Цитата(Aleksandr Baranov @ Apr 25 2008, 17... Apr 25 2008, 14:09
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|