Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays 字符串数组到C字符串数组的快速转换不起作用_Arrays_C_Swift_String - Fatal编程技术网

Arrays 字符串数组到C字符串数组的快速转换不起作用

Arrays 字符串数组到C字符串数组的快速转换不起作用,arrays,c,swift,string,Arrays,C,Swift,String,我希望调用的C函数记录如下: GDALVectorTranslateOptions*GDALVectorTranslateOptions新建(char**papszArgv,GDALVectorTranslateOptions任意*psOptionsForBinary) …并作为以下内容导入swift: public func gdalvectorTranslateOptions新建(\papszArgv:UnsafeMutablePointer!,\upsoptionsforBinary:O

我希望调用的C函数记录如下:

GDALVectorTranslateOptions*GDALVectorTranslateOptions新建(char**papszArgv,GDALVectorTranslateOptions任意*psOptionsForBinary)
…并作为以下内容导入swift:

public func gdalvectorTranslateOptions新建(\papszArgv:UnsafeMutablePointer!,\upsoptionsforBinary:OpaquePointer!)->OpaquePointer!
我无法将我的swift字符串数组转换为C字符串数组,这种转换方式不会产生错误

我尝试过在研究中发现的各种方法,它们最终都会产生类似的错误。我当前的方法是使用以下函数转换要在闭包中使用的字符串的Swift数组:

public func with ArrayOfcString(args:[String],body:([UnsafeMutablePointer?])->R)->R{
var cStrings=args.map{strdup($0)}
cStrings.append(无)
推迟{
cStrings.forEach{free($0)}
}
返回体(CST环)
}
我试图这样使用它:

var opts=[“blah1”、“blah2”]
withArrayOfCStrings(opts){(cOpts)在
设translateOpts=GDALVectorTranslateOptionsNew(cOpts,nil)
}
但我得到了一个错误:

无法将类型“[UnsafemtablePointer?]”(也称为“数组”)的值转换为预期的参数类型“UnsafemtablePointer”


我应该怎么做?

withArrayOfCStrings函数与C函数一起工作,C函数使用
char*const*
参数,即指向常量的指针指向字符

如果将C声明更改为

GDALVectorTranslateOptions* GDALVectorTranslateOptionsNew(char* const* papszArgv,
    GDALVectorTranslateOptionsForBinary* psOptionsForBinary)
然后它按照预期编译和运行

如果您没有修改C代码的选项,那么可以将helper方法更改为

public func withArrayOfCStrings<R>(_ args: [String],
                                    _ body: (UnsafeMutablePointer<UnsafeMutablePointer<Int8>?>) -> R) -> R {
    var cStrings = args.map { strdup($0) }
    cStrings.append(nil)
    
    defer {
        cStrings.forEach { free($0) }
    }
    
    return body(&cStrings)
}
public func with ArrayOfcString(uArgs:[String],
_正文:(非女性化指针)->R)->R{
var cStrings=args.map{strdup($0)}
cStrings.append(无)
推迟{
cStrings.forEach{free($0)}
}
返回阀体(&C环)
}

现在使用
unsafemeutablepointer
参数调用主体,该参数对应于一个C
char**
参数。

我无法更改C代码,但使用ArrayOfcString更新的
看起来就可以了。我还没有完成足够的其他代码来完全测试它,但至少XCode不再抱怨类型转换。我认为筑巢和间接定向的层次太多了,我无法遵循。