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

 
 
4 страниц V   1 2 3 > »   
Closed TopicStart new topic
> Язык С, 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
aaarrr
сообщение Jan 21 2009, 15:29
Сообщение #2


Гуру
******

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



Цитата(Slash @ Jan 21 2009, 18:17) *
Стоит ли пользоваться глобальными переменными и можно ли без них обойтись?
В книгах пишут, что глобальные переменные - плохой тон, можно запутаться.

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

Цитата(Slash @ Jan 21 2009, 18:17) *
Мне понравилась система глобальных флагов - данные готовы к отправке, данные приняты, какое-то действие завершено и т.д.
Как без них?

Нормальная система.
Go to the top of the page
 
+Quote Post
Demeny
сообщение Jan 22 2009, 08:33
Сообщение #3


Знающий
****

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



Цитата(Slash @ Jan 21 2009, 18:17) *
Стоит ли пользоваться глобальными переменными и можно ли без них обойтись?
В книгах пишут, что глобальные переменные - плохой тон, можно запутаться.

Правильно пишут. Пока проект небольшой (до 10 файлов на С) - это несущественно, а в больших проектах (особенно многопоточных) обилия глобальных переменных лучше избегать - замучаетесь с отладкой.
Кроме того, следование этому принципу побуждает программиста к грамотной структуризации кода, в котором каждая функция выполняет строго определённую задачу, имеет набор входных и выходных данных, которые, собственно, и передаются через параметры функции, а не выносятся в глобальные переменные.
Цитата(Slash @ Jan 21 2009, 18:17) *
А если программа строится в виде задач в бесконечном цикле:
Код
while (1)
{
    Task1();
    Task2();
    Task3();
}

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

Например, так.
Код
while (1)
{
    int Msg1, Msg2, Msg3;
            
    Task1(&Msg1, &Msg2);
    Task2(&Msg3, &Msg2);
    Task3(&Msg1);
}


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


Гуру
******

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



Цитата(Demeny @ Jan 22 2009, 11:33) *
Правильно пишут. Пока проект небольшой (до 10 файлов на С) - это несущественно, а в больших проектах (особенно многопоточных) обилия глобальных переменных лучше избегать - замучаетесь с отладкой.

Поясните, пожалуйста, каким это образом глобальные переменные мешают отладке?
Go to the top of the page
 
+Quote Post
Demeny
сообщение Jan 22 2009, 10:20
Сообщение #5


Знающий
****

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



Цитата(aaarrr @ Jan 22 2009, 12:09) *
Поясните, пожалуйста, каким это образом глобальные переменные мешают отладке?

При их обилии, они запутывают логику выполнения программы (и без того запутанную smile3046.gif ). Поскольку инициализируется переменная в одном месте, модифицируется в другом, а используется ещё в десятке разных мест (на то она и глобальная переменная).
Также им нужно придумывать уникальные имена, а при сходной функциональности эти имена будут примерно такие - Counter27, Sigma7, Delta18, Sum88, что тоже не добавляет читабельности коду.


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


Гуру
******

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



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

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

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


Знающий
****

Группа: Свой
Сообщений: 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
Сообщение #8


Гуру
******

Группа: Свой
Сообщений: 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
VladimirYU
сообщение Jan 22 2009, 12:52
Сообщение #9


Местный
***

Группа: Свой
Сообщений: 426
Регистрация: 5-04-07
Из: Санкт-Петербург
Пользователь №: 26 782



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


Для этого достаточно одной глобальной переменной, которая удаляется после окончания отладки. Как правило, даже в сложном, но грамотно спроектированном проекте, глобальных переменных единицы.
Go to the top of the page
 
+Quote Post
zltigo
сообщение Jan 22 2009, 13:05
Сообщение #10


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



Цитата(VladimirYU @ Jan 22 2009, 14:52) *
Как правило, даже в сложном, но грамотно спроектированном проекте, глобальных переменных единицы.

Глупости то какие sad.gif у меня вот прямо сечас добрых 64K глобальных динамичеки создаваемых структур (не считая прочих глобальных )по которым бегают десятки подпрограмм.

Смею утверждать, что проект cпроектирован грамотно smile.gif.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Jan 22 2009, 13:05
Сообщение #11


