在程序中稍后传递一个双精度-使用对话框进行输入
Passing a double to later in a program - using a dialog box for entry
我正试图传递一个稍后在程序中使用的double。当程序启动时,会出现一个对话框,要求输入一个数字。以下代码应该接收数字输入,并将其转换为要传递的双精度:
char MaxBuf[256];
#ifdef WIN32
edit_dialog(NULL,"Max", "Enter Max:", MaxBuf,260);
#endif
sprintf( MaxBuf, "%d", Max);
请注意,"Max"被定义为头文件中的全局变量,其方式如下:
double Max;
然而,当我到达程序的后一点(在一个单独的C++文件中的一个单独子例程)时,Max的值将被取消初始化。我知道在头文件中正确定义了变量,因为这在以前对我来说是有效的;我刚刚意外地删除了"main.c"文件中的代码,正在尝试恢复它。因此,问题一定出在代码的顶部块中。我做错了什么?
当你说:
sprintf( MaxBuf, "%d", Max);
您正试图使用整数转换器打印双精度,这将给出奇怪的结果,这取决于Max中的内容-您想要:
sprintf( MaxBuf, "%f", Max);
我想你想要sscanf
而不是sprintf
,正如@dragon135提到的%lf
而不是%d
首先,在头文件中定义变量不是一个好的做法,因为包含该头的每个文件都有自己版本的变量(除非您使用一些保护宏来预测这一点)。
这就是您遇到未初始化变量的原因,因为它与您之前初始化的变量不同。
相反,您最好在C++文件中定义变量double Max;
,然后在相应的头文件中添加extern double Max;
。这样,即使头文件包含在多个文件中,变量也只能有一个定义。
顺便说一下,您应该使用%lf
作为double
,而不是%d
:
sprintf( MaxBuf, "%lf", Max); // Max is of type double
听起来每个翻译单元(基本上意味着源文件)都在获得自己版本的全局变量。
您应该只在一个文件中将其定义为int Max;
,并在头文件中将其为extern int Max;
。
或者更好的是,不要使用全局变量。)
相关文章:
- 将双精度变量设置为另一个变量的值
- 我在C++中使用提升哈希函数将 3 个双精度组合成一个面临冲突的哈希
- 为什么 Clang std::ostream 写一个 std::istream 无法读取的双精度?
- Fmod 函数清楚地输出一个预期的双精度值,但 if(fmod == 预期的双精度值)的计算结果不是 true
- C++ 警告:在一个声明中将截断从双精度初始化为浮点数,但在另一个声明中则不初始化
- 字符串和双精度的麻烦,等值后再得到一个数字
- 我想读取文本文件中的所有内容(但文本文件中只有一个双精度值),转换为双精度值并返回值
- 在编译时将整数和分数部分宏组合成一个新的宏或双精度
- 将 32 位浮点数和不强制转换的 32 位整数与双精度进行比较,当其中一个值可能太大而无法完全适合另一种类型时
- 有没有办法构造一个 constexpr 函数来获取双精度的位表示
- 如何使用 c++ 将多个变量存储在一个变量中?例如,双精度 x,y,z 包含在可变点 p 中
- 您能否给我一个 16 位(或更多)十进制数,该十进制数仅在第 15 位正确转换为双精度浮点圆
- C++ 传递一个 int,错误地说这是一个双精度
- 如何验证字符串是有效的双精度(即使它有一个点)
- 在C++中获取大于或等于一个双精度的最小浮点值(以及小于或等于一的最大浮点值)
- 当我声明一个大小为500 x 500的双精度矩阵时,为什么会出现堆栈溢出
- 在字符串(C++)的末尾添加一个双精度
- C++试图返回一个双精度数组的字符串(有点)
- 从文件中读取长双精度,然后写入另一个文件
- 将所有双精度转换为整数以获得更好的性能,这只是一个谣言