Вопросы по С/С++ (СИ)

Если ваш вопрос не влез ни в одну из вышеперечисленных тем, вам сюда.
Ответить
Говорящий с текстолитом
Аватара пользователя
Сообщения: 1590
Зарегистрирован: Вс июн 24, 2012 16:07:00
Откуда: Лен.Обл.

Сообщение da-nie »

что это значит? если я эту переменную никак не использую по делу,как может программа к ней добраться и побпловаться?
Дело в том, что переменную лучше "запереть" в модуле и изменять/получать значение только через функции этого модуля. Эдакая инкапсуляция.
что даст static.? то что только по делу можно ее поменять?т.е конкретно там где ее используют?
static для имени переменной делает её запертой внутри этого модуля. Доступ к такой переменной через объявление её же через extern в другом модуле не получится.
Тоже так предполагал, казалось этими действиями я понижаю уровень языка!
Не экономьте на спичках. Пишите так, как вам проще и удобнее. Пусть компилятор сам решит, как ему удобно работать с переменной - может, он её в регистре будет держать (впрочем, вашу с volatile не будет :) ).
пока не представляю,что это,но попробую разобраться
Это то, что позволит наглядно представлять и удобно переключаться между версиями вашей программы. Вы делаете "слепки" ("коммиты") рабочего каталога, когда они требуются (с комментариями).
И день и ночь в пути...
Мои программки: https://github.com/da-nie
Мои публикации: https://habr.com/ru/users/da-nie/posts/
Мои видео: https://www.youtube.com/channel/UCUroi3 ... 52g/videos
Контактная информация:
Реклама
Грызет канифоль
Аватара пользователя
Сообщения: 287
Зарегистрирован: Сб янв 23, 2016 00:59:59
Откуда: Чебоксары

Сообщение ROMan2947 »

Дело в том, что переменную лучше "запереть" в модуле и изменять/получать значение только через функции этого модуля. Эдакая инкапсуляция.
интересный случай!? в моем примере как это должно выглядеть?как мне до нее добраться из другого модуля МЕНЮ? написать функцию в модуле KEY которая просто передает мою переменную,а в модуле меню вызвать эту функцию?
static для имени переменной делает её запертой внутри этого модуля. Доступ к такой переменной через объявление её же через extern в другом модуле не получится.
действительно, попробовал так, extern не канает уже...
Пишите так, как вам проще и удобнее.
ок

Это то, что позволит наглядно представлять и удобно переключаться между версиями вашей программы.
хорошо,посмотрю
Реклама
Говорящий с текстолитом
Аватара пользователя
Сообщения: 1590
Зарегистрирован: Вс июн 24, 2012 16:07:00
Откуда: Лен.Обл.

Сообщение da-nie »

интересный случай!? в моем примере как это должно выглядеть?как мне до нее добраться из другого модуля МЕНЮ? написать функцию в модуле KEY которая просто передает мою переменную,а в модуле меню вызвать эту функцию?
Да. :) unit8_t GetKeyCode(void);
И день и ночь в пути...
Мои программки: https://github.com/da-nie
Мои публикации: https://habr.com/ru/users/da-nie/posts/
Мои видео: https://www.youtube.com/channel/UCUroi3 ... 52g/videos
Контактная информация:
Грызет канифоль
Аватара пользователя
Сообщения: 287
Зарегистрирован: Сб янв 23, 2016 00:59:59
Откуда: Чебоксары

Сообщение ROMan2947 »

Да. :) unit8_t GetKeyCode(void);
ну хорошо получил я ее,теперь мне нужно поменять ее значение в чужом модуле. что тоже писать функцию для этого? разврат какой-то :o
Реклама
Эиком - электронные компоненты и радиодетали
Говорящий с текстолитом
Аватара пользователя
Сообщения: 1590
Зарегистрирован: Вс июн 24, 2012 16:07:00
Откуда: Лен.Обл.

Сообщение da-nie »

