开源改变世界

pmErrno 的返回 a && b 有点太接近汇编了——或者是错误的 #1570

推推 grbl 3年前 (2023-01-30) 109次浏览
关闭
smoe 打开了这个问题 2022 年 2 月 6 日 · 2 条评论
关闭

pmErrno 的返回 a && b 有点太接近汇编了——或者是错误的#1570

smoe 打开了这个问题 2022 年 2 月 6 日 · 2 条评论

注释

pmErrno 的返回 a && b 有点太接近汇编了——或者是错误的 #1570
贡献者
烟雾 评论了 2022 年 2 月 6 日  

你好,

我偶然发现

return pmErrno = ( pmQuatQuatCompare (&p1-> rot , &p2-> rot ) && pmCartCartCompare (&p1-> tran , &p2-> tran ));

 

我认为这意味着如果左侧函数调用出错,则不应执行第二次调用。但后来不清楚究竟发现了什么错误。而且很难阅读。类比代码中的许多其他类似情况,我建议

int r1,r2
r1 = a(...);
if (!r1) r2= b(...);
return (r1||r2)?pmErrno:0:

最好的,
史蒂芬

pmErrno 的返回 a && b 有点太接近汇编了——或者是错误的 #1570
合作者

我认为情况并非如此,因为 pmQuatQuatCompare 和 pmCartCartCompare 似乎都只返回 0 或 1。

在这种情况下,pmErrno 似乎只是一个临时结果变量。事实上,在这里使用它似乎有点奇怪,因为它可能会从中清除错误值。在文件的其他部分,它似乎是通过三元组传递或重置的,

事实上,我越看越困惑。

pmErrno 的返回 a && b 有点太接近汇编了——或者是错误的 #1570
贡献者作者
烟雾 评论了 2022 年 2 月 6 日  

如果没有 pmErrno,它可能会有一些意义。您想知道 tran 和 rot 的两个姿势是否相同。不然函数返回1时总是报错?那条线是从 2013 年开始的,人们很想认为它并没有做太多坏事 :)

$ grep -r PosePoseCompare src/
src/libnml/posemath/_posemath.c:int pmPosePoseCompare(PmPose const * const p1, PmPose const * const p2)
src/libnml/posemath/_posemath.c:        pmPrintError("Bad quaternion in pmPosePoseCompare\n");
src/libnml/posemath/posemath.cc:    return pmPosePoseCompare(&_p1, &_p2);
src/libnml/posemath/posemath.cc:    return !pmPosePoseCompare(&_p1, &_p2);
src/libnml/posemath/posemath.h:    extern int pmPosePoseCompare(PmPose const * const, PmPose const * const);

但它是姿势的实际比较器:

int operator ==(const PM_POSE &p1, const PM_POSE &p2)
{
    PmPose _p1, _p2;

    toPose(p1, &_p1);
    toPose(p2, &_p2);

    return pmPosePoseCompare(&_p1, &_p2);
}

它只是不检查 pmErrno。

@andypugh– 非常感谢您的评论,我确实完全误读了该代码,除了“pmErrno =”确实是错误的。我会将其添加到#1571中,该文件对同一文件进行了许多其他更改。