Реклама на сайте English version  DatasheetsDatasheets

KAZUS.RU - Электронный портал. Принципиальные схемы, Datasheets, Форум по электронике

Новости электроники Новости Литература, электронные книги Литература Документация, даташиты Документация Поиск даташитов (datasheets)Поиск PDF
  От производителей
Новости поставщиков
В мире электроники

  Сборник статей
Электронные книги
FAQ по электронике

  Datasheets
Поиск SMD
Он-лайн справочник

Принципиальные схемы Схемы Каталоги программ, сайтов Каталоги Общение, форум Общение Ваш аккаунтАккаунт
  Каталог схем
Избранные схемы
FAQ по электронике
  Программы
Каталог сайтов
Производители электроники
  Форумы по электронике
Помощь проекту


 
Опции темы
Непрочитано 11.11.2017, 00:34  
supercelt
Прописка
 
Регистрация: 29.03.2007
Сообщений: 185
Сказал спасибо: 11
Сказали Спасибо 1 раз в 1 сообщении
supercelt на пути к лучшему
Радость Функция вывода на 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 может влиять на вывод на экран???
П.С. Раз уж я тут...то спрошу как вообще правильно делать такие финты? В плане когда функцией тянешь что-то и складируешь куда-то а потом ретёрнишь указатель
))))))
Реклама:
supercelt вне форума  
Непрочитано 11.11.2017, 04:59  
AR_Favorit
Почётный гражданин KAZUS.RU
 
Регистрация: 13.03.2010
Сообщений: 2,901
Сказал спасибо: 499
Сказали Спасибо 3,061 раз(а) в 1,425 сообщении(ях)
AR_Favorit на пути к лучшему
По умолчанию Re: Функция вывода на lcd и глобальные переменные

Учебник по Си -› область видимости переменных.

Глобальная переменная доступна всем функциям. Потому она так и называется - "глобальная".

Локальная переменная функции доступна только внутри нее. Если эта переменная объявлена без модификатора static, она создается заново каждый раз, когда вызывается функция, то есть ее содержимое после выходя из функции теряется. Если с этим модификатором - то под такую переменную выделяется постоянное место в ОЗУ и при следующем вызове функции значение этой переменной то же самое, что и при выходе после прошлого вызова.

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

Короче, в учебник. Там лучше расписано)
AR_Favorit вне форума  
Непрочитано 11.11.2017, 05:12  
CERGEI1982
Почётный гражданин KAZUS.RU
 
Аватар для CERGEI1982
 
Регистрация: 03.01.2007
Адрес: Россия,Иркутская обл.
Сообщений: 2,579
Сказал спасибо: 351
Сказали Спасибо 315 раз(а) в 193 сообщении(ях)
CERGEI1982 на пути к лучшему
По умолчанию Re: Функция вывода на lcd и глобальные переменные

С указателями так можно запутаться.
__________________
Глаза боятся,а руки делают.
CERGEI1982 вне форума  
Непрочитано 11.11.2017, 07:27  
mike-y-k
Модератор
 
Регистрация: 04.08.2010
Адрес: Москва СЗАО
Сообщений: 11,246
Сказал спасибо: 11,165
Сказали Спасибо 3,854 раз(а) в 2,925 сообщении(ях)
mike-y-k на пути к лучшему
По умолчанию Re: Функция вывода на lcd и глобальные переменные

supercelt, присоединяюсь к уважаемому AR_Favorit, таки лучше начать с базовых основ языка.
Если лень читать книги - на Coursera есть много курсов по теме.
От начал C, до использования C++.
Там собственно и другие направления есть, но не об этом речь, хотя может и будут полезны.
Сами курсы из разных источников. На русском видел от МФТИ, МИФИ, ВМК. В подготовке активно участвуют ребята из Яндекса.
Правда там за них могут попросить вполне разумные деньги.
__________________
rtfm forever должно быть основой для каждого. Альтернатива грустна, поскольку метод слепого щенка успешно работает при весьма малом числе вариантов…
mike-y-k вне форума  
Непрочитано 11.11.2017, 13:03  
supercelt
Прописка
 
Регистрация: 29.03.2007
Сообщений: 185
Сказал спасибо: 11
Сказали Спасибо 1 раз в 1 сообщении
supercelt на пути к лучшему
По умолчанию Re: Функция вывода на lcd и глобальные переменные

Мужики, если честно я знаю про области видимости. Это не ново. Я касательно как применить. Это правильно так делать? Что в функции складировать выдернутую подстроку в глобал переменную value? PS. Точнее вот так: если цель вернуть строку, то лучше возвращать саму строку (массив char) или в ф-ии записывать ее в глобал а потом возвращать указатель на эту строку?

