Как использовать указатели, взаимодействующие с c (библиотека) - PullRequest
0 голосов
/ 19 июня 2019

Я использую библиотеку C и хочу вызвать функцию с Pointers в качестве аргументов. Там написано, что мне нужно конвертировать Double в UnsafeMutablePointer<Double>.

Итак, как далеко я зашёл:

class ViewController: UIViewController {

    var buffer1 = [Double]()
    var buffersize = [Int32]()
    var ar = UnsafeMutablePointer<Double>.allocate(capacity: 10)
    var ar2 = UnsafeMutablePointer<Double>.allocate(capacity: 2)

    override func viewDidLoad() {
        super.viewDidLoad()

        randomBuffer()
        print(buffer1)
        ar.deallocate()
        ar2.deallocate()
        let grade = ar.pointee
        let isevent = ar2.pointee

        print(grade, isevent)

        let pointer = app_ios_ersatzfunktion(buffer1, buffersize, ar, ar2)
        print(pointer)
    }
    func randomBuffer()
    {
        let randomDouble = Double.random(in: -1...2)
        if buffer1.count<200{ 
        buffer1.append(randomDouble) 
        }  
        else {
            buffer1.removeFirst()
            buffer1.append(randomDouble)
        }
    }

}

Мой код C был создан с помощью Matlab и выглядит следующим образом:

void app_ios_ersatzfunktion(const double buffer2_data[], const int buffer2_size
  [2], double *grade, double *event_found)
{
  double jerk;
  *grade = 0.0;
  *event_found = 0.0;

  jerk = (buffer2_data[buffer2_size[1] - 1] - buffer2_data[buffer2_size[1] - 2])
    / 0.01;

  if ((jerk >= 200.0) || (jerk <= -200.0)) {
    *event_found = 1.0;
    *grade = jerk / 50.0;
      }
}

1 Ответ

1 голос
/ 19 июня 2019

Вы можете напрямую передавать массивы Swift в функцию C, это передаст адрес хранилища элемента.Для «параметров out» вы должны передать переменные как «аргумент inout» с &:

let buffer2_data: [Double] = ...
let buffer2_size: [CInt] = ...

var grade: Double = 0
var event_found: Double = 0

app_ios_ersatzfunktion(buffer2_data, buffer2_size, &grade, &event_found)

print(grade, event_found)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...