#python #arrays #swift #return #ctypes
#python #массивы #swift #Возврат #ctypes
Вопрос:
Я пытаюсь вызвать функцию swift, которая возвращает массив с плавающей запятой в python. Я использую ctypes для загрузки скомпилированной библиотеки swift и определения типа встроенной функции. Результат, который я получаю в Python из собственной функции, отличается от значений, которые я жестко запрограммировал в Swift. Кто-нибудь может помочь мне разобраться, что я делаю не так?
mySwiftLib.swift
import Foundation
@_cdecl("get_float_array")
public func getFloatArray() -> [CFloat] {
return [0.1, 0.2, 0.3, 0.4]
}
скомпилирован с swiftc -emit-library -o ./libMySwiftLib mySwiftLib.swift
main.py
import ctypes
swift_lib = ctypes.CDLL('./libMySwiftLib')
# define arguments and result type
result_array_length = 4 # swift array length
swift_lib.get_float_array.argtypes = []
swift_lib.get_float_array.restype = ctypes.POINTER(ctypes.c_float * result_array_length)
# call swift lib function
result = swift_lib.get_float_array()
print("result from native call: ", result)
# get actual array from result pointer
arr = [i for i in result.contents]
print("result array: ", arr)
# XXX:
# actual: [2.285883241727672e-30, 1.401298464324817e-45, 2.802596928649634e-45, 0.0]
# expected: [0.1, 0.2, 0.3, 0.4]
запускаем с python3 main.swift
Комментарии:
1. может быть, мой подход с пониманием списка (
arr = [i for i in result.contents]
) совершенно неверен, и есть другой способ разыменования указателя вresult
?