gpt4 book ai didi

C 函数 : return value incorrect?

转载 作者:行者123 更新时间:2023-12-02 07:03:09 24 4
gpt4 key购买 nike

我写了一个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);
}

如您所见,我的函数中有打印语句。在 _dcml_cmd 中,打印语句的典型输出是

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:00 调试它时,通过在它不会破坏你的逻辑的地方添加 fprintfs 来运行它。 :^)

关于C 函数 : return value incorrect?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16976419/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com