реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> Как передать структуру битов или битовое поле в функцию? (CVAVR)
mmavka
сообщение Aug 2 2011, 19:29
Сообщение #1





Группа: Новичок
Сообщений: 2
Регистрация: 12-02-09
Из: Yar
Пользователь №: 44 780



Доброго времени суток!

У меня возникло затруднение. Я не могу понять как передать в функцию в параметрах битовое поле или структуру битов???

Часть кода:
Код
char temp=0,i;
eeprom char hour_on,hour_off,min_on,min_off;
struct {
unsigned char fh_on : 1;
unsigned char fh_off : 1;
unsigned char fm_on : 1;
unsigned char fm_off : 1;
unsigned char prog : 1;
} flags;                           //структура битов в данном случае

void check(?????? active,???????? next,char eep, char limit) //как передать не понимаю....
{
    if (SET_STATE==0 & active == 1)
       {
        temp++;
        led(1);                    //функция мигания диодом
        if (temp>=limit)
            {
            temp=0;
            };
        };
    if (REC_STATE==0 & active == 1)
        {
       led(temp);                //функция мигания диодом
        eep = temp;
        active ^= active;
        next ^= next;
        temp = 0;
        delay_ms(250);
        };
};

void main (void)
{
check(flags.fh_on, flags.fh_off, hour_on, 24);    //?????????????????????
};


вот функция как я ее представляю, но компилятор говорит что я не понимаю что творю...
Прошу помощи.
Go to the top of the page
 
+Quote Post
=GM=
сообщение Aug 2 2011, 20:32
Сообщение #2


Ambidexter
*****

Группа: Свой
Сообщений: 1 589
Регистрация: 22-06-06
Из: Oxford, UK
Пользователь №: 18 282



Вы не структуру передаёте, а обычные аргументы, которые являются элементами структуры, так и передавайте.

В описании функции
void check(unsigned char active,unsigned char next,char eep, char limit)

В вызове функции
check(flags.fh_on,flags.fh_off, hour_on, 24);


--------------------
Делай сразу хорошо, плохо само получится
Go to the top of the page
 
+Quote Post
mmavka
сообщение Aug 2 2011, 21:18
Сообщение #3





Группа: Новичок
Сообщений: 2
Регистрация: 12-02-09
Из: Yar
Пользователь №: 44 780



Цитата(=GM= @ Aug 3 2011, 00:32) *
В описании функции
void check(unsigned char active,unsigned char next,char eep, char limit)


Да все заработало! спасибо!

У меня вопрос. А как передать указатель на структуру и передать как бы "указатель" на те этементы структуры которые нужно изменить или использовать при логических сравнениях. Может это бред, если так то простите может вопрос поставлен не правильно, но думаю суть ясна.
Go to the top of the page
 
+Quote Post
Sirko
сообщение Aug 2 2011, 21:32
Сообщение #4


Местный
***

Группа: Участник
Сообщений: 245
Регистрация: 15-08-07
Пользователь №: 29 795



Цитата
А как передать указатель на структуру
Точно так, как Вы передаете указатель на char или int.
Цитата
и передать как бы "указатель" на те этементы структуры которые нужно
Такой фокус не пройдет, да это и не нужно. Просто в теле функции обрабатывайте нужные поля.
Go to the top of the page
 
+Quote Post
=GM=
сообщение Aug 3 2011, 13:10
Сообщение #5


Ambidexter
*****

Группа: Свой
Сообщений: 1 589
Регистрация: 22-06-06
Из: Oxford, UK
Пользователь №: 18 282



Цитата(mmavka @ Aug 2 2011, 20:18) *
А как передать указатель на структуру и передать как бы "указатель" на те этементы структуры которые нужно изменить или использовать при логических сравнениях

Передача адреса структуры в аргументе
check(struct FLGS *flags,char eep,char limit)

Вызов функции
check(&flags,eep,limit);

Теперь, поскольку вы явно передаёте адрес структуры, чтобы добраться до элемента структуры внутри подпрограммы, надо использовать стрелку, например,
flags->fh_on ^= flags->fh_on


--------------------
Делай сразу хорошо, плохо само получится
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 7th July 2025 - 03:02
Рейтинг@Mail.ru


Страница сгенерированна за 0.01377 секунд с 7
ELECTRONIX ©2004-2016