首页 > 解决方案 > 检查for循环中的变量

问题描述

我不明白为什么当我去比较一个 for 循环中的两个 unint8_t 和一个 if 而不放任何 printf 时,我发现比较不正确。

此代码有效,我没有任何错误:

for (uint16_t i = 0; i < BUFFER_SIZE; i++)
        {
            printf("Position Value: %d -> read %d, expected %d \n", i, RxData[i], TxData[i]);
            if (TxData[i] != RxData[i])
            {
                error++;
            }
        }

此代码不起作用,我有错误:

for (uint16_t i = 0; i < BUFFER_SIZE; i++)
        {
            if (TxData[i] != RxData[i])
            {
                error++;
            }
        }

Work -> 这两个向量具有相同的元素,因此它们的比较不会产生任何错误。不起作用 -> 这两个向量具有相同的元素,但它们的比较不成功,因此错误变量增加了。

Error 是一个在比较不成功时递增的变量。

程序的行为通过放置或不放置 printf 来改变。

你知道这其中的原因吗?我还尝试使用“继续”放置一个while循环,但我遇到了同样的问题。

标签: c

解决方案


从对原始问题的评论来看,我认为这里发生了什么(没有 OP 澄清这是猜想)是这样的:

#define BUFFER_SIZE 256

// returns the actual number of bytes sent, stops and NUL terminator
int send_string(char const *buf, size_t bufsz);

// returns the actual number of bytes received
int receive_some_data(char *buf, size_t bufsz);

int test_interface_loopback()
{
    char TxData[BUFFER_SIZE] = "Test Data";
    char RxData[BUFFER_SIZE]; // left uninitialized

    // return values are ignored -> PROBLEM!
    send_some_data(TxData, BUFFER_SIZE);
    receive_some_data(RxData, BUFFER_SIZE);

    int error = 0;
    for( uint16_t i = 0; i < BUFFER_SIZE; i++ )
    {
        if( TxData[i] != RxData[i] ){
            error++;
        }
    }
    return error;
}

这里的问题是,send_some_data由于某种原因,它不会传输整个 256 个字节,而只会执行短写入。例如,这可能是因为它假设 C nul 终止的字符串;但这也可能是由于其他原因,例如系统缓冲区限制,或者字节刚刚排队等待发送,但没有从接口中清除。

无论哪种方式,receive_some_data实际上都不会读取 256 个字节,而是更少。因此,其余的RxData初始化,因此比较会调用未定义的行为

正确的解决方案在于考虑两个缓冲区中有效的实际数据量。


推荐阅读