Easyelectronics.ru

Электроника для всех
Текущее время: 19 сен 2019, 07:26

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



JLCPCB – Прототипы печатных плат за $2/10pcs (Любой цвет!)
Крупнейший производитель печатных плат и прототипов. Более 600000 клиентов и свыше 10000 заказов в день!
Получите скидку на почтовую отправку при первом заказе в JLCPCB!

Начать новую тему Ответить на тему  [ Сообщений: 47 ]  На страницу 1, 2  След.
Автор Сообщение
 Заголовок сообщения: функция со структурой в качестве параметра
СообщениеДобавлено: 03 сен 2014, 21:15 
Старожил

Зарегистрирован: 25 фев 2011, 18:45
Сообщения: 3534
Откуда: Новосибирск
Народ, а как можно сделать следующее:
есть структура, скажем:
Код:
typedef struct my_struct
{
   u08 a;
   u16 b;
   u16 c;
} my_struct;


Есть массив этой структуры.

Хочется следующего:
Код:
   func (a, b, c);


И в функции я хотел бы разом скинуть в массив (a, b, c) не расписывая по отдельности каждый пункт структуры.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: функция со структурой в качестве параметра
СообщениеДобавлено: 03 сен 2014, 21:39 
Заглядывает иногда

Зарегистрирован: 09 ноя 2013, 18:29
Сообщения: 145
Чем не устраивает передача указателя?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: функция со структурой в качестве параметра
СообщениеДобавлено: 03 сен 2014, 22:46 
Старожил

Зарегистрирован: 30 апр 2010, 22:56
Сообщения: 1578
Откуда: Киев
corvus писал(а):
Чем не устраивает передача указателя?

в ассемблере такого не было!


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: функция со структурой в качестве параметра
СообщениеДобавлено: 04 сен 2014, 06:29 
Старожил
Аватара пользователя

Зарегистрирован: 20 апр 2010, 17:59
Сообщения: 1097
Откуда: Челябинск
Steel.ne писал(а):
в ассемблере такого не было!

Так ведь "и деревья были выше, и трава зеленее", но сейчас не об этом.

_________________
Everybody lies


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: функция со структурой в качестве параметра
СообщениеДобавлено: 04 сен 2014, 12:43 
Старожил
Аватара пользователя

Зарегистрирован: 10 фев 2012, 18:04
Сообщения: 827
Откуда: Україна
Код:
typedef struct my_struct
{
   uint8_t a;
   uint16_t b;
   uint16_t c;
} my_struct;
my_struct str_arr[100];

void func (my_struct *s, uint8_t n)
{
  str_arr[n] = *s;
}

......

func(&temp_struct, 0);

_________________
"Если вы такие умные, что ж вы строем не ходите?"

Легче зажечь одну маленькую свечу, чем постоянно жаловаться на тьму...


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: функция со структурой в качестве параметра
СообщениеДобавлено: 04 сен 2014, 15:58 
Старожил

Зарегистрирован: 25 фев 2011, 18:45
Сообщения: 3534
Откуда: Новосибирск
DOOMSDAY писал(а):
...

Мне нужно задать в функции func (a, b, c).
a,b,c - значения задаваемые в параметрах функции:
func (eprst, 20, 1000)

В функции если требуется, мне нужно изменить значение. И кучей все эти значения сбросить в массив с такими же структурами. одной строчкой кода, не расписывая все элементы структуры.
struct [i] = func_struct_param;

Еще лучше получить макрос, в котором если b = 0, то a | FLAG.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: функция со структурой в качестве параметра
СообщениеДобавлено: 04 сен 2014, 16:33 
Старожил

Зарегистрирован: 31 янв 2010, 20:19
Сообщения: 4946
Откуда: Донецк-Мариуполь
Берем классический код, который предложил DOOMSDAY, и немного подтачиваем напильником под свои нужды

Код:
typedef struct my_struct
{
   uint8_t a;
   uint16_t b;
   uint16_t c;
} my_struct;

#define MAX_ARRAY   100
my_struct str_arr[MAX_ARRAY], temp_struct;

void my_special_func(my_struct *s, uint8_t p1, uint16_t p2, uint16_t p3)
{
uint8_t  i;
   for (i=0;i<MAX_ARRAY;i++)
   {
      s->a = p1;
      s->b = p2;
      s->c = p3;
      str_arr[i] = *s;
   }
}
......

my_special_func(&temp_struct, 17, 1234, 453);


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: функция со структурой в качестве параметра
СообщениеДобавлено: 04 сен 2014, 18:15 
Старожил

Зарегистрирован: 30 апр 2010, 22:56
Сообщения: 1578
Откуда: Киев
demiurg1978 писал(а):
Еще лучше получить макрос, в котором если b = 0, то a | FLAG.

а если нет, то что?
b==0?a|FLAG:a;


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: функция со структурой в качестве параметра
СообщениеДобавлено: 04 сен 2014, 18:45 
Старожил

Зарегистрирован: 25 фев 2011, 18:45
Сообщения: 3534
Откуда: Новосибирск
Если b = 0, то a | FLAG, если b > 0, то просто a.
Ну типа:
Код:
   if (!(b))
      a |= FLAG;


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: функция со структурой в качестве параметра
СообщениеДобавлено: 04 сен 2014, 19:24 
Старожил

Зарегистрирован: 30 апр 2010, 22:56
Сообщения: 1578
Откуда: Киев
a |= b==0?FLAG:0;

Желание писать "круто по сишному" городя конструкции вроде a=i++?b[i]:c[++i]; быстро пропадает, когда через пару месяцев пыришься в свой код и думаешь "Ну что за дебил это писал?"


Последний раз редактировалось Steel.ne 04 сен 2014, 19:24, всего редактировалось 1 раз.

Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: функция со структурой в качестве параметра
СообщениеДобавлено: 04 сен 2014, 19:24 
Старожил
Аватара пользователя

Зарегистрирован: 23 янв 2012, 00:31
Сообщения: 1797
Откуда: Новокузнецк
demiurg1978 писал(а):
И кучей все эти значения сбросить в массив с такими же структурами. одной строчкой кода, не расписывая все элементы структуры.

Если нужно что-то сделать одной строчкой, то самое время сделать функцию для этого.

demiurg1978 писал(а):
Еще лучше получить макрос, в котором если b = 0, то a | FLAG.

Хотите красиво оформить это?
Код:
if (!(task_pause))
    Task_Queue [cnt]. status = (task_status | RUN_TASK_FLG);
else
    Task_Queue [cnt]. status = task_status;

Обвернув в один макрос эту конструкцию вы не сделаете ее понятной. Да, она станет занимать всего одну строчку, но она смешает в себе странные манипуляции с битами, которые можно будет понять с трудом.
Лучше просто добавить очевидную проверку
Код:
if (pause == 0)
    setRunFlag()

Тут кто угодно поймет, что если пауза нулю, то запускаем задачу. Хотя всеравно есть недочет: неудачное имя для pause. Пауза между запусками? Пауза перед запуском? Пауза в запуске? pauseBeforeRun - так сразу понятнее для чего мы проверяем ее на ноль и стартуем задачу. Хотя мне кажется, что стартованием задачи должен заниматься сама функция диспетчера.

И чтоб как-то уменьшить количество параметров в функции можно сделать две функции добавления задачи: добавление периодической задачи и добавление одноразовой задачи. Тогда от статуса можно избавиться. А при добавлении одноразовой задачи вообще два параметра: отсрочка и указатель на функцию.

_________________
elisey.su


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: функция со структурой в качестве параметра
СообщениеДобавлено: 04 сен 2014, 19:41 
Старожил

Зарегистрирован: 25 фев 2011, 18:45
Сообщения: 3534
Откуда: Новосибирск
elisey писал(а):
Лучше просто добавить очевидную проверку
Код:
if (pause == 0)
    setRunFlag()


Разве так писать криминал?:
if (value)
if (!(value))
Я такие примеры видел у людей, которые профессионально занимаются программированием и разработкой электронных устройств.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: функция со структурой в качестве параметра
СообщениеДобавлено: 04 сен 2014, 19:43 
Старожил

Зарегистрирован: 25 фев 2011, 18:45
Сообщения: 3534
Откуда: Новосибирск
elisey писал(а):
Лучше просто добавить очевидную проверку
Код:
if (pause == 0)
    setRunFlag()


Разве так писать криминал?:
if (value)
if (!(value))
Я такие примеры видел у людей, которые профессионально занимаются программированием и разработкой электронных устройств.

elisey писал(а):
Хотите красиво оформить это?
Код:
if (!(task_pause))
    Task_Queue [cnt]. status = (task_status | RUN_TASK_FLG);
else
    Task_Queue [cnt]. status = task_status;


А-а-а! Спалился я, блин! :) а если серьезно, не только это. Есть еще моменты.


Последний раз редактировалось demiurg1978 04 сен 2014, 20:21, всего редактировалось 1 раз.

Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: функция со структурой в качестве параметра
СообщениеДобавлено: 04 сен 2014, 19:51 
Старожил

Зарегистрирован: 22 мар 2010, 22:54
Сообщения: 3995
demiurg1978 писал(а):
Я такие примеры видел у людей, которые профессионально занимаются программированием и разработкой электронных устройств.
а что в вашем понимании "профессионально"? вы вроде тоже вполне профессионально занимаетесь разработкой, если не ошибаюсь, но тоже не прочь написать и запроектировать говнокод (сужу по соседней теме)... то бишь, это вещи не пересекающиеся.