ну хорошо получил я ее,теперь мне нужно поменять ее значение в чужом модуле. что тоже писать функцию для этого? разврат какой-то
Нет, не разврат. :) Это инкапсуляция:
Инкапсуляция - это механизм, который объединяет данные и методы, манипулирующие этими данными, и защищает и то и другое от внешнего вмешательства или неправильного использования
В этой функции вы запретите прерывания, считаете/запишете переменную, снова разрешите прерывания. Для внешнего пользователя всё это не важно - он этого не замечает и не знает тонкостей работы с переменной. Это знает сам модуль.
И день и ночь в пути...
Мои программки: https://github.com/da-nie
Мои публикации: https://habr.com/ru/users/da-nie/posts/
Мои видео: https://www.youtube.com/channel/UCUroi3 ... 52g/videos
Контактная информация:
Реклама
Грызет канифоль
Аватара пользователя
Сообщения: 287
Зарегистрирован: Сб янв 23, 2016 00:59:59
Откуда: Чебоксары

Сообщение ROMan2947 »

В этой функции
Тело этой функции так должно выглядеть?

Код: Выделить всё

uint8_t GetKeyCode(void)
{
	return BuTTON;
}
но так не работает :dont_know:
Реклама
Потрогал лапой паяльник
Аватара пользователя
Сообщения: 353
Зарегистрирован: Вс янв 19, 2014 22:41:55

Сообщение Siarzhuk »

[uquote="ROMan2947",url="/forum/viewtopic.php?p=3338804#p3338804"]но так не работает[/uquote]
Что-то не так. Как функцию вызываете?
Одновременным нажатием LIGHT и POWER, РП Sangean ATS-909X (ver 1.29) превращается в ATS-909XR! ;-)
Грызет канифоль
Аватара пользователя
Сообщения: 287
Зарегистрирован: Сб янв 23, 2016 00:59:59
Откуда: Чебоксары

Сообщение ROMan2947 »

[uquote="Siarzhuk",url="/forum/viewtopic.php?p=3338820#p3338820"]Как функцию вызываете?[/uquote]

Код: Выделить всё

while (1)
	{   
	
		if (GetKeyCode()) 
		opredelenieUkazatela();  // при наличии кода клавиатуры переходим в меню	
	}
}

Код: Выделить всё

uint8_t f=0;
while (1)
	{   
	f=GetKeyCode();
		if (f) 
		opredelenieUkazatela();  // при наличии кода клавиатуры переходим в меню	
	}
}

static uint8_t BuTTON=0; //ошибка

static volatile uint8_t BuTTON=0; // не ошибка
Потрогал лапой паяльник
Аватара пользователя
Сообщения: 353
Зарегистрирован: Вс янв 19, 2014 22:41:55

Сообщение Siarzhuk »

[uquote="ROMan2947",url="/forum/viewtopic.php?p=3338822#p3338822"]

Код: Выделить всё

uint8_t f=0;
while (1)
	{   
	f=GetKeyCode();
		if (f) 
		opredelenieUkazatela();  // при наличии кода клавиатуры переходим в меню	
	}
}
[/uquote]
Т.е. функция "переходим в меню" вообще не вызывается? А, кстати, как она узнаёт код кнопки? Раньше получала его параметром - а сейчас?
Одновременным нажатием LIGHT и POWER, РП Sangean ATS-909X (ver 1.29) превращается в ATS-909XR! ;-)
Грызет канифоль
Аватара пользователя
Сообщения: 287
Зарегистрирован: Сб янв 23, 2016 00:59:59
Откуда: Чебоксары

Сообщение ROMan2947 »

Т.е. функция "переходим в меню" вообще не вызывается?
без volatile не вызывалась, даже значение BuTTON не возвращалось в ф-й GetKeyCode();
А, кстати, как она узнаёт код кнопки? Раньше получала его параметром - а сейчас?
сейчас я в модуле вызываю GetKeyCode снова
Грызет канифоль
Аватара пользователя
Сообщения: 287
Зарегистрирован: Сб янв 23, 2016 00:59:59
Откуда: Чебоксары

Сообщение ROMan2947 »

Здравствуйте!своим наивным расчетом пытаюсь добраться к полю структуры вот таким образом:

Код: Выделить всё