Гуру
******

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



Цитата(VladimirYU @ Jan 22 2009, 15:52) *
Для этого достаточно одной глобальной переменной, которая удаляется после окончания отладки.

И что же с этой переменной делать? Промежуточный результат - это не обязательно одинокий int.
Go to the top of the page
 
+Quote Post
sergeeff
сообщение Jan 22 2009, 15:14
Сообщение #12


Профессионал
*****

Группа: Свой
Сообщений: 1 481
Регистрация: 10-04-05
Пользователь №: 4 007



Это скорее организационная проблема. Один человек ведет весь проект или коллектив. При коллективной работе глобальные переменные раскиданные по разным модулям и библиотекам - абсолютный кошмар для программистов.
Go to the top of the page
 
+Quote Post
zltigo
сообщение Jan 22 2009, 17:14
Сообщение #13


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



Цитата(sergeeff @ Jan 22 2009, 17:14) *
Это скорее организационная проблема.



Это ВООБЩЕ НЕ ПРОБЛЕМА и уж тем более не организационая. Либо глобальные данные принципиально нужны, либо нет.
Цитата
При коллективной работе глобальные переменные раскиданные по ...

Хоть при коллективной, хоть любой другой РАБОТЕ а бездумном бумагомарательстве, глобальные данные, структуры, поля, биты описываются ЕДИНОЖДЫ в хидерах. Дополнительно для доступа к данным c целью сокрытия ненужных подробностей можно иметь макросы/функции. И никакого кошмара.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
singlskv
сообщение Jan 23 2009, 00:27
Сообщение #14


дятел
*****

Группа: Свой
Сообщений: 1 681
Регистрация: 13-05-06
Из: Питер
Пользователь №: 17 065



Цитата(Demeny @ Jan 22 2009, 15:35) *
Это справедливо, если проект маленький.
ИМХО, это совсем не так, ну посмотрите на Linux например...
Цитата
В большом проекте отладку каждого модуля (функции) удобно производить отдельно, особенно если они написаны разными людьми. Для этого нужно уметь быстро собрать модуль и проверить (отладить) его функционирование. А если он усеян декларациями "extern ...", то мало того, что для его запуска потребуется определять все эти переменные локально, так ещё и сделает этот модуль нелинкуемым в составе проекта, если ту или иную глобальную переменную удалят другие разработчики. Всё это влечёт за собой геморрой необходимость ведения Конвенции по глобальным переменным в рамках проекта, и т. п.
По моему Вы смешиваете в одном понятии совсем разные вещи,
глобальные это те переменные которые заводятся вне функций, все... (утрированно конечно)
Вы можете сделать их доступными для других модулей(например через extern), а можете и не делать,
более того Вы можете сделать их доступными для одной части других модулей и недоступными для другой(например через препроцессор, ну или еще много как).

"Конвенции по глобальным переменным в рамках проекта" не относяться ко всем глобальным переменным(если конечно это не было целью).

В качестве примера, пусть есть некий программный автомат который чего-нить там куда-нить отсылает/пишет/итд
Так вот у него есть функции или глобальные переменные видимые из вне которые запускают действие, и есть
например глобальные переменные видимые из вне которые показывают состояние выполнения, а еще есть
куча ГЛОБАЛЬНЫХ но невидимых из вне переменных которые содержат в себе все внутреннее состояние автомата.
Такой модуль вполне независим и множество таких модулей может работать в одной проге не мешая друг другу,
нужно только описать "Конвенцию..." по входным и выходным параметрам.
Go to the top of the page
 
+Quote Post
rezident
сообщение Jan 23 2009, 00:46
Сообщение #15


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



Я бы предложил спорщикам уточнить, для какой области приложений они обсуждают полезность/вредность глобальных переменных? Одно дело писать под Windows, где размеры стека и кучи особо не волнуют программиста. И совсем другое дело писать для МК с очень ограниченными ресурсами ОЗУ, где "наползание" стека на область статических данных нередкая и весьма трудновылавливаемая ошибка. Вот где нужно искать компромисс между глобальными/статическими и локальными (стековыми) переменными!
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 6th July 2025 - 07:57
Рейтинг@Mail.ru


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