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

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Как сделать переменную глобальной?  (Прочитано 32450 раз)
0 Пользователей и 1 Гость смотрят эту тему.
SSW
Гость
« : 09-07-2003 20:53 » 

Помогите! Как и где  описать переменную, так чтоб была видна по всему проекту?
Зарание благодарю!
Записан
Гром
Птычк. Тьфу, птычник... Вот!
Готовлюсь к пенсии

il
Offline Offline
Пол: Мужской
Бодрый птах


« Ответ #1 : 09-07-2003 20:59 » 

Найди в проекте переменную theApp.
Далее - рядом с ней можешь описывать любые переменные и константы - все будет глобальным...
Для получения доступа в других файлах напиши в каждом нужном месте в начале файла extern тип переменная; Где тип и переменная - описание нужной глобальной переменной.
Записан

А птичку нашу прошу не обижать!!!
SSW
Гость
« Ответ #2 : 09-07-2003 23:39 » new

Огромное спасибо!
Записан
PSD
Главный специалист

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

« Ответ #3 : 10-07-2003 04:35 » 

Цитата

Найди в проекте переменную theApp.
Далее - рядом с ней можешь описывать любые переменные и константы - все будет глобальным...
Для получения доступа в других файлах напиши в каждом нужном месте в начале файла extern тип переменная; Где тип и переменная - описание нужной глобальной переменной.

У меня тут такие грабли с этой theApp не видят ее мои классы, а не видят потому что в CPP она обявлена.
пишешь так

СWnd * f=theApp.GetMainWnd();
и
получаешь
D:\ds\MyProjects\TestMFC\TestMFCDoc.cpp(75) : error C2065: 'theApp' : undeclared identifier


Как до нее достучаться?
Записан

Да да нет нет все остальное от лукавого.
Антон (LogRus)
Глобальный модератор

ru
Offline Offline
Пол: Мужской
Внимание! Люблю сахар в кубиках!


WWW
« Ответ #4 : 10-07-2003 04:55 » 

Вот тут ответ на твой ворос PSD, првда на англицком т.к. VC у меня нет то тестить придётся тебе, а так я тестирую ответы обычно.
http://www.microsoft.com/msj/archive/s202c.aspx
первый вопрос
и еще посмотри вот сдесь пример в VC
C:\Program Files\Visual Studio .NET 2002\Samples\Visual C++ Samples\mfc_general_hello
его можно скачать с MSDN
Записан

Странно всё это....
PSD
Главный специалист

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

« Ответ #5 : 10-07-2003 05:01 » 

Нет про то как достучаться до нее методами MFC  я знаю.

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

Тема была какая "как создать глобальную переменную" гром посоветовал обявить ее рядом с theApp у меня законный вопрос а как потом до ентой переменной достукиваться?
Записан

Да да нет нет все остальное от лукавого.
Lex
Специалист

ru
Offline Offline

WWW
« Ответ #6 : 10-07-2003 05:09 » 

А в header файле не забыли ее описать с добавлением  extern

Я например в MFC проектах добавляю в файл MyApp.h строчку где-нить после
определения класса.

extern CMyApp theApp;

Тогда она видна по всему проекту. Аналогично и со своими переменными.
Или тоже самое(с extern) можно писать прямо в начале .с файла.

Зона видимости всех переменных, даже глобальных файл. Следовательно тебе нужно объявлять переменную в каждом файле. Extern указывает компилятору, что переменная создана и находится в каком-то другом файле.
Записан

Megabyte be with you!
PSD
Главный специалист

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

« Ответ #7 : 10-07-2003 05:11 » 

Цитата

extern CMyApp theApp;

Вот это я и хотел узнать.
Записан

Да да нет нет все остальное от лукавого.
Lex
Специалист

ru
Offline Offline

WWW
« Ответ #8 : 10-07-2003 05:13 » 

Не знаю, почему микрософт это не сделал. Это напрашивается само сабой, если они делают theApp глобальной
Записан

Megabyte be with you!
Антон (LogRus)
Глобальный модератор

ru
Offline Offline
Пол: Мужской
Внимание! Люблю сахар в кубиках!


WWW
« Ответ #9 : 10-07-2003 05:26 » 

Извите не понял! :oops:
Записан

Странно всё это....
PSD
Главный специалист

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

« Ответ #10 : 10-07-2003 05:39 » 

Цитата: LogRus
Извите не понял! :oops:

Все просто  в MFC  проекте есть глобальня переменя theApp через которую можно очень просто управлять приложением (это верхняя точка иерархии объектов). Но изначадльно она не доступна из других частей программы потому что обявленя в срр файле и просто не видна из других модулей.
Код:
extern CMyApp theApp

Это один из вариантов как можно получить доступ к обекту приложения.
Записан

Да да нет нет все остальное от лукавого.
SlavaI
Главный специалист

ru
Offline Offline

« Ответ #11 : 10-07-2003 06:02 » 

Блин, ну и задал вопрос. Сам бы я никогда не допер, что он к MFC относится.
 У меня вопрос к SSW- как ты предполагал, что люди догадаются о том что вопрос про MFC, почему нельзя написать в вопросе что проблема возникла при работе с MFC.  MFC-это не стандартный C++. Если человек работает с WTL, или вобще для Linux пищет, то он что угодно может подумать про твой вопрос.
 Ну надо же понимать что MFC-это некий частный случай, а вопрос так глобально звучит.
 Ответ на твой вопрос, который можно дать, если не думать об MFC- объяви переменную вне всех классов и ф-ций, или сделай переменную статическим членом класса.
Записан
PSD
Главный специалист

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

« Ответ #12 : 10-07-2003 06:08 » 

А он не справшиал конкретно про MFC он спаршивал "как сделать глобалной" , это гром дал четкие указания по MFC(хотя может укогото еще такая переменая есть но я не видел ) проекту (орентир theApp).  А я точно знаю что в VC если обявить чтото свое рядом с theApp светится она будет как глобальня но братится кней напрямую  без дополнительных телодвижений нельзя.
 И пошло поехало. Отлично
Записан

Да да нет нет все остальное от лукавого.
Lex
Специалист

ru
Offline Offline

WWW
« Ответ #13 : 10-07-2003 06:10 » 

SlavaI, SSW задавал вопрос не по MFC а вообще. Это PSD про MFC спросил. Ну и Гром слегка в сторону MFC увел ответ.Ага
Записан

Megabyte be with you!
Гром
Птычк. Тьфу, птычник... Вот!
Готовлюсь к пенсии

il
Offline Offline
Пол: Мужской
Бодрый птах


« Ответ #14 : 10-07-2003 06:53 » 

Все вопросы SSW касались MFC логично предположить, что и этот к ним относится, так как человек с MFC работает...
Записан

А птичку нашу прошу не обижать!!!
Lex
Специалист

ru
Offline Offline

WWW
« Ответ #15 : 10-07-2003 07:48 » 

Гром, я вот такую статистику вопросов не отслеживаю, поэтому мне предположить это трудно. И во многом я согласен со Славой и не один раз уже это писал. НАРОД, ЗАДАВАЙТЕ ВОПРОС ПРАВИЛЬНО И КАК МОЖНО ПОЛНЕЕ.
Тогда можно ответить более предметно.
Записан

Megabyte be with you!
Гром
Птычк. Тьфу, птычник... Вот!
Готовлюсь к пенсии

il
Offline Offline
Пол: Мужской
Бодрый птах


« Ответ #16 : 10-07-2003 07:52 » 

С этим и я согласен...
А статистику я тоже не вел - просто вечером вчера - подряд вопросы задавались  Ага
Записан

А птичку нашу прошу не обижать!!!
awolf
Гость
« Ответ #17 : 10-07-2003 14:06 » 

А вообще, какая разница, использует человек MFC или какую-дибо другую технологию. Правила объявления переменных одинаковы практически во всех случаях.
SSW, можно почитать книженцию Кернигана и Риччи про язык Си - там все прекрасно расписано, как объявить глобальные, статические и т.д. переменные.

В каком нить заголовочном файле объявляешь
extern unsigned long global_var;

В каком-нить сишнике инициализируешь ее
unsigned long global_var = 0;

Вот тебе глобальная переменная
Записан
Гром
Птычк. Тьфу, птычник... Вот!
Готовлюсь к пенсии

il
Offline Offline
Пол: Мужской
Бодрый птах


« Ответ #18 : 10-07-2003 18:26 » 

Цитата

А вообще, какая разница, использует человек MFC


В данном случае я привязался к переменной theApp которая существует в MFC
Записан

А птичку нашу прошу не обижать!!!
Lex
Специалист

ru
Offline Offline

WWW
« Ответ #19 : 11-07-2003 05:14 » 

awolf, разница в понимани объяснений. Особенно если только-только начинаешь изучать, то фраза типа в каком-нибудь заголовочном файле и т.п. ставит в тупик. Гораздо понятнее для человека, когда ему говорят, найди такуюто строку и сделай так же. Когда человек более или менее освоился он начнет адекватно воспринимать более общие объяснения.
Записан

Megabyte be with you!
SlavaI
Главный специалист

ru
Offline Offline

« Ответ #20 : 11-07-2003 05:51 » 

У Страуструпа на личной странице висит интересное замечание про статические члены класса- вот оно

Код:
If you want a constant that you can use in a constant expression, say as an
 array bound, you have two choices:

class X {
static const int c1 = 7;
enum { c2 = 19 };

char v1[c1];
char v2[c2];

// ...
};

At first glance, the declaration of c1 seems cleaner, but note that to use that
 in-class initialization syntax, the constant must be a static const of integral
 or enumeration type initialized by a constant expression. That's quite
 restrictive:
class Y {
const int c3 = 7; // error: not static
static int c4 = 7; // error: not const
static const float c5 = 7; // error not integral
};

I tend to use the "enum trick" because it's portable and doesn't tempt me to use
 non-standard extensions of the in-class initialization syntax.
 
So why do these inconvenient restrictions exist? A class is typically declared
 in a header file and a header file is typically included into many translation
 units. However, to avoid complicated linker rules, C++ requires that every
 object has a unique definition. That rule would be broken if C++ allowed in-
class definition of entities that needed to be stored in memory as objects.
 See D&E for an explanation of C++'s design tradeoffs.

You have more flexibility if the const isn't needed for use in a constant
 expression:

class Z {
static char* p; // initialize in definition
const int i; // initialize in constructor
public:
Z(int ii) :i(ii) { }
};

char* Z::p = "hello, there";

You can take the address of a static member if (and only if) it has an out-of-
class definition:
class AE {
// ...
public:
static const int c6 = 7;
static const int c7 = 31;
};

const int AE::c7; // definition

int f()
{
const int* p1 = &AE::c6; // error: c6 not an lvalue
const int* p2 = &AE::c7; // ok
// ...
}
« Последнее редактирование: 19-11-2007 07:00 от RXL » Записан
Lex
Специалист

ru
Offline Offline

WWW
« Ответ #21 : 11-07-2003 05:54 » 

Прикольно
Записан

Megabyte be with you!
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines