c - 检查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循环,但我遇到了同样的问题。
解决方案
从对原始问题的评论来看,我认为这里发生了什么(没有 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
未初始化,因此比较会调用未定义的行为。
正确的解决方案在于考虑两个缓冲区中有效的实际数据量。
推荐阅读
- algorithm - Netlogo - 根据曼哈顿距离找到最近的代理
- android - 领域迁移未正确实施
- node.js - 发布请求后..错误:在将标头发送到客户端后无法设置标头
- python-3.x - 使用循环的 SNS 子图
- angularjs - 服务在控制器中抛出错误作为未定义的功能
- javascript - 如何在 FlatList 中显示一维数组
- c# - 在 C# 中仅替换字符串中出现的“n”个子字符串
- php - 作曲家需要特定的拉取请求
- postgresql - Store and update jsonb value in Postgres
- java - 如何使用循环在 Android 应用程序中按顺序选择项目