Форум программистов, компьютерный форум, киберфорум
Наши страницы
Микроконтроллеры Atmega AVR
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.62/45: Рейтинг темы: голосов - 45, средняя оценка - 4.62
mmovko
0 / 0 / 0
Регистрация: 24.01.2007
Сообщений: 66
1

CVAVR (передать флаги, биты, структуру в функцию)

02.08.2011, 00:37. Просмотров 8247. Ответов 20
Метки нет (Все метки)

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

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

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

void check(?????? active,???????? next,char eep, char limit) //как передать не понимаю....
{
if (SIT_STATE==0 & active == 1)
{
temp++;
tid(1);                    //функция мигания диодом
if (temp>=limit)
{
temp=0;
};
};
if (REC_STATE==0 & active == 1)
{
tid(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);    //?????????????????????
};                                                              //в параметр функции передаю 2 флага для сравнения и изменения
//переменную eeprom и просто число для ограничения.
вот функция как я ее представляю, но компилятор говорит что я не понимаю что творю...
Прошу помощи.
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
02.08.2011, 00:37
Ответы с готовыми решениями:

Посоветуйте по CVAVR как передать значение в процедуру
Сразу говорю в программировании не силен оттого возник следующий вопрос, посоветуйте ченить...

Передать структуру в функцию
что не так в моей передаче структуры и массива в функцию? void Sort_date (struct ptoject& proj,...

Передать структуру в функцию!!
Коллеги, есть вопрос технический. К примеру мне нужно передать массив в функцию. Что я делаю? А вот...

Как передать структуру в функцию
Добрый день. Возник такой вопрос, никак не могу разобраться. Запускаю поток, он должен отработать...

Не получается передать структуру в функцию
Имею такую проблему, при попытке передать мою структуру в функцию, получаю следующие ошибки: ...

20
Otikzzz
0 / 0 / 0
Регистрация: 28.02.2011
Сообщений: 461
02.08.2011, 00:45 2
Что компилятор говорит.
И вообще, указатель передать не вариант?
0
mmovko
0 / 0 / 0
Регистрация: 24.01.2007
Сообщений: 66
02.08.2011, 00:49 3
Цитата Сообщение от Otykzzz
И вообще, указатель передать не вариант?
Как его предать? подскажите пожалуйста! Читал по них но не до конца понял.

Это если
Код
void check(bit active,bit next,char eep, char limit)
Код
Error: term_my.c(95): bit type not allowed in this context
А как по другому не знаю!
0
Wroyth
0 / 0 / 0
Регистрация: 07.04.2011
Сообщений: 663
02.08.2011, 01:05 4
НИКОГДА !! НИКОГДА НЕ ПЕРЕДАВАЙТЕ В ФУНКЦИИ СТРУКТУРЫ НАПРЯМУЮ!!
даже на PC, где стек почти что резиновый, за это бьют сначала по рукам, а потом по лицу. Про микроконтроллеры я молчу. Всегда используйте указатели.

хотя в вашем случае можно было бы использовать одну 8-битную переменную .. не так удобно конечно.
я в сях еще не очень, а на паскале вы не поймете, так что пример из гугла:

http://glagolew2010.narod.ru/07/0704.htm

struct bal {
ftoot balance;
char name[80];
} person;
struct bal *p; /* объявление указателя на структуру */
адрес структуры person можно присвоить указателю p:
p = &person;
теперь вы передаете УКАЗАТЕЛЬ в функцию и в ней делаете:
p->balance например

ну по ссылке все подробно

Касательно указателя:
У вас есть структура - возьму из примера, name[80] - занимает 80байт и balance еще 8 байт итого структура 88 байт, теперь в вашем случае, при передаче структуры напрямую - компилятор кладет в стек 88 байт - а потом уже в функции забирает 88 байт, НО в другое место - долго и у вас получается в памяти 2 абсолютно одинаковые структуры, и если вы что-то измените внутри в функции в новой структуре, то в передаваемой ничего не поменяется, и вы можете поиметь много седых волос разбираясь а почему по возвращении из функции ничего не поменялось. а с учетом размера стека на микроконтроллере еще может не влезть. Указатель - это ВСЕГДА 8 байт (ну или 32 или 64 - зависит от разрядности процессора) он УКАЗЫВАЕТ на место в памяти где что-то лежит (не важно какого размера).. при работе с указателем вы как-бы говорите - сходи туда и сам возьми... причем структура остается только 1.. ну это кратко
0
02.08.2011, 01:05
Brykodyr
0 / 0 / 0
Регистрация: 16.08.2010
Сообщений: 1,326
02.08.2011, 01:15 5
Цитата Сообщение от Wroyth
struct bal {
ftoot balance;
char name[80];
} person;
struct bal *p; /* объявление указателя на структуру */
адрес структуры person можно присвоить указателю p:
p = &person;
теперь вы передаете УКАЗАТЕЛЬ в функцию и в ней делаете:
p->balance например
Это же КодеВижн, да срать он хотел на ваши Си-шные стандарты. Смотрите справку и примеры к сабжу.
0
Wroyth
0 / 0 / 0
Регистрация: 07.04.2011
Сообщений: 663
02.08.2011, 01:18 6
ну синтаксис то должен как-то же похож быть, независимо от среды.. хотя... кто его знает :)
0
mmovko
0 / 0 / 0
Регистрация: 24.01.2007
Сообщений: 66
02.08.2011, 01:19 7
А как передать указатель на конкретный бит (элемент) структуры в функцию? И возможно ли это вообще?
Или передать указатель на структуру целиком и как то указатели на конкретные элементы? ЧТобы в структуре выделить их для роботы в функции.
0
Wroyth
0 / 0 / 0
Регистрация: 07.04.2011
Сообщений: 663
02.08.2011, 01:21 8
кстати только заметил, с чего у вас bit если в структуре char?
0
Brykodyr
0 / 0 / 0
Регистрация: 16.08.2010
Сообщений: 1,326
02.08.2011, 01:24 9
Зачем тебе передавать отдельный бит? Ты либо передаешь указатель на структуру, а затем высасываешь из нее все что хочешь внутри функции, либо копируешь бит из структуры в переменную и передаешь в функцию уже эту переменную. Может и еще какие варианты есть, пока только 2 в голову пришло.
0
mmovko
0 / 0 / 0
Регистрация: 24.01.2007
Сообщений: 66
02.08.2011, 01:35 10
Цитата Сообщение от Wroyth
кстати только заметил, с чего у вас bit если в структуре char?
поменял на CHAR заработало...
Возник вопрос в другом как вернуть из функции результат ее работы?
не один параметр а например два или три?
0
Otikzzz
0 / 0 / 0
Регистрация: 28.02.2011
Сообщений: 461
02.08.2011, 01:38 11
А, у вас там bit, оказывается - опера мини знаки вопроса показала.
Так вот, типа bit в Си нет. Нужно так:
Код
void check(char active , char next , char eep , char limit);
Здесь, при передаче параметров, маскированиями и сдвигами, произойдёт извлечение значений из битового поля, а в функции - создание 4-х байтов в стэке для локальных переменных.
Лучше написать вот так:
Код
struct {...}flags;
void check(struct *flags, char eep , char limit)
{
...
}
...
check(&flags, eep, limit)
Так, в принципе, тоже 4 байта (2 на адрес и 2 чара) хранить надо, но на больших структурах - profit.
0
Wroyth
0 / 0 / 0
Регистрация: 07.04.2011
Сообщений: 663
02.08.2011, 01:43 12
если возвращаете 1 параметр то через return, если несколько - то просто передайте их функции и измените внутри. Но со структурой (в случае нескольких переменных) будет красивее и правильнее.

создали структуру
заполнили структуру для передачи в функцию
вызвали функцию, она там всю структуру перезаполнила
прочитали структуру, или передали куда-то дальше.

вот вам Otykzzz пример дал.
0
mmovko
0 / 0 / 0
Регистрация: 24.01.2007
Сообщений: 66
02.08.2011, 01:48 13
Цитата Сообщение от Wroyth
если возвращаете 1 параметр то через return, если несколько - то просто передайте их функции и измените внутри. Но со структурой (в случае нескольких переменных) будет красивее.

создали структуру
заполнили структуру для передачи в функцию
вызвали функцию, она там всю структуру перезаполнила
прочитали структуру, или передали куда-то дальше.
Что то не совсем понимаю я эти структуры!

Как ее передать я понял. А вот как из нее выцарапать (изменить) конкретный элемент в ней я не понял! я не про SRTUCT->ELEMENT, а про то что какой элемент изменить тоже нужно передать в параметрах. Вот как это сделать для меня остается вопросом!
0
Otikzzz
0 / 0 / 0
Регистрация: 28.02.2011
Сообщений: 461
02.08.2011, 01:50 14
Да, долго я стилусом по экрану тыкал.
Как вернуть? Передавайте указатель (как у Wroyth) или адрес (как у меня).
На счёт передачи битов: минимум что может переслать контроллер - это байт.
Wroyth, даже если в структуре будет unsykned long: 1; всё равно в прототипе ф-ции надо писать char.
0
Wroyth
0 / 0 / 0
Регистрация: 07.04.2011
Сообщений: 663
02.08.2011, 01:56 15
ээм SRTUCT->ELEMENT=0; как обычно... структура это набор переменных...
зачем еще что-то передавать. Вы описали тип структуры - сказали что у вас там 5 переменных типа char и обозвали ТИП структуры flags
затем при void check(struct *flags,...) - вы сказали компилятору что функция получает указатель на структуру типа flags соответственно он уже знает что в памяти по адресу *flags лежит структура типа flags (ну или тупо 5 1байновых переменных подряд) ... ну и работайте дальше с ними как с обычными переменными, меняйте, а т.к. вы работает через указатель(или адрес) то и меняете созданную структуру , а не её копию(как если бы вы передали структуру напрямую в функцию), т.е. поменяли в 1 функции - передали во 2ю и во 2й функции при попытке чтения из структуры вы прочитает то, что наменяли в 1 функции..

to Otykzzz
хм. не знал.. однако интересно :)
0
Otikzzz
0 / 0 / 0
Регистрация: 28.02.2011
Сообщений: 461
02.08.2011, 02:09 16
Код
struct
{
unsykned char f1: 1;
unsykned char f2: 1;
}flsgs;
...
void foo(struct *flag)
{
flag->f1=1;
flag->f2=0;
}

