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

 
 
> Язык С, ARM - простые вопросы
Slash
сообщение Jan 21 2009, 15:17
Сообщение #1


Местный
***

Группа: Участник
Сообщений: 202
Регистрация: 10-04-05
Из: Санкт-Петербург
Пользователь №: 4 011



Здравствуйте!

Стоит ли пользоваться глобальными переменными и можно ли без них обойтись?
В книгах пишут, что глобальные переменные - плохой тон, можно запутаться.

А если программа строится в виде задач в бесконечном цикле:
Код
while (1)
{
    Task1();
    Task2();
    Task3();
}

Как обмениваться сообщениями между задачами? Мне понравилась система глобальных флагов - данные готовы к отправке, данные приняты, какое-то действие завершено и т.д.
Как без них?
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
aaarrr
сообщение Jan 22 2009, 11:29
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



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

Уникальные и осмысленные имена нужно просто научиться придумывать, имена типа Counter27, Sigma7 возникают как раз из-за недостатка этого умения.

Без глобальных переменных обойтись нельзя. Попытка использовать локальную переменную там, где нужна глобальная, запутает программу гораздо сильнее. Поэтому книжные утверждения, что де "плохой тон" следует отметать как бредовые. Нужно просто разумно использовать и те, и другие.
Go to the top of the page
 
+Quote Post
Demeny
сообщение Jan 22 2009, 12:35
Сообщение #3


Знающий
****

Группа: Свой
Сообщений: 648
Регистрация: 11-02-06
Из: Санкт-Петербург
Пользователь №: 14 237



Цитата(aaarrr @ Jan 22 2009, 14:29) *
Для отладки глобальные переменные наоборот удобнее, так как видны всегда. Иногда даже лучше временно заменить локальные переменные на глобальные, чтобы видеть результаты промежуточных вычислений.

Это справедливо, если проект маленький.
В большом проекте отладку каждого модуля (функции) удобно производить отдельно, особенно если они написаны разными людьми. Для этого нужно уметь быстро собрать модуль и проверить (отладить) его функционирование. А если он усеян декларациями "extern ...", то мало того, что для его запуска потребуется определять все эти переменные локально, так ещё и сделает этот модуль нелинкуемым в составе проекта, если ту или иную глобальную переменную удалят другие разработчики. Всё это влечёт за собой геморрой необходимость ведения Конвенции по глобальным переменным в рамках проекта, и т. п.
И ещё важный момент. Если Вы в своём модуле "нечаянно" измените логику работы с глобальным объектом, остальные разработчики об этом так и не узнают, только программа из-за возможной Вашей ошибки в целом может оказаться в один момент неработоспособной, и простыми средствами "поймать за руку" поломавшийся модуль не представляется возможным, повторюсь, особенно в многопоточном приложении. Зато если Вы поменяете перечень вызываемых параметров, их тип или количество ( "ну, не использую я более переменную Sum --> удаляю её из перечня параметров моей функции!" ) - это тут же выяснится ещё на этапе компиляции-линковки, и остальные разработчики смогут внести изменения в свои тексты.

Цитата(aaarrr @ Jan 22 2009, 14:29) *
Попытка использовать локальную переменную там, где нужна глобальная, запутает программу гораздо сильнее. Поэтому книжные утверждения, что де "плохой тон" следует отметать как бредовые. Нужно просто разумно использовать и те, и другие.

Там, где действительно нужна глобальная переменная, заменить её локальной невозможно в принципе - локальная будет "не видна" остальным. Никто ведь и не говорит, что от них нужно отказаться совсем. Речь идёт о том, что использовать глобальную переменную там, где запросто можно обойтись локальной - это плохой стиль программирования, "дурной тон".
--------------------------
Такая же история с оператором "goto". В принципе, в С можно без него обойтись. Но есть случаи, где его применение улучшает читабельность и логическую структуру кода, проще говоря, удобно. Однако заменять все циклы оператором "goto" - это "дурной тон".


--------------------
Сделано в Китае. Упаковано в России.
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Jan 22 2009, 12:48
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(Demeny @ Jan 22 2009, 15:35) *
Всё это влечёт за собой геморрой необходимость ведения Конвенции по глобальным переменным в рамках проекта, и т. п.

