Easyelectronics.ru

Электроника для всех
Текущее время: 28 фев 2021, 06:09

Часовой пояс: UTC + 5 часов



JLCPCB – Прототипы печатных плат за $2/5шт. два слоя. $5/5шт. четыре слоя
Крупнейший производитель печатных плат и прототипов. Более 600000 клиентов и свыше 10000 заказов в день!
Получите скидку на почтовую отправку при первом заказе в JLCPCB!

Начать новую тему Ответить на тему  [ Сообщений: 307 ]  На страницу Пред.  1 ... 7, 8, 9, 10, 11, 12, 13  След.
Автор Сообщение
 Заголовок сообщения: Re: Вопросы о С.
СообщениеДобавлено: 06 сен 2012, 03:06 
Супермодератор
Аватара пользователя

Зарегистрирован: 26 янв 2010, 22:19
Сообщения: 6835
Откуда: Из тех... Из бывших...
Ок, спасибо. Мне просто попробовать разобраться.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Вопросы о С.
СообщениеДобавлено: 28 сен 2012, 12:30 
Старожил
Аватара пользователя

Зарегистрирован: 05 ноя 2010, 16:03
Сообщения: 1510
Откуда: Екатеринбург
а вот такой вопрос:
в некоем примере наткнулся на такой финт, написанный под Keil
Код:
enum {TEMP,HUMI};

char s_measure(unsigned char mode)
{
    case TEMP   :  break;
    case HUMI   :  break;
    default     : break;   
}


s_measure(HUMI);


как-то нелогично объявляется тип перечисления. точнее, он вообще не объявляется.
или подразумевается, что раз проц 8-битный, то и дефолтный тип тоже 8 бит?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Вопросы о С.
СообщениеДобавлено: 28 сен 2012, 12:34 
Старожил

Зарегистрирован: 03 мар 2010, 14:10
Сообщения: 1514
Откуда: Беларусь, Минск
Ant писал(а):
а вот такой вопрос:
в некоем примере наткнулся на такой финт, написанный под Keil
...
как-то нелогично объявляется тип перечисления. точнее, он вообще не объявляется.
или подразумевается, что раз проц 8-битный, то и дефолтный тип тоже 8 бит?

Всё верно, это яркий пример того, как не надо делать. К тому же вы явно пропустили switch, а если это оригинал - то вообще полная чушь.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Вопросы о С.
СообщениеДобавлено: 28 сен 2012, 12:45 
Старожил
Аватара пользователя

Зарегистрирован: 05 ноя 2010, 16:03
Сообщения: 1510
Откуда: Екатеринбург
а, да, switch выкусил случайно.
ну мне-то был интересен не свитч, а именно муть с объявлением перечисления.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Вопросы о С.
СообщениеДобавлено: 28 сен 2012, 14:59 
Старожил
Аватара пользователя

Зарегистрирован: 05 ноя 2010, 16:03
Сообщения: 1510
Откуда: Екатеринбург
сижу туплю:
Код:
char s_measure(unsigned char *p_value)
{
  *(p_value)  =s_read_byte(ACK);    //read the first byte (MSB)
  *(p_value+1)=s_read_byte(ACK);    //read the second byte (LSB)
}


как понять *(p_value) и *(p_value+1) ?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Вопросы о С.
СообщениеДобавлено: 28 сен 2012, 15:16 
Старожил
Аватара пользователя

Зарегистрирован: 27 янв 2012, 17:24
Сообщения: 525
Ant писал(а):
сижу туплю:

как понять *(p_value) и *(p_value+1) ?

Первое - значение байта по адресу, на который указывает указатель.
Второе - значение по следующему адресу.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Вопросы о С.
СообщениеДобавлено: 28 сен 2012, 15:47 
Старожил

Зарегистрирован: 03 мар 2010, 14:10
Сообщения: 1514
Откуда: Беларусь, Минск
MrYuran писал(а):
Ant писал(а):
сижу туплю:

как понять *(p_value) и *(p_value+1) ?

Первое - значение байта по адресу, на который указывает указатель.
Второе - значение по следующему адресу.

Единственное дополнение, в общем следующий адрес - это не адрес больший на единицу, а больший на размер элемента.
*(p_value) и *(p_value+1) можно записать как p_value[0] и p_value[1] соответственно.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Вопросы о С.
СообщениеДобавлено: 28 сен 2012, 16:23 
Старожил
Аватара пользователя

Зарегистрирован: 05 ноя 2010, 16:03
Сообщения: 1510
Откуда: Екатеринбург
а кстати, по предыдущему вопросу с enum {TEMP,HUMI}
дефолтный размер понятен. но неужели существует ещё и дефолтный ряд значений?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Вопросы о С.
СообщениеДобавлено: 28 сен 2012, 17:12 
Старожил

Зарегистрирован: 03 мар 2010, 14:10
Сообщения: 1514
Откуда: Беларусь, Минск
Ant писал(а):
а кстати, по предыдущему вопросу с enum {TEMP,HUMI}
дефолтный размер понятен. но неужели существует ещё и дефолтный ряд значений?

А как же, значения начинаются с 0 и далее по возрастанию. Можно явно указать значение, если необходимо.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Вопросы о С.
СообщениеДобавлено: 25 окт 2012, 16:54 
Старожил
Аватара пользователя

Зарегистрирован: 05 ноя 2010, 16:03
Сообщения: 1510
Откуда: Екатеринбург
вы не поверите, снова выдалось некоторое время на Си. курю всё тот же небольшой кусок кода и всё-таки не вдупляю..
Код:

// 1. объявляем структуру, состоящую из инта и флоата (простите за мой французский)
typedef union
{ unsigned int i;
  float f;
} value;

//////////////////////////////////////////////
char s_measure(unsigned char *p_value)
{
  *(p_value)  =s_read_byte(ACK);    //read the first byte (MSB)

  // 4. тут вообще непонятки: сдвиг на байт (см. объявление p_value на входе в функцию), -- это что, заполнение инта в два захода?
  *(p_value+1)=s_read_byte(ACK);    //read the second byte (LSB)
}

//////////////////////////////////////////////
int main(void)
{
   // 2. объявляем две переменные ранее объявленного "структурного" типа.
   value humi_val,temp_val;

   // 3. тут уже работаем с длинами переменной, равными байту (??), но ведь i у нас объявлен в структуре как инт
   error+=s_measure((unsigned char*) &humi_val.i);  //measure humidity
   
   if(error!=0) s_connectionreset();                 //in case of an error: connection reset
   else
      { humi_val.f=(float)humi_val.i; }         


посмотрите кто в этом всём понимает, последовательность вопросов я отметил особо))
PS код выдернут из стандартного примера работы с SHT10 с их сайта


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Вопросы о С.
СообщениеДобавлено: 25 окт 2012, 17:13 
Старожил

Зарегистрирован: 30 апр 2010, 22:56
Сообщения: 1589
Откуда: Киев
Ant писал(а):
вы не поверите, снова выдалось некоторое время на Си. курю всё тот же небольшой кусок кода и всё-таки не вдупляю..

PS код выдернут из стандартного примера работы с SHT10 с их сайта


попробую изобразить в танце

PS. В комментариях непонятный порядок байт, АВР вроде little-endian


Вложения:
bitmap.png
bitmap.png [ 44.88 Кб | Просмотров: 7329 ]
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Вопросы о С.
СообщениеДобавлено: 26 окт 2012, 09:05 
Старожил
Аватара пользователя

Зарегистрирован: 05 ноя 2010, 16:03
Сообщения: 1510
Откуда: Екатеринбург
и последний вопрос: в Си такой подход это норма? я имею в виду, один раз объявить одну переменную двухбайтной, потом кучу раз обращаться к её байтам по отдельности -- и всё для того, чтобы единожды в самом конце взять весь инт целиком. и это ещё в аппноте.

не проще было завести просто две однобайтных переменных - и код стал бы понятнее в разы?..


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Вопросы о С.
СообщениеДобавлено: 26 окт 2012, 10:03 
Старожил
Аватара пользователя

Зарегистрирован: 26 сен 2012, 16:33
Сообщения: 609
Откуда: Челябинск
Ant писал(а):
и последний вопрос: в Си такой подход это норма? я имею в виду, один раз объявить одну переменную двухбайтной, потом кучу раз обращаться к её байтам по отдельности -- и всё для того, чтобы единожды в самом конце взять весь инт целиком. и это ещё в аппноте.

не проще было завести просто две однобайтных переменных - и код стал бы понятнее в разы?..


Когда это применяется по делу, то да. Просто С хорошим компилятором обычно очень хорошо переводится в нативный код.
Сдвиги, маски и прочее занимают 1-2 команды процессора. Память не расходуется зря и скорость выполнения не страдает.
А вот побайтовое обращение обычно медленнее на многих архитектурах, чем работа с int или long (16, 32, 64bit).
Именно поэтому С и называют "высокоуровневым ассемблером".


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Вопросы о С.
СообщениеДобавлено: 26 окт 2012, 12:05 
Старожил

Зарегистрирован: 30 апр 2010, 22:56
Сообщения: 1589
Откуда: Киев
По размеру кода оно практически одинаково. Недостаток указателей - занята регистровая пара указателей и можно ошибиться с порядком байт.

Я бы использовал такую конструкцию:

Код:
i = (myReadTemp()<<8) | myReadTemp();


тут четко понятно, что здесь старший байт, что здесь младший.

Код:
   i = 0;
  a0:   10 92 67 00    sts   0x0067, r1
  a4:   10 92 66 00    sts   0x0066, r1

   p = (uint8_t *)&i;
  a8:   86 e6          ldi   r24, 0x66   ; 102
  aa:   90 e0          ldi   r25, 0x00   ; 0
  ac:   90 93 65 00    sts   0x0065, r25
  b0:   80 93 64 00    sts   0x0064, r24

   *(p) = myReadTemp();
  b4:   0e 94 49 00    call   0x92   ; 0x92 <myReadTemp>
  b8:   80 93 66 00    sts   0x0066, r24
   *(p+1) = myReadTemp();
  bc:   00 91 64 00    lds   r16, 0x0064
  c0:   10 91 65 00    lds   r17, 0x0065
  c4:   0e 94 49 00    call   0x92   ; 0x92 <myReadTemp>
  c8:   f8 01          movw   r30, r16
  ca:   81 83          std   Z+1, r24   ; 0x01

   i = 0;
  cc:   10 92 67 00    sts   0x0067, r1
  d0:   10 92 66 00    sts   0x0066, r1

   i = (myReadTemp()<<8) | myReadTemp();
  d4:   0e 94 49 00    call   0x92   ; 0x92 <myReadTemp>
  d8:   18 2f          mov   r17, r24
  da:   0e 94 49 00    call   0x92   ; 0x92 <myReadTemp>
  de:   31 2f          mov   r19, r17
  e0:   20 e0          ldi   r18, 0x00   ; 0
  e2:   90 e0          ldi   r25, 0x00   ; 0
  e4:   28 2b          or   r18, r24
  e6:   39 2b          or   r19, r25
  e8:   30 93 67 00    sts   0x0067, r19
  ec:   20 93 66 00    sts   0x0066, r18


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Вопросы о С.
СообщениеДобавлено: 26 окт 2012, 12:49 
Старожил
Аватара пользователя

Зарегистрирован: 05 ноя 2010, 16:03
Сообщения: 1510
Откуда: Екатеринбург
Steel.ne писал(а):
Я бы использовал такую конструкцию:

Код:
i = (myReadTemp()<<8) | myReadTemp();

ага, и вызов функции идёт дважды, получится один байт из одного замера, второй - из другого


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Вопросы о С.
СообщениеДобавлено: 26 окт 2012, 14:07 
Старожил

Зарегистрирован: 03 мар 2010, 14:10
Сообщения: 1514
Откуда: Беларусь, Минск
Steel.ne писал(а):
Я бы использовал такую конструкцию:
Код:
i = (myReadTemp()<<8) | myReadTemp();

В общем случае порядок вычисления не определён. С вероятностью 50% можно получить как правильный результат, и ещё 50% остается на инвертированный. Лучше уж так:
Код:
i = s_read_byte(ACK) & 0xFFU;
i |= (s_read_byte(ACK) & 0xFFU) << 8;

На счёт "лишних" побитовых И можно особо не волноваться, компиляторы ныне достаточно умные что бы понять что от результат вызова функции нужен только младший байт.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Вопросы о С.
СообщениеДобавлено: 26 окт 2012, 14:22 
Старожил

Зарегистрирован: 30 апр 2010, 22:56
Сообщения: 1589
Откуда: Киев
Ant писал(а):
Steel.ne писал(а):
Я бы использовал такую конструкцию:

Код:
i = (myReadTemp()<<8) | myReadTemp();

ага, и вызов функции идёт дважды, получится один байт из одного замера, второй - из другого


ээээ. Конечно.
Ты наверно невнимательно смотрел, что у тебя в функции творится

Код:
*(p_value)  =s_read_byte(ACK);    //read the first byte (MSB)

  // 4. тут вообще непонятки: сдвиг на байт (см. объявление p_value на входе в функцию), -- это что, заполнение инта в два захода?
  *(p_value+1)=s_read_byte(ACK);    //read the second byte (LSB)


два раза читаем, соответственно старший и младший байты. Не?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Вопросы о С.
СообщениеДобавлено: 26 окт 2012, 14:26 
Старожил

Зарегистрирован: 30 апр 2010, 22:56
Сообщения: 1589
Откуда: Киев
amx писал(а):
Steel.ne писал(а):
Я бы использовал такую конструкцию:
Код:
i = (myReadTemp()<<8) | myReadTemp();

В общем случае порядок вычисления не определён. С вероятностью 50% можно получить как правильный результат, и ещё 50% остается на инвертированный. Лучше уж так:
Код:
i = s_read_byte(ACK) & 0xFFU;
i |= (s_read_byte(ACK) & 0xFFU) << 8;

