gpt4 book ai didi

c - Swift:将未初始化的 C 结构传递给导入的 C 函数

转载 作者:IT王子 更新时间:2023-10-29 05:23:26 25 4
gpt4 key购买 nike

我知道 this answer ,但这不是一回事 - 那是传递一个指针以使用分配进行初始化。

我正在与具有以下结构定义的 C 库交互:

typedef struct myStruct { unsigned char var [50]; } myStruct;

有一个函数可以将结构的地址传递给 - 通常基于堆栈而不是堆,因此:

myStruct mine;
initMyStruct(&mine);

这会初始化结构的内容 - 调用者不知道内存的内部格式,因此会造成混淆。

在 Swift 中,我正在创建一个类,它将封装结构并与在其上运行的其他 C 函数进行接口(interface)。

class MyClass {

var mine : myStruct

init() {

initMyStruct(&mine)
// Error: Variable 'self.msg' passed by reference before being initialized

}

}

我终其一生都无法弄清楚如何初始化结构,或者如果可以的话,也无法使用点来代替。

mine = myStruct()
// Fails because you aren't providing the value of the member 'var'

mine = myStruct((CUnsignedChar(), CUnsignedChar(), /*... repeat to 50 */))
// Cannot find an overload for 'init' that accepts the arguments

请注意,这是将已分配(基于堆栈)结构的地址传递给已作为

导入的函数
CInt initMyStruct(str: CMutablePointer<myStruct>)

它没有传递一个由有问题的 C 库分配的指针,这似乎是一个更常见的要求,并在其他地方得到了回答。

Swift 目前也不支持固定大小的数组。

我看不出如何满足结构的初始化或让 Swift 认为它将通过调用完成。

非常感谢任何帮助!

最佳答案

首先,让我们定义用于测试的 C 代码:

typedef struct my_struct {
unsigned char buffer[10];
} my_struct;

void my_struct_init(my_struct *my_s) {
for (int i = 0; i < 10; i++) {
my_s->buffer[i] = (char) i;
}
}

在 Swift 中,我们有两种选择:

1。栈上的结构

var my_s: my_struct = ...

但是,我们必须以某种方式对其进行初始化。每个结构都有一个默认的初始化器

var my_s: my_struct = my_struct(buffer: (0, 0, 0, 0, 0, 0, 0, 0, 0, 0))

请注意,在这种情况下,buffer[10] 已作为 10 元组 转换为 Swift。

现在我们可以调用:

my_struct_init(&my_s)
print("Buffer: \(my_s.buffer)") // Buffer: (0, 1, 2, 3, 4, 5, 6, 7, 8, 9)

但是,结构越复杂,使用默认初始化器就越困难。

2。堆上结构

这类似于在 C 中使用 mallocfree:

var my_s_pointer = UnsafeMutablePointer<my_struct>.allocate(capacity: 1)
print("Buffer: \(my_s.buffer)") // Buffer: (some random values)

my_struct_init(my_s_pointer)
print("Buffer: \(my_s_pointer.memory.buffer)") // Buffer: (0, 1, 2, 3, 4, 5, 6, 7, 8, 9)

my_s_pointer.deallocate()

结合两种方法

以下函数将初始化任何结构:

func initStruct<S>() -> S {
let struct_pointer = UnsafeMutablePointer<S>.allocate(capacity: 1)

let struct_memory = struct_pointer.pointee
struct_pointer.dealloate()

return struct_memory
}

var my_s: my_struct = initStruct()
my_struct_init(&my_s)

关于c - Swift:将未初始化的 C 结构传递给导入的 C 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24146488/

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