我想在双数组中将所有索引值设置为-1
这是我的代码:
double dp[505];
memset(dp,-1,sizeof(dp));
cout<<dp[0]<<"\n";
但是当我尝试打印其值时,它显示nan
。
nan
是什么意思?
是否可以在双数组中使用memset()
?
答案 0 :(得分:7)
memset
对字节进行操作,而非浮点数,并且所有字节设置为-1的double
不等于-1。我想你正在寻找std::fill
:
#include <algorithm>
std::fill(dp, dp + 505, -1.0);
或者,在C ++ 11中:
#include <algorithm>
#include <iterator>
std::fill(std::begin(dp), std::end(dp), -1.0);
答案 1 :(得分:7)
在C ++中,您可以写:
double initValue = -1;
std::fill_n(dp, 505, initValue);
使用非double值设置双数组将不起作用。
答案 2 :(得分:4)
您已使用字节0xFF
(即char
的{{1}}表示)设置要填充的数组的每个元素。
没有浮点数由一系列-1
字节表示,因此在打印0xFF
时,您会看到double
(即&#39;不是数字&#39;) 。这与NaN
将字节为零形成鲜明对比,这是合法的,因为0字节的字符串是memset
,其值为零。请参阅Is it legal to use memset(,0,) on array of doubles?。
如果您打算将每个条目设置为double
(即双倍),则在C ++中使用-1.0
或std::fill
或在C中使用循环,例如
std::fill_n
答案 3 :(得分:4)
来自memset
的手册页:
memset()
函数使用常量字节 c 填充 s 指向的内存区域的第一个 n 字节。
问题在于,您希望使用常量double
填充-1.0
s数组,但sizeof(double) > 1
使memset
实际上填充垃圾,最终会成为一个NaN。
如果您使用的是C ++,std::fill
功能就是您的朋友。实际上,由于您是第一次写入阵列,std::uninitialized_fill
是正确的。虽然对于内置double
类型,应该没有区别,但精确总是好的。
constexpr std::size_t length = 505;
double values[length];
std::uninitialized_fill(values, values + length, -1.0);
答案 4 :(得分:2)
memset
设置字节,因此您得到double
- 每个字节为-1
的值。
而是在C ++中使用std::vector
,然后编写
vector<double> dp( 505, -1.0 );
就这么简单。
如果dp
是一个全局向量,您需要多次将其设置为-1
,那么您只需执行此操作:
dp = vector<double>( dp.size(), -1.0 );
但是,generally not a good idea to use non-const
global variables。
或者,可以使用std::fill
,或仅使用循环,或仅使用仍将double
值视为double
值的任何技术。但std::vector
也是出于许多其他原因而不是大大简化fill-it任务。特别是std::vector
可以调整大小,它负责复制,它可以自动化内存管理,正确地为您做这个部分。
答案 5 :(得分:0)
nan意味着不是数字。
无法理解为什么它不起作用。 也许是因为没有设定精度:(cout.precision(15);)
检查一下: How do I print a double value with full precision using cout?
但我不确定它会起作用:o 我检查了memset源代码,负面没有问题:D
但这可能是双打的问题:
memset(dst0, c0, length) void *dst0;
register int c0;
register size_t length;
您是否尝试使用Werror标志进行编译?
答案 6 :(得分:-1)
虽然已经给出了问题的答案,但我只是想让你注意到这一点
sizeof(dp)
输出用于在内存中编码变量的字节数。
在你的情况下,dp是指向double的指针。然后它将等于指针(4)的大小,无论是否分配了memery。 sizeof(* dp)将输出double(8)的大小。 为了使用
的长度