我想从C函数中获取一个int和string。 int - 错误代码,字符串 - 数据。
试着这样:
errortMsg = this.myform.controls['password'].validatePw
它几乎奏效了。
输出为:1234567
但应该是:1234567890abcd
我认为传递给C函数的C.String的大小是8。 但是我不知道如何扩展它(固定大小<> 8)或改变为动态。
所以问题是:我应该如何将该变量传递给C?
答案 0 :(得分:6)
您正在指针上调用函数sizeof
。指针的大小在您的计算机上是8个字节,因此您将返回一个长度为8的字符串。
我不知道你应该如何管理指针大小的所有细节,因为我不擅长C,但这个例子说明了如何解决你的直接问题。
package main
/*
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
int test(char *out){
snprintf(out, 16, "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))
}
答案 1 :(得分:1)
经过研究,我找到了解决方案:
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))
}
要从C函数接收'string',我必须创建一个切片:
buf := make([]byte, 8192)
并传递一个指向它的指针:
C.test((*C.char)(unsafe.Pointer(&buf[0])), C.int(len(buf)))
在这种情况下使用C.String无效。
答案 2 :(得分:0)
对于将来遇到此问题的任何人,C.CString确实可以工作,您不能将sizeof与指针一起使用,因为它始终为8个字符。我是通过以下方式完成的:
package main
/*
#include <stdlib.h>
#include <string.h>
int test(char* out){
strcpy(out, "1234567890123456789012345671`iknvcap9nv1-93hbf1-39b");
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))
}