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.

Reply via email to