foo(&flags);
Структура будет изменена.

Wroyth, не тип, а объект в памяти, т.е. даже если её потом не использовать, память будет выделена.
Да, емнип, структуры в K&R С передавать нельзя, только указатели на них.
0
mmovko
0 / 0 / 0
Регистрация: 24.01.2007
Сообщений: 66
02.08.2011, 02:14 17
Цитата Сообщение от Otykzzz
Код:
flag->f1=1;
flag->f2=0;

Как передать в параметре f1 и f2??? Я понимаю что в функции я буду менять саму структуру!

На
Код
void foo(struct *p)
{
p->fh_on=1;
};
Говорит
Код
Error: term_my.c(88): declaration syntax error
0
Wroyth
0 / 0 / 0
Регистрация: 07.04.2011
Сообщений: 663
02.08.2011, 02:20 18
Да, запарил тип пишется сразу после структуры. витиеватый однако синтаксис у сей... у делфей/паскаля деревяннее но нагляднее :) спс Кстати, без объявления типа нельзя передать...

Код
#include <avr/io.h>

struct Tflag{
unsykned char f1;
unsykned char f2;
} flags;

void foo(struct Tflag *flags)
{
flags->f1=0;
flags->f2=1;
}

int main(void)
{
//struct Tflag flags; //создаем структуру с именем flags типа Tflag

flags.f1=1;
flags.f2=0;

foo(&flags);

while(1)
{
//TODO:: Please write your application code
}
}
0
mmovko
0 / 0 / 0
Регистрация: 24.01.2007
Сообщений: 66
02.08.2011, 02:48 19
Простите за то что не понимаю очевидного... ))) Спасибо!

Но как передать в параметрах конкретно что нужно менять или сравнивать. до сих пор не понял...
0
Wroyth
0 / 0 / 0
Регистрация: 07.04.2011
Сообщений: 663
02.08.2011, 02:51 20
а зачем??? вы передаете ВСЕ. что хотите то и сравнивайте... а вот если вы не знаете что нужно сравнить, тогда надо думать. массив или что-то подобное...
0
02.08.2011, 02:51
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
02.08.2011, 02:51

Не получается передать структуру в функцию
#include &lt;iostream&gt; using namespace std; struct Node { int e; int c; Node *next; };

Передать структуру в функцию другого класса
Добрый день, при выполнении КР возник затор, необходима подсказка. Нужно создать объект класса и...

Как передать в функцию ссылку на структуру?
Добрый вечер, помогите пожалуйста разобраться. Нужно чтобы функция myProc принимала не структуру, а...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru