ios - 将 swift struct 指针传递给 C 函数

标签 ios pointers struct swift

比方说,我有一个名为 Foo 的 Swift 结构

struct Foo
{
     var a,b,c : Float
     var d : Double
     init()
     {
        a = 0
        b = 0
        c = 0
        d = 0
     }
}

Swift sizeof(Foo) 在 arm64 上打印 24 个字节,4 个字节用于 Float 字段,8 个用于 Double 和 4 个字节的填充。

所以我认为,在结构对齐方面没有特殊的 Swift 魔法,我们可以自由地将指向它的指针传递给内部 C 函数,以便使用像 NEON 和 Metal 这样的东西,只要内置变量是联合, 目前不能直接包含在 Swift 中

不知何故,当我尝试使用 const void* 时(Swift 中的 ConstUnsafePointer<()>)

let a = Foo()
let b = &a

我在第二个表达式上遇到严重的编译器错误

'Foo' is not convertible to '@lvalue inout $T1'

我是否遗漏了什么,这是设计使然的吗?

更新部分

Martn R,感谢您的回答!不过,整个情况对我来说还不是很清楚。我的目标是创建方便的 Math 东西包装器,所以我想实现 @infix 方法,比如乘法,并将所有内部原生东西隐藏在 C 后面。例如,对于矩阵,这意味着我们需要从 = 中提取 & 符号&b*&c 表达式,因为如果有一种方法可以绕过它并在 @infix 方法实现的范围内从内存中获取原始点,我没有从你的答案和文档中得到。

像这样:

@infix public func *(l: Mat4, r: Mat4) -> Mat4
{
    var m = Mat4()
    _internalMat4Multiply(&l, &r, &m)
}

_internalMat4Multiply 是 void(void*, void*, void*) C 方法,执行所有计算

最佳答案

有两个问题:你不能获取一个常量(用let定义)的地址, 并且您只能将变量的地址传递给函数参数。 假设你的 C 函数是

void myFunc(const void *data);

那么这会起作用:

var a = Foo()
myFunc(&a)

但是,您不必假设 C 和 Swift 中的对齐方式相同,而是 也许应该更好地定义您的 C API 中的结构:

struct Foo {
    float a;
    float b;
    float c;
    double d;
};

void myFunc(const struct Foo *data);

并在 Swift 代码中使用它:

var a = Foo(a: 0, b: 0, c: 0, d: 0)
myFunc(&a)

关于ios - 将 swift struct 指针传递给 C 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25116782/

相关文章:

c - 将参数从指针传递到非封闭地址空间时出错

c - 使用指向函数的指针进行数值积分始终返回 0

c - 指针被莫名其妙地修改

c++ - 将元素添加到现有结构会使函数因段错误而崩溃

ios - Swift Socket,监听传入的消息

ios - 为 iOS 推送通知设置 Amazon EC2 服务器

ios - 应用程序崩溃并显示消息 "Usage: leveldbutil command..."

c - 计算不同函数中保留的内存的函数

ios - 难以从 iPhone X 上的 2D 区域获取面部标志点的深度(SceneKit/ARKit 应用程序)

mysql - 使用 <cfloop> 从查询结果构建数组和数组数组