for (typ8 i=0;i<3;i++)
	{
		TWI_buffer[i]=*(PtrRTC_struct+i);
	}
компилятр пишет : invalid type argument of unary '*' (have 'int') правильно ли я понимаю,что доступ к полю структуры это унарная операция, т.е для доступа нужно использовать только один аргумент.Но я же работаю адресом структуры....или причина не в этом?
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18787
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

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

Мой уютный бложик... заходите!
Контактная информация:
Грызет канифоль
Аватара пользователя
Сообщения: 287
Зарегистрирован: Сб янв 23, 2016 00:59:59
Откуда: Чебоксары

Сообщение ROMan2947 »

[uquote="ARV",url="/forum/viewtopic.php?p=3342565#p3342565"]не понял, какие типы переменных у вас.[/uquote]

Код: Выделить всё

typedef uint8_t typ8;
typedef struct 
{
	typ8 secund;
	typ8 minut;
	typ8 hour;
	typ8 den_nedeli;
	typ8 chislo;
	typ8 mecyac;
	typ8 yahr;
	typ8 status_registr;
}rtc;
rtc *PtrRTC_struct;
rtc RTC_struct={0};
rtc *PtrRTC_struct=&RTC_struct;
typ8 TWI_buffer[8]={0};

[uquote="ARV",url="/forum/viewtopic.php?p=3342565#p3342565"]не увидел доступа к полю структуры...[/uquote] вот таким образом решил получить доступ

Код: Выделить всё

*(PtrRTC_struct+i);
беру адрес структуры перемещаюсь на нужный адрес поля (типы полей учитываю,так как у нас все поля одного типа они должны располагаться равномерно) и разименовываю полученный адрес. или такое только с массивами прокатывает?

!!!с кодом выше предидущая ошибка пропала. указатель на структуру было не правильно использовал
ща только вот эта Ошибка incompatible types when assigning to type 'typ8' from type 'rtc'
ругается вот на это

Код: Выделить всё

TWI_buffer[i]=*(PtrRTC_struct+i);
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18787
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

я вам не рекомендовал бы пока что использовать арифметику указателей, т.к. она, мягко говоря, не совсем очевидна.
PtrRTC_struct+1 это совсем не переход на 1-е поле структуры... а переход на первый байт ЗА этой структурой...

для обращения ПОБАЙТНО к памяти, выделенной под структуру, надо использовать указатель на БАЙТ, а не указатель на структуру

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

Мой уютный бложик... заходите!
Контактная информация:
Грызет канифоль
Аватара пользователя
Сообщения: 287
Зарегистрирован: Сб янв 23, 2016 00:59:59
Откуда: Чебоксары

Сообщение ROMan2947 »

[uquote="ARV",url="/forum/viewtopic.php?p=3342583#p3342583"]я вам не рекомендовал бы[/uquote]
понял :write:
[uquote="ARV",url="/forum/viewtopic.php?p=3342583#p3342583"]надо использовать указатель на БАЙТ[/uquote] как получить этот указатель можно?или сначала в массив , а потом работать с эти массивом?

Добавлено after 6 minutes 27 seconds:
[uquote="ARV",url="/forum/viewtopic.php?p=3342583#p3342583"]memcpy[/uquote]это же то, что мне и нужно!!! :beer: :music:

хотя пишут memmove "безопаснее" :roll:

Добавлено after 14 minutes 43 seconds:
[uquote="ARV",url="/forum/viewtopic.php?p=3342583#p3342583"]для "занесения" структуры в массив[/uquote] а мне нужно нуе всю структуру заносить, а только допустим 2,3,5 поле, то как быть? пока предполагаю два раза использовать функцию?
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18787
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

ROMan2947 писал(а):как получить этот указатель можно?

Код: Выделить всё

uint8_t *u8_ptr = (void*)&RTC_struct;
ROMan2947 писал(а):хотя пишут memmove "безопаснее"
memmove может копировать без проблем данные между "пересекающимися" областями. в вашем случае такого пересечения нет и не может быть, поэтому лучше memcpy - она быстрее.
ROMan2947 писал(а):а мне нужно нуе всю структуру заносить, а только допустим 2,3,5 поле, то как быть?

