go 调用c语言,golang之调用C语言代码

此篇教程只是简单的描述怎么使用以及遇到的一些错误

我写的实例,C语言与golang在同一个文件中,并没有分开。

我这里演示两个例子:

⑴ 调用C语言函数打印“Hello World”#include 

void PrintHello(){    printf("Hello World!\n");

}

c代码写好了我们就写golang代码import "C"

func main() {

C.PrintHello()

}

输出结果是:Hello World!

完整代码package main  /*

#include 

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 

#include 

void PrintArray(int arr[], int len){    int i = 0;    printf("[");      for (i = 0; i 

}    printf("]\n");

}  int* CreateArray(int len){    int* arr = (int*)malloc(sizeof(int)*len);    int i = 0;    for (i = 0; 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 

#include 

void PrintArray(int arr[], int len){

int i = 0;    printf("[");      for (i = 0; i 

}    printf("]\n");

}

int* CreateArray(int len){

int* arr = (int*)malloc(sizeof(int)*len);

int i = 0;    for (i = 0; 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里面直接使用下标进行修改。

作者:吴敬悦

链接:https://www.jianshu.com/p/0c7774a328e0

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/550930.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

jsessionid每次请求都在变_为什么每次沟通都变争吵,学会这4条沟通原则,解决90%的沟通问题...

沟通重要吗?太重要了,可以这么说,我们在生活中遇到的绝大部分问题其实都是沟通问题。你的身边有这样的对话吗?老婆对丈夫说:“老娘当初瞎眼了才看上你,成天就知道打牌“妈妈对儿子说:”你看看人…

c语言long说明符,C语言-类型说明符 long,short,unsigned,signed

类型说明符基本概念C 语言提供了一下四种说明符,四个都属于关键字;short短型等价于 short intlong 长型 等价于 long intsigned 有符号型unsigned 无符号型这些说明符一般就是用来修饰 int 类型的,所以在使用时可以省略 intshort和 longshort 和 long 可以提供不同长度的整型数…

常见食物营养成分表图_营养成分表,你会看么?

中国居民对于营养标签的认知较低。一项针对中国五城市居民的调查显示,仅有40.54%的消费者会阅读营养标签。恭喜你成为其中之一。这是什么数据?营养成分表通常有三项主要内容,从左到右依次为营养素的名称、营养素的含量以及营养素参考值&#…

求年龄和的c语言数据类型,第1章 c语言与数据类型.ppt

第1章 c语言与数据类型转义字符 转义字符 功能描述 举例 \n 换行,将当前位置移到下一行开头 printf("请输入你的年龄\n"); \t 水平制表(跳到下一个tab位置) printf("\n姓名\t年龄\t地址\n"); \ 单引号(撇号)字符? printf("字符\a\的ASCII…

mysql安装mac 压缩包_MAC mysql安装及设置

首先,去http://www.mysql.com/downloads/mysql下载mysql-5.1.44-osx10.6-x86_64.dmg,然后,双击该文件,安装映像中的两个安装包文件。a. mysql-5.1.44-osx10.6-x86_64.pkg(mysql标准版安装)b. MySQLStartupItem.pkg(mysql启动项目)…

android 自定义view滚动条,Android自定义View实现等级滑动条的实例

Android自定义View实现等级滑动条的实例实现效果图:思路:首先绘制直线,然后等分直线绘制点;绘制点的时候把X值存到集合中。然后绘制背景图片,以及图片上的数字。点击事件down的时候,换小图片为大图片。move…

二项分布的期望方差证明_关于二项分布

2007-01-07二项分布和正态分布的期望与方差EXn我介绍一个较繁但易懂的方法。先证kC(n,k)*p^k*q^(n-k)np*[C(n-1,k-1)*p^(k-1)q^(n-k)]过程如下:kC(n,k)*p^k*q^(n-k)k*(n!/[(n-k)!k!])*p^k*q^(n-k)np*[(n-1)!/((n-k)!(k-1)!]*p^(k-1)*q^(n-k)np*[C(n-1,k-1)*p^(k-1)q…

android短信验证码代码,Android短信验证码自动填写实现代码

今天给大家分享一个Android短信验证码自动填写的功能。先看下效果图,我发送了一条短信到手机,自动填写验证码。如图:这个小功能运用到了观察者模式,什么是观察者模式?观察者模式 :定义对象间的一种一个(Sub…

decimal类型 go_Go 语言程序设计——字符串类型(2)

格式化布尔值布尔值使用 %t (真值) 格式指令来输出例子:package mainimport ("fmt")func IntForBool (b bool) int {if b {return 1}return 0}func main() {fmt.Printf("%t %t\n", true, false)fmt.Printf("%d %d\n", IntForBool(tru…

android 评论的展开功能,Android开发实现ListView点击展开收起效果示例

本文实例讲述了Android开发实现ListView点击展开收起效果。分享给大家供大家参考,具体如下:废话不说先上效果:实际上这是采用一个ExpandableListView实现的布局文件很简单:xmlns:android"http://schemas.android.com/apk/res…

画流程图activiti流程图_干货!小白也能一天画100张高逼格流程图

今天是在一起两周年零128天纪念日~你喜滋滋地订好了花,买好了酒,暗暗盘算着下班以后赶紧走~不料老板的命令从天而降“出100张流程图,今天给我!”What???100张!!&#xff…

linux修图,修图只知道Photoshop?11款高逼格修图工具快来get!

精致的产品是在线商店成功的一个重要元素。虽然Adobe Photoshop长期以来一直是编辑图像的行业标准,但也有许多免费或廉价的应用程序和类似的工具。本文将为大家介绍一些Photoshop的替代品,包括在线应用程序和图形软件套件,它们都具有创建动态…

摆的频率公式_频率与转速的公式

信息举报时间:2020-12-24 本页为您甄选多篇描写频率与转速的公式,频率与转速的公式精选,频率与转速的公式大全,有议论,叙事 ,想象等形式。文章字数有400字、600字、800字....想做一个lc振荡电路产生正弦波到方波产生电路形成一个方…

Android10打断动画,Android开发(10) 动画(Animation)

概述Android SDK介绍了两种Animation:Tween Animation:通过对场景里的对象不断做图像变换(平移、缩放、旋转)产生动画效果,即是一种 渐变动画 ,或者说 补间动画。Frame Animation:顺序播放事先做好的图像,是…

safari浏览器横屏怎么设置_如何避免苹果safari自带浏览器“跟踪”你的信息!

苹果自带的“safari浏览器”正在悄悄“追踪”你的信息,这样做可以有效避免你的隐私信息不被泄露。说起苹果设备自带的APP,毫无疑问safari浏览器是其中的代表之一,很多朋友由于习惯的原因,大多在使用苹果设备的时候选择下载一些第三…

android按钮旋转,单击一个按钮在android中顺时针旋转图像

我有一个要求,我有一个ImageView和一个按钮.我想在单击按钮时旋转图像.我需要全屏图像.但是当我点击按钮图像时会旋转,但不会在全屏显示.请参阅以下链接.之后,当我点击按钮图像时也会旋转.但是位置已更改且未全屏显示.我的要求是,当我点击按钮时,图像将顺时针旋转,并将全屏显示…

自动提示_EXCEL2013版突然打不开,自动修复提示1907错误

由于系统升级或电脑进行修复操作,导致EXCEL突然打不开。office自动修复的时候提示错误1907。无法注册字体。请确认有足够的权限安装字体,并且系统支持此字体。解决方法一:直接点击忽略即可。一般点击一下忽略,它没有反应&#xff…

android 按钮改变顺序,在Android中定义RelativeLayout的Z视图顺序

在Android中定义RelativeLayout的Z视图顺序我想在Android中定义RelativeLayout视图的z顺序。我知道这样做的一种方法是拨打bringToFront。有更好的方法吗? 如果我可以在布局xml中定义z顺序会很棒。11个解决方案288 votes最简单的方法是简单地关注视图添加到XML文件的…

matlab去除图片水印_(水印去除技巧)3个在线图片水印去除网站,值得收藏

嗨!大家好!我是网罗小帅。很高兴和大家见面。今天是五一放假的第一天。有人说,新媒体人你不佩有五一假期。我太“南”了!今天带来一波图片,视频去水印技巧干货神器。有时候我们看到一些漂亮的壁纸,但是别人…

android 软键盘遮住按钮,Android应用中出现软键盘遮挡住按钮如何解决

Android应用中出现软键盘遮挡住按钮如何解决发布时间:2020-11-20 16:25:47来源:亿速云阅读:110作者:LeahAndroid应用中出现软键盘遮挡住按钮如何解决?相信很多没有经验的人对此束手无策,为此本文总结了问题…