隐式转换将符号“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 方案。
我正在使用 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 方案。