Модераторы: LSD

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> использовать ли глобальные переменные? целесообразность использования гл. п. 
V
    Опции темы
MAKCim
Дата 13.4.2009, 13:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 8
Всего: 207



Цитата(Lazin @  13.4.2009,  13:04 Найти цитируемый пост)
про обработчики прерываний я согласен

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


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
Lazin
Дата 13.4.2009, 13:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

Репутация: 4
Всего: 154



Цитата(bsa @  13.4.2009,  13:28 Найти цитируемый пост)
Интересно, а что делать в случае WndProc? Она объявлена как:

Код

LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)

И тут уж никуда указатель свой не сунуть... Вот и получается, необходимо, например, хранить map<HWND, MyClass*>, если окон много...

я думал, что можно передать указатель на свой объект, через последний параметр ф-ии CreateWindow, хотя GDI не мой конек smile 

bsa, со случайной )

Это сообщение отредактировал(а) Lazin - 13.4.2009, 14:00
PM MAIL Skype GTalk   Вверх
Любитель
Дата 13.4.2009, 14:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Программист-романтик
****


Профиль
Группа: Комодератор
Сообщений: 3645
Регистрация: 21.5.2005
Где: Воронеж

Репутация: 5
Всего: 92



GetWindowLong/SetWindowLong + GWL_USERDATA + hWnd.


--------------------
PM MAIL ICQ Skype   Вверх
Ln78
Дата 13.4.2009, 15:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 274
Регистрация: 25.11.2006

Репутация: нет
Всего: 15



Цитата(Proghat @  12.4.2009,  19:21 Найти цитируемый пост)
Как лучше писать и почему?

I вариант:

код C++


void rec( int sum, int n, int c ) {
  if ( sum == n ) {
  }
  for ( i = 1; i <= c; i++ ) {
    rec( sum + a[i], n, c )
  }
}

int main(){
  int n( 10 ), c( 23 );

  rec( 0, n, c );

  return( 0 );
}


Proghat, а что это такое вообще? Просто лишь бы что-то было, или есть какой-то смысл именно в этом примере? В обоих вариантах примера используется непонятно где находящееся a[i], смысл if'а  в функции остался недоступен, других вариантов останова, кроме как по переполнению стека вызова я что-то не вижу. Что полезное делает это функция понять невозможно. Для данного примера ответ, ИМХО, зависит от того, какая цель преследуется. Если нужно, чтобы переполнение наступило быстрее, то дополнительные переменные этот процесс ускорят. Если нужно, чтобы подольше помучилась, то использование глобальных переменных немного продлит процесс. Что это за пример такой?  smile 
PM MAIL   Вверх
Proghat
Дата 13.4.2009, 15:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 50
Регистрация: 16.1.2007
Где: Гомель, Беларусь

Репутация: нет
Всего: нет



Цитата(Ln78 @ 13.4.2009,  15:47)
Что это за пример такой?

Я привел не полный код.
PM MAIL WWW ICQ Skype Jabber   Вверх
Ln78
Дата 13.4.2009, 16:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 274
Регистрация: 25.11.2006

Репутация: нет
Всего: 15



Цитата(Proghat @  13.4.2009,  16:55 Найти цитируемый пост)
Я привел не полный код. 

Так его или совсем не нужно было приводить, получается тема "за жисть поговорить", или как-то конкретизировать условия. Или думаешь, без этого примера никто не догадается чем отличается в коде использование глобальных переменных и передача переменных как параметров фукнции? 
Если хочешь, чтобы общий разговор на тему был полезен и тебе, можно было как-то хотя бы немного уточнить, на чём программируешь (С, С++), какой сложности программы писал, что на тему читал и т.д. А то ведь не всякий разговор воинов дZена понятен школьнику обыкновенному. 

Это сообщение отредактировал(а) Ln78 - 13.4.2009, 16:11
PM MAIL   Вверх
Proghat
Дата 13.4.2009, 16:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 50
Регистрация: 16.1.2007
Где: Гомель, Беларусь

Репутация: нет
Всего: нет



Цитата(Ln78 @  13.4.2009,  16:09 Найти цитируемый пост)
Так его или совсем не нужно было приводить, получается тема "за жисть поговорить", или как-то конкретизировать условия. Или думаешь, без этого примера никто не догадается чем отличается в коде использование глобальных переменных и передача переменных как параметров фукнции? 

Понятно. Учту ; ). Хотел спросить об использовании глобальных переменных именно в данном примере(это решение простой олимпиадной задачи).

Прочитал эту тему и те две темы, которые предлагал Soah и сделал для себя выводы:
1) всегда нужно стараться сделать функцию максимально независимой от другого кода;
2) в решении простой олимпиадной задачи (<100 строк) можно использовать глобальные переменные.

Цитата(Ln78 @  13.4.2009,  16:09 Найти цитируемый пост)
Если хочешь, чтобы общий разговор на тему был полезен и тебе, можно было как-то хотя бы немного уточнить, на чём программируешь (С, С++), какой сложности программы писал, что на тему читал и т.д. А то ведь не всякий разговор воинов дZена понятен школьнику обыкновенному. 

Учу C++. (До этого писал на Pascal около трех лет.) Писал решения олимпиадных задач.

Это сообщение отредактировал(а) Proghat - 13.4.2009, 16:32
PM MAIL WWW ICQ Skype Jabber   Вверх
vinter
Дата 13.4.2009, 17:12 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Explorer
****


Профиль
Группа: Завсегдатай
Сообщений: 2735
Регистрация: 1.4.2006
Где: Н.Новгород

