11.11.2017, 00:34
|
|
Прописка
Регистрация: 29.03.2007
Сообщений: 185
Сказал спасибо: 11
Сказали Спасибо 1 раз в 1 сообщении
|
Функция вывода на lcd и глобальные переменные
Добрый вечер!
У меня есть файл gsm.c
В нём есть такой кусок кода:
Код:
|
char value[] = "";
char *CREG_result;
.......
void gsm_handler(void){
......
CREG_result = gsm_extract_str(gsm_buffer_receive, gsm_buffer_index_head, gsm_buffer_index_tail, ",", "$");
gsm_state = 21;
lcd_clear();
lcd_send_string_xy(0,0,"45313");
.....
}
char *gsm_extract_str(char *str3, uint8_t head, uint8_t tail, char *from, char *to){
uint8_t begin = 0, k = 0;
char *arrow = value;
char *start = str3 + head;
while(head != tail){
if(begin){
if(*start != *to){
value[k++] = *start;
}else{
return arrow;
}
}
if(*start == *from) begin = 1;
head++;
start++;
if(head == BUFFER_RECEIVE_SIZE){
head = 0;
start = str3;
}
}
return NULL;
} |
Значит такс... ф-я gsm_extract_str берёт приёмный кольцевой буфер, рассматривает в нём определённый участок и из этого участка тянет всё что находится межу запятой и знаком доллара. Ну примерно там может быть символ 1, а может быть символы 13.
CREG_result - указывает на начало строки (массива), куда слили то что находится между нужными знаками.
Так вот, если value объявить глобально, как показано, то всё работает state будет 21 и на экране появится 45313.
Но мне кажется неправильно, наверное.... value делать глобальным. Я попробовал сделать так:
Кусок из ф-ии
Код:
|
char *gsm_extract_str(char *str3, uint8_t head, uint8_t tail, char *from, char *to){
uint8_t begin = 0, k = 0;
static char value[] = "";
char *arrow = value;
char *start = str3 + head;
while(head != tail){
.......... |
Сразу скажу, что если локально объявить value без статика, то в по указатель CREG_result приведёт нас на строку в которой вместо символа 13 будет почему-то символ тм - типа торговая марка. А если раскрыть массив по указателю (это я пишу ща про отладчик в KEil5), то в элементах массива будет "13__" (вместо подчёркиваний там будет два лишних символа квадратика).
Добавил статик. Всё работает, по указателю значится 13, НО на экран ничего не выводится вообще. И что странно, то что ф-ия очистки дисплея отрабатывает. А вот выводить вообще отказывается. Причем камень не виснет. По отладчику по шагам все проходит. Просто не выводит. Я понимаю что я только учусь ещё.... но просто интересно как глобальность/локальность value может влиять на вывод на экран???
П.С. Раз уж я тут...то спрошу как вообще правильно делать такие финты? В плане когда функцией тянешь что-то и складируешь куда-то а потом ретёрнишь указатель
))))))
|
|
|
|
11.11.2017, 04:59
|
|
Почётный гражданин KAZUS.RU
Регистрация: 13.03.2010
Сообщений: 2,901
Сказал спасибо: 499
Сказали Спасибо 3,061 раз(а) в 1,425 сообщении(ях)
|
Re: Функция вывода на lcd и глобальные переменные
Учебник по Си -› область видимости переменных.
Глобальная переменная доступна всем функциям. Потому она так и называется - "глобальная".
Локальная переменная функции доступна только внутри нее. Если эта переменная объявлена без модификатора static, она создается заново каждый раз, когда вызывается функция, то есть ее содержимое после выходя из функции теряется. Если с этим модификатором - то под такую переменную выделяется постоянное место в ОЗУ и при следующем вызове функции значение этой переменной то же самое, что и при выходе после прошлого вызова.
Если есть глобальная переменная с некоторым именем и локальная переменная в функции с таким же именем - в функции будет использоваться именно локальная, а значение глобальной будет недоступно, и изменение этого значения тоже.
Короче, в учебник. Там лучше расписано)
|
|
|
|
11.11.2017, 05:12
|
|
Почётный гражданин KAZUS.RU
Регистрация: 03.01.2007
Адрес: Россия,Иркутская обл.
Сообщений: 2,579
Сказал спасибо: 351
Сказали Спасибо 315 раз(а) в 193 сообщении(ях)
|
Re: Функция вывода на lcd и глобальные переменные
С указателями так можно запутаться.
__________________
Глаза боятся,а руки делают.
|
|
|
|
11.11.2017, 07:27
|
|
Модератор
Регистрация: 04.08.2010
Адрес: Москва СЗАО
Сообщений: 11,246
Сказал спасибо: 11,165
Сказали Спасибо 3,854 раз(а) в 2,925 сообщении(ях)
|
Re: Функция вывода на lcd и глобальные переменные
supercelt, присоединяюсь к уважаемому AR_Favorit, таки лучше начать с базовых основ языка.
Если лень читать книги - на Coursera есть много курсов по теме.
От начал C, до использования C++.
Там собственно и другие направления есть, но не об этом речь, хотя может и будут полезны.
Сами курсы из разных источников. На русском видел от МФТИ, МИФИ, ВМК. В подготовке активно участвуют ребята из Яндекса.
Правда там за них могут попросить вполне разумные деньги.
__________________
rtfm forever должно быть основой для каждого. Альтернатива грустна, поскольку метод слепого щенка успешно работает при весьма малом числе вариантов…
|
|
|
|
11.11.2017, 13:03
|
|
Прописка
Регистрация: 29.03.2007
Сообщений: 185
Сказал спасибо: 11
Сказали Спасибо 1 раз в 1 сообщении
|
Re: Функция вывода на lcd и глобальные переменные
Мужики, если честно я знаю про области видимости. Это не ново. Я касательно как применить. Это правильно так делать? Что в функции складировать выдернутую подстроку в глобал переменную value? PS. Точнее вот так: если цель вернуть строку, то лучше возвращать саму строку (массив char) или в ф-ии записывать ее в глобал а потом возвращать указатель на эту строку?
Последний раз редактировалось supercelt; 11.11.2017 в 13:11.
|
|
|
|
11.11.2017, 13:22
|
|
Почётный гражданин KAZUS.RU
Регистрация: 13.03.2010
Сообщений: 2,901
Сказал спасибо: 499
Сказали Спасибо 3,061 раз(а) в 1,425 сообщении(ях)
|
Re: Функция вывода на lcd и глобальные переменные
Сообщение от supercelt
|
Это правильно так делать? Что в функции складировать выдернутую подстроку в глобал переменную value?
|
Ну а какие у вас еще варианты, если вы хотите эту выдернутую подстроку использовать где-то еще помимо данной функции?
|
|
|
|
11.11.2017, 14:43
|
|
Прописка
Регистрация: 29.03.2007
Сообщений: 185
Сказал спасибо: 11
Сказали Спасибо 1 раз в 1 сообщении
|
Re: Функция вывода на lcd и глобальные переменные
Ну да)) никаких
|
|
|
|
11.11.2017, 14:47
|
|
Гуру портала
Регистрация: 06.05.2005
Адрес: Краснодар, возле укротворного моря.
Сообщений: 18,841
Сказал спасибо: 2,531
Сказали Спасибо 11,764 раз(а) в 5,895 сообщении(ях)
|
Re: Функция вывода на lcd и глобальные переменные
Сообщение от supercelt
|
или в ф-ии записывать ее в глобал а потом возвращать указатель на эту строку?
|
А если уже "глобал", то зачем ВОЗВРАЩАТЬ указатель?
__________________
Не бейте больно, ежели чо, ну не удержался... А вааще,
"Мы за все хорошее, против всей х..., По лугам некошеным чтобы шли ступни,
Чтобы миром правила правда, а не ложь, Мы за все хорошее, нас не на...!
..." (Ленинград)
Я не несу ответственности за свои действия в Вашей голове.
|
|
|
|
11.11.2017, 15:11
|
|
Прописка
Регистрация: 29.03.2007
Сообщений: 185
Сказал спасибо: 11
Сказали Спасибо 1 раз в 1 сообщении
|
Re: Функция вывода на lcd и глобальные переменные
Сообщение от akegor
|
А если уже "глобал", то зачем ВОЗВРАЩАТЬ указатель?
|
тогда ничего возвращать и не надо)
|
|
|
|
11.11.2017, 15:19
|
|
Почётный гражданин KAZUS.RU
Регистрация: 13.03.2010
Сообщений: 2,901
Сказал спасибо: 499
Сказали Спасибо 3,061 раз(а) в 1,425 сообщении(ях)
|
Re: Функция вывода на lcd и глобальные переменные
Сообщение от supercelt
|
тогда ничего возвращать и не надо)
|
Вот именно. Когда потребуется, чтоб одна и та же функция могла выполнять ту или иную работу с разными массивами - вот тогда и использовать указатели. Которые ПЕРЕДАЮТСЯ ЕЙ. А не она их возвращает.
Или когда функция сама решает, с каким массивом из имеющихся глобальных ей надо работать, например, в зависимости от каких-то флагов, или переданных ей аргументов, или еще чего-нибудь. Тогда уже она делает свое дело и ВОЗВРАЩАЕТ указатель на массив, который она выбрала.
А пока нет лишних сложностей - не надо городить лишние сущности (и слишком уж бояться глобальных переменных по примеру некоторых упоротых программистов, которые орут, что таких переменных в программе вообще быть не должно)))
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 01:25.
|
|