c - 如果我不打印 char 数组,函数将返回错误值

标签 c beagleboneblack

我的情况很奇怪。我有两个函数用来读取 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/

相关文章:

linux - 无法在 debian beaglebone 上将 IP 更改为静态

c - BeagleBone 黑色 : UART crashes the BBB after two successful read write calls

python - 读取输入数据到csv文件

c - 无法用另一个字符串替换字符串中的字符

c - 回文程序(不工作)我不知道为什么

arm - Beaglebone Black 的 U-boot 无法构建 - objective-c PU 不支持 THUMB 指令

python - Linux用户空间串口通信(非阻塞)

c++ - IAR 6.50 在项目构建时显示多个错误

c - 为什么我的arduino串口到LCD在26个循环后卡住了?

c - 我在双向链表中查找最后一个元素的代码抛出段错误