隐式转换将符号“int”更改为“unsigned int”

implicit conversion changes signedness 'int" to 'unsigned int"

我正在使用 clang++ 编译程序,我需要在 clang++ 中正确编译它。我用其他编译器没有错误。

代码中的错误行是

memset(grid_, 0, sizeof(int) * x_quadrants * y_quadrants);

整个函数是这样的:

Ocean::Ocean(int num_boats, int x_quadrants, int y_quadrants)
{
  grid_ = new int[x_quadrants * y_quadrants];
  memset(grid_, 0, sizeof(int) * x_quadrants * y_quadrants);
  x_quadrants_ = x_quadrants;
  y_quadrants_ = y_quadrants;
  boats_ = new Boat[num_boats];
  num_boats_ = num_boats;

  stats_.hits = 0;
  stats_.misses = 0;
  stats_.duplicates = 0;
  stats_.sunk = 0;
}

我正在使用 memset,因此在使用不同的驱动程序进行测试时不会得到垃圾值输出。不需要为 clang 提供命令行,因为我不允许更改它。

sizeof returns 无符号的 std::size_t。您正在乘以(带符号的)int 变量,因此如果您在 clang 中启用 -Wsign-conversion 会出现警告。

您可以 static_cast 将维度设置为无符号以避免出现警告 - 如果需要,添加防止出现负值(例如 assert)的措施。

(您的代码可能会受益于使用 member initializer list。)

替换

grid_ = new int[x_quadrants * y_quadrants];
memset(grid_, 0, sizeof(int) * x_quadrants * y_quadrants);

只有

grid_ = new int[x_quadrants * y_quadrants]();

注意括号,它告诉编译器你想要这个零初始化(或者真正的值初始化,在这里减少到零初始化)。

更好的是,使用 std::vector 而不是这个危险的 DIY 方案。