gpt4 book ai didi

c - 发送指向哈希表的指针导致编译错误

转载 作者:太空宇宙 更新时间:2023-11-03 23:26:45 25 4
gpt4 key购买 nike

下面是一个内核模块,可以很好地编译和运行。我已经编写了一个方法 show,它获取指向哈希表的指针并打印它。但是,如果我使用方法参数 b,则会出现编译错误。我只能使用全局变量a。

#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/slab.h>
#include <linux/hashtable.h>

MODULE_LICENSE("GPL");

typedef struct {
int age;
struct hlist_node my_next;
} my_type;

DEFINE_HASHTABLE(a, 3);
my_type *node1, *node2, *node3;

void show(struct hlist_head b[]){
int i;
my_type *temp;

printk(KERN_INFO "a: %p \tb: %p \n", a, b); // Always the same address.

hash_for_each(a, i, temp, my_next){ // Change the a to b
printk(KERN_INFO "%d\n", temp->age);
}
}


int init_module(void){
printk(KERN_INFO "Hi.\n");

node1 = kmalloc(sizeof(my_type), GFP_KERNEL);
node1->age = 28;
node2 = kmalloc(sizeof(my_type), GFP_KERNEL);
node2->age = 27;
node3 = kmalloc(sizeof(my_type), GFP_KERNEL);
node3->age = 20;

show(a);
hash_add(a, &node1->my_next, 0);
hash_add(a, &node2->my_next, 1);
hash_add(a, &node3->my_next, 1);
show(a);

return 0;
}


void cleanup_module(void){
kfree(node1);
kfree(node2);
kfree(node);
printk(KERN_INFO "Bye.\n");
}

我得到的错误是:

In file included from include/linux/thread_info.h:11:0,
from /usr/src/kernels/3.15.8-200.fc20.x86_64/arch/x86/include/asm/preempt.h:6,
from include/linux/preempt.h:18,
from include/linux/spinlock.h:50,
from include/linux/seqlock.h:35,
from include/linux/time.h:5,
from include/linux/stat.h:18,
from include/linux/module.h:10,
from /home/k/development/hash2/main.c:1:
/home/k/development/hash2/main.c: In function ‘show’:
include/linux/bug.h:33:45: error: negative width in bit-field ‘<anonymous>’
#define BUILD_BUG_ON_ZERO(e) (sizeof(struct { int:-!!(e); }))
^

我尝试过使用定义,例如使用 struct hlist_head * b[] 并在 hash_for_each 宏中使用 *b 但非成功了。
我还尝试在方法 show() 中定义 DEFINE_HASHTABLE(c, 3); ,如下所示,但没用。

void show(struct hlist_head b[]){
int i;
my_type *temp;

DEFINE_HASHTABLE(c, 3);
printk(KERN_INFO "a: %p \tb: %p \n", a, b);

hash_for_each(c, i, temp, my_next){
printk(KERN_INFO "%d\n", temp->age);
}
}

那么,为什么会出现此错误?我该如何解决?

最佳答案

hash_for_each 是一个宏,它又使用另一个宏 (ARRAY_SIZE) 来确定作为第一个参数传递给 hash_for_each 的数组的大小.

您将指针传递给 hash_for_each作为第一个参数,这使得 ARRAY_SIZE窒息,如"pointers are not arrays" .

要解决这个问题,您可能想采用 Paul R 在他对您的问题的评论中提出的方法,即将 show() 实现为宏好吧。

您观察到的编译错误是有意为之,以防止您使用未按预期执行的代码。错误信息本身

error: negative width in bit-field ...

然而,这是严重的误导。

关于c - 发送指向哈希表的指针导致编译错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25348038/

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