Thank you very much for your patience and help. I got it and will try it 
later. :)

在 2017年8月7日星期一 UTC+8下午3:52:43,Konstantin Khomoutov写道:
>
> On Sun, Aug 06, 2017 at 07:08:03PM -0700, jianzh...@gmail.com 
> <javascript:> wrote: 
>
> > Thanks your reply, I also used this way, but it still not work. code as 
> the 
> > following. 
> > 
> > gonameunits := []string{"gpu0", "gpu1", "gpu2", "gpu3"} 
> >    nameunits := make([]*C.char, len(gonameunits)) 
> >    for i, _ := range gonameunits { 
> >        nameunits[i] = C.CString(gonameunits[i]) 
> >        defer C.free(unsafe.Pointer(nameunits[i])) 
> >    } 
> >    fmt.Println("nameunits:", nameunits) 
>
> This looks correct... 
>
> >     golevelmatrix := [][]int{{1}, {3, 3}, {3, 3, 2}} 
> >    levelmatrix := make([][]C.int, len(golevelmatrix)) 
> >    for i, _ := range golevelmatrix { 
> >        levelmatrix[i] = make([]C.int, len(golevelmatrix[i])) 
> >        for j, _ := range golevelmatrix[i] { 
> >            levelmatrix[i][j] = C.int(golevelmatrix[i][j]) 
> >        } 
> >    } 
>
> ...but this is not: remember that in Go, the type []T denotes *a slice* of 
> elements of type T.  A slice is a dynamic construct which is a view into 
> underlying array, and as such it itself consists of a pointer into that 
> array's contents, the current length of the slice and the capacity of 
> it. 
>
> >    fmt.Println("levelmatrix:", levelmatrix) 
> > 
> >     C.test_settopologyresource(mod, C.CString("node1"), C.int(2), 
> (**C.char 
> > )(unsafe.Pointer(&nameunits[0])), 
> (**C.int)(unsafe.Pointer(&levelmatrix[0][0 
> > ]))) 
>
> That thing about slices means that passing a pointer to a single slice 
> element to C is OK; passing a pointer to an Nth element of a slice to C 
> and expecting it to access it and the elements following it up to the 
> slice's length is also OK but interpreting a slice of slices (which 
> [][]*C.int really is) is wrong: it's not represented by a contiguous 
> array: it's a slice of N independent slices -- each backed by its 
> independent array. 
>
> So what you really want is something like: 
>
> 1. Know the dimensions of your matrix (let's denote them by N and M). 
> 2. Allocate a slice of the length N*M. 
> 3. Fill it up with the values from your source slice of slices. 
> 4. Pass the pointer to the array to C. 
>
> Like this (untested, may not even compile): 
>
>   n := len(golevelmatrix) 
>   m := 0 
>   for _, row := range golevelmatrix { 
>     if len(row) > m { 
>           m = len(row) 
>         } 
>   } 
>   
>   a := make([]int, n*m) 
>   i := 0 
>   for _, row := range golevelmatrix { 
>         for j, v := range row { 
>                 a[i*n+j] = v 
>         } 
>         i++ 
>   } 
>
>   C.my_func(&a[0]) 
>
>

-- 
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