А как без нее вообще можно обойтись? Если глобальные объекты используются в качестве интерфейсов между различными частями проекта, то они в любом случае должны быть согласованы. Но это далеко не единственный вариант, глобальные переменные могут использоваться и только в пределах модуля, а здесь никаких ограничений нет.

Цитата(Demeny @ Jan 22 2009, 15:35) *
Никто ведь и не говорит, что от них нужно отказаться совсем. Речь идёт о том, что использовать глобальную переменную там, где запросто можно обойтись локальной - это плохой стиль программирования, "дурной тон".

Разумеется, но обратная ситуация - не менее, если не более дурной.
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- Slash   Язык С, ARM - простые вопросы   Jan 21 2009, 15:17
- - aaarrr   Цитата(Slash @ Jan 21 2009, 18:17) Стоит ...   Jan 21 2009, 15:29
- - Demeny   Цитата(Slash @ Jan 21 2009, 18:17) Стоит ...   Jan 22 2009, 08:33
|- - aaarrr   Цитата(Demeny @ Jan 22 2009, 11:33) Прави...   Jan 22 2009, 09:09
|- - Demeny   Цитата(aaarrr @ Jan 22 2009, 12:09) Поясн...   Jan 22 2009, 10:20
||- - singlskv   Цитата(Demeny @ Jan 22 2009, 15:35) Это с...   Jan 23 2009, 00:27
||- - Demeny   Цитата(singlskv @ Jan 23 2009, 03:27) В к...   Jan 23 2009, 07:34
||- - A. Fig Lee   Цитата(singlskv @ Jan 22 2009, 19:27) В к...   Jan 23 2009, 19:06
|- - VladimirYU   Цитата(aaarrr @ Jan 22 2009, 14:29) Для о...   Jan 22 2009, 12:52
|- - zltigo   Цитата(VladimirYU @ Jan 22 2009, 14:52) К...   Jan 22 2009, 13:05
|- - aaarrr   Цитата(VladimirYU @ Jan 22 2009, 15:52) Д...   Jan 22 2009, 13:05
- - sergeeff   Это скорее организационная проблема. Один человек ...   Jan 22 2009, 15:14
|- - zltigo   Цитата(sergeeff @ Jan 22 2009, 17:14) Это...   Jan 22 2009, 17:14
- - rezident   Я бы предложил спорщикам уточнить, для какой облас...   Jan 23 2009, 00:46
- - rezident   Цитата(Demeny @ Jan 23 2009, 12:34) Тепер...   Jan 23 2009, 15:10
|- - singlskv   Цитата(rezident @ Jan 23 2009, 18:10) Мог...   Jan 23 2009, 15:57
|- - Demeny   Цитата(singlskv @ Jan 23 2009, 18:57) Я в...   Jan 26 2009, 09:58
|- - zltigo   Цитата(Demeny @ Jan 26 2009, 12:58) 1) Ес...   Jan 26 2009, 10:32
||- - A. Fig Lee   Цитата(zltigo @ Jan 26 2009, 05:32) Стати...   Jan 26 2009, 14:20
||- - _Pasha   Цитата(A. Fig Lee @ Jan 26 2009, 18:20) Т...   Jan 26 2009, 14:49
|||- - A. Fig Lee   Цитата(_Pasha @ Jan 26 2009, 09:49) Стати...   Jan 26 2009, 17:55
|||- - _Pasha   Цитата(A. Fig Lee @ Jan 26 2009, 21:55) 2...   Jan 26 2009, 18:33
||||- - sonycman   Цитата(_Pasha @ Jan 26 2009, 22:33) стати...   Jan 26 2009, 20:17
||||- - singlskv   Цитата(sonycman @ Jan 26 2009, 23:17) А е...   Jan 26 2009, 20:27
||||- - rezident   Цитата(singlskv @ Jan 27 2009, 01:27) Бол...   Jan 26 2009, 20:40
|||||- - singlskv   Цитата(rezident @ Jan 26 2009, 23:40) Раб...   Jan 26 2009, 21:29
|||||- - sonycman   Цитата(singlskv @ Jan 27 2009, 01:29) Вас...   Jan 26 2009, 21:51
|||||- - Dima_G   Цитата(singlskv @ Jan 27 2009, 01:29) Я э...   Jan 28 2009, 10:21
|||||- - A. Fig Lee   Цитата(Dima_G @ Jan 28 2009, 05:21) Локал...   Jan 28 2009, 14:45
||||- - sonycman   Цитата(singlskv @ Jan 27 2009, 00:27) Пер...   Jan 26 2009, 21:07
|||- - singlskv   Цитата(A. Fig Lee @ Jan 26 2009, 20:55) 2...   Jan 26 2009, 19:45
|||- - A. Fig Lee   Цитата(singlskv @ Jan 26 2009, 14:45) Вот...   Jan 26 2009, 22:07
|||- - zltigo   Цитата(A. Fig Lee @ Jan 27 2009, 01:07) О...   Jan 26 2009, 22:52
|||- - singlskv   Цитата(A. Fig Lee @ Jan 27 2009, 01:07) Н...   Jan 26 2009, 22:52
|||- - A. Fig Lee   Цитата(singlskv @ Jan 26 2009, 17:52) ага...   Jan 26 2009, 23:46
||- - zltigo   Цитата(A. Fig Lee @ Jan 26 2009, 17:20) Т...   Jan 26 2009, 15:22
|- - Dog Pawlowa   Цитата(Demeny @ Jan 26 2009, 12:58) Попро...   Jan 26 2009, 10:45
|- - _Pasha   Цитата(Dog Pawlowa @ Jan 26 2009, 13:45) ...   Jan 26 2009, 11:13
|- - Dog Pawlowa   Цитата(_Pasha @ Jan 26 2009, 14:13) Есть ...   Jan 26 2009, 15:10
|- - _Pasha   Цитата(Dog Pawlowa @ Jan 26 2009, 18:10) ...   Jan 26 2009, 15:23
|- - zltigo   Цитата(_Pasha @ Jan 26 2009, 18:23) Один ...   Jan 26 2009, 15:25
- - Goodefine   Я, вот, по простому спрошу... Допустим, имеем обра...   Jan 23 2009, 19:09
|- - A. Fig Lee   Цитата(Goodefine @ Jan 23 2009, 14:09) Я,...   Jan 24 2009, 03:01
|- - VladimirYU   Цитата(A. Fig Lee @ Jan 24 2009, 06:01) п...   Jan 24 2009, 08:23
|- - zltigo   Цитата(A. Fig Lee @ Jan 24 2009, 05:01) п...   Jan 24 2009, 08:47
|- - _Pasha   Цитата(zltigo @ Jan 24 2009, 11:47) Их до...   Jan 24 2009, 14:43
|- - A. Fig Lee   Цитата(zltigo @ Jan 24 2009, 03:47) Опять...   Jan 24 2009, 17:14
|- - zltigo   Цитата(A. Fig Lee @ Jan 24 2009, 20:14) н...   Jan 24 2009, 17:50
|- - A. Fig Lee   Цитата(zltigo @ Jan 24 2009, 12:50) Ага, ...   Jan 25 2009, 13:43
- - Serj78   Можно, я свои 5 копеек вставлю? Иногда , на мало...   Jan 24 2009, 08:14
- - A. Fig Lee   вот правильный стандард - C++: The zeroinitializa...   Jan 27 2009, 14:42
|- - zltigo   Цитата(A. Fig Lee @ Jan 27 2009, 17:42) в...   Jan 27 2009, 16:10
||- - A. Fig Lee   Цитата(zltigo @ Jan 27 2009, 11:10) Вы, к...   Jan 27 2009, 16:23
|- - singlskv   Цитатакстати, я все никак не добьюсь - речь о C ил...   Jan 27 2009, 22:27
|- - A. Fig Lee   Цитата(singlskv @ Jan 27 2009, 17:27) Ну ...   Jan 27 2009, 23:44
- - rezident   Модератор. Тема закрыта по просьбе топикстартера.   Feb 2 2009, 21:01


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

 


RSS Текстовая версия Сейчас: 21st July 2025 - 23:16
Рейтинг@Mail.ru


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