На счёт "лишних" побитовых И можно особо не волноваться, компиляторы ныне достаточно умные что бы понять что от результат вызова функции нужен только младший байт.


Согласен. Я так написал только для примера - вместо записи по указателю мы собираем через сдвиги и OR
порядок строк может быть и обратным, в зависимости от того, что первым приходит MSB или LSB.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Вопросы о С.
СообщениеДобавлено: 26 окт 2012, 21:04 
Старожил

Зарегистрирован: 24 окт 2011, 17:29
Сообщения: 2338
Откуда: Украина
[quote="Ant"]вы не поверите, снова выдалось некоторое время на Си. курю всё тот же небольшой кусок кода и всё-таки не вдупляю..
Код:

// 1. объявляем структуру, состоящую из инта и флоата (простите за мой французский)
typedef union
{ unsigned int i;
  float f;
} value;

это юнион! со структурой не имеет ничего общего!!!
ну и дальнейшие рассуждения перечитать после внимательного чтения букваря.
т.е. по факту, в памяти uint и float лежат по одному адресу. на чем, собственно, и основано чтение младшего и старшего байтов инта.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Вопросы о С.
СообщениеДобавлено: 26 окт 2012, 21:20 
Старожил
Аватара пользователя

Зарегистрирован: 26 янв 2010, 21:48
Сообщения: 3965
Откуда: Звенигород
led_fan писал(а):
ну и дальнейшие рассуждения перечитать после внимательного чтения букваря.

Это надо в заголовок, красными и мигающими буквами, выделить.

_________________
От Парижа до Находки с водкой лучше, чем без водки!


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Вопросы о С.
СообщениеДобавлено: 26 окт 2012, 23:45 
Старожил

Зарегистрирован: 11 сен 2012, 11:19
Сообщения: 5896
led_fan писал(а):
Ant писал(а):
это юнион! со структурой не имеет ничего общего!!!


Гы... Свершилось . Наконец то хоть кто то вдуплился.
Честно говоря после местных перлов о static сильно сомневался .


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Вопросы о С.
СообщениеДобавлено: 26 окт 2012, 23:56 
Старожил

Зарегистрирован: 24 окт 2011, 17:29
Сообщения: 2338
Откуда: Украина
да я сразу отдетектил, просто на тот момент был чисто читателем... ;)

ну а про статик и про "небольшие преувеличения" я в той теме там отписался, как и о причинах... ;)
подтверждением чему, собсно, очередной (этот) топик... ну и вопрос дрвласа про ребут буквально пару дней спустя... %)


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Вопросы о С.
СообщениеДобавлено: 27 окт 2012, 00:46 
Старожил
Аватара пользователя

Зарегистрирован: 05 ноя 2010, 16:03
Сообщения: 1510
Откуда: Екатеринбург
PRC писал(а):
led_fan писал(а):
ну и дальнейшие рассуждения перечитать после внимательного чтения букваря.

Это надо в заголовок, красными и мигающими буквами, выделить.

такое ощущение, что вас там обоих электрошокером долбят, если вы в этом топике на каждый тупой вопрос не ответите. извинити.

PS букварь я читал. видимо, слишком был примитивный.
PPS про юнионы и структуры гуглил, везде всё это описывается в одной главе и различия из них не делается. впрочем, зачем я это объясняю.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Вопросы о С.
СообщениеДобавлено: 27 окт 2012, 02:37 
Старожил
Аватара пользователя

Зарегистрирован: 26 сен 2012, 16:33
Сообщения: 609
Откуда: Челябинск
По факту viewtopic.php?p=222631#p222631
А то дольше глаза ломаешь, чем отвечаешь.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Вопросы о С.
СообщениеДобавлено: 27 окт 2012, 09:30 
Старожил

Зарегистрирован: 24 окт 2011, 17:29
Сообщения: 2338
Откуда: Украина
Ant писал(а):
PS букварь я читал. видимо, слишком был примитивный.

читай еще раз, а потом и еще. до полного просветления.

Цитата:
PPS про юнионы и структуры гуглил, везде всё это описывается в одной главе и различия из них не делается. впрочем, зачем я это объясняю.

смотри:
Код:

union u16convert
{
uint16_t value;    //!< for word access
struct u16bytes   //!< for byte access
{
uint8_t low;   //!< byte member
uint8_t high;   //!< byte member
};

};

value и структура лежат по одному адресу.
можно обратиться как к уинту, и получить уинт, а можно раздельно к младшему и старшему байтам. но места в памяти этот юнион занимает 2 байта.

есть разница, правда?


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 307 ]  На страницу Пред.  1 ... 7, 8, 9, 10, 11, 12, 13  След.


Часовой пояс: UTC + 5 часов


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
cron

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB