Задать вопрос
MAKAPOH
@MAKAPOH
многостаночник

Вызов С функций с данными из Go пакета, возможно ли?

Добрый день.
Просмотрел документацию:

Однако не очень понятно как вызвать С функцию с данными из 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 коде решает вопрос.
  • Вопрос задан
  • 2688 просмотров
Подписаться 4 Оценить Комментировать
Решения вопроса 2
artem_kovardin
@artem_kovardin
Думаю, стоит курить в сторону unsafe.Pointer. Что-то вроде такого: Passing arrays/slices as pointers to C functions
Ответ написан
uvelichitel
@uvelichitel Куратор тега Go
habrahabr.ru/users/uvelichitel
Попробуйту просто конвертировать типы
C.MyFunc(*C.int(&go_arr[0]), C.int(len(go_arr))
In C, a function argument written as a fixed size array actually requires a pointer to the first element of the array. C compilers are aware of this calling convention and adjust the call accordingly, but Go cannot. In Go, you must pass the pointer to the first element explicitly: C.f(&C.x[0]).
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы