Зона видимости локальных переменных

Общие вопросы, не зависящие от языка реализации.

Модераторы: Duncon, Hawk, Romeo, Eugie

Ответить
pots
Сообщения: 43
Зарегистрирован: 14 июн 2006, 14:18

23 ноя 2006, 18:06

Здравствуйте, уважаемые :)

Разбираюсь с таб контролом, взял пример из книжки (см.ниже)
при компиляции говорит:
local variable 'hTabCtrlWnd' used without having been initialized

ничего не пойму :( а если не так то как?

Подскажите плз....

Код: Выделить всё

LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
	int wmId, wmEvent;
	PAINTSTRUCT ps;
	HDC hdc;
	HWND hTabCtrlWnd;
	RECT rRect;
	TC_ITEM TcItem;
	static HWND hDlg = 0;
	int nTab;
	LPNMHDR lpNMHdr;
	
	switch (message) 
	{
	case WM_CREATE:
		AddData = new AddDataType[LOTTERY_SIZE];
		GetClientRect(hWnd,&rRect);
		hTabCtrlWnd = CreateWindow(WC_TABCONTROL,"TabCtrl",WS_VISIBLE | WS_TABSTOP | WS_CHILD | TCS_TOOLTIPS,0,0,rRect.right,rRect.bottom,hWnd,NULL,hInst,NULL);
		TcItem.mask = TCIF_TEXT;
		TcItem.iImage = -1;
		TcItem.pszText = "Additional lottery data";
		TabCtrl_InsertItem(hTabCtrlWnd,0,&TcItem);
		TcItem.pszText = "Combination cost table";
		TabCtrl_InsertItem(hTabCtrlWnd,1,&TcItem);
		hDlg = CreateDialog(hInst,(LPCTSTR)IDD_TABLE_DIALOG,hTabCtrlWnd,(DLGPROC)TableDialogProc);
		//return 0;
		break;
	case WM_NOTIFY:
		lpNMHdr = (LPNMHDR)lParam;
		hDlg = CreateDialog(hInst,(LPCTSTR)IDD_TABLE_DIALOG,hTabCtrlWnd,(DLGPROC)AddDialogProc);
		switch(lpNMHdr->code)
		{
		case TCN_SELCHANGE:
			if(hDlg)DestroyWindow(hDlg);
			nTab = TabCtrl_GetCurSel((HWND)lpNMHdr->hwndFrom);
			if(nTab==0)	hDlg = CreateDialog(hInst,(LPCTSTR)IDD_TABLE_DIALOG,hTabCtrlWnd,(DLGPROC)AddDialogProc);
			if(nTab==1) hDlg = CreateDialog(hInst,(LPCTSTR)IDD_TABLE_DIALOG,hTabCtrlWnd,(DLGPROC)TableDialogProc);
			break;
		}
		break;
Аватара пользователя
Oscar
Сообщения: 958
Зарегистрирован: 29 май 2004, 13:44
Откуда: Мюнхен (рожден в Киеве)
Контактная информация:

23 ноя 2006, 21:04

Код: Выделить всё

HWND hTabCtrlWnd;
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
//...
BBB
Сообщения: 1272
Зарегистрирован: 27 дек 2005, 13:37

24 ноя 2006, 10:06

pots писал(а):Разбираюсь с таб контролом, взял пример из книжки (см.ниже)
при компиляции говорит:
local variable 'hTabCtrlWnd' used without having been initialized

ничего не пойму :( а если не так то как?
1) Если я правильно догадываюсь, это не ОШИБКА (error), а ПРЕДУПРЕЖДЕНИЕ (warning) компиляции. Нет?
2) Такое сообщение возникает, когда интеллектуальный компилятор нашел ситуацию, когда (во всяком случае, с его точки зрения), ты используешь в выражении переменную, значение которой ранее не было присвоено (собственно, англиийское сообщение ровно об этом и говорит :) )
То есть, компилятор "беспокоится" о разработчике и предупреждает тебя о возможной ошибке в логике алгоритма.
Ну, например, такое же сообщение будет в следующей ситации:

Код: Выделить всё

 long   i1, i2]
pots
Сообщения: 43
Зарегистрирован: 14 июн 2006, 14:18

24 ноя 2006, 10:44

Да,это предупреждение, но при выполнении программы выдается ошибка!! поэтому и спрашиваю.
Наверное все таки придется делать переменную глобальной. Спасибо :)
BBB
Сообщения: 1272
Зарегистрирован: 27 дек 2005, 13:37

24 ноя 2006, 11:44

pots писал(а):Да,это предупреждение, но при выполнении программы выдается ошибка!! поэтому и спрашиваю.
Наверное все таки придется делать переменную глобальной. Спасибо :)
А, ну-да, конечно.
Естественно, что инициализируется переменная при перовм входе в процедуру, а используется при последующих. И, разумеется, значение после выхода из процедуры теряется. Так что, без глобальной (в смысле ее расположения в памяти) не обойтись.
А в чем проблема-то?
Если в "красивости написания", то можно "сделать" переменную, описанную в процедуре глобальной, приписав слово static. Тогда с точки зрения программирования она будет "видна" лишь в пределах этой процедуры, но хранится будет как глобальная.

Код: Выделить всё

LRESULT CALLBACK WndProc&#40]
Аватара пользователя
Stealth Legion
Сообщения: 13
Зарегистрирован: 21 июл 2007, 15:10
Откуда: Преисподня

21 июл 2007, 21:50

LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
HWND hTabCtrlWnd=NULL; /// вот как првильно
}

static - создаст переменную, которая будет существовать до конца работы программы в этой функции...
просто необходмо задать hTabCtrlWnd начальное значение (проинициализировать), так как это адрес и он где то используется в коде...

И было правильно замечено, что это ПРЕДУПРЕЖДЕНИЕ | WARNING. а не ошибка компиляции...
(в Visual Studio по идеи это предупреждение на 3-ем уровне)
Ответить