C sys/queue.h:使用LIST\u REMOVE
我正试图使用OpenBSD中的sys/queue.h文件来操作链表 我正在为一个小型微控制器编写一个缓存引擎。页面在使用时存储在缓存中,在其他事情(如malloc)需要内存时删除 此任务需要找到命中次数最少的缓存页—命中次数最少的页面最不可能被使用并释放它。然而,我遇到了一个相当简单的错误 这是我目前的职能:C sys/queue.h:使用LIST\u REMOVE,c,list,pointers,C,List,Pointers,我正试图使用OpenBSD中的sys/queue.h文件来操作链表 我正在为一个小型微控制器编写一个缓存引擎。页面在使用时存储在缓存中,在其他事情(如malloc)需要内存时删除 此任务需要找到命中次数最少的缓存页—命中次数最少的页面最不可能被使用并释放它。然而,我遇到了一个相当简单的错误 这是我目前的职能: void _fmem_cache_malloc_purge(int requested_size) { int n = ((requested_size / FMEM_SECTOR
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();
}
我得到的错误是:
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\u FOREACH使用的类型,我猜这是第160行,LIST\u稍后删除10行,所以它必须是170。 fmem_缓存和entry_ptr的定义不在您的帖子中,所以我无法说出错误是什么 我建议您仔细阅读所使用的列表宏的文档,并检查所使用的所有宏的类型是否正确
似乎代码中没有定义struct s_fmem_cache_条目,或者没有包含定义它的头。您应该检查LIST_FOREACH使用的类型,我猜这是第160行,LIST_稍后删除10行,所以它必须是170行。 fmem_缓存和entry_ptr的定义不在您的帖子中,所以我无法说出错误是什么 我建议您仔细阅读所使用的列表宏的文档,并检查所使用的所有宏的类型是否正确 此外,代码中似乎没有定义结构s_fmem_cache_项,或者没有包含定义它的标头。问题在于列表中的结构s_fmem_cache_项定义 从queue.h我们可以看到
#define LIST_ENTRY(type) \
struct { \
struct type *le_next; /* next element */ \
struct type **le_prev; /* address of previous next element */ \
}
因此,当您使用LIST_条目时,它基本上变成了一个无名的结构,如下所示。这就是编译器给出错误的原因
struct {
struct fmem_cache_entry *le_next;
struct fmem_cache_entry **le_prev;
} entry_ptr;
您可以通过不使用LIST_条目和自己声明struct条目来轻松避免这种情况。我不确定是否有其他解决方案。问题出在列表\u ENTRYfmem\u cache\u entry\ptr中的结构s\u fmem\u cache\u条目定义中
LIST_ENTRY(fmem_cache_entry) entry_ptr;
从queue.h我们可以看到
#define LIST_ENTRY(type) \
struct { \
struct type *le_next; /* next element */ \
struct type **le_prev; /* address of previous next element */ \
}
因此,当您使用LIST_条目时,它基本上变成了一个无名的结构,如下所示。这就是编译器给出错误的原因
struct {
struct fmem_cache_entry *le_next;
struct fmem_cache_entry **le_prev;
} entry_ptr;
您可以通过不使用LIST_条目和自己声明struct条目来轻松避免这种情况。我不确定是否有其他解决办法
LIST_ENTRY(fmem_cache_entry) entry_ptr;
应该是
LIST_ENTRY(s_fmem_cache_entry) entry_ptr;
应该是
LIST_ENTRY(s_fmem_cache_entry) entry_ptr;
当您看到一个不完整的类型警告时,您就知道错过了一个包含文件。如果你想知道哪一个。。。。您必须显示行号。@J-16@Eregrith请输入fmem_缓存和entry_ptr的定义。如果lowentry未在foreach循环内初始化,它将指向垃圾内存位置,并且LIST_REMOVE可能会失败。@user718895我已添加了定义。感谢对洛温垂的热情;我将为此添加一个测试。当您看到一个不完整的类型警告时,您就知道错过了一个包含文件。如果你想知道哪一个。。。。您必须显示行号。@J-16@Eregrith请输入fmem_缓存和entry_ptr的定义。如果lowentry未在foreach循环内初始化,它将指向垃圾内存位置,并且LIST_REMOVE可能会失败。@user718895我已添加了定义。感谢对洛温垂的热情;我将为此添加一个测试。