热门标签 | HotTags
当前位置:  开发笔记 > IOS > 正文

从Swift4调用C函数

如何解决《从Swift4调用C函数》经验,求大佬解答?

我已经使用codegen工具从MATLAB生成了C代码。该功能可以描述如下:

function [result] = calculate_data(my_matrix)
    for idx = 1:length(my_matrix)
        result = result + sum(my_matrix(idx,1:3));
    end
end

使用codegen工具时,我明确声明my_matrix是double(:inf,3)的类型。换句话说,行数是无限制的,但是它将有3列。生成代码时,这是我要执行的生成的函数:

calculate_data(my_matrix : UnsafePointer!, result : UnsafeMutablePointer!)

在不同的c文件中,emxArray_real_T的定义如下:

struct emxArray_real_T
{
  double *data;
  int *size;
  int allocatedSize;
  int numDimensions;
  boolean_T canFreeData;
};

当我看到上述类的初始化选项时,这一点特别有意义:

emxArray_real_T.init(data: UnsafeMutablePointer!, size: UnsafeMutablePointer!, allocatedSize: Int32, numDimensions: Int32, canFreeData: boolean_T)

我试图遵循本文档作为将我的头缠在如何调用生成的C代码上的一种方法,但是我认为我可能缺少一个基本步骤。这是我在做什么:

// create an 2d array with some fake data
var mySampleData = [[Double]]();
for i in 0 ..<3 {
    mySampleData.append([1.1, 2.2, 3.3]);
}

// begin fulfilling requirements for emxArray_real_T
var data_pointer = UnsafeMutablePointer.allocate(capacity: 3);
data_pointer.initialize(from: mySampleData)

但是,上面的代码引发了一个错误,指出:

Generic parameter 'C' could not be inferred

我认为自己正在做完全错误的事情,并且可能走在错误的道路上。有一个类似的帖子与我的问题有关,如何将float [] []类型数组转换为“ emxArray_real_T * x”,但是提供的解决方案似乎是针对C的,而不是针对Swift 4的。我该如何有效地调用一个使用Swift 4的C函数,并且满足emxArray_real_T.init方法的要求?可以使用伪造的数据来演示基本原理。


推荐阅读
author-avatar
phpxiaofei
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有