发 帖  
原厂入驻New
[问答] 怎么使用#assert预处理程序指令?
112 处理器
分享
大家好。在我的源代码中,我使用“assert”预处理器指令来检查常量值的一致性。如果我以简单的方式使用它,通过直接赋值,一切如预期:define ABC 0x7Fassert ABC<=0x7Fhere,当ABC定义得大于0x7F时,编译器抛出N错误:好!但是,当我试图在稍微复杂一点的方案中使用该指令时,如以下所示,它并不如预期的那样工作:\define VREF 5.0\define ADC_SIZE 0x3FF\define V_TO_A 1.8293\define ITo10BitADC(i)((in t)((V_TO_A*i*ADC_SIZE/VREF)+0.5)\define OVRCUR_PEAK ITo10BitADC(1.0)\assert OVRCUR_A_i这里我需要检查作为常量参数放置的内容是否落在可能值的正确范围之内。结构可能看起来很复杂,但是能够很好地管理所有涉及的参数。通过其他方法,值是正确的,软件操作如下可以预料,只有“#assert”指令似乎无法处理嵌套的定义。我已经试着将括号放在几乎任何地方,但没有用……还尝试了对更复杂的定义:#define ITo10BitADC(i)((int)((float)i*ADC_SIZE*V_TO_A/VREF)+0的另一种转换。(5)…还试着把传球传给小学生,但老实说,那一刻我头疼得厉害,无论如何也没成功……。你能建议一下问题在哪里吗?谢谢您。
0
2020-4-15 09:41:57   评论 分享淘帖 邀请回答
3个回答
我不是100%积极,但我不认为预处理器可以处理浮点值。
2020-4-15 09:57:05 评论

举报

谢谢你的答复。所以在我的例子中,使用浮点来减少错误(以及随后的返回int)使得检查变得不可能……您认为这在编译器的预处理器中很常见,还是MPLABX中的XC8就是这种情况?再次感谢。
2020-4-15 10:20:26 评论

举报

我曾多次遇到过这个问题……基本问题是C预处理器只知道非常有限的一类表达式,通常是那些可以在编译时用整数算术计算的表达式,并且没有像表达式这样的标准东西可以杀死li。如果象您这样的表达式表明了这一点,则运行nk。我怀疑#assert可能在某个时候将其变成C标准;如果没有,则很容易转换成\if...。谬误“常错!”...#endif.,在标准库中有一个运行时assert()宏,问题是在碰到嵌入式PIC或其他CPU时该怎么做。此外,如果愿意,可以在程序开始时找到测试函数和常量的方法,如果出现问题,则命中断点。但是,所有这些对于环境的假设比C标准愿意做的更多。最后,对于您正在处理的问题……将整数A数据转换为D数据到一些工程单元时,使用相对慢的浮点会破坏您可能从宏获得的任何速度优势,并且宏会在使用的每个地方重新扩展。在这种情况下,我将使用定点,并把小数点左右移动,以便得到相同的东西。在您的示例中,我将不讨论1.0A,我将讨论1000mA,并且当我写下它时,我为该源工作的所有数据都将被缩放为1000mA,可能在运行时(通常在初始化时)缩放为A到D计数。#定义ITo10BitADC(i)ITo10BitADC(i)((int)((int)((V_TO_A.*V*i.*ADC_SIZE/VREF.*ADC_SI/VC_SIZE/VC.*A*I.*ADC_ADC_ADC_ADC_ADC_ADC_ADC_ADC_ADC_ADC_ADC_ADC_ADC_ADC_ADC_ADC_ADC_ADC_ADC_SISIZE/VAK ITOOOAKITOOOOOOOAKITO10BiITO10Bi10BiIT10BiBiBiBiTADADADC(1.5))\\\\ts_at_1000mA1829UL//实际上没有更多的精度a this...#definitionOvercurr_Milliamps 1000UL//UL正在使用,因为它if(OverCurr_Milliamps*Millivolts_at_1000mA/1000UL>VREF)error“Overcurr_Milliamps太大!”第二节
2020-4-15 11:22:25 评论

举报

只有小组成员才能发言,加入小组>>

113个成员聚集在这个小组

加入小组

创建小组步骤

关闭

站长推荐 上一条 /7 下一条

快速回复 返回顶部 返回列表