C sys/queue.h:使用LIST\u REMOVE

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

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

我正在为一个小型微控制器编写一个缓存引擎。页面在使用时存储在缓存中,在其他事情(如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();
}
我得到的错误是:

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我已添加了定义。感谢对洛温垂的热情;我将为此添加一个测试。