C++中size_t循环的坑

快来注册~

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

x

for (size_t i = _height - 1; i >= 0; i--)这段代码看起来没有什么问题,其实有一个大坑,是因为size_t是一种非负类型,它永远都不可能会小于0,所以循环停不下来。把size_t改成int就没问题了。
  1. #include"utils.h"
  2. #include<iostream>
  3. using namespace std;

  4. void calMinDis()
  5. {
  6. bool **_map = NULL;
  7. int **_min_dis;
  8. int _height = 100;
  9. int _width = 200;

  10. _map = new bool*[_height];
  11. for (size_t i = 0; i < _height; i++)
  12. {
  13. _map[i] = new bool[_width];
  14. }

  15. printf("cal min dis.\n");
  16. if (_map == NULL)
  17. {
  18. printf("map haven't init.\n");
  19. return;
  20. }

  21. _min_dis = new int *[_height];
  22. for (size_t i = 0; i < _height; i++)
  23. {
  24. _min_dis[i] = new int[_width];
  25. }
  26. int MAX_INT = 0xffffffff >> 1;
  27. for (size_t i = 0; i < _height; i++)
  28. {
  29. for (size_t j = 0; j < _width; j++)
  30. {
  31. if (_map[i][j])
  32. {
  33. _min_dis[i][j] = MAX_INT;
  34. }
  35. else
  36. {
  37. _min_dis[i][j] = 0;
  38. }
  39. }
  40. }
  41. for (size_t i = 0; i < _height; i++)
  42. {
  43. for (size_t j = 0; j < _width; j++)
  44. {
  45. if (!_map[i][j])
  46. {
  47. continue;
  48. }
  49. if (i > 0 && _min_dis[i - 1][j] < _min_dis[i][j])
  50. {
  51. _min_dis[i][j] = _min_dis[i - 1][j] + 1;
  52. }
  53. if (j > 0 && _min_dis[i][j - 1] < _min_dis[i][j])
  54. {
  55. _min_dis[i][j] = _min_dis[i][j - 1] + 1;
  56. }
  57. }
  58. }
  59. printf("1\n");
  60. for (size_t i = _height - 1; i >= 0; i--)
  61. {
  62. for (size_t j = _width - 1; j >= 0; j--)
  63. {
  64. printf("(%d,%d)\n",i,j);
  65. if (!_map[i][j])
  66. {
  67. continue;
  68. }
  69. if (i + 1 < _height && _min_dis[i + 1][j] < _min_dis[i][j])
  70. {
  71. _min_dis[i][j] = _min_dis[i + 1][j] + 1;
  72. }
  73. if (j + 1 < _width && _min_dis[i][j + 1] < _min_dis[i][j])
  74. {
  75. _min_dis[i][j] = _min_dis[i][j + 1] + 1;
  76. }
  77. }
  78. }
  79. printf("finished cal min dis.\n");
  80. }

  81. int main(int argc, char const *argv[])
  82. {
  83. calMinDis();
  84. return 0;
  85. }
复制代码


免责声明:
资源盒论坛发布的一切资源、模型和注册信息及软件的源码教程仅限用于学习和研究目的;
不得将上述内容用于商业或者非法用途,否则,一切后果请用户自负。
本站资源来自网络,版权争议与本站无关。您必须在下载后的24个小时之内,从您的电脑中彻底删除上述内容。
如果您喜欢该程序/源文件,请支持正版软件,购买/注册,得到更好的正版服务。如有侵权请邮件与我们联系处理。
若本站侵犯了您的权益请联系站长进行删除处理E-mail:190183740@qq.com;
这个家伙很懒,没有设置签名~
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册账号

本版积分规则

资源盒致力于软件下载、办公素材、技术教程、软件源码、学习交流分享为一体的资源盒子。我们提供最新最全面的资源,包括软件类资源、工程文件素材下载、海量技术网络教程以及各种实用的教程。

联系客服 进入论坛