隐式转换改变了有符号整数类型 'int' 到 无符号整数类型 'unsigned int'

7
我使用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提供命令行。


1
什么是错误?错误在哪里?在构造函数中提到的“Ocean”的成员变量有哪些类型?当你说“其他编译器没有错误”时,你是什么意思?那里的编译选项是什么?clang的选项是什么?你的问题缺少很多重要信息。 - Pradhan
2个回答

11

替换

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 而不是这种危险的自制方案。


谢谢,错误已经消失了。顺便说一下,我们实际上还没有涉及STL的任何内容。所以我不确定如何使用std::vector来解决这个问题。 - TommyLan

2

sizeof返回一个无符号的std::size_t类型。你在使用带符号的int变量进行乘法运算,因此如果启用-Wsign-conversion选项,就会产生警告。

你可以使用static_cast将维度转换为无符号以避免警告 - 如果需要,则添加负值保护(例如assert)。

(你的代码可能受益于使用成员初始化列表。)


谢谢你的建议。也许我没有表达清楚,但事实上我不能通过更改命令行来消除警告。但还是谢谢。 - TommyLan
2
我并没有让你改变命令行,而是告诉你如何修复代码以避免警告。(但在这种情况下,Cheers的回答更加合适。) - Mat

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接