sprintf 遗漏双数据 C
sprintf leaves out double data C
sprintf 函数不包括我已经包含的变量。
我有以下代码:
typedef struct
{
double sensor_1;
double sensor_2;
double sensor_3;
double sensor_4;
int32_t acc_count;
}PAC1934_ResultData_t;
这是功率传感器的结构。
PAC1934_ResultData_t power;
power = PAC1934_read_Power_accumulation();
uint8_t buf[100] = {0};
sprintf((char*)&buf, " %010.9f W %010.9f W %010.9f W %010.9f W \n\r",
power.sensor_1, power.sensor_2, power.sensor_3, power.sensor_4);
但是 buf 的值总是只是一些空格和 W。我检查了调试器和 power 的值。sensor_1, ... 总是正确的并且不为零。
幂值都是双精度类型。
函数 PAC1934_read_Power_accumulation(); returns 类型为 PAC1934_ResultData_t 的元素及其所有元素的值。
出了什么问题?
当我用整数重写代码时,sprintf 工作正常。
编辑:试图输出浮点数或双精度数的简单代码不起作用。只有整数输出有效。我用
测试过
double test = 1.432;
printf("%f",test);
考生问题:
不支持 FP@Tom V
各种 compilers/linkers 不自动包含浮点 (FP) 支持。通过 printf()/scanf()
仅使用 FP 的代码被误以为不需要 FP 支持。研究您的编译器以强制将 FP 支持或一些简单且明显的 FP 代码链接到您的源代码。
缓冲区溢出
sprintf((char*)&buf, " %010.9f W ...
可能会超限。 为意外的 FP 值做好准备 并确保不会超限是一个很好的做法,无论如何。 buf[100]
和 %010.9f
是不够的。
备选方案:
// Limit buffer writing
snprintf((char*)&buf, sizeof buf, " %010.9f W ...
// or
// Use `%g` to avoid long text
sprintf((char*)&buf, " %010.9g W ...
// or
// Increase buffer size to some worst case - think -DBL_MAX
uint8_t buf[4 * 350] = {0};
真失败?
OP 仅描述了 失败,但没有post 可以复制它的代码。
一般帮助
启用所有编译器警告。
sprintf 函数不包括我已经包含的变量。 我有以下代码:
typedef struct
{
double sensor_1;
double sensor_2;
double sensor_3;
double sensor_4;
int32_t acc_count;
}PAC1934_ResultData_t;
这是功率传感器的结构。
PAC1934_ResultData_t power;
power = PAC1934_read_Power_accumulation();
uint8_t buf[100] = {0};
sprintf((char*)&buf, " %010.9f W %010.9f W %010.9f W %010.9f W \n\r",
power.sensor_1, power.sensor_2, power.sensor_3, power.sensor_4);
但是 buf 的值总是只是一些空格和 W。我检查了调试器和 power 的值。sensor_1, ... 总是正确的并且不为零。 幂值都是双精度类型。 函数 PAC1934_read_Power_accumulation(); returns 类型为 PAC1934_ResultData_t 的元素及其所有元素的值。 出了什么问题?
当我用整数重写代码时,sprintf 工作正常。
编辑:试图输出浮点数或双精度数的简单代码不起作用。只有整数输出有效。我用
测试过double test = 1.432;
printf("%f",test);
考生问题:
不支持 FP@Tom V
各种 compilers/linkers 不自动包含浮点 (FP) 支持。通过 printf()/scanf()
仅使用 FP 的代码被误以为不需要 FP 支持。研究您的编译器以强制将 FP 支持或一些简单且明显的 FP 代码链接到您的源代码。
缓冲区溢出
sprintf((char*)&buf, " %010.9f W ...
可能会超限。 为意外的 FP 值做好准备 并确保不会超限是一个很好的做法,无论如何。 buf[100]
和 %010.9f
是不够的。
备选方案:
// Limit buffer writing
snprintf((char*)&buf, sizeof buf, " %010.9f W ...
// or
// Use `%g` to avoid long text
sprintf((char*)&buf, " %010.9g W ...
// or
// Increase buffer size to some worst case - think -DBL_MAX
uint8_t buf[4 * 350] = {0};
真失败?
OP 仅描述了 失败,但没有post 可以复制它的代码。
一般帮助
启用所有编译器警告。