static int与int的迷惑?

半点闲 2004-09-30 12:43:33
操作系统:WinXp+sp2
开发工具:vc6.0
语言:c

使用C编写windows下的一个实时获取鼠标X、Y坐标的小程序,定义了两个变量来

保存X、Y信息。定义如下:

原:int x, y // 保存鼠标X、Y坐标。

此时程序运行会初始给X、Y两个变量一个很大的“负数”如:-87877889。而且

无法实时获取鼠标坐标值(过程省略,因为验证后无误)。

更改为(无意)如下定义后问题解决。

static int x, y

不知道为何???请大家给我上一课。
...全文
2449 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
njSeeWhy 2004-09-30
  • 打赏
  • 举报
回复
static 变量会被初始化成缺省值,而一般变量不会。你可以在定义变量的同时初始化,像这样:
int x = 0;
int y = 0;
njSeeWhy 2004-09-30
  • 打赏
  • 举报
回复
原来你是这个意思,我知道了。关键在于WndProc是在有消息到来时被调用,处理完一条消息后就结束了。所以,如果你不把变量设为static,那每次退出时该变量就被释放了,下次进入WndProc时又被初始化成0。而设为static后,函数返回后变量所在的内存未被释放,下次再进入时还可以继续使用。不过,这种情况还是建议你利用全局变量来传递鼠标位置。全局变量可以在创建窗口时初始化好,在窗口过程中更新。
半点闲 2004-09-30
  • 打赏
  • 举报
回复
mdzhao(读破书万卷)
你只要把int x,y;写在main()函数的外面就行了,这样x,y就是全局变量,这个程序里的函数都能调用

只有在程序结束的时候x,y才被释放

crybird(寒号鸟)
-----------
存在全局数据区,程序结束才over

看了分析一下,好像有些明白因为定义int x, y;时不是全局变量所以WndProc过程无法访问cxMouse,cyMouse变量。

当定义为static int x, y;时(它们被放到全局变量区,所以WndProc能访问到它们)。

我以前以为把变量放到WndProc函数内,只要定义了数据类型WndProc都可以随意的访问。其实不然~~~说不明白总结还是我对windows下编程理解不够啊。。。
半点闲 2004-09-30
  • 打赏
  • 举报
回复
可是我的代码什么就没有动~~~

只是把原来定义的变量int x, y;改为static int x, y;就好了。代码如下。

LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
static int cxChar, cxCaps, cyChar;
TCHAR szBuffer[100]; // 格式化用的字符缓冲区。
int iCount; // 格式化后返回值。
static int cxMouse, cyMouse;// 鼠标X,Y坐标。
HDC hdc;
PAINTSTRUCT ps;
TEXTMETRIC tm;

switch (message)
{
case WM_CREATE:
hdc = GetDC(hwnd);

GetTextMetrics(hdc, &tm);
cxChar = tm.tmAveCharWidth ;
cxCaps = (tm.tmPitchAndFamily&1?3:2) * cxChar / 2;
cyChar = tm.tmHeight + tm.tmExternalLeading ;

ReleaseDC(hwnd, hdc);
return 0;
case WM_PAINT:
hdc = BeginPaint(hwnd, &ps);

iCount = wsprintf(szBuffer,
TEXT("鼠标X坐标:%20d,鼠标Y坐标:%20d"),cxMouse,cyMouse);
TextOut(hdc, cxChar, cyChar, szBuffer, iCount);

EndPaint(hwnd, &ps);
return 0;
case WM_LBUTTONDOWN: //鼠标左键。
cxMouse = LOWORD(lParam);
cyMouse = HIWORD(lParam);

InvalidateRect(hwnd, NULL, FALSE); //区域无效,屏幕信息清除。
return 0;
case WM_RBUTTONDOWN: // 鼠标右键。
cxMouse = 0;
cyMouse = 0;

InvalidateRect(hwnd, NULL, TRUE);
return 0;
case WM_MOUSEMOVE: // 鼠标(客户区)移动。
if (wParam & MK_LBUTTON)
{
cxMouse = LOWORD(lParam);
cyMouse = HIWORD(lParam);

hdc = GetDC(hwnd);
SetPixel(hdc, LOWORD(lParam), HIWORD(lParam), 0);
ReleaseDC(hwnd, hdc);
}
InvalidateRect(hwnd, NULL, FALSE); //区域无效,保存屏幕信息。
return 0;
case WM_DESTROY:
PostQuitMessage(0);
return 0;
}
return DefWindowProc(hwnd, message, wParam, lParam);
}
mdzhao 2004-09-30
  • 打赏
  • 举报
回复
你只要把int x,y;写在main()函数的外面就行了,这样x,y就是全局变量,这个程序里的函数都能调用

只有在程序结束的时候x,y才被释放
  • 打赏
  • 举报
回复
凝问1:
static 看书上说是把变量变为(静态),如果在一个函数中定义了一个静态变量,那么这个变量只能在这个函数内部使用(它会在内存中分配一块空间),是不是定义它的这个函数调用完毕后它(这个变量)也随着自动释放所占用的空间呢?
-----------
存在全局数据区,程序结束才over

凝问2:
按着楼上的我把它定义为 int x = 0, y = 0;后程序运行始终为显示为0,而且还是无法实时响应鼠标坐标值的变化。
-----------
你写的代码有问题
半点闲 2004-09-30
  • 打赏
  • 举报
回复
谢谢楼上~~

凝问1:
static 看书上说是把变量变为(静态),如果在一个函数中定义了一个静态变量,那么这个变量只能在这个函数内部使用(它会在内存中分配一块空间),是不是定义它的这个函数调用完毕后它(这个变量)也随着自动释放所占用的空间呢?

凝问2:
按着楼上的我把它定义为 int x = 0, y = 0;后程序运行始终为显示为0,而且还是无法实时响应鼠标坐标值的变化。


69,369

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