gpt4 book ai didi

c - 系统/queue.h : Use of LIST_REMOVE

转载 作者:太空宇宙 更新时间:2023-11-04 01:38:55 26 4
gpt4 key购买 nike

我正在尝试使用 OpenBSD 中的 sys/queue.h 文件来操作链表。

我正在为小型微 Controller 编写缓存引擎。页面在使用时存储在缓存中,并在需要内存用于 malloc 等其他操作时移除。

这个任务需要找到最小命中数的缓存页(命中数最少的是最不可能被使用的)并释放它。但是,我遇到了一个相当简单的错误。

到目前为止,这是我的功能:

void _fmem_cache_malloc_purge(int requested_size)
{
int n = ((requested_size / FMEM_SECTOR_SIZE) + 1) * FMEM_SECTOR_SIZE;
struct s_fmem_cache_entry *entry, *lowentry;
long int lowhits;
fmem_acquire();
for(; n > 0; n--)
{
// Traverse the cache table. Find an entry with a minimum number of hits.
lowhits = -1;
LIST_FOREACH(entry, &fmem_cache, entry_ptr)
{
if(lowhits == -1 || lowhits > entry->hits)
{
lowentry = entry;
lowhits = entry->hits;
}
}
// Free the minimum entry.
assert(lowhits > 0);
LIST_REMOVE(lowentry, entry_ptr); <-- error occurs here (line 170)
mmgr_free(lowentry->data);
mmgr_free(lowentry);
fmem_cache_size--;
}
fmem_release();
}

定义(接近同一文件的顶部):

struct s_fmem_cache_entry {
fAddr addr;
char data[FMEM_SECTOR_SIZE];
long int hits, ctime;
LIST_ENTRY(fmem_cache_entry) entry_ptr;
};

LIST_HEAD(s_fmem_cache_head, s_fmem_cache_entry) fmem_cache;

我得到的错误是:

flashmem.c: In function '_fmem_cache_malloc_purge':
flashmem.c:160: warning: assignment from incompatible pointer type
flashmem.c:170: error: dereferencing pointer to incomplete type

我觉得这是一个简单的错误,但 C 对我来说是新手。

最佳答案

问题出在 LIST_ENTRY(fmem_cache_entry) entry_ptrstruct s_fmem_cache_entry 定义中

从queue.h我们可以看出

#define LIST_ENTRY(type)                                                \
struct { \
struct type *le_next; /* next element */ \
struct type **le_prev; /* address of previous next element */ \
}

因此,当您使用 LIST_ENTRY 时,它基本上变成了如下所示的无名结构。这就是编译器给出错误的原因。

struct {
struct fmem_cache_entry *le_next;
struct fmem_cache_entry **le_prev;
} entry_ptr;

您可以通过不使用 LIST_ENTRY 并自己声明 struct entry_ptr 来轻松避免这种情况。我不确定对此有任何替代解决方案。

关于c - 系统/queue.h : Use of LIST_REMOVE,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9374053/

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