You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

VS2015下C++中如何检测status变量是否曾出现-1

如何检测任意一次status是否为-1

这个问题其实很典型——你每次调用readData32或writeData32后,都直接把结果赋值给了同一个status变量,前面的状态会被后面的覆盖,所以最后只能拿到最后一次的执行结果。要检测任意一次是否返回了-1,有几种实用的解决思路,我给你拆解一下:

方案1:即时检查,失败立即返回

如果只要有一步操作失败,就不需要继续执行后续步骤,那么可以在每次调用后立刻检查status,一旦发现-1就直接返回错误。这样既能及时终止错误流程,也能保证只要返回-1,就说明至少有一步失败了。

修改后的代码如下:

int function1(ATF *cm33) {
    int status;
    uint32_t val;

    // 第一次读取操作,检查状态
    status = cm33->readData32(SAU_CTRL_Mv8, &val);
    if (status == -1) {
        return -1; // 第一次读取失败,直接返回错误
    }

    // 写入操作,检查状态
    status = cm33->writeData32(SAU_CTRL_Mv8, 0x3);
    if (status == -1) {
        return -1; // 写入失败,直接返回错误
    }

    // 第二次读取操作,返回最终状态
    status = cm33->readData32(SAU_CTRL_Mv8, &val);
    return status;
}

方案2:执行完所有操作,记录是否出现过错误

如果你需要执行完所有操作,同时想知道整个流程中是否有任意一步失败,可以额外加一个标志变量来记录错误状态。即使后续操作成功,只要之前有过失败,最终还是返回-1。

示例代码:

int function1(ATF *cm33) {
    int status;
    uint32_t val;
    bool has_failed = false; // 标记是否有任意一步失败

    // 第一次读取
    status = cm33->readData32(SAU_CTRL_Mv8, &val);
    if (status == -1) {
        has_failed = true;
        // 可选:在这里添加日志,记录具体是哪一步失败了
        // printf("第一次读取SAU_CTRL_Mv8失败\n");
    }

    // 写入操作
    status = cm33->writeData32(SAU_CTRL_Mv8, 0x3);
    if (status == -1) {
        has_failed = true;
        // printf("写入SAU_CTRL_Mv8失败\n");
    }

    // 第二次读取
    status = cm33->readData32(SAU_CTRL_Mv8, &val);
    if (status == -1) {
        has_failed = true;
        // printf("第二次读取SAU_CTRL_Mv8失败\n");
    }

    // 只要有一次失败就返回-1,否则返回最后一次的状态
    return has_failed ? -1 : status;
}

方案3:记录具体失败步骤(可选)

如果需要更精确地知道是哪一步操作失败了,可以用一个变量记录失败的步骤编号,后续可以根据这个编号排查问题。示例如下:

int function1(ATF *cm33) {
    int status;
    uint32_t val;
    int error_step = 0; // 0=无错误,1=第一次读失败,2=写失败,3=第二次读失败

    status = cm33->readData32(SAU_CTRL_Mv8, &val);
    if (status == -1) {
        error_step = 1;
    }

    // 只有前一步无错误才继续执行后续操作
    if (error_step == 0) {
        status = cm33->writeData32(SAU_CTRL_Mv8, 0x3);
        if (status == -1) {
            error_step = 2;
        }
    }

    if (error_step == 0) {
        status = cm33->readData32(SAU_CTRL_Mv8, &val);
        if (status == -1) {
            error_step = 3;
        }
    }

    // 有错误则返回-1,否则返回最后一次状态
    // 如果需要传递具体错误步骤,可以改用输出参数或者修改函数返回类型
    return error_step != 0 ? -1 : status;
}

这些方案都能解决你当前的问题,你可以根据实际需求选择最适合的方式——比如如果失败后不需要继续操作,方案1最简洁;如果必须执行完所有步骤,方案2更合适;需要排查具体错误点的话,方案3会更实用。

内容的提问来源于stack exchange,提问作者Wassim Hammami

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.09 08:02:51