- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
在一些用于 MC9S12C32 微 Controller 的嵌入式 C 代码中,我有一个循环队列(又名循环缓冲区),它使用静态大小的字节数组和队列前后的两个“指针”实现,它们实际上只是索引对于队列的数组。
// call unsigned chars bytes
typedef unsigned char byte;
byte trear = 0; // SCI transmit display buffer IN index
byte tfront = 0; // SCI transmit display buffer OUT index
byte tsize = 16; // size of transmit buffer
byte tbuf[16]= {0};// SCI transmit display buffer
请注意,trear
是后元素的实际索引,但 tfront
比前元素的实际索引少一(当然要对 16 取模)。因此,例如,如果我的缓冲区包含“hello”,它可能看起来像这样(空槽是垃圾值):
_________________________________
| | |h|e|l|l|o| | | | | | | | | |
^ ^
front rear
当需要从队列中删除一个字节时,我会这样做:
// increment front index
tfront++;
// wrap front index if it exceeded bounds
tfront %= tsize; // (A)
// get character to transmit
byte outputChar = tbuf[tfront];
一切正常——至少,我的程序没有出现与该片段相关的错误。然而,当我编译这个程序时,我的编译器警告我上面片段中标记为 (A)
的行,并提示:
Warning : C2705: Possible loss of data
main.c line 402
第 402 行是 (A) 行。我应该注意,我没有使用 gcc 或类似的东西;我在 Freescale 的 CodeWarrior IDE 中编译,它有时会给我一些其他有点神秘的警告。为了消除警告,我将上面的片段重写为:
// increment front index mod tsize
tfront = (tfront + 1 >= tsize) ? 0 : tfront + 1; // (B)
// get character to transmit
byte outputChar = tbuf[tfront];
但是,我的编译器仍然发出相同的警告,这次是关于 (B)
行。也许编译器告诉我,在语句 (tfront + 1 >= tsize)
中,tfront
可能在执行前为 255,并溢出。当然,我知道这不会发生,但我的编译器不会。
但是,如果是这种情况,为什么行 (A)
是一个问题?基本上,我想知道编译器对什么不满意。
自打出我的问题后,我通过将 tsize
从变量类型更改为预处理器定义(即 #define TSIZE 16
)解决了这个问题。不过,我的问题仍然存在。
一些相关问题:
unsigned overflow with modulus operator in C
modulus operator with unsigned chars
最佳答案
编译器警告可能来自于 tfront %= tsize;
等价于 tfront = tfront % tsize;
,因为 C 中的提升规则表达式 tfront % tsize
具有 (*) 类型 int
。
如果您改为编写 tfront = (byte)(tfront % tsize);
,它可能会使编译器静音。
没有特别的理由担心,你的编译器确实发出了奇怪的警告:虽然表达式 tfront % tsize
在技术上具有类型 int
,但它的值都适合byte
因为它的计算方式。即使值不完全适合 byte
,无符号整数类型的 C 标准也保证了环绕行为(因此您有理由故意使用这种环绕行为).
(*) 除非在您的编译平台上 int
不能包含 unsigned char
可以采用的所有值,在这种情况下它将是 unsigned int 类型
并且您可能看不到警告。
关于C 无符号模导致编译器警告,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19980664/
你好,我正在尝试在 opensuse 中创建一个 Shell 脚本来创建 MySqlUsers,但是当我尝试运行它时,我得到了这个错误: Warning: Could not start progra
我阅读了有关此错误的所有信息,但未能找到任何解决方案。 我有一个看起来像这样的简单页面: $xmlfile = "/var/www/marees.xml"; //Fichier dans lequel
运行 Websphere App 服务器 V8.5 Liberty Profile。我找不到任何可以解决这些警告的帮助。我在 eclipse 。 ************** He
我尝试在 GC AppEngine 上部署应用程序。部署过程中没有错误,但应用程序无法运行(仅显示加载页面)。日志中唯一一个奇怪的原始 OpenBLAS WARNING - could not det
我刚开始学习 RestKit。我正在尝试使用它来使用 Foursquare api 获取附近的 field 。但每次我尝试“objectLoader:(RKObjectLoader *)objectL
我对 Vuejs 比较陌生,每次按键时都会收到以下警告: [Vue warn]: $attrs is readonly. found in ---> at src\component
Warning: simplexml_load_file() [function.simplexml-load-file]: I/O warning : failed to load external
我在尝试修改某些表时不断收到此错误。这是我的代码: /** = 1){ //$this->mysqli->autocommit(FALSE); //insert th
当我尝试使用 PHP 的 ftp_put 函数上传文件时,早些时候出现错误: 警告:ftp_put() [function.ftp-put]:无数据连接 现在,我尝试开启被动模式: ftp_pasv(
我一直在努力让这段代码适用于现阶段的年龄。它旨在计算一个范围内的素数,我已经编写了一种方法来打印它们。不幸的是,代码将无法编译,引用警告: “警告:[未检查] 未检查调用 add(E) 作为原始类型
尝试使用带有架构组件和Kotlin的Android Studio 3 Canary 5构建示例会给出此警告。 谁能告诉我原因? 谢谢,Ove 编辑#1: 这是Dan Lew前段时间制作的样本 http
我正在编写一个 Shiny 的应用程序,它运行得非常好,突然我收到两条警告消息。我已经回到以前运行良好的副本,它们现在显示相同的错误消息,所以我真的很困惑。我的代码仍然运行并在我 Shiny 的仪表板
03-25 05:52:15.329 8029-8042/com.mgh.radio W/MediaPlayerNative: info/warning (703, 0) 03-25 05:52:15
我在构建时在我的 gradle 控制台中收到一条警告消息: 警告:[options] 引导类路径未与 -source 1.7 一起设置 1 条警告 我怎样才能解决这个问题? 任何帮助表示赞赏! 最佳答
我有下一个代码: 测试.c #include "a1.h" int main() { int a = 8; foo(a); return a; } a1.h void foo
我的程序中有一个 WORD 变量。 WORD hour; 但是当我比较它的时候 if(hour>=0 && hour=0 && hour=0 的比较,它始终适用于 hour 是 WORD 类型,它是一
安全研究人员警告称,一个最新的严重的Java错误,其本质与目前在全球范围内利用的臭名昭著的 Log4Shell 漏洞相同 。 CVE-2021-42392 尚未在国家漏洞数据库 (NVD) 中
安装SqlServer2005时“版本变更检查 (警告)"问题排查 今天同事在安装SqlServer2005时遇到“版本变更检查 (警告) ”问题导致安装失败,警告提示如下: - 版本
我的 UWP 项目中出现以下警告。我已经标记了解决方案的示例,但我更感兴趣的是为什么在同一平台上创建另一个空项目时不会出现此警告? APPX4001: Build property AppxBundl
我试图修复我的登录脚本,在我的本地主机上它可以工作,但上传到我的在线测试服务器时,注销被破坏,我得到这个错误: Warning: session_destroy() [function.session
我是一名优秀的程序员,十分优秀!