Код: Выделить всё

TWI_bufferх[0] = RTC_struct.minut;
TWI_bufferх[1] = RTC_struct.chislo;
TWI_bufferх[2] = RTC_struct.yahr;
P.S. ужас-то какой у вас в идентификаторах творится... там и английский, там и транслит... там и помесь заглавных с прописными... нечитаемый код будет
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Грызет канифоль
Аватара пользователя
Сообщения: 287
Зарегистрирован: Сб янв 23, 2016 00:59:59
Откуда: Чебоксары

Сообщение ROMan2947 »

[uquote="ARV",url="/forum/viewtopic.php?p=3342604#p3342604"]....[/uquote]огромное спасибо!!!! :)
[uquote="ARV",url="/forum/viewtopic.php?p=3342604#p3342604"]ужас-то какой[/uquote] :oops:

Добавлено after 7 minutes 22 seconds:
[uquote="ARV",url="/forum/viewtopic.php?p=3342604#p3342604"]

Код: Выделить всё

TWI_bufferх[0] = RTC_struct.minut;
TWI_bufferх[1] = RTC_struct.chislo;
TWI_bufferх[2] = RTC_struct.yahr;
[/uquote]

по-вашему запись понятна!это круто,но по-мне это банально.
а если так:

Код: Выделить всё


 memcpy(TWI_buffer,&(PtrRTC_struct->minut),1);
 memcpy(TWI_buffer,&(PtrRTC_struct->chislo),1);
 memcpy(TWI_buffer,&(PtrRTC_struct->yahr),1);

:tea:

Добавлено after 1 minute 47 seconds:
[uquote="ARV",url="/forum/viewtopic.php?p=3342604#p3342604"]

Код: Выделить всё

uint8_t *u8_ptr = (void*)&RTC_struct;
[/uquote]
это что-то новое :shock:

P.S Все больше складывается впечатление, что СИ безграничен!
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18787
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

ROMan2947 писал(а):это круто,но по-мне это банально.
вам шашечки, или ехать?

вызов функции трижды для копирования 3 байт - это настолько не банально, что даже и не знаю, что сказать... наверное, это как если вы купите два бревна для того, чтобы выстрогать 2 палочки для суши...

Добавлено after 2 minutes 12 seconds:
тем более что в вашем примере вы все три байта из структуры пишите на одно и то же место в массиве. на самом деле все будет куда круче

Код: Выделить всё

memcpy(&TWI_buffer[0],&(PtrRTC_struct->minut),1);
 memcpy(&TWI_buffer[1],&(PtrRTC_struct->chislo),1);
 memcpy(&TWI_buffer[2],&(PtrRTC_struct->yahr),1);
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Грызет канифоль
Аватара пользователя
Сообщения: 287
Зарегистрирован: Сб янв 23, 2016 00:59:59
Откуда: Чебоксары

Сообщение ROMan2947 »

[uquote="ARV",url="/forum/viewtopic.php?p=3342616#p3342616"]купите два бревна для ...[/uquote] конкретно для этого
случая сравнение у Вас точное :)))

[uquote="ARV",url="/forum/viewtopic.php?p=3342616#p3342616"]в вашем примере вы...[/uquote]мне вот любопытно сколько Гб или Тб кода нужно написать, чтоб не делать такие детские ошибки :oops: :facepalm:
Друг Кота
Аватара пользователя
Сообщения: 4905
Зарегистрирован: Чт апр 11, 2013 11:19:59
Откуда: Минск

Сообщение WiseLord »

Ещё можно было бы union использовать:

Код: Выделить всё

typedef union
{
    struct {
        typ8 secund;
        typ8 minut;
        typ8 hour;
        typ8 den_nedeli;
        typ8 chislo;
        typ8 mecyac;
        typ8 yahr;
        typ8 status_registr;
    };
    typ8 buf[8];
}rtc;
Тогда обращение RTC_struct.minut и RTC_struc.buf[1] будет, по сути, одним и тем же. Памяти эта структура занимать больше не будет, естественно.
Контактная информация:
Ответить

Вернуться в «Разные вопросы по МК»