4

我的程序需要在程序启动时将几个浮点数设置为默认数字。当程序运行时,这些整数将被设置为它们的真实值。然而,这些真值可以是任何实数。我的程序将始终检查这些数字,以查看它们的值是否已从默认值更改。

例如,假设我有整数 A、B、C。所有这些整数都将在开始时设置为默认值(比如说-1)。然后随着程序的进行,假设 A 和 B 分别设置为 3 和 2。由于 C 仍处于默认值,因此程序可以得出结论,C 尚未被分配非默认值。

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

我认为 NULL 作为默认值,但在 C++ 中 NULL 等于 0,导致同样的问题!

我可以创建一个由 bool 和 float 作为成员组成的整个对象,其中 bool 指示 float 是否已被分配了自己的值。然而,这似乎有点矫枉过正。是否有一个默认值我可以将我的浮点数设置为使得该值与任何其他值都不相同?(示例包括无穷大或 i)

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

4

8 回答 8

7

我可以创建一个包含一个 bool 和一个整数作为成员的整个对象,其中 bool 指示该数字是否已被分配了自己的值。然而,这似乎有点矫枉过正。

您所描述的在.NET中称为“可为空类型”。C++ 实现是boost::optional

boost::optional<int> A;

if (A)
  do_something(*A);
于 2012-06-20T20:20:32.040 回答
5

在二进制补码机器上,有一个整数值不如其他整数值:INT_MIN. 你不能通过否定它来产生一个有效的正值。由于它是整数范围内最没用的值,因此它是标记值的不错选择。它还有一个易于识别的十六进制值 0x80000000。

于 2012-06-20T20:43:38.873 回答
2

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

于 2012-06-20T20:18:57.033 回答
1

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

但是,您确定MAX_INT是理想的选择吗?

于 2012-06-20T20:19:19.210 回答
1

无法保证您分配 int 的值不会等于另一个随机 int。确保您想要发生的事情发生的唯一方法是创建一个单独的布尔值来说明更改。

于 2012-06-20T20:20:25.050 回答
1

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

于 2012-06-20T20:20:29.873 回答
0

如果如您所说,没有整数值是禁止的,那么您不能分配默认的“未初始化”值。只需按照您在问题中的建议使用带有 int 和 bool 的结构。

于 2012-06-20T20:22:21.070 回答
0

我可以创建一个包含一个 bool 和一个整数作为成员的整个对象,其中 bool 指示该数字是否已被分配了自己的值。然而,这似乎有点矫枉过正。

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

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