Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Можно ли обойтись без глобальных переменных  (Прочитано 12907 раз)
0 Пользователей и 1 Гость смотрят эту тему.
The Nameless One
Помогающий

ru
Offline Offline
Пол: Мужской

« : 18-03-2011 15:03 » 

Привет)
Можно ли в приложение Win32 обойтись без глобальных переменных?

Все мои объекты хотелось бы создать внутри входной ф-ии (WinMain), а не в глобальном пространстве.
Но как тогда оперировать данными из этих объектов, которые нужны в ф-ии обработки сообщений (HWND и прочие вещи)?

Может, можно что-нибудь придумать?
Записан
Dale
Блюзмен
Команда клуба

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #1 : 18-03-2011 15:12 » 

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

Всего лишь неделя кодирования с последующей неделей отладки могут сэкономить целый час, потраченный на планирование программы. - Дж. Коплин.

Ходить по воде и разрабатывать программное обеспечение по спецификациям очень просто, когда и то, и другое заморожено. - Edward V. Berard

Любые проблемы в информатике решаются добавлением еще одного уровня косвенности – кроме, разумеется, проблемы переизбытка уровней косвенности. — Дэвид Уилер.
The Nameless One
Помогающий

ru
Offline Offline
Пол: Мужской

« Ответ #2 : 18-03-2011 15:41 » 

Тогда что придумать, если мне нужно вызывать методы объектов и обращаться к их данным-членам внутри ф-ии обработки сообщений LRESULT CALLBACK WinProc(...) {...} ?
Записан
Dale
Блюзмен
Команда клуба

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #3 : 18-03-2011 16:07 » 

Какую сигнатуру имеет функция?
Записан

Всего лишь неделя кодирования с последующей неделей отладки могут сэкономить целый час, потраченный на планирование программы. - Дж. Коплин.

Ходить по воде и разрабатывать программное обеспечение по спецификациям очень просто, когда и то, и другое заморожено. - Edward V. Berard

Любые проблемы в информатике решаются добавлением еще одного уровня косвенности – кроме, разумеется, проблемы переизбытка уровней косвенности. — Дэвид Уилер.
The Nameless One
Помогающий

ru
Offline Offline
Пол: Мужской

« Ответ #4 : 18-03-2011 20:22 » 

Какую сигнатуру имеет функция?

Вот Улыбаюсь

LRESULT CALLBACK WinProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam);

Сомневаюсь, что можно передать указатель как-нибудь через wParam/lParam.
Записан
Ochkarik
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #5 : 18-03-2011 20:33 » 

совсем - практически нереально. хм, а действительно... )

ЗЫ но если хочется попробовать то
CreateWindow() имеет последний параметр который передается через WM_CREATE
« Последнее редактирование: 18-03-2011 20:49 от Ochkarik » Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
The Nameless One
Помогающий

ru
Offline Offline
Пол: Мужской

« Ответ #6 : 18-03-2011 20:36 » 

Т.е. все-таки один объект (класса с композицией - содержащего в себе все нужные объекты) нужно создавать в глобальном пространстве?
Записан
Ochkarik
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #7 : 18-03-2011 20:39 » 

чуть выше ответил)
+ SetWindowLong /GetWindowLong для хранения своих данных внутри функции
« Последнее редактирование: 18-03-2011 20:44 от Ochkarik » Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
The Nameless One
Помогающий

ru
Offline Offline
Пол: Мужской

« Ответ #8 : 18-03-2011 20:48 » 

Благодарю!
Записан
Ochkarik
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #9 : 18-03-2011 20:50 » 

тока доку все таки почитайте, там особенности есть.
« Последнее редактирование: 18-03-2011 21:30 от Ochkarik » Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
Джон
просто
Администратор

de
Online Online
Пол: Мужской

« Ответ #10 : 18-03-2011 20:58 » 

Сомневаюсь, что можно передать указатель как-нибудь через wParam/lParam.

Почему? Это просто другое название для DWORD, что есть в свою очередь разрядность указателя (32-ух разрядных системах). "И кильками в наш век отравиться гораздо легче, нежели водкой. Пейте смело." (с)
« Последнее редактирование: 18-03-2011 21:01 от Джон » Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
Вад
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #11 : 18-03-2011 21:43 » 

Точнее, WPARAM = UINT_PTR, а этот последний определён так:
Код: (C)
#if defined(_WIN64)
 typedef unsigned __int64 UINT_PTR;
#else
 typedef unsigned int UINT_PTR;
#endif
Записан
The Nameless One
Помогающий

ru
Offline Offline
Пол: Мужской

« Ответ #12 : 18-03-2011 21:53 » new

Отлично, спасибо!
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines