鱼C论坛

 找回密码
 立即注册
查看: 3187|回复: 2

如何解决C语言数组大小静态分配的限制,附一个简单的案例

[复制链接]
发表于 2011-11-20 22:33:07 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
功能:
用鼠标单击一个区域N次。( N >3 )
按下G键。 ( G是自己定义的, 无特殊含义 )
实现画多边形的功能。
很简单吧?

画多边形的API函数是 Polyline
  1. BOOL Polyline(
  2. HDC hdc,                           // handle to device context
  3. CONST POINT *lppt,          // array of endpoints
  4. int cPoints                          // number of points in array
  5. );
复制代码
我的做法是将鼠标点击时的,HIWORD(lParam)和LOWORD(lParam)逐个传入POINT结构体数组。
然后在响应G键的函数上,调用Polyline就可以了。
从而实现,点几下,就闪出几边形。

但使用Polyline前必须得先定义POINT pt [N];
N显然每次不是一个固定的常量。

这个问题如何解决呢?

如果懒得看这么长的描述,简单的说,在C语言中,用什么方法补充数组的这种局限性。
好像有些说法是链表指针之类的,那在这个案例中具体如何实现。


我的回调函数中代码如下,缺陷是只能画固定边数的多边形,求完善
  1. //将数组定义为静态变量
  2. static POINT poly[6] = {0};
  3. HDC hdc;
  4. int i;

  5. switch(uMsg)
  6. {
  7. case WM_LBUTTONDOWN:
  8. //定义为五边形,只对前4点赋值,第5点和第1点重合
  9. for(i = 0; i<5; i++)
  10. {
  11. if(!poly[i].x && !poly[i].y)
  12. {
  13. poly[i].y = HIWORD(lParam);
  14. poly[i].x = LOWORD(lParam);
  15. break;
  16. }
  17. }
  18. break;

  19. case WM_CHAR:
  20. {
  21. switch(wParam)
  22. {
  23. case 'G':
  24. case 'g':
  25. if(!poly[4].x && !poly[4].y)
  26. {
  27. MessageBox(NULL, TEXT("请用鼠标选出五个点"), "Warning", 0);
  28. break;
  29. }
  30. poly[5] = poly[0];
  31. hdc = GetDC(hWnd);
  32. Polyline(hdc, poly, 6);
  33. ReleaseDC(hWnd, hdc);
  34. //清空数组,等待下一次赋值
  35. for(i=0; i<6; i++)
  36. {
  37. poly[i].x = 0;
  38. poly[i].y = 0;
  39. }
  40. break;
  41. }
  42. }
  43. break;
复制代码



小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-11-21 08:36:24 | 显示全部楼层
用动态数组,malloc() 函数,动态分内存配空间,p = (int *)malloc(sizeof(int)*num)
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-11-21 16:52:42 | 显示全部楼层
如果是C++的话可以用
vector<Point> vec;
小甲鱼最新课程 -> https://ilovefishc.com
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-11-9 12:47

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表