在我的程序中,我试图用DBL_MAX
的常量值填充二维数组的双精度数。但是,当我调试我的代码时,我发现数组填充的值为0,而不是DBL_MAX
,即使在我跳过数组填充代码之后也是如此。有什么我做错了吗?
这是我填写double 2d数组的代码
double array[150][150];
memset(array, DBL_MAX, sizeof(array));
答案 0 :(得分:2)
memset()
对于这项工作来说只是错误的工具。
它被声明为:
void* memset( void* dest, int ch, std::size_t count );
将ch
分配给每个数据字节。如果你测试DBL_MAX
是什么,当转换为int时,你可以确认你为什么得到零:
int x = DBL_MAX;
std::cout << x << "\n"; // prints 0
你可能会混淆cast和std::fill
,但在我看来这看起来很糟糕,我认为你最好使用一个简单的双循环让编译器为你优化它:< / p>
for(auto& l : array) {
for (auto& c : l) {
c = DBL_MAX;
}
}
编辑:由于您已将此标记为C ++ 11,因此请注意:除非您与直接在内存中工作的API和接口进行交互,否则您真的不应该考虑在&#34;记忆&#34;在编写现代C ++代码时。即使在处理核心数据类型时,将它们视为对象几乎总是更好。如果你使用任何旧的mem...
接口,你可能会从错误的角度解决你的问题。
答案 1 :(得分:1)
memset
将每个字节设置为提供的值。但是,您实际上想要设置每个double
。
您可以使用:
double array[150][150];
std::fill_n(&array[0][0], 150 * 150, DBL_MAX); // #include <algorithm>
也可以使用模板元编程生成基本等同于double array[150][150] = { DBL_MAX, DBL_MAX, DBL_MAX,
....,see this thread的代码。