Как вернуть массив C-структуры из C-функции?

У меня есть функция C, которая вернет массив структуры для перехода к функции. Как я могу получить массив структуры и интерпретировать или преобразовать структуру?

Вот фрагмент кода

typedef struct student{  
    nameStruct name;  
    addressStruct address;  
} studentStruct;

typedef struct name{
    char firstName[20];
    char lastName[20];
} nameStruct;

typedef struct address{
    char location[40];
    int    pin;
}addressStruct;


student* getAllStudents(){
   //Allocate memory for N number of students
   student *pStudent= (struct student*)(N* sizeof(struct student));
   //populate the array
   return pStudent;
}

Мне нужно получить массив pStudent в моем коде go

package main

/*
#cgo CFLAGS: -I.
#cgo LDFLAGS: -L. -lkeyboard
#include "keyboard.h"
*/
import "C"
import (
    "fmt"
)

type student struct {
    name string
    ID int
}

func main() {
    s := student{} //Need to know how to decide the length of the struct array
    s = C.getAllStudents() //?????


}

Может ли кто-нибудь помочь мне с фрагментом кода?


person user3218590    schedule 12.10.2016    source источник
comment
Здесь много недостающей функциональности, охватывающей множество основных областей. О какой части вы спрашиваете?   -  person JimB    schedule 12.10.2016
comment
как лучше всего преобразовать структуру C в структуру Go? учитывая, что в структуре C могут быть разные типы данных.   -  person user3218590    schedule 13.10.2016
comment
Если типы данных разные, вам необходимо скопировать/преобразовать их в соответствующие поля. Например, строки Go не совпадают со строками C, поэтому вы не можете их преобразовать, вам нужно скопировать символы из C char* в Go string   -  person JimB    schedule 13.10.2016
comment
Я знаю об этом, поэтому я искал любой другой короткий путь, который может напрямую преобразовывать или отображать структуру C в структуру Golang.   -  person user3218590    schedule 14.10.2016
comment
Я добавил сложную структуру C studentStruct в свой исходный пост. Может ли кто-нибудь добавить фрагмент кода для интерпретации этой структуры C в коде Go?   -  person user3218590    schedule 16.10.2016
comment
Что вы подразумеваете под интерпретацией структуры C? Вы сказали, что знаете, что вам нужно копировать/преобразовывать данные для использования собственных структур Go, но ищете короткий путь. Вы можете получить доступ к структуре напрямую как тип C.struct_student, если это то, что вы ищете.   -  person JimB    schedule 16.10.2016
comment
Возможный дубликат cgo: как передать массив структур из c идти   -  person bain    schedule 29.08.2019


Ответы (1)


Вы можете использовать параметры out, и путь для C struct -> Go struct выглядит следующим образом:

package main

/*
#include <stdlib.h>

typedef struct Point{
    float x;
    float y;
}Point;

void GetPoint(void **ppPoint) {
   Point *pPoint= (Point *)malloc(sizeof(Point));
   pPoint->x=0.5f;
   pPoint->y=1.5f;
   *ppPoint = pPoint;
}
*/
import "C"

import "unsafe"

type Point struct {
    x float32
    y float32
}

func main() {
    var ppoint unsafe.Pointer
    C.GetPoint(&ppoint)
    point := *(*Point)(ppoint)
    println(point.x, point.y)
}
person Mohanson    schedule 13.10.2016
comment
На самом деле, я предлагаю использовать строку json между C и Golang. - person Mohanson; 13.10.2016
comment
преобразование всех различных типов данных в строку json перед отправкой в ​​Golang потребует дополнительной логики преобразования, чего я пытался избежать. - person user3218590; 14.10.2016