[英]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.