PDA

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



pots
23.11.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,NUL L,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,hTabC trlWnd,(DLGPROC)TableDialogProc);
//return 0;
break;
case WM_NOTIFY:
lpNMHdr = (LPNMHDR)lParam;
hDlg = CreateDialog(hInst,(LPCTSTR)IDD_TABLE_DIALOG,hTabC trlWnd,(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,hTabC trlWnd,(DLGPROC)AddDialogProc);
if(nTab==1) hDlg = CreateDialog(hInst,(LPCTSTR)IDD_TABLE_DIALOG,hTabC trlWnd,(DLGPROC)TableDialogProc);
break;
}
break;

Oscar
23.11.2006, 21:04
HWND hTabCtrlWnd;
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
//...

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

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


long i1, i2;
i1 = i2 + 1;

pots
24.11.2006, 10:44
Да,это предупреждение, но при выполнении программы выдается ошибка!! поэтому и спрашиваю.
Наверное все таки придется делать переменную глобальной. Спасибо :)

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


LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
static HWND hTabCtrlWnd;
...............
};

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

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

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