【发布时间】:2014-07-31 12:58:17
【问题描述】:
我知道this answer,但这不是一回事 - 那是传递一个指针以使用分配进行初始化。
我正在与具有以下结构定义的 C 库进行交互:
typedef struct myStruct { unsigned char var [50]; } myStruct;
您可以将结构的地址传递给一个函数 - 通常基于堆栈而不是堆,因此:
myStruct mine;
initMyStruct(&mine);
这会初始化结构的内容 - 调用者不知道内存的内部格式,因此会混淆。
在 Swift 中,我正在创建一个类,该类将封装结构和与其他对其进行操作的 C 函数的接口。
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 认为它会通过调用来完成。
非常感谢任何帮助!
【问题讨论】:
-
你能用一些虚拟信息初始化它,然后再覆盖它吗?
-
这就是整个问题 - 我无法弄清楚它想要什么语法(如果有的话)作为
unsigned char [50]的初始化。似乎没有什么是可以接受的。如果我无法初始化它,我想要一种方法来告诉它忽略未初始化的传递引用。我试过编译器选项无济于事。感谢您的帮助。 -
你真的需要使用 initMyStruct 吗? initMyStruct 里面是什么?
-
@nightshade 里面有什么并不重要,它对其他 C 库函数很重要——内部状态数据。事实上,我知道它被强制转换为联合,因此 50 个字节只是为不同的需求分配足够的存储空间,具体取决于代码后面发生的情况。但这对于 Swift 的语义问题并不重要。
标签: c macos pointers struct swift