質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Go

Go(golang)は、Googleで開発されたオープンソースのプログラミング言語です。

Q&A

解決済

1回答

1025閲覧

Colabでgolangのcgoを使いたい。

owl_ddbb

総合スコア7

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Go

Go(golang)は、Googleで開発されたオープンソースのプログラミング言語です。

0グッド

0クリップ

投稿2021/01/29 08:33

colabでgolangのcgoをつかいたいのですがえらーがでてしまいます。
command-line-arguments
./main.go:3:11: fatal error: conio.h: No such file or directory
// #include <conio.h>
^~~~~~~~~
compilation terminated.

何が原因かおしえてください。

%%writefile main.go
package main

// #include <conio.h>
// #include <stdio.h>
import "C"
import (
"fmt"
"time"
)

func mainLoop() {
// ループミリ秒
var loopms time.Duration = 33
// タイマ作成
timer := time.NewTimer(loopms * time.Millisecond)

// メインループ
for {
select {
case <-timer.C:
timer = time.NewTimer(loopms * time.Millisecond)
// 入力
// C言語の関数を使用
str := ""
if C.kbhit() != 0 {
str = string(C.getche())
}
break
}
}
}

// メイン関数
func main() {
mainLoop()
}

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

nobonobo

2021/01/31 23:39

conio.hがみつからないのが原因なのでconio.hをインストールする方法を検討してください。 それでも解決しそうになければOS環境などの情報追記が必要だと思います。
nobonobo

2021/02/01 05:23

ああ、環境が「Google-Colaboratry」なんですね。conio.hはMS-DOS由来のヘッダーファイルです。Google-ColaboratryはLinux(debian?)ベースなのでそのヘッダーファイルは存在しないと思います。
owl_ddbb

2021/02/01 09:34

sudo apt-get update sudo apt-get install ncurses-devを行いましたが同じでした。 これではないのでしょうか?
owl_ddbb

2021/02/01 09:36

could not determine kind of name for C.getche このようなエラーがでます。
nobonobo

2021/02/01 10:07

conio.hは存在がなく配布もされていませんのでインストールも不可能だと思います。 curses.hまたはncurses.hにgetch()関数の定義はあるのでこちらをお使いください。 getche()はconio.h特有の定義なので使えません。
nobonobo

2021/02/01 10:22

もう少し踏み込んでアドバイスすると、目的の「コンソールから1文字入力」処理を提供するサードパーティライブラリを使い、CGOの利用自体を避けることをお勧めします。
owl_ddbb

2021/02/01 11:55

C.kbhit()もgetchと同じようなものがあるのでしょうか?
nobonobo

2021/02/01 12:08

kbhit相当は無いですが、goroutineとchanとで待ち受けすることができます。
guest

回答1

0

ベストアンサー

conio.hはMS-DOSまたはWindows以外には存在しません。
Colabはdebian-linuxの上で動作しています。
OSに合わせた実装に修正が必要です。

以下の情報を参考にしてみてください。

https://stackoverflow.com/questions/7469139/what-is-the-equivalent-to-getch-getche-in-linux

おすすめ追記

Cの資産に詳しい方ならCGOでも良いと思うのですが、そうでないなら
以下の様にサードパーティライブラリを使うことをお勧めします。

さらに、kbhit()相当は存在しないので、
「goroutineとchanでブロックするgetch.Getch()を非同期処理に変換」します。
以下の様に書くとtimerと並行してキー入力を受け付けることができます。
(おまけでNewTimerをなんども呼ぶよりはNewTickerを使うほうがリソースに優しいです。)

go

1package main 2 3import ( 4 "fmt" 5 "time" 6 7 "github.com/wzshiming/getch" 8) 9 10func main() { 11 input := make(chan string) 12 go func() { 13 for { 14 r, _, _ := getch.Getch() 15 input <- string(r) 16 } 17 }() 18 timer := time.NewTicker(1000 * time.Millisecond) 19 for { 20 select { 21 case <-timer.C: 22 fmt.Println("tick!") 23 case v := <-input: 24 fmt.Println("input:", v) 25 return 26 } 27 } 28}

追記:Colabの制約

どのみちColabでは「RAWモードな標準入力」は使えない様です。
conio.h相当を再現するライブラリを持ってしても結局のところはColabの実行画面が対応できません。

Colabの実行画面で標準入力を読もうとするとテキスト入力フォームが現れ、
「改行を契機」に標準入力に投げ込むことしかできません。
つまり、普通にos.Stdinを「改行を契機」に読むしかできません。
以下の様な使い方でどうぞ。
(この方法だともちろん文字入力ごとに何かをするということはできません。)

go

1s := bufio.NewScanner(os.Stdin) 2s.Scan() 3fmt.Println(s.Text())

そもそもColabは主にPython向けの環境なのでGoを試す場としては向かないし、
GoやCGOを動かすのもあまりColagサービスの想定とは
ズレていてコンパイルできたり動かしたりできたのはたまたまだと思います。

投稿2021/02/01 05:27

編集2021/02/05 02:22
nobonobo

総合スコア3367

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問