gpt4 book ai didi

c - simclist 库中除以零

转载 作者:行者123 更新时间:2023-11-30 17:22:34 25 4
gpt4 key购买 nike

在 simclist 链接列表库中,我遇到了一个问题,即函数 list_findpos() 中出现被零除的情况。通常我会犹豫是否要修改一个广泛使用的第三方库,并且它这样做一定有充分的理由(我没有排除该库被错误使用的可能性)。该函数定义为:

/* set tmp to point to element at index posstart in l */
static inline struct list_entry_s *list_findpos(const list_t *restrict l, int posstart) {
struct list_entry_s *ptr;
float x;
int i;

/* accept 1 slot overflow for fetching head and tail sentinels */
if (posstart < -1 || posstart > (int)l->numels) return NULL;

x = (float)(posstart+1) / l->numels;
if (x <= 0.25) {
/* first quarter: get to posstart from head */
for (i = -1, ptr = l->head_sentinel; i < posstart; ptr = ptr->next, i++);
} else if (x < 0.5) {
/* second quarter: get to posstart from mid */
for (i = (l->numels-1)/2, ptr = l->mid; i > posstart; ptr = ptr->prev, i--);
} else if (x <= 0.75) {
/* third quarter: get to posstart from mid */
for (i = (l->numels-1)/2, ptr = l->mid; i < posstart; ptr = ptr->next, i++);
} else {
/* fourth quarter: get to posstart from tail */
for (i = l->numels, ptr = l->tail_sentinel; i > posstart; ptr = ptr->prev, i--);
}

return ptr;
}

如果l->numels0,那么第9行的表达式就有问题。代码否则运行正常(没有泄漏或段错误),但英特尔检查员说此行上发生了被零除的情况。建议的更改是:

/* set tmp to point to element at index posstart in l */
static inline struct list_entry_s *list_findpos(const list_t *restrict l, int posstart) {
struct list_entry_s *ptr;
float x;
int i;

/* accept 1 slot overflow for fetching head and tail sentinels */
if (posstart < -1 || posstart > (int)l->numels) return NULL;

if (l->numels == 0){ //avoid division-by-zero on first element
ptr = l->head_sentinel;
}
else{
x = (float)(posstart + 1) / l->numels;
if (x <= 0.25) {
/* first quarter: get to posstart from head */
for (i = -1, ptr = l->head_sentinel; i < posstart; ptr = ptr->next, i++);
}
else if (x < 0.5) {
/* second quarter: get to posstart from mid */
for (i = (l->numels - 1) / 2, ptr = l->mid; i > posstart; ptr = ptr->prev, i--);
}
else if (x <= 0.75) {
/* third quarter: get to posstart from mid */
for (i = (l->numels - 1) / 2, ptr = l->mid; i < posstart; ptr = ptr->next, i++);
}
else {
/* fourth quarter: get to posstart from tail */
for (i = l->numels, ptr = l->tail_sentinel; i > posstart; ptr = ptr->prev, i--);
}
}
return ptr;
}

想知道是否有人有使用 simclist 的经验可以对此发表评论?

<小时/>

编辑

list_findpos 不是 API 函数;相反,它是一个内部函数。导致问题的调用顺序是:

/* ... */
list_init(...)
list_attributes_copy(...)
list_append(...) /* <---- list_findpos() is called here, divide by zero */

最佳答案

此函数不是库 API 的一部分;这完全是内部的。为了解决这个问题,库的作者/维护者需要知道的是您执行的 API 调用顺序导致了库失败。

关于c - simclist 库中除以零,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27993081/

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