Репутация: 1
Всего: 56



Использование глобальных переменных нецелесообразно и опасно. Если дизайн поджимает и обойти никак, тогда лучше использовать функцию со static variable inside. Хотя бы избавит от несогласованности в инициализации между еденицами трансляции. В С++ я вообще не вижу в них смысла, если конечно не приходится в существующий  "дизайн" вписываться.


--------------------
Мой блог
PM MAIL WWW   Вверх
GoldFinch
Дата 13.4.2009, 17:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Завсегдатай
Сообщений: 2141
Регистрация: 30.11.2008

Репутация: нет
Всего: 26



Цитата(vinter @  13.4.2009,  18:12 Найти цитируемый пост)
Использование глобальных переменных нецелесообразно и опасно.

нецелесообразно и опасно в частных случаях когда это действительно нецелесообразно и опасно
в общем случае, это и целесообразно, и безопасно
Код

#include <intrin.h>
#pragma intrinsic(__rdtsc)

int g_RandSeed;

void randomize() {
    g_RandSeed=(int)__rdtsc();
}

int random(int lim) {
    g_RandSeed=g_RandSeed*0x8088405+1;
    return __int64(g_RandSeed*lim)>>32;
}

int main() {
    randomize();
    return random(10); 
}


Это сообщение отредактировал(а) GoldFinch - 13.4.2009, 17:45
PM MAIL ICQ   Вверх
mes
Дата 13.4.2009, 17:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 1
Всего: 250



Цитата(GoldFinch @  13.4.2009,  16:42 Найти цитируемый пост)
в общем случае, это и целесообразно, и безопасно

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

Это сообщение отредактировал(а) mes - 13.4.2009, 17:54


--------------------
PM MAIL WWW   Вверх
vinter
Дата 13.4.2009, 17:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Explorer
****


Профиль
Группа: Завсегдатай
Сообщений: 2735
Регистрация: 1.4.2006
Где: Н.Новгород

Репутация: 1
Всего: 56



Цитата(GoldFinch @  13.4.2009,  18:42 Найти цитируемый пост)
в общем случае, это и целесообразно, и безопасно

есть опыт работы с большими проектами?


--------------------
Мой блог
PM MAIL WWW   Вверх
GoldFinch
Дата 13.4.2009, 18:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Завсегдатай
Сообщений: 2141
Регистрация: 30.11.2008

Репутация: нет
Всего: 26



vinter, с небольшими, и не на С\С++
приведите пример, где использование глобальных переменных нецелесообразно и опасно, 
ато может то что очевидно вам, совсем не очевидно остальным


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

Это сообщение отредактировал(а) GoldFinch - 13.4.2009, 18:09
PM MAIL ICQ   Вверх
vinter
Дата 13.4.2009, 18:27 (ссылка) |   (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Explorer
****


Профиль
Группа: Завсегдатай
Сообщений: 2735
Регистрация: 1.4.2006
Где: Н.Новгород

Репутация: 1
Всего: 56



GoldFinch, конкретного примера под рукой нет. Но, потенциальные проблемы:
1. Проблемы связанные с сокрытием и перекрытием имен. Ужасные проблемы могут быть связаны с этим.
2. Проблемы меж-еденица-трансляционного взаимодействия - нет гарантии, что переменная инициализирована при ее использовании, нет гарантии что переменная не изменит своего значения в неподходящий момент.
Глобальную переменную в больших проектах, практически невозможно контролировать



--------------------
Мой блог
PM MAIL WWW   Вверх
Anikmar
Дата 13.4.2009, 18:35 (ссылка) |  (голосов:3) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2513
Регистрация: 26.11.2006
Где: Санкт-Петербург

Репутация: 1
Всего: 59



Цитата(vinter @  13.4.2009,  18:27 Найти цитируемый пост)
Глобальную переменную в больших проектах, практически невозможно контролировать

Возьмем пример:
Некие настройки большого проекта - пара сотен окон, все хотят сохранить некие свои настройки.
1 подход. Сохраняйся кто как может. Используем налево-направо серализацию, плодим кучу веток в реестре или файлах настройки. Это все легко контролируется?
2 подход. Глобальный объект локальных настроек. Один на всех, который поддерживает необходимые методы для сохранения всего что кому-нибудь нужно.

Что легче контролировать?

У глобальных переменных есть только одна проблема: программист(-ы). Если разработчик(-и) дружат с головой ничего страшного в глобальных переменных нет.
ИМХО.
PM MAIL ICQ   Вверх
Lazin
Дата 13.4.2009, 18:37 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

Репутация: 4
Всего: 154



Цитата(GoldFinch @  13.4.2009,  18:07 Найти цитируемый пост)
приведите пример, где использование глобальных переменных нецелесообразно и опасно

самый простой пример - масштабируемость кода, допустим есть у нас глобальая переменная connection, мы ее юзаем в множестве мест программы, все хорошо, не нужно передавать лишних параметров в методы(ф-ии), достаточно проверить if (connection.connected()) и все, программа растет и обрастает функционалом, и тут выясняется что дальше нам прийдется работать с большим количеством connection-ов, либо с connection-ом другого типа smile 
PM MAIL Skype GTalk   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила ведения Религиозных войн
Smartov
1. Уважайте собеседника
2. Собеседник != враг
3. Старайтесь воздерживаться от тем вида "Windows Rulez" или "Linux Rulez"

С уважением, Smartov.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Религиозные войны | Следующая тема »


 




[ Время генерации скрипта: 0.1459 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.