I have issue when using cgo with c struct array. My program as follow:
I have struct in c and contain a pointer to a c struct array. In C, I provide a initialize function (take two parameter: the pointer to the variable, the length of the array inside the variable) to malloc the memory of the variable. Then In go, I assign the value to this variable and assign value to the array in variable. And in go , I call another C function to using this variable. After the C function handle it. Go pick up the variable again and return to other Go function. When I coded like this, I go a array like. type *C.struct does not support indexing. My code like follow. C: test.h typedef struct { int profileCnt; _profile *profile; //pointer to profile array }_profiles; // variable using in Go typedef struct { int profileId; _name userName; char *dateOfBirth; int stateFipsId; }_profile; typedef struct { char first[32]; char last[32]; } _name; void initializeProfiles(_profiles *profiles, int profileCount, bool create); int doSomething _In_C( _profiles *profiles, int log); test.c void initializeProfiles(_profiles *profiles, int profileCount, bool create) { profiles->profileCnt = profileCount; // initialize profiles struct & profile[] Array if (profileCount > 0) { if (create == true) profiles->profile = malloc(profileCount * sizeof *profiles->profile + 1); // allocate memory for profiles[numProfiles] for (int i = 0; i < profiles->profileCnt; i++) initializeProfile(&profiles->profile[i], create); if (create == false) { free(profiles->profile); profiles->profileCnt = 0; } } else profiles->profile = NULL; } int doSomething _In_C( _profiles *profiles, int log) { /* =========================================== */ ==== did something to that variable============================ if (errStatus.code == _SUCCESS) return(_SUCCESS); else return(FAILURE); } My GO code package main //#cgo CFLAGS: -std=c99 -ggdb3 -O0 -Wall //#cgo CFLAGS: -I../../include/common //#cgo LDFLAGS: -L string.h //#cgo LDFLAGS: -lstdc++ -lpthread -lm -lc -lssl -lcrypto //#include <stdio.h> //#include <stdlib.h> //#include "test.h" import "C" //import "unsafe" func Test() { log := 1 // sets logging level numProfiles := 3 var profiles C._profiles C.initializeProfiles(&profiles, C.int(numProfiles), C.bool(true)) profiles.profile[0].profileId = C.int(2) profiles.profile[0].stateFipsId = "MD" profiles.profile[0].userName.first = "test" profiles.profile[0].userName.last = "test" C.dosomething_In_C( &profiles,C.int(3)) C.initializeProfiles(&profiles, C.int(numProfiles), C.bool(false)) fmt.Println(int("get c variable and return") } When I compile in like this profiles.profile[0].profileId = C.int(2) I got error message : invalid operation: profiles.profile[0] (type *C.struct___6 does not support indexing) So, I try another solution. Transfer the c struct array form c to go. like this profile.profikes = (*[1 << 30]C._profile)(unsafe.Pointer(&profiles.profile))[:numProfiles:numProfiles] But get error like cannot use (*[1073741824]C.struct___6)(unsafe.Pointer(&profiles.profile))[:numProfiles:numProfiles] (type []C.struct___6) as type *C.struct___6 in assignment and I afraid It create another piece of memory, when I call in dosomething_In_C function, it can not get the data. Is anyone know how to fix this? Thank you -- You received this message because you are subscribed to the Google Groups "golang-nuts" group. To unsubscribe from this group and stop receiving emails from it, send an email to golang-nuts+unsubscr...@googlegroups.com. For more options, visit https://groups.google.com/d/optout.