首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用UnsafeMutablePointer数组

使用UnsafeMutablePointer数组
EN

Stack Overflow用户
提问于 2016-02-10 09:00:58
回答 3查看 8.3K关注 0票数 6

我正在尝试使用Brad的出色的GPUImage框架,并且我很难处理GPUImageHarrisCornerDetectionFilter返回的cornerArray。

这些角作为GLFloat数组返回到UnsafeMutablePointer中,我想将其转换为CGPoint数组。

我试过分配内存空间

代码语言:javascript
复制
var cornerPointer = UnsafeMutablePointer<GLfloat>.alloc(Int(cornersDetected) * 2)

但是这些数据似乎没有任何意义--无论是0还是1E-32。

我找到了一个完美的答案, in Swift,然后尝试

代码语言:javascript
复制
filter.cornersDetectedBlock = {(cornerArray:UnsafeMutablePointer<GLfloat>, cornersDetected:UInt, frameTime:CMTime) in
        crosshairGenerator.renderCrosshairsFromArray(cornerArray, count:cornersDetected, frameTime:frameTime)

    for floatData in UnsafeBufferPointer(start: cornerArray, count: cornersDetected)
    {
        println("\(floatData)")
    }

但是编译器不喜欢UnsafeBufferPointer,所以我把它改成了UnsafeMutablePointer,但是它不喜欢参数列表。

我肯定这很简单,听起来像是必须做的其他人必须做的事情--那么解决方案是什么呢?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-02-10 20:17:55

从C转换而来的UnsafeMutablePointer<GLfloat>类型可以通过下标访问其元素,就像普通数组一样。为了实现将这些转换为CGPoints的目标,我将使用以下代码:

代码语言:javascript
复制
filter.cornersDetectedBlock = { (cornerArray:UnsafeMutablePointer<GLfloat>, cornersDetected:UInt, frameTime:CMTime) in
    var points = [CGPoint]()
    for index in 0..<Int(cornersDetected) {
       points.append(CGPoint(x:CGFloat(cornerArray[index * 2]), y:CGFloat(cornerArray[(index * 2) + 1])))
    }
    // Do something with these points
}

在触发回调之前立即分配内存支持cornerArray,并在回调之后立即将其释放。除非您在代码块中间复制这些值,正如我前面所做的那样,否则我担心您会对一些令人讨厌的错误敞开心扉。无论如何,在这一点上也更容易转换成正确的格式。

票数 6
EN

Stack Overflow用户

发布于 2016-02-10 17:55:39

我找到了一个解决办法--而且很简单。答案就在这里,https://gist.github.com/kirsteins/6d6e96380db677169831

代码语言:javascript
复制
var dataArray = Array(UnsafeBufferPointer(start: cornerArray, count: Int(cornersDetected) * 2))
票数 3
EN

Stack Overflow用户

发布于 2016-02-10 10:37:40

试试这个:

代码语言:javascript
复制
     var cornerPointer = UnsafeMutablePointer<GLfloat>.alloc(Int(cornersDetected) * 2)

    filter.cornersDetectedBlock = {(cornerArray:UnsafeMutablePointer<GLfloat>, cornersDetected:UInt, frameTime:CMTime) in
        crosshairGenerator.renderCrosshairsFromArray(cornerArray, count:cornersDetected, frameTime:frameTime)

    for i in 0...cornersDetected
    {
        print("\(cornerPointer[i])")
    }
票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35310679

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档