我目前正在开发一个程序,它接收输入(通过main)并根据输入绘制不同的分形。 我在结构中保存已解析和转换(转换为数字)的用户输入:
typedef struct
{
unsigned int xcord,ycord;
}point_t;
typedef struct
{
int fractalType;
double lstart,lend,lconstant;
double leftangle,rightangle;
point_t drawStart;
}input_data_t;
我遇到的问题是,某些分形不会使用结构中包含的所有变量,如果使用变量调用某个分形,它不会使用我必须显示错误。
无论如何现在对这个问题,我知道变量当DECLARED"拿起"来自指定记忆位置的手中的垃圾。有没有办法知道变量是否在运行时被初始化,以确保解析后没有使用过不必要的变量? (如果需要,我需要跨平台解决方案)
答案 0 :(得分:2)
不,没有办法直接找到它。从未初始化的变量读取会调用未定义的行为,并且无法从中恢复。但是,您可以选择一些方法来防止这种情况发生。
如果您的变量具有有意义的默认值,只需将它们初始化为这些默认值,然后再对它们执行任何其他操作。您仍然无法区分默认变量和恰好具有相同值的变量之间的区别,但如果您的逻辑在没有这些知识的情况下工作,则完全没问题。 (例如,如果您要绘制正弦函数 f ( x )= a + b sin( c x + d ),默认 a 和 d 是很自然的到0和 b 和 c 到1。)
如果参数未跨越数据类型的整个值范围,则可以将它们初始化为某个标记值,并在使用前检查它们。例如,您可以将NAN
用于浮点值,或者对于任何不能为负的类型的数量使用-1。许多人不喜欢这种解决方案,因为很容易忘记检查值并使用哨兵就好像它是一个合适的值,从而计算垃圾。我相信每种技术都有时间和地点,但这可能确实被过度使用了。
如果其他所有内容都失败了,您可以为每个变量添加一个标志,指示它是否有值。为了使其可用,我建议您创建一个具有合理名称的数据类型,例如这个。
struct optional_float
{
bool initialized; // always safe to read, set appropriately
float value; // only safe to read if initialized == true
};
在C ++中,使用新的std::experimental::optional<T>
可以做得更好。但我意识到你的问题已经删除了C ++标签。
答案 1 :(得分:0)
我认为没有办法检查变量是否为initialiez。 由于c中的默认变量在初始化之前具有随机值或0。
如果您想知道变量是否已初始化,则可以为此变量设置合法值范围。在使用它之前,您可以检查该值是否在范围内。
使用变量进行安全保护的最佳方法是自行检查是否要使用变量。
答案 2 :(得分:0)
为什么不只是使用一些无效值初始化该结构,然后问题就变成该值是否无效。