Добрый день.
Просмотрел документацию:
Однако не очень понятно как вызвать С функцию с данными из Go. Хотелось бы объявить в пакете массив:
var arr [10]int
и передать его в свою функцию написанную на С:
C.MyFunc(arr, 10)
Где MyFunc определить так:
void MyFunc(int *arr, int len);
Подскажите можно ли такое сделать?
------------------------------------------------------------------------
компилируется такой вариант:
package libs
func MySum(arr [4]int) int {
my_arr := unsafe.Pointer(&arr[0])
my_len := C.int(len(arr))
res := C.Sum1((*C.int)(my_arr), my_len)
return int(res)
}
где Sum1:
int Sum1(int *arr, int len)
{
std::cout << "---------- inside Sum1 (C++) ------------\n";
int sum = 0;
std::cout << "len=" << len << std::endl;
for (int i=0; i<len; ++i)
{
std::cout << "arr[" << i << "]=" << arr[i] << std::endl;
sum += arr[i];
}
std::cout << "sum=" << sum << std::endl;
std::cout << " ---------- Sum1 (C++) end ------------\n";
return sum;
}
В Go вызываю так:
arr := [4]int{1, 2, 3, 4}
fmt.Println(libs.MySum(arr))
Однако работает оно не правильно и внутри С кода вместо 1,2,3,4 я вижу 1,0,2,0. Видимо не совпадают размерности int-ов.
------------------------------------------------------
замена int на int32 в Go коде решает вопрос.