我在 C++ 中有以下循环,使用 g++ 4.1.2 编译:
while(1) {
int status = getStatus();
bool firstOk = status & 0x1;
bool secondOk = status & 0x2;
if(firstOk != m_firstOk) {
logStatus(1, firstOk);
m_firstOk = firstOk;
}
if(secondOk != m_secondOk) {
logStatus(2, secondOk);
m_secondOk = secondOk;
}
sleep(1);
}
注意 logStatus() 通过值接收它的参数,所以参数没有被修改。 m_firstOk和m_secondOk当然是bool成员属性。
到目前为止一切正常。我收到一份报告,它没有检测到 firstOk 何时更改。我用 gdb 附加到正在运行的进程。它在 sleep() 行中,当我看到以下内容时我感到很惊讶:
(gdb) p m_firstOk
$1 = true
(gdb) p m_secondOk
$2 = true
(gdb) p firstOk
$3 = 244
WTF? firstOk 怎么会是 244 而它应该是按位与 0x1 的结果?我知道一个 boolean 值实际上存储为一个整数,但我的按位 AND 怎么会被忽略呢?因为它是 244,所以在它应该为 false 时被评估为 true,这就是问题的原因。
按位 AND 的结果不是安全的 boolean 值吗?这是 gcc 错误吗?或者我应该做类似下面的事情吗?
bool firstOk = (status & 0x1) ? true : false;
提前致谢。
最佳答案
当您到达 sleep() 调用时,局部变量 firstOk 和 secondOk 不是“事件的”,所以即使它们 如果分配了堆栈槽,则它们的值完全有可能(而且确实很有可能)不再存储在任何地方。
如果你需要调试这些变量中的任何一个,你需要要么
static,这将从堆栈中为它们分配持久存储firstOk 和 secondOk 的声明移到外部范围。 (请注意,这可能还不够,除非您将它们移出文件范围。)firstOk 和 secondOk 的值复制到持久变量或外部作用域中的变量,并检查它们。无论如何,一旦您完成调试过程,我将恢复上述任何调试措施。 :-)
关于您的最后一个问题,语句 bool firstOk = status & 0x1 完全没问题,它后面的语句设置 secondOk 也是如此。将 int 分配给 bool 会将零/非零值强制为 false 和 true。
至于你的实际错误(不知何故你错过了 firstOk 的转换),我看不出你可能在这段代码中丢失了它。这部分代码看起来不错。您的 getStatus() 函数是否需要被更频繁地调用一次?还有什么可以写入 m_firstOk 或 m_secondOk 吗?它们的声明未显示,因此推测它们存在于外部范围内。
关于C++:将按位与的结果分配给 boolean 值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14892779/
我的瘦服务器配置了nginx,我的ROR应用程序正在它们上运行。在我发布代码更新时运行thinrestart会给我的应用程序带来一些停机时间。我试图弄清楚如何优雅地重启正在运行的Thin实例,但找不到好的解决方案。有没有人能做到这一点? 最佳答案 #Restartjustthethinserverdescribedbythatconfigsudothin-C/etc/thin/mysite.ymlrestartNginx将继续运行并代理请求。如果您将Nginx设置为使用多个上游服务器,例如server{listen80;server
导读语言模型给我们的生产生活带来了极大便利,但同时不少人也利用他们从事作弊工作。如何规避这些难辨真伪的文字所产生的负面影响也成为一大难题。在3月9日智源Live第33期活动「DetectGPT:判断文本是否为机器生成的工具」中,主讲人Eric为我们讲解了DetectGPT工作背后的思路——一种基于概率曲率检测的用于检测模型生成文本的工具,它可以帮助我们更好地分辨文章的来源和可信度,对保护信息真实、防止欺诈等方面具有重要意义。本次报告主要围绕其功能,实现和效果等展开。(文末点击“阅读原文”,查看活动回放。)Ericmitchell斯坦福大学计算机系四年级博士生,由ChelseaFinn和Chri
如何将send与+=一起使用?a=20;a.send"+=",10undefinedmethod`+='for20:Fixnuma=20;a+=10=>30 最佳答案 恐怕你不能。+=不是方法,而是语法糖。参见http://www.ruby-doc.org/docs/ProgrammingRuby/html/tut_expressions.html它说Incommonwithmanyotherlanguages,Rubyhasasyntacticshortcut:a=a+2maybewrittenasa+=2.你能做的最好的事情是:
我正在开发一个创建网络博客的RubyonRails项目。我希望将一个名为featured的boolean数据库字段添加到Post模型中。该字段应该可以通过我添加的事件管理界面进行编辑。我使用了以下代码,但我什至没有在网站上显示另一列。$railsgeneratemigrationaddFeaturedfeatured:boolean$rakedb:migrate我是RubyonRails的新手,非常感谢任何帮助。我的index.html.erb文件中的相关代码(views):FeaturedPost架构.rb:ActiveRecord::Schema.define(:version=>
我对如何计算通过{%assignvar=0%}赋值的变量加一完全感到困惑。这应该是最简单的任务。到目前为止,这是我尝试过的:{%assignamount=0%}{%forvariantinproduct.variants%}{%assignamount=amount+1%}{%endfor%}Amount:{{amount}}结果总是0。也许我忽略了一些明显的东西。也许有更好的方法。我想要存档的只是获取运行的迭代次数。 最佳答案 因为{{incrementamount}}将输出您的变量值并且不会影响{%assign%}定义的变量,我
我正在尝试将$stdout设置为临时写入一个文件,然后返回到一个文件。test.rb:old_stdout=$stdout$stdout.reopen("mytestfile.out",'w+')puts"thisgoesinmytestfile"$stdout=old_stdoutputs"thisshouldbeontheconsole"$stdout.reopen("mytestfile1.out",'w+')puts"thisgoesinmytestfile1:"$stdout=old_stdoutputs"thisshouldbebackontheconsole"这是输出。r
我有一个数组数组,想将元素附加到子数组。+=做我想做的,但我想了解为什么push不做。我期望的行为(并与+=一起工作):b=Array.new(3,[])b[0]+=["apple"]b[1]+=["orange"]b[2]+=["frog"]b=>[["苹果"],["橙子"],["Frog"]]通过推送,我将推送的元素附加到每个子数组(为什么?):a=Array.new(3,[])a[0].push("apple")a[1].push("orange")a[2].push("frog")a=>[[“苹果”、“橙子”、“Frog”]、[“苹果”、“橙子”、“Frog”]、[“苹果”、“
有没有办法让Ruby能够做这样的事情?classPlane@moved=0@x=0defx+=(v)#thisiserror@x+=v@moved+=1enddefto_s"moved#{@moved}times,currentxis#{@x}"endendplane=Plane.newplane.x+=5plane.x+=10putsplane.to_s#moved2times,currentxis15 最佳答案 您不能在Ruby中覆盖复合赋值运算符。任务在内部处理。您应该覆盖+,而不是+=。plane.a+=b与plane.a=
出于某种原因,heroku尝试要求dm-sqlite-adapter,即使它应该在这里使用Postgres。请注意,这发生在我打开任何URL时-而不是在gitpush本身期间。我构建了一个默认的Facebook应用程序。gem文件:source:gemcuttergem"foreman"gem"sinatra"gem"mogli"gem"json"gem"httparty"gem"thin"gem"data_mapper"gem"heroku"group:productiondogem"pg"gem"dm-postgres-adapter"endgroup:development,:t
我从ui中得到日期范围为-approved_between"=>"2013-03-17-2013-03-18"我需要拆分此approved_start_date="2013-03-17"和approved_end_date="2013-03-18"...我希望使用它在mysql中查询,因为mysql中的日期格式是created_at:2012-07-2810:35:01.我正在做的是:approved=approved_between.split("")approved_start_date=approved[0]approved_end_date=approved[2]很确定这不是处