отвечая на вопрос: не криминал, но если можно сделать понятнее - лучше сделать, если это не write only код.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: функция со структурой в качестве параметра
СообщениеДобавлено: 04 сен 2014, 19:58 
Старожил

Зарегистрирован: 25 фев 2011, 18:45
Сообщения: 3534
Откуда: Новосибирск
Ink писал(а):
demiurg1978 писал(а):
Я такие примеры видел у людей, которые профессионально занимаются программированием и разработкой электронных устройств.
а что в вашем понимании "профессионально"? вы вроде тоже вполне профессионально занимаетесь разработкой, если не ошибаюсь, но тоже не прочь написать и запроектировать говнокод (сужу по соседней теме)... то бишь, это вещи не пересекающиеся.

отвечая на вопрос: не криминал, но если можно сделать понятнее - лучше сделать, если это не write only код.

Сказал один гавнакод, стали и другие подхватывать. :) Повторяю еще раз. На си, хорошо, если год будет, как я на него переполз. До этого несколько лет писал на асме. А тот диспетчер я писал в свободное от работы время. И в качестве эксперимента. Поэтому особо не напрягался.
Спрашиваю еще раз, разве криминально и не читабельно пишется таким образом:
Код:
   if (value)
      bla-bla ();

   if (!(value))
      bla-bla ();

   if (value & (1<<FLAG))
      bla-bla ();

   if (!(value & (1<<FLAG)))
      bla-bla ();


Если кому и непонятно, то новичку какому-нибудь. Который только-только начал си изучать.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: функция со структурой в качестве параметра
СообщениеДобавлено: 04 сен 2014, 20:11 
Старожил
Аватара пользователя

Зарегистрирован: 23 янв 2012, 00:31
Сообщения: 1797
Откуда: Новокузнецк
demiurg1978 писал(а):
Разве так писать криминал?:
if (value)
if (!(value))

Считается по разному, но я считаю что криминал. Не убудет если потратить еще 2 секунды и дописать "== true". Булевы переменные еще перевариваю без равенства, но сам так не пишу. А проверять без равенства на ноль вообще криминал. Не из-за того, что педант я такой, а потому что за такие конструкции глаз цепляется, и на разрешение этого условия нужно потратить пару секунд. Секунду там, секунду тут, жалко время тратить. Кстати отрицательные условия читаются на порядок хуже, поэтому их лучше не применять. Либо проверять на равенство false (" == false").
Цитата:
А-а-а! Спалился! :) а если серьезно, не только это. Есть еще моменты.

А в чем я спалился? Это ваш кусок кода из диспетчера. Я отрицание интеджера восклицательным знаком не смог бы сделать. Да и фигурные скобки не опускаю.
Цитата:
Спрашиваю еще раз, разве криминально и не читабельно пишется таким образом:
Код:
if (!(value & (1<<FLAG)))
      bla-bla ();

А вы как сами думаете? Что лучше читается: эта конструкция или моя:
Код:
if (deviseIsReady() == true) {
    bla-bla();
}

Потому как проверка флага это уровень абстракции на пару ступеней ниже, чем логика работы основанная на состояниях. Свою конструкцию я окину взглядом за одну секунду и пойму о чем идет речь. Вашу я сначала буду вглядываться в восклицательный знак, потом в побитовое И, потом пойду смотреть что это за флаг, потом пойду смотреть, как он хранится в value.
Цитата:
Если кому и непонятно, то новичку какому-нибудь. Который только-только начал си изучать.

Одно дело понимать, другое дело забивать голову ненужными вещами. Если код можно упростить, то почему бы и нет? Это же не соревнование, кто хитрее завернет конструкцию. Тут как бы рассказ алгоритма идет.

_________________
elisey.su


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: функция со структурой в качестве параметра
СообщениеДобавлено: 04 сен 2014, 20:21 
Старожил

Зарегистрирован: 25 фев 2011, 18:45
Сообщения: 3534
Откуда: Новосибирск
elisey писал(а):
А в чем я спалился?

Да не вы спалились, а я. :)


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: функция со структурой в качестве параметра
СообщениеДобавлено: 04 сен 2014, 20:25 
Старожил

Зарегистрирован: 25 фев 2011, 18:45
Сообщения: 3534
Откуда: Новосибирск
elisey писал(а):
Код:
if (deviseIsReady() == true) {
    bla-bla();
}


У меня по первости на таких записях косяки выпадали, я уже не помню подробностей. Поэтому стал писать без == 0 или == 1


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: функция со структурой в качестве параметра
СообщениеДобавлено: 04 сен 2014, 20:54 
Старожил

