内容简介:此篇教程只是简单的描述怎么使用以及遇到的一些错误我写的实例,C语言与golang在同一个文件中,并没有分开。我这里演示两个例子:
此篇教程只是简单的描述怎么使用以及遇到的一些错误
我写的实例,C语言与golang在同一个文件中,并没有分开。
我这里演示两个例子:
⑴ 调用 C语言 函数打印“Hello World”
#include <stdio.h> void PrintHello(){ printf("Hello World!\n"); }
c代码写好了我们就写golang代码
import "C" func main() { C.PrintHello() }
输出结果是:Hello World!
完整代码
package main /* #include <stdio.h> void PrintHello(){ printf("Hello World!\n"); } */ import "C" func main() { C.PrintHello() }
请将我这段代码,原样复制进行测试,你看到结果就明白了怎么调用C函数了,其中要特别说明的就是:
① C代码与import "C"之间不能有空格
② import "C"这里的"C"要独自占一个import,也可以这样写
import (
"C"
)
但是不能这样
import (
"C"
"fmt"
)
③ C代码是被注释的状态;
⑵ 打印给定数组
#include <stdio.h> #include <stdlib.h> void PrintArray(int arr[], int len){ int i = 0; printf("["); for (i = 0; i < len; i++){ if (i == len - 1) printf("%d",arr[i]); else printf("%d ",arr[i]); } printf("]\n"); } int* CreateArray(int len){ int* arr = (int*)malloc(sizeof(int)*len); int i = 0; for (i = 0; i < len; i ++) { arr[i] = i; } return arr; } void SetArrValue(int *arr, int index, int value){ arr[index] = value; }
然后是golang代码
import "C" func main() { var b *C.int = C.CreateArray(5) C.SetArrValue(b, 0, 100) C.PrintArray(b, 5) }
输出的结果是:[100 1 2 3 4]
全部代码,复制测试,尽量全部复制,然后再修改代码进行测试
/* #include <stdio.h> #include <stdlib.h> void PrintArray(int arr[], int len){ int i = 0; printf("["); for (i = 0; i < len; i++){ if (i == len - 1) printf("%d",arr[i]); else printf("%d ",arr[i]); } printf("]\n"); } int* CreateArray(int len){ int* arr = (int*)malloc(sizeof(int)*len); int i = 0; for (i = 0; i < len; i ++) { arr[i] = i; } return arr; } void SetArrValue(int *arr, int index, int value){ arr[index] = value; } */ import "C" func main() { var b *C.int = C.CreateArray(5) C.SetArrValue(b, 0, 100) C.PrintArray(b, 5) }
特别说明
按到底打印不需要这么多函数,但是遇到好几个问题,首先我使用C语言的方式进行传参:C.PrintArray([1,2,3,4,5], 5),毫无疑问这是会失败的;第二种方式是使用golang的方式进行,先声明数组,然后再进行传参
var b = []C.int{1,2,3,4,5} C.PrintArray(b,5)
然后就会报下面的错误:
cannot use b (type []_Ctype_int) as type *_Ctype_int in argument to _Cfunc_PrintArray
根据错误,我们可以看出是类型不统一,说不能使用类型[]_Ctype_int作为函数的参数类型*_Ctype_int;我一看这是需要指针,然后我就进行第三次尝试;
声明一个C语言指针,然后开辟空间,然后再逐一赋值:
var b *C.int = C.malloc(C.sizeof(int)*5)
这一次提示的是
could not determine kind of name for C.sizeof
这句话的大概意思就是不能确定类型C.sizeof,我是这样理解,反正就是不能用,于是我就想到了使用上面那一种方式进行;后面想到需要修改里面的值,于是又写了一个函数,专门修改数组的值,因为我发现并不能在golang里面直接使用下标进行修改。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网
猜你喜欢:- Go语言反射之反射调用
- Go语言调用-Physx物理引擎
- C语言实现GET请求调用API
- thrift 增加跨语言的调用链【TODO】
- Golang 语言使用标准库 net/rpc/jsonrpc 包跨语言远程调用
- go语言调用不通包下的函数报错
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Ordering Disorder
Khoi Vinh / New Riders Press / 2010-12-03 / USD 29.99
The grid has long been an invaluable tool for creating order out of chaos for designers of all kinds—from city planners to architects to typesetters and graphic artists. In recent years, web designers......一起来看看 《Ordering Disorder》 这本书的介绍吧!