Вопросы по синтаксису СИ
- megasvintus
- Вымогатель припоя
- Сообщения: 568
- Зарегистрирован: Вт мар 04, 2008 20:03:03
- Откуда: Нижний Новгород
Вопросы по синтаксису СИ
Всех приветствую!
Сижу, разбираю примеры, которые разработчики CVAVR любезно предоставили в комплекте с компилятором. Понятное дело- тексты писаны профессионалами, и кое-что в них совсем не понятно:
1) Файл ds18b20.с, есть строки:
#define MAX_DEVICES 8 //Тут всё ясно
unsigned char rom_code[MAX_DEVICES][9] /* а здесь непонятен синтаксис, вроде бы объявляется массив, но как-то интересно указывается количество членов. Компилятор потом же вместо MAX_DEVICES подставит цифру 8 и получится
unsigned char rom_code[8[9] Как это работает?
2) Код, в котором происходит инициализация термометров и настройка их на 12 битное разрешение, я если честно, мало не понял как сие работает.
for(i=0;i<devices)
if(!ds18b20_init(&rom_code[i++][0],20,30,DS18B20_12BIT_RES))
далее всего лишь вывод результатв на дисплей.
Насколько я понял, идет поочередная инициализация всех найденных девайсов и их настройка. Для этого тут есть цикл for, непонятно вот что:
а) Почему счетчик i++ вынесен в функцию if? неужели помимо проверки условия в скобках if(условие) сразу может исполняться код записанный в этих скобках?
б) для чего стоит ! и DS18B20_12BIT_RES- понятно. Объясните, пожалуйста как работает остальное, для чего, к примеру [0], 10, 20, 30- что это такое? Почему 0 в квадр. скобках, а остальное -нет?
А для чего стоит & перед rom_code?
Сижу, разбираю примеры, которые разработчики CVAVR любезно предоставили в комплекте с компилятором. Понятное дело- тексты писаны профессионалами, и кое-что в них совсем не понятно:
1) Файл ds18b20.с, есть строки:
#define MAX_DEVICES 8 //Тут всё ясно
unsigned char rom_code[MAX_DEVICES][9] /* а здесь непонятен синтаксис, вроде бы объявляется массив, но как-то интересно указывается количество членов. Компилятор потом же вместо MAX_DEVICES подставит цифру 8 и получится
unsigned char rom_code[8[9] Как это работает?
2) Код, в котором происходит инициализация термометров и настройка их на 12 битное разрешение, я если честно, мало не понял как сие работает.
for(i=0;i<devices)
if(!ds18b20_init(&rom_code[i++][0],20,30,DS18B20_12BIT_RES))
далее всего лишь вывод результатв на дисплей.
Насколько я понял, идет поочередная инициализация всех найденных девайсов и их настройка. Для этого тут есть цикл for, непонятно вот что:
а) Почему счетчик i++ вынесен в функцию if? неужели помимо проверки условия в скобках if(условие) сразу может исполняться код записанный в этих скобках?
б) для чего стоит ! и DS18B20_12BIT_RES- понятно. Объясните, пожалуйста как работает остальное, для чего, к примеру [0], 10, 20, 30- что это такое? Почему 0 в квадр. скобках, а остальное -нет?
А для чего стоит & перед rom_code?
Трудно быть деревянным, совсем трудно....
- ARV
- Ум, честь и совесть. И скромность.
- Сообщения: 18544
- Зарегистрирован: Чт дек 28, 2006 08:19:56
- Откуда: Новочеркасск
- Контактная информация:
1. с define не все так уж и ясно. очень рекомендую не использовать в строке #define комментарий типа // - лучше применяйте /* такой комментарий */
2. объявляется двумерный массив, т.е. матрица из 8 строк и 9 столбцов
3. синтаксис Си допускает использовать операторы ++ и -- всюду, где используются переменные.
4. рекомендую придерживаться стандартно-полного формата записи оператора for - в вашем случае так: for(i=0;i<devices;) - т.е. точка с запятой после второй части оператора
5. посмотрите на параметры функции ds18b20_init() и вы увидите, что у нее 4 параметра - первый это указатель на элемент вашего двумерного массива, а три остальных и указаны через запятые, что это означает - надо смотреть в описании функции (я не пользуюсь CVAVR потому и не могу сказать)
6. & перед rom_code - это оператор получения адреса элемента массива - первый параметр функции ds18b20_init() должен быть указателем, т.е. адресом - вот этот оператор и используется). я бы советовал использовать перед ним (void *) - так корректнее.
P.S. Все рекомендации мои касаются соблюдения стандарта языка Си - то, что компилятор CVAVR допускает вольности - не должно вводить вас в заблуждение, лучше придерживаться требований стандарта, тогда не возникнет проблем с переносимостью на другие компиляторы.
2. объявляется двумерный массив, т.е. матрица из 8 строк и 9 столбцов
3. синтаксис Си допускает использовать операторы ++ и -- всюду, где используются переменные.
4. рекомендую придерживаться стандартно-полного формата записи оператора for - в вашем случае так: for(i=0;i<devices;) - т.е. точка с запятой после второй части оператора
5. посмотрите на параметры функции ds18b20_init() и вы увидите, что у нее 4 параметра - первый это указатель на элемент вашего двумерного массива, а три остальных и указаны через запятые, что это означает - надо смотреть в описании функции (я не пользуюсь CVAVR потому и не могу сказать)
6. & перед rom_code - это оператор получения адреса элемента массива - первый параметр функции ds18b20_init() должен быть указателем, т.е. адресом - вот этот оператор и используется). я бы советовал использовать перед ним (void *) - так корректнее.
P.S. Все рекомендации мои касаются соблюдения стандарта языка Си - то, что компилятор CVAVR допускает вольности - не должно вводить вас в заблуждение, лучше придерживаться требований стандарта, тогда не возникнет проблем с переносимостью на другие компиляторы.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
- megasvintus
- Вымогатель припоя
- Сообщения: 568
- Зарегистрирован: Вт мар 04, 2008 20:03:03
- Откуда: Нижний Новгород
- ARV
- Ум, честь и совесть. И скромность.
- Сообщения: 18544
- Зарегистрирован: Чт дек 28, 2006 08:19:56
- Откуда: Новочеркасск
- Контактная информация:
пользуйтесь WinAVR - его авторы придерживаются стандарта С99 очень сильноmegasvintus писал(а):Спасибо! Жаль, что авторы компилятора не придерживаются общих правил, а пользуются "вольностями". Это усложняет процесс понимания данных примеров
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
- megasvintus
- Вымогатель припоя
- Сообщения: 568
- Зарегистрирован: Вт мар 04, 2008 20:03:03
- Откуда: Нижний Новгород
Для начала освою CVAVR, а то и так глаза разбегаются от обилия информации. А то если возьмусь еще и за WinAVR, то будет как в поговорке: за двумя зайцами погонишься...
Хотя чувствую что необходимость изучить WinAVR наступит.
Кстати, там есть такая полезная штука как генератор начального кода?
Хотя чувствую что необходимость изучить WinAVR наступит.
Кстати, там есть такая полезная штука как генератор начального кода?
Трудно быть деревянным, совсем трудно....
- ARV
- Ум, честь и совесть. И скромность.
- Сообщения: 18544
- Зарегистрирован: Чт дек 28, 2006 08:19:56
- Откуда: Новочеркасск
- Контактная информация:
нет. генератор начального кода с моей точки зрения штука для начинающих вреднаяmegasvintus писал(а):Кстати, там есть такая полезная штука как генератор начального кода?
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
- megasvintus
- Вымогатель припоя
- Сообщения: 568
- Зарегистрирован: Вт мар 04, 2008 20:03:03
- Откуда: Нижний Новгород
- ARV
- Ум, честь и совесть. И скромность.
- Сообщения: 18544
- Зарегистрирован: Чт дек 28, 2006 08:19:56
- Откуда: Новочеркасск
- Контактная информация:
если бы мастер CVAVR генерировал хороший код - я не так был бы настроен против него. но он генерирует код, который не помогает, а затрудняет понимание происходящего.
сравните:
в итоге вы быстро делаете то, что работает, но с каждым разом все меньше и меньше понимаете, почему оно работает.
P.S. К сожалению, я не встречал "автогенераторов кода", которые генерировали бы красивый код, хотя никакой проблемы в этом нет
сравните:
Код: Выделить всё
// нормальный программист пишет так:
ADCSRA = (1<<ADEN)|(1<<ADIE);
// для WinAVR можно написать так:
ADCSRA = _BV(ADEN)|_BV(ADIE);
// "мастер" генерирует то же самое так:
ADCSRA = 0x88;в итоге вы быстро делаете то, что работает, но с каждым разом все меньше и меньше понимаете, почему оно работает.
P.S. К сожалению, я не встречал "автогенераторов кода", которые генерировали бы красивый код, хотя никакой проблемы в этом нет
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
- megasvintus
- Вымогатель припоя
- Сообщения: 568
- Зарегистрирован: Вт мар 04, 2008 20:03:03
- Откуда: Нижний Новгород
- tych
- Э...
- Сообщения: 2792
- Зарегистрирован: Ср апр 04, 2007 08:39:14
- Откуда: Москва
- Контактная информация:
megasvintus писал(а): я всегда смотрю в даташит почему мастер написал то-то...
Обязательно надо это читать и понимать значение записываемых в регистры чисел - в курсе я советую обязательно разбираться и писать СВОИ комментарии к коду мастера с указанием страниц даташита.
ARV писал(а): но с каждым разом все меньше и меньше понимаете, почему оно работает.
Вы своим опытом делитесь ? Спсибо ! он бесценен.
ARV писал(а):Код: Выделить всё
// "мастер" генерирует то же самое так:
ADCSRA = 0x88;
И даже комментариев не даёт ? Ай-ай-ай ...
Думайте сами, решайте сами ... а вот он-лайн перевод на корявый русский http://translate.ru
- ARV
- Ум, честь и совесть. И скромность.
- Сообщения: 18544
- Зарегистрирован: Чт дек 28, 2006 08:19:56
- Откуда: Новочеркасск
- Контактная информация:
пожалуйста, пользуйтесь на здоровьеtych писал(а):Вы своим опытом делитесь ? Спсибо ! он бесценен.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
- ARV
- Ум, честь и совесть. И скромность.
- Сообщения: 18544
- Зарегистрирован: Чт дек 28, 2006 08:19:56
- Откуда: Новочеркасск
- Контактная информация:
не знаю на счет комментариев - не пользуюсь CVAVR, если не считать пары опытов, чтоб войти в курс дела...tych писал(а):И даже комментариев не даёт ? Ай-ай-ай ...
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
- tych
- Э...
- Сообщения: 2792
- Зарегистрирован: Ср апр 04, 2007 08:39:14
- Откуда: Москва
- Контактная информация:
ARV писал(а): на счет непонимания опыта у меня нет, делиться нечем...
У вас большой опыт врать цитируя то что вам выгодно ! Но зря вы им делитесь.
А реально код мастера в примере
C:\CVAVR\examples\ADC8535
выглядит вот так:
Код: Выделить всё
// ADC initialization
// ADC Clock frequency: 57.600 kHz
// ADC Voltage Reference: AREF pin
// ADC High Speed Mode: Off
// ADC Auto Trigger Source: None
// Only the 8 most significant bits of
// the AD conversion result are used
// Select ADC input 0
ADMUX=ADC_VREF_TYPE;
ADCSRA=0x8E;
SFIOR&=0xEF;
// Global enable interrupts
#asm("sei")
// Start the first AD conversion
ADCSRA|=0x40;ПОЧУВСТВУЙТЕ РАЗНИЦУ !!!
ARV писал(а):не знаю на счет комментариев - не пользуюсь CVAVR, если не считать пары опытов, чтоб войти в курс дела...
Пастернака не читал, но осуждаю ...
Думайте сами, решайте сами ... а вот он-лайн перевод на корявый русский http://translate.ru
- ARV
- Ум, честь и совесть. И скромность.
- Сообщения: 18544
- Зарегистрирован: Чт дек 28, 2006 08:19:56
- Откуда: Новочеркасск
- Контактная информация:
в этом мы одинаковы - вы тоже цитируете только то, что вам выгодно. и назовите мне хоть кого-то, кто делает цитаты себе во вредtych писал(а):У вас большой опыт врать цитируя то что вам выгодно ! Но зря вы им делитесь.
что же касается показанного вами примера - и что толку с тех комментариев?! я понимаю, что лично вам, благодаря мастеру-автогенератору кода, не надо думать ("было бы ошибкой думать" ©В.И.Ленин), как настроить АЦП на другую частоту сэмплов, но если придется - как поступать станете? много ли пользы получите от "// ADC Clock frequency: 57.600 kHz " и "ADCSRA=0x8E;"? для чего в хидерах расписаны имена всех битов всех регистров?! чтобы их использовать, а не загадочные числа шестнадцатеричные писать - вот мое мнение.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
- Aheir
- Модератор
- Сообщения: 4517
- Зарегистрирован: Пн апр 03, 2006 11:43:25
- Откуда: Санкт - Петербург
- Контактная информация:
В любом случае, если человеку оно надо, он возьмет шестнадцатиричное число, переведет его в двоичное, посмотрит название и функционал соответствующих битов в даташите и навсегда запомнит, ну а если человеку это не нужно - так и говорить не о чем. Такое мое мнение.
Заканчиваем оффтоп, дружненько так, хорошо?
Заканчиваем оффтоп, дружненько так, хорошо?
Оптимизм х (Опыт + Знания) = const
- savage
- Нашел транзистор. Понюхал.
- Сообщения: 187
- Зарегистрирован: Пн дек 17, 2007 14:06:09
- Откуда: Саранск
С WinAVR не все так гладко. С ATTiny13 у меня он почему то ругается на
PORTB|=1<<OUTBIT;
и
PORTB&=~(1<<OUTBIT);
Приходится указывать явно PORTB|=b00001000;
В тоже время CVAVR работает нормально.
С другими контроллерами работает нормально. Интересно почему?
Дня три убил пока разобрался.Так что не все так просто.
PORTB|=1<<OUTBIT;
и
PORTB&=~(1<<OUTBIT);
Приходится указывать явно PORTB|=b00001000;
В тоже время CVAVR работает нормально.
С другими контроллерами работает нормально. Интересно почему?
Дня три убил пока разобрался.Так что не все так просто.
- Yellow Tiger
- Сверлит текстолит когтями
- Сообщения: 1148
- Зарегистрирован: Вт июл 08, 2008 12:24:17
Вообще-то, в указанном файле так и написано - с двумя точко-запятыми:ARV писал(а):рекомендую придерживаться стандартно-полного формата записи оператора for - в вашем случае так: for(i=0;i<devices;) - т.е. точка с запятой после второй части оператора

А кроме того - по идее, компилятор должен выдать ошибку "For statement missing ;" на такой фортель, как отсутствие точки с запятой.
Нет здесь вольностиmegasvintus писал(а):Жаль, что авторы компилятора не придерживаются общих правил, а пользуются "вольностями".
- ARV
- Ум, честь и совесть. И скромность.
- Сообщения: 18544
- Зарегистрирован: Чт дек 28, 2006 08:19:56
- Откуда: Новочеркасск
- Контактная информация:
я отвечал по тексту сообщения, файла этого я и в глаза не виделYellow Tiger писал(а):Вообще-то, в указанном файле так и написано - с двумя точко-запятыми
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!