Зарегистрирован: 31 янв 2010, 20:19
Сообщения: 4946
Откуда: Донецк-Мариуполь
Есть большая верятность ошибиться в условии и написать один знак равенства вместо двух. И в результате ошибку будешь искать до посинения... Поэтому чисто Си-шный стиль писать именно if (!val).


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: функция со структурой в качестве параметра
СообщениеДобавлено: 04 сен 2014, 20:59 
Старожил

Зарегистрирован: 25 фев 2011, 18:45
Сообщения: 3534
Откуда: Новосибирск
kitekat писал(а):
Есть большая верятность ошибиться в условии и написать один знак равенства вместо двух. И в результате ошибку будешь искать до посинения... Поэтому чисто Си-шный стиль писать именно if (!val).

Кстати, да, одна из причин, почему я отказался от ==


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: функция со структурой в качестве параметра
СообщениеДобавлено: 04 сен 2014, 21:01 
Старожил
Аватара пользователя

Зарегистрирован: 23 янв 2012, 00:31
Сообщения: 1797
Откуда: Новокузнецк
kitekat писал(а):
Есть большая верятность ошибиться в условии и написать один знак равенства вместо двух. И в результате ошибку будешь искать до посинения... Поэтому чисто Си-шный стиль писать именно if (!val).

Ну нормальный компилятор на такие вещи сразу ругается. А если копнуть в другую сторону, то можно легко напутать в условии if (!val) и получить логическую ошибку, которую компилятор не поймает.

_________________
elisey.su


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: функция со структурой в качестве параметра
СообщениеДобавлено: 04 сен 2014, 21:11 
Старожил

Зарегистрирован: 25 фев 2011, 18:45
Сообщения: 3534
Откуда: Новосибирск
elisey писал(а):
if (!val) и получить логическую ошибку, которую компилятор не поймает.

Поэтому я лучше лишний раз в скобки заверну. (!(val)). И я выработал правило тщательно проверять свои программы. Хоть вы и сказали гавнакод, но программы проверяются у меня очень тщательно. И в коде и в железе. Особенно перед установкой устройства на оборудование.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: функция со структурой в качестве параметра
СообщениеДобавлено: 04 сен 2014, 21:14 
Старожил

Зарегистрирован: 19 мар 2013, 19:37
Сообщения: 2619
Откуда: Санкт-Петербург
elisey писал(а):
А вы как сами думаете? Что лучше читается: эта конструкция или моя:
Код:
if (deviseIsReady() == true) {
    bla-bla();
}

Лично мне глаз режет. Сравнение с true:
1. Не нужно.
2. Усложняет код.
3. В некоторых случаях можете наступить на грабли из-за преобразований типов (не забывайте: истинным считается _любое_ ненулевое значение). Кстати, никогда не видели в коде запись вида "!!value" для преобразования в один бит?

Вот "deviceIsReady" вместо проверки флага прямо на месте - это я понимаю. И скомпилируется в то же самое, и код яснее, и если понадобится переделать условие - не надо будет искать в коде все места, где оно встречается.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: функция со структурой в качестве параметра
СообщениеДобавлено: 04 сен 2014, 21:20 
Старожил

Зарегистрирован: 25 фев 2011, 18:45
Сообщения: 3534
Откуда: Новосибирск
Кстати, а что в deviseIsReady() ?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: функция со структурой в качестве параметра
СообщениеДобавлено: 04 сен 2014, 21:33 
Старожил
Аватара пользователя

Зарегистрирован: 23 янв 2012, 00:31
Сообщения: 1797
Откуда: Новокузнецк
aamonster писал(а):
Лично мне глаз режет. Сравнение с true:
1. Не нужно.
2. Усложняет код.
3. В некоторых случаях можете наступить на грабли из-за преобразований типов (не забывайте: истинным считается _любое_ ненулевое значение). Кстати, никогда не видели в коде запись вида "!!value" для преобразования в один бит?

Вот "deviceIsReady" вместо проверки флага прямо на месте - это я понимаю. И скомпилируется в то же самое, и код яснее, и если понадобится переделать условие - не надо будет искать в коде все места, где оно встречается.

А я выше написан, что сравнение булевых с true я еще перевариваю и понимаю, хоть и сам не пишу. Тут уже расхождение взглядов и мнений. Мне не кажется что это усложняет код. А вот проверка интеджера на нуль довольно не очевидна, и лучше прямо показать в условии, что и как сравниваем ( if (value != 0) ). А на грабли с преобразованием типов можно хоть где наступить, это же си)
!!value - такое не видел и хорошо что не видел) Но опять же, выделить один бит, это работа с флагами. Нужно оборачивать функцией.
Цитата:
Кстати, а что в deviseIsReady() ?

Это своя собственная функция проверки флага. В данном случае что-то вроде:
Код:
bool deviceisReady()
{
    return ( flagIsSet(Status, FLAG_READY ) )
}

_________________
elisey.su


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 47 ]  На страницу 1, 2  След.

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


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

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


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

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

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