2012-06-20 35 views
4

当程序启动时,我的程序需要将几个浮点数设置为默认值。随着程序运行,这些整数将被设置为它们的真实值。然而这些真值可以是任何实数。我的程序将一直在检查这些数字,以查看它们的值是否已从默认值改变。例如,让我说我有整数A,B,C。所有这些整数将在开始时设置为默认值(可以说是-1)。然后随着程序的进行,可以说A和B分别设置为3和2。由于C仍然是默认值,程序可以推断出C还没有被分配非默认值。整数的默认值?

尝试查找唯一的默认值时出现问题。由于数字的值可以设置为任何值,如果它设置的值与默认值相同,我的程序将不知道一个浮点数是否仍具有默认值,或者其真值是否与默认值相同。

我认为NULL是一个默认值,但在C++中NULL等于0,导致相同的问题!

我可以创建一个由bool和float组成的完整对象作为成员,其中bool指示该float是否已被赋值为自己的值。然而,这看起来像是过度杀伤力。有没有一个默认值,我可以设置我的浮动,这样的价值是不相同的任何其他值? (例子包括无限或我)

我要求的C/C++解决方案。

+0

C本质上不支持确定值是否已分配的能力。一种策略是创建一个散列表(从变量名到分配的值),如果散列表中不存在变量名,那么它就没有分配给它。 –

+0

*无限或我*不是整数。如果你正在处理浮点数,你可以使用非数字(nan),但是整数没有这个值。你可以使用boost :: optional(实现应该类似于一个布尔值和整数的组合......或者你自己的,但是没有*无效的*整数(除非你的域中有一个,即在你的域中)域-12345是不可能的......) –

+0

你在最后提到了float,在C++中,你可以使用Nan,std :: numeric_limits, :: NaN(),作为标记,但是没有用于整数的标记值 –

回答

7

我可以创建选自由布尔和整数作为 构件,其中该布尔指示的数目是否已经被分配 其自身的价值还与否的整个对象。然而,这看起来像是过度杀伤力。

你所描述的在.NET中被称为“nullable type”。 A C++实现boost::optional

boost::optional<int> A; 

if (A) 
    do_something(*A); 
+1

我不认为这回答他的问题... – NominSim

+0

@NominSim我编辑了我的答案。现在我认为它回答了这个问题。 – kol

+0

是的,看起来不错,+1。 – NominSim

2

没有可以分配给不是实际int的int的位模式。如果您确实没有超出范围的整数值,则需要保留单独的标志。

1

如果有效的int域的值是无限的,唯一的选择是管理位,指示它是否被分配。

但是,你确定MAX_INT是一个理想的选择吗?

1

没有办法保证您分配一个int的值不会等于另一个随机int。确保你想要发生的唯一方法是创建一个单独的bool来说明变化。

1

不,您将不得不创建自己的数据类型,其中包含有关是否已分配的信息。

0

如果像你说的,没有整数值是关闭的限制,那么你就不能指定一个默认的“未初始化”的价值。就像你在你的问题中所建议的那样,使用一个带有int和bool的结构。

0

我可以创建选自由布尔和整数作为 构件,其中该布尔指示的数目是否已经被分配 其自身的价值还与否的整个对象。然而,这看起来像是过度杀伤力。

我的第一个猜测是有效地使用一个标志并标记每个变量。但这当然不是你唯一的选择。

  1. 您可以使用指针(可以是NULL)并动态分配内存。不是很方便。
  2. 您可以选择几乎从不使用的自定义值。然后您可以将此值定义为默认值。有时候,你需要将这个值赋给你的浮点数,但这种情况不会经常发生,你只需要跟踪这些变量。鉴于这种情况的发生,应该有一个简单的链表。
5

在一个二进制补码机器上,有一个整数值比其他值小:INT_MIN。否定它,你不能产生有效的正面价值。由于它是整数范围中最不有用的值,因此它是标记值的不错选择。它也有一个容易识别的十六进制值0x80000000。