1
0

More than 3 years have passed since last update.

眺めて覚えるGo言語 その7 GO言語の中にC言語

Posted at

GO言語の中にC言語を書いてみよう。

準備 GCCをインストールしておきます。

  • Windows 10 64bitの場合
  • mingw-w64-install.exeをインストールします。 image.png 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などにアクセスするインターフェースを書くことができる。
1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0