Сгенерированные SWIG Go обертки (?) Указатели на указатели на структуры - PullRequest
0 голосов
/ 16 апреля 2020

Мы интегрируем 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 для генерации версии кода, которая работает для нас. без нас, чтобы взломать то, что это генерирует?

Спасибо!

Марк

...