#c #ios #objective-c #swift
#c #iOS #objective-c #swift
Вопрос:
У меня есть указатель на функцию в C , который имеет значение
function_pointer(const char*, unsigned long int){
const char arr[] = {1, 2, 3, 4, 5, 'a', 'b', 'c', 'd', 'e', 'f', 'g'};
for (int i = 0; i<12; i ){
std::cout<<int(arr[i])<<" ";
}
SwiftCallingFunction(arr, 12);
}
На стороне Swift я могу получить доступ как
func function_pointer_swift (frameData: UnsafePointer<Int8>?, frameSize: UInt){
let buffer = UnsafeBufferPointer(start: frameData.unsafelyUnwrapped, count: Int(frameSize));
let a = Array(buffer)
for element in a {
print(Int(element), terminator:" ")
}
}
Насколько я знаю, до сих пор все в порядке:
UnsafePointer -> Неизменяемый (поскольку char является const, это нормально) и преобразование в Int8 из-за char (знаковое 8-битное целое число val).
Как только я печатаю массив на C и Swift несколько раз, я получаю одно и то же значение несколько раз совершенно по-разному.
Например:
Он печатает (как и ожидалось):
CPP Prints -> 1 2 3 4 5 97 98 99 100 101 102 103
Swift Prints -> 1 2 3 4 5 97 98 99 100 101 102 103
Но, однако, несколько раз
CPP Prints -> 1 2 3 4 5 97 98 99 100 101 102 103
Swift Prints -> -16 -57 -32 -127 2 0 0 0 40 -106 -127 13
CPP печатает всегда одно и то же содержимое, но swift не совпадает, он печатает что-то вроде следующего:
-16 -57 -32 -127 2 0 0 0 40 -106 -127 13
1 2 3 4 5 97 98 99 100 101 102 103
16 -64 -32 -127 2 0 0 0 40 -106 -127 13
0 93 12 0 0 0 0 0 40 -106 -127 13
-128 -44 -60 2 1 0 0 0 100 101 102 103
Комментарии:
1. Я вижу, что функция CPP не выводит массив, переданный в параметрах. Может быть, он работает неправильно, а не в версии swift?
2. Я передаю как arr на самом деле, если вы посмотрите function_pointer, это функция обратного вызова. SwiftCallingFunction(arr, 12); И я могу получить доступ к чему-то правильному, иногда неправильному, поэтому я не думаю, что это ошибка параметра
3. Вам нужно включить
Address Sanitizer
,Detect use of stack after return
,Undefined behaviour Sanitizer
вDiagnostics
4. Я предполагаю, что это цель отладки, но, однако, после этого все работает нормально. Я действительно смущен тем, как эта ошибка устраняется, поскольку это инструмент отладки. Но это работает только для моих статических данных, которые «1 2 3 4 5 97 98 99 100 101 102 103 » Но если я использую динамический тип вместо него, это иногда неправильно, иногда неправильно, и ошибки на стороне памяти нет. Чтобы убедиться, что он работает, я просто изменил его размер, и он говорит, что переполнение кучи, поэтому инструмент отладки в порядке, но если ошибка / ошибка происходит, это мне ничего не говорит. Но это полезно знать для следующих попыток. Спасибо
5. Я изменил char * на char [] через strncpy, теперь я получаю тот же результат. Спасибо 🙂