Я написал простую функцию cpp для получения входных параметров из swift и использования этих параметров в функции cpp из библиотеки cpp (Если кто-то знаком с CPLEX, я в основном использую библиотеку CPLEX cpp в swift. Я хотел бы выполнить предварительную обработку проблемы и передать эти значения в cpp для оптимизации)
Простая функция cpp, которую я написал, требует, чтобы я предоставил параметр double [][]
, который переводится в UnsafeMutablePointer< UnsafeMutablePointer<Double>? >
в быстром. Я написал небольшой фрагмент кода для преобразования в [[Double]]
.
let arrayToConvert = [[3.0, 4.0], [2.0, 3.3]]
let outerArray = UnsafeMutablePointer< UnsafeMutablePointer<Double> >.allocate(capacity: arrayToConvert.count)
for idx in 0..<dists.count {
let arrPointer = UnsafeMutablePointer<Double>.allocate(capacity: dists[idx].count)
arrPointer.initialize(from: arrayToConvert[idx], count: arrayToConvert[idx].count)
outerArray.advanced(by: idx).pointee = arrPointer
}
. Затем я вызвал мою маленькую функцию cpp с именем opt(double **)
, используя созданный externalArray, но это не так. Это не работает, потому что outerArray
не соответствует требованию маленькой функции, которую я написал, которая принимает UnsafeMutablePointer< UnsafeMutablePointer<Double>? >
(обратите внимание на опциональную).
Поэтому я попытался изменить
let outerArray = UnsafeMutablePointer< UnsafeMutablePointer<Double> >.allocate(capacity: arrayToConvert.count)
на
let outerArray = UnsafeMutablePointer< UnsafeMutablePointer<Double>? >.allocate(capacity: arrayToConvert.count)
Здесь все становится странным. Когда я добавляю необязательный (?), Я получаю сообщение об ошибке «Неопределенный символ: _opt». Кто-нибудь может указать мне на то, что мне не хватает или что я здесь делаю неправильно?
Вот коды MWE:
main.swift
import Foundation
let arrayToConvert = [[3.0, 4.0], [2.0, 3.3]]
let outerArray = UnsafeMutablePointer< UnsafeMutablePointer<Double> >.allocate(capacity: arrayToConvert.count)
for idx in 0..<dists.count {
let arrPointer = UnsafeMutablePointer<Double>.allocate(capacity: dists[idx].count)
arrPointer.initialize(from: arrayToConvert[idx], count: arrayToConvert[idx].count)
outerArray.advanced(by: idx).pointee = arrPointer
}
opt(outerArray)
cp.cpp
#include "cp.hpp"
template <size_t rows, size_t cols>
double opt(double (&array)[rows][cols]) {
return 0.0;
}
cp.hpp
#ifndef cp_hpp
#define cp_hpp
#include <stdio.h>
#ifdef __cplusplus
extern "C" {
#endif
double opt(double **);
#ifdef __cplusplus
}
#endif
#endif
paper1-Bridging-Header.ч
#ifndef paper1_Bridging_Header_h
#define paper1_Bridging_Header_h
#include "paper1/cp/cp.hpp"
#endif