Последний раз редактировалось supercelt; 11.11.2017 в 13:11.
supercelt вне форума  
Непрочитано 11.11.2017, 13:22  
AR_Favorit
Почётный гражданин KAZUS.RU
 
Регистрация: 13.03.2010
Сообщений: 2,901
Сказал спасибо: 499
Сказали Спасибо 3,061 раз(а) в 1,425 сообщении(ях)
AR_Favorit на пути к лучшему
По умолчанию Re: Функция вывода на lcd и глобальные переменные

Сообщение от supercelt Посмотреть сообщение
Это правильно так делать? Что в функции складировать выдернутую подстроку в глобал переменную value?
Ну а какие у вас еще варианты, если вы хотите эту выдернутую подстроку использовать где-то еще помимо данной функции?
AR_Favorit вне форума  
Непрочитано 11.11.2017, 14:43  
supercelt
Прописка
 
Регистрация: 29.03.2007
Сообщений: 185
Сказал спасибо: 11
Сказали Спасибо 1 раз в 1 сообщении
supercelt на пути к лучшему
По умолчанию Re: Функция вывода на lcd и глобальные переменные

Ну да)) никаких
supercelt вне форума  
Непрочитано 11.11.2017, 14:47  
akegor
Гуру портала
 
Аватар для akegor
 
Регистрация: 06.05.2005
Адрес: Краснодар, возле укротворного моря.
Сообщений: 18,841
Сказал спасибо: 2,531
Сказали Спасибо 11,764 раз(а) в 5,895 сообщении(ях)
akegor на пути к лучшему
По умолчанию Re: Функция вывода на lcd и глобальные переменные

Сообщение от supercelt Посмотреть сообщение
или в ф-ии записывать ее в глобал а потом возвращать указатель на эту строку?
А если уже "глобал", то зачем ВОЗВРАЩАТЬ указатель?
__________________
Не бейте больно, ежели чо, ну не удержался... А вааще,
"Мы за все хорошее, против всей х..., По лугам некошеным чтобы шли ступни,
Чтобы миром правила правда, а не ложь, Мы за все хорошее, нас не на...!
..." (Ленинград)
Я не несу ответственности за свои действия в Вашей голове.
akegor вне форума  
Непрочитано 11.11.2017, 15:11  
supercelt
Прописка
 
Регистрация: 29.03.2007
Сообщений: 185
Сказал спасибо: 11
Сказали Спасибо 1 раз в 1 сообщении
supercelt на пути к лучшему
По умолчанию Re: Функция вывода на lcd и глобальные переменные

Сообщение от akegor Посмотреть сообщение
А если уже "глобал", то зачем ВОЗВРАЩАТЬ указатель?
тогда ничего возвращать и не надо)
supercelt вне форума  
Непрочитано 11.11.2017, 15:19  
AR_Favorit
Почётный гражданин KAZUS.RU
 
Регистрация: 13.03.2010
Сообщений: 2,901
Сказал спасибо: 499
Сказали Спасибо 3,061 раз(а) в 1,425 сообщении(ях)
AR_Favorit на пути к лучшему
По умолчанию Re: Функция вывода на lcd и глобальные переменные

Сообщение от supercelt Посмотреть сообщение
тогда ничего возвращать и не надо)
Вот именно. Когда потребуется, чтоб одна и та же функция могла выполнять ту или иную работу с разными массивами - вот тогда и использовать указатели. Которые ПЕРЕДАЮТСЯ ЕЙ. А не она их возвращает.

Или когда функция сама решает, с каким массивом из имеющихся глобальных ей надо работать, например, в зависимости от каких-то флагов, или переданных ей аргументов, или еще чего-нибудь. Тогда уже она делает свое дело и ВОЗВРАЩАЕТ указатель на массив, который она выбрала.

А пока нет лишних сложностей - не надо городить лишние сущности (и слишком уж бояться глобальных переменных по примеру некоторых упоротых программистов, которые орут, что таких переменных в программе вообще быть не должно)))
AR_Favorit вне форума  
 

Закладки
Опции темы

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

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Ускорить компьютер 7Fantomas7 Ремонт оргтехники 111 08.08.2018 05:27
PIC16F876a+Nokia 5110 LCD+PICKit2 AndGrig PIC 31 02.11.2016 09:18
ЖКИ и CodeVision: 8-ми битный режим vikpol Микроконтроллеры, АЦП, память и т.д 33 09.03.2009 21:55
На чём написано ??? Koka Proteus, KiCAD и другие ECAD 18 08.10.2006 15:50
Не могу разобраться с LCD init_sub Информация по радиокомпонентам 6 02.04.2004 04:40


Часовой пояс GMT +4, время: 01:25.


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot