簡體   English   中英

C功能:返回值不正確?

[英]C Function: return value incorrect?

我編寫了一個C庫函數,但返回值似乎不正確,即使它在函數中是正確的。

這是相關代碼:

(在dcml_private.c中)違規函數:

dcml_status _dcml_get_status(struct dcml_device *dev)
{
    uint64_t data;
    dcml_status ret;
    int len;

    libusb_bulk_transfer(dev->handle,
                     DCML_ENDPOINT | LIBUSB_ENDPOINT_IN,
                     (unsigned char *) &data,
                     DCML_REPORT_SZ, &len, RX_TIMEOUT);

    printf("data = %ld\n", data);

    if (len != DCML_REPORT_SZ)
        printf("DCML: LIBUSB ERROR (%s)\n", libusb_error_name(len));
        return STATUS_UNKNOWN;

    ret = data & ~(1>>17);
    return (ret);
}

調用功能:

void _dcml_cmd(dcml_context *ctx, dcml_cmd cmd,
      dcml_status quit_cond, int dur)
{
    struct timeval start;
    struct timeval cur;
    uint32_t stat;

    (void)gettimeofday(&start, NULL);
    (void)gettimeofday(&cur, NULL);
    _dcml_send_cmd(ctx->active, cmd);

    while(difftimeval(cur, start) < dur) {
            sleep(POLL_PERIOD);
            stat = _dcml_get_status(ctx->active);

            printf("status (%d), quit_cond (%d)", stat, quit_cond);
            if (stat == quit_cond)
                  break;

            (void)gettimeofday(&cur, NULL);
    }

    _dcml_send_cmd(ctx->active, CMD_NONE);
}

如你所見,我的函數中有print語句。 在_dcml_cmd中,該print語句的典型輸出將是

status (65535), quit_cond (2048)

_dcml_get_status打印的位置:

data = 128

這意味着返回值在退出_dcml_get_status之前立即正確,但在返回調用函數后立即錯誤(此處的值總是為65535 ......)

知道“dmcl_status”是一個枚舉可能會有所幫助。 將返回類型切換為uint16_t無法解決問題。 我認為它可能是一個溢出問題或者其他什么,但改變類型,顯式轉換和添加掩碼行並不能解決它。

有什么想法嗎?

這是因為你有一個壞習慣,就是不要在你的if語句之后放{}

   if (len != DCML_REPORT_SZ) {
        printf("DCML: LIBUSB ERROR (%s)\n", libusb_error_name(len));
        return STATUS_UNKNOWN;
   }

還使用fprintf(stderr,...來轉儲錯誤。向printf發送錯誤是不好的做法:

   if (len != DCML_REPORT_SZ) {
        fprintf(stderr, "DCML: LIBUSB ERROR (%s)\n", libusb_error_name(len));
        return STATUS_UNKNOWN;
   }

調用函數有相同的問題:

       printf("status (%d), quit_cond (%d)", stat, quit_cond);
        if (stat == quit_cond)
              break;

采用:

       fprintf(stderr, "status (%d), quit_cond (%d)", stat, quit_cond);
        if (stat == quit_cond) {
              break;
        }

是的,它會占用一條額外的線,但是在凌晨3點進行調試時,通過在整個地方添加fprintf來調試它,它不會破壞你的邏輯。 :^)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM