i want to get an int and string from C function. int - error code, string - the data.
Tried that way:
package main
/*
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
int test(char *out){
snprintf(out, sizeof out, "1234567890abcd");
return 0;
}
*/
import "C"
import (
"fmt"
"unsafe"
)
func main() {
foo := C.CString("")
defer C.free(unsafe.Pointer(foo))
C.test(foo)
fmt.Println("Output is: "+C.GoString(foo))
}
and it almost worked.
Output is: 1234567
but should be: 1234567890abcd
I think that size of C.String passed to C function is 8. But don't know how can I extend it (fixed size <> 8) or change into dynamic.
So the question is: How should I pass that variable to C?
After a research i found a solution:
package main
/*
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
int test(char *out, int len){
snprintf(out, len, "1234567890123456789012345671`iknvcap9nv1-93hbf1-39b");
return 0;
}
*/
import "C"
import (
"fmt"
"unsafe"
)
func main() {
buf := make([]byte, 8192)
C.test((*C.char)(unsafe.Pointer(&buf[0])), C.int(len(buf)))
fmt.Println(string(buf))
}
To receive 'string' from C function, i had to create a slice:
buf := make([]byte, 8192)
and pass a pointer to it:
C.test((*C.char)(unsafe.Pointer(&buf[0])), C.int(len(buf)))
Using C.String in that situation is not working.