我的情况很奇怪。我有两个函数用来读取 Beagle Bone Black 的模拟输入值。第一个函数打开文件并读取引脚值,并应将其返回到另一个函数,该函数将该值与另一个引脚的值进行比较。仅当我打印用于连接 pin 号与文件路径的 BUFFER
时,一切才能正常工作。一旦我注释掉该行,我就会得到不好的值。简单地打印或不打印 BUFFER
怎么会导致这种情况?
float AIN_value(char AIN) {
float value;
char line[10] = {0};
char BUFFER[150];
sprintf(BUFFER, "%s%c", AIN_FILE, AIN);
FILE *fp;
//printf("%s\n", BUFFER);
fp = fopen(BUFFER, "r");
if (! is_open(fp)) {
printf("ERROR: could not open %s\n", BUFFER);
exit(1);
}
fgets(line, sizeof(line), fp);
value = atoi(line);
fclose(fp);
//printf("%d\n", value);
return(value);
}
bool pins_within_threshold(photores *data) {
float P0_value = AIN_value(data->AP_0);
float P1_value = AIN_value(data->AP_1);
float highest_pin_value;
float lowest_pin_value;
if (P0_value > P1_value) {
highest_pin_value = P0_value;
lowest_pin_value = P1_value;
}
else if (P1_value > P0_value) {
highest_pin_value = P1_value;
lowest_pin_value = P0_value;
}
else if (P0_value == P1_value){
return(true);
}
float numerator = highest_pin_value - lowest_pin_value;
float denominator = (highest_pin_value + lowest_pin_value) / 2;
float quotient = numerator/denominator;
float threshold = quotient * 100;
printf("P0_value: %f\n", P0_value);
printf("P1_value: %f\n", P1_value);
printf("Threshold: %f%%\n", threshold);
if (threshold <= data->move_threshold) {
return(true);
}
else if (threshold > data->move_threshold) {
return(false);
}`enter code here`
else {
return(true);
}
}
编辑:
我所说的“好”值是指 boolpins_within_threshold(photores *data)
将打印正确的阈值。这个“阈值”是两个光敏电阻值的百分比差异。它们都获得相同数量的光,阈值差异通常在 5% 以内。仅当我在 float AIN_value(char AIN)
中打印 BUFFER 时,阈值才是正确的输出。当 printf 被注释掉时,boolpins_within_threshold(photores *data)
正在打印引脚不在阈值内,并且一个引脚根本没有读取。我认为这是一个“坏”值。
编辑2:
以下是注释掉 snprintf(BUFFER, sizeof(BUFFER), "%s%c", AIN_FILE, AIN)
后的输出:
AIN5: 1696
AIN6: 0
Threshold: 200.000000%
这是我打印的输出:
AIN5: 1366
AIN6: 1379
Threshold: 0.947522%
编辑3: 与 chux 聊了一段时间后,很明显存在文件读取同步问题,因为操作系统拥有该文件并且该文件处于不断变化的状态。由于某种原因,一个简单的 `printf('\n');解决问题。不是一个完整的修复,希望更好地理解为什么会发生这种情况以及如何避免它。
最佳答案
您在该行中使用 atoi:
value = atoi(line);
将 char* 行转换为 int (即“值”存储为整数)。但是您将“值”定义为“浮点”,并且打算将其返回为“浮点”。使用“atoi”将其转换为 int 将使您截断值(例如,一旦读取非数字字符,atoi() 将停止从 str 读取。)。 您应该使用 atof() 代替 - 即将上面的行转换为 -
值= atof(行);
#include <stdlib.h>
int atoi( const char *str );
描述: atoi() 函数将 str 转换为整数,并返回该整数。 str 应该以某种数字开头,一旦读取到非数字字符,atoi() 将停止从 str 读取。
示例: 我 = atoi( "512.035");
结果:我设置为 512。
关于c - 如果我不打印 char 数组,函数将返回错误值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19578605/