Missing a C function
void initializeProfile(_profile *profile, bool create)
{
if (create == true)
{
profile->dateOfBirth = NULL;
}
profile->profileId = 0;
memset(profile->userName.first, '\0', sizeof(profile->userName.first)); :
memset(profile->userName.last, '\0', sizeof(profile->userName.last));
profile->stateFipsId = 0;
profile->geolocation.latitude = 0.0;
profile->geolocation.longitude = 0.0;
if (create == false)
{
if (profile->dateOfBirth != NULL)
free(profile->dateOfBirth);
}
}
AND igore the Go code
profiles.profile[0].userName.first = "test" // It should be
profiles.profile[0].userName.first = C.CString("test") I changed that
still does not work
profiles.profile[0].userName.last = "test"
On Thursday, March 16, 2017 at 1:59:58 PM UTC-4, Wei Zhang wrote:
>
>
> 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 [email protected].
For more options, visit https://groups.google.com/d/optout.