GO言語の中にC言語を書いてみよう。
準備 GCCをインストールしておきます。
- Windows 10 64bitの場合
- mingw-w64-install.exeをインストールします。 x86_64を選択します。 最初の一歩は、いつもの Hello World
cPrint.go
package main
// #include <stdio.h>
// #include <stdlib.h>
//
// static void cprint(char* s) {
// printf("%s\n", s);
// }
import "C"
import "unsafe"
func main() {
cs := C.CString("Hello World C")
C.cprint(cs)
C.free(unsafe.Pointer(cs))
}
//のコメント部分にC言語でコーディングします。
- 上記の例は、cprint関数を定義してprintfを呼び出しています。
- Cのfree関数を呼んでいます。
- 上記に必要なincludeを
1 stdio.h printf
2 stdlib.h free
で行っています。
>go run cprint.go
Hello World C
配列を渡して合計を求める。(int *)版
sum.go
package main
// int cal_sum(int *x,int n) {
// int sum=0;
// for(int i=0;i<n;i++){
// sum+=x[i];
// }
// return sum;
//}
import "C"
import "fmt"
func main() {
x := []C.int{1, 2, 3, 4,5,6,7,8,9,10}
a:=C.cal_sum((*C.int)(&x[0]),(C.int)(len(x)))
fmt.Println("sigma x=",a)
}
>go run sum.go
sigma x= 55
配列を渡して合計を求める。(float *)版
sigma.go
package main
// float cal_sum(float *x,int n) {
// float sum=0.0;
// for(int i=0;i<n;i++){
// sum+=x[i];
// }
// return sum;
//}
import "C"
import "fmt"
func main() {
x := []C.float{10.0, 20.0, 30.0, 40.0,50.0,60.0,70.0,80.0,90.0,100.0}
a:=C.cal_sum((*C.float)(&x[0]),(C.int)(len(x)))
fmt.Println("sigma x=",a)
}
配列を渡して平均を求める。(float *)版
avr.go
package main
// float cal_sum(float *x,int n) {
// float sum=0.0;
// for(int i=0;i<n;i++){
// sum+=x[i];
// }
// return sum/n;
//}
import "C"
import "fmt"
func main() {
x := []C.float{10.0, 20.0, 30.0, 40.0,50.0,60.0,70.0,80.0,90.0,100.0}
a:=C.cal_sum((*C.float)(&x[0]),(C.int)(len(x)))
fmt.Println("avr a=",a)
}
>go run avr.go
avr a= 55
CGOは、なかなか便利な仕組みです。
- C言語が使えれば容易にI/Oなどにアクセスするインターフェースを書くことができる。