Мы интегрируем Go программу с сторонним C API, но получаем некоторые странные результаты при работе с указателями на указатели на структуры. Модель заголовочного файла выглядит примерно так ...
//mytest.h
typedef struct Books {
char title[50];
char author[50];
char subject[100];
int book_id;
} Book;
extern void initbook(Book** b);
С такой реализацией модели ...
//mytest.c
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
typedef struct Books {
char title[50];
char author[50];
char subject[100];
int book_id;
} Book;
void initbook(Book** b){
*b = malloc(sizeof(Book));
strcpy( (*b)->title, "A Book Title");
}
Мы попытались обернуть API с помощью очень простой SWIG-файл, который выглядит следующим образом ...
%module mytest
%{
#include "./mytest.h"
%}
%include "./mytest.h"
И вызывает его из Go основной функции, подобной этой ...
//main.go
package main
import "fmt"
import "mytest"
func main() {
bookPtr := mytest.NewBook()
mytest.Initbook(bookPtr)
fmt.Printf("title: '%s'\n", bookPtr.GetTitle())
}
Однако мы нашли когда мы запускаем это, то значение, возвращаемое из GetTitle () искажается ....
> go run ../main.go
title: '??'
Копая сгенерированный код C, мы обнаружили, что редактирование конструктора Book для возврата Book ** скорее чем Book *, а затем изменив функцию GetTitle для получения Book ** вместо Book *, все стало работать как положено.
Любые подсказки о том, как мы можем настроить SWIG для генерации версии кода, которая работает для нас. без нас, чтобы взломать то, что это генерирует?
Спасибо!
Марк