Tag: struct

将Cython中的C结构包装/转换为Python类

我刚刚开始熟悉Cython,试图将一些C语言结构包装到Python方法和类中。 我真正不了解的是如何从(初始化的)C结构转换到相应的Python类应该是有效的。 我在这里缺少什么: 来自C头文件的片段: struct test_struct { int _something; complex_struct* _another; }; typedef struct test_struct test; test *test_new(void); int some_method(test **n, int irrelevant); 来自我.pxd的相应片段: cdef struct test_struct: pass ctypedef test_struct test test* test_new() int some_method(test **n, int irrelevant) 我的.pyx: def do_something(int irrelevant): cdef test* t = test_new() ret = some_method(&t, irrelevant) # Here comes the […]

通过Ctypes从C到Python – 将函数指针的结构包装到静态函数

我有一个像这样的C库中的结构。 DataFn中的函数指针指向静态函数。 。H struct Data { int i; int *array; }; typedef struct { bool (* const fn1) (struct Data*, const char *source); …. } DataFn; extern DataFn const DATAFUNC 使用objdump,该表仅包含DATAFUNC和gcc中的一些其他内容。 这在C中很好,其中调用fn1就像DATAFUNC.fn1(…,…),但是这样的东西怎么会被包裹起来所以fn1可以用python w / ctypes调用? 示例python libc = ctypes.cdll.LoadLibrary(“./data.so”) print(libc.DATAFUNC) 导致 这是类似的,但没有工厂function。

交换链表中的节点

我正在尝试交换链表中的两个相邻节点,我想我理解如何使用临时节点来实现它。 这是我的struct swap函数 struct part { char* name; float price; int quantity; struct part *next; }; typedef struct part partType; partType *swap_node(partType **item) { partType *temp; temp = *item; *item = (*item)->next; temp->next = (*item)->next; (*item)->next = temp; return *item; } 我想不出如何使列表中的前一个节点指向新的交换节点。 我需要另一个临时变量吗? 另外,如何解释要交换的两个节点是列表中的前两个节点的情况。

struct的access元素传递给void *指针

我正在使用二叉搜索树数据结构来对具有类型定义的一系列结构进行排序: typedef struct { char c; int index; } data_t; typedef struct node node_t; typedef node { void *data; node_t *left; node_t *right; } node_t typedef来自为此目的提供给我的库,可能带有void *指针以确保多态性。 node将传递给函数: static void *recursive_search_tree(node_t *root, void *key, int cmp(void*,void*)) 在recursive_search_tree函数中,我希望能够修改代码以使用index元素作为条件来查找最接近字符数组的线性传递索引的匹配,这最终将涉及传递给*key的data_t *key和key->index在函数内被访问。 问题 是否可以访问key->index其中key是指向data_t结构的void* ,或者只有在data_t被声明为key的类型时才可能这样data_t ? 我试图做后者,但即使将指针强制转换为int似乎也没有通过编译器。

灵活的arrays成员(零长度arrays)

参考GCC的零长度arrays说明: 当struct是可变长度对象的头时,这尤其有用。 这正是我的情况。 此外,我关心的是我的结构在堆中的对齐。 在这种情况下,我仍然不明白零长度数组有什么用处。 它们与这种特殊情况有什么关系? 编辑: 我可以在那里放置尽可能多的“数据”吗?

__attribute __((packed))会影响程序的性能吗?

我有一个名为log的结构,里面有13个字符。 在执行sizeof(log)之后,我看到大小不是13而是16。我可以使用__attribute __((packed))将其设置为13的实际大小,但我想知道这是否会影响程序的性能。 它是一种经常使用的结构。 我希望能够读取结构的大小(13而不是16)。 我可以使用宏,但如果这个结构被更改,即添加或删除字段,我希望在不更改宏的情况下更新新大小,因为我认为这很容易出错。 有什么建议吗?

GPU上的内存分配用于动态结构数组

将struct数组传递给gpu内核时遇到问题。 我基于这个主题 – cudaMemcpy分段错误 ,我写的是这样的: #include #include struct Test { char *array; }; __global__ void kernel(Test *dev_test) { for(int i=0; i < 5; i++) { printf("Kernel[0][i]: %c \n", dev_test[0].array[i]); } } int main(void) { int n = 4, size = 5; Test *dev_test, *test; test = (Test*)malloc(sizeof(Test)*n); for(int i = 0; i < n; i++) […]

一个类与结构的内存布局如何

我来自C编程,其中结构中的数据首先是top变量,然后是第二个,第三个,依此类推。 我现在用C ++编程,而我正在使用类。 我基本上想要实现相同的目标,但我也想要获取/设置方法,也可能需要其他方法(我也想尝试以C ++方式实现它,并且可能会学到新东西)。 是否有保证,例如公共变量将首先在内存中,然后是私有变量?

为什么数组不能在C / C ++中赋值?

可以将结构分配给另一个,这会导致将所有值从struct复制到另一个: struct { int a, b, c; } a, b; … a = b; 但为什么数组不能像这样分配: int a[3], b[3]; … a = b; 因为,严格来说,结构只是具有可变大小元素的数组,那么为什么不允许这样呢? 无论如何,这种任务尚未使用。 当然,似乎只涉及地址,但可以轻松地复制数组(“静态”)。

灵活的arrays成员真的有必要吗?

显然,具有灵活数组成员的结构不是要声明的,而是与指向该结构的指针一起使用。 声明灵活数组成员时,必须至少有一个其他成员,并且灵活数组成员必须是该结构中的最后一个成员。 假设我有一个看起来像这样的: struct example{ int n; int flm[]; } 然后要使用它,我将必须声明一个指针并使用malloc为结构的内容保留内存。 struct example *ptr = malloc(sizeof(struct example) + 5*sizeof(int)); 也就是说,如果我希望我的flm []数组保持五个整数。 然后,我可以像这样使用我的结构: ptr->flm[0] = 1; 我的问题是,我不应该只使用指针而不是这个吗? 它不仅在C99之前兼容,而且可以在有或没有指向该结构的指针的情况下使用它。 考虑到我已经必须将malloc与flm一起使用,我不应该只能这样做吗? 考虑这个示例结构的新定义; struct example{ int n; int *notflm; } struct example test = {4, malloc(sizeof(int) * 5)}; 我甚至能够以与柔性arrays成员相同的方式使用替换: 这还行吗? (以非flm为例提供上述示例) struct example test; test.n = 4; notflm = […]