ホーム < ゲームつくろー! < IKD備忘録

Raspberry Pi
C++してみよう


 前章でVNCを使ってRaspberry Piのデスクトップ画面をWindows上で見る事ができるようになりました。これでRaspberry PiにキーボードやマウスやHDMI端子をごてごてと付けなくともRaspberry Piで遊べます。遊ぶというと、まープログラマの遊びはプログラムとなるわけです。



@ g++が入ってます

 家のRaspberry PiにはlinuxのディストリビューションであるRaspbianが入っています。linuxなのでgcc(GUN Compiler Collection)が標準で入っていて、C++のコンパイラであるg++が使えます。gccのウィキペディアはこちら。C++コンパイラがあればC++のコードからlinuxで動く実行ファイルが作れるわけです。

 ただ、実は私gccを殆ど使った事がありません。Visual Studioというぬくぬくの環境で育ったためgccの知識と耐性が限りなくゼロです。なので、色々調べて探りながら勉強する事になります。



A テキストエディタどうしよう

 プログラムを書くからにはテキストエディタが必要です。Raspberry PiにはLeafpadというテキストエディタが入っていますが、んーさすがに力不足な感が否めません。じゃぁどうしようとなるわけです。linuxのテキストエディタというと「vi」やその拡張版である「vim」が有名です。これから色々なlinux環境を触る時にテキスト編集に困らないよう、ここはvimに慣れておこうかなと思います。Raspberry Piのターミナル上で「vi」と打つと、次のような力強いVIMの画面が立ちあがりました:

「:q」と打つとexit(終了)とあるので「:q」と打ちます…:

終わりました(^-^;。起動と終了、これで大丈夫。

 では、ホームディレクトリに「prj/sandbox/test」というフォルダを作って、そこにmain.cppの空テキストを作る事にします。ホームは「~」で、ディレクトリを作るのは「mkdir(make directory)」にパスを指定すればOKのはず:

mkdir ~/prj/sandbox/test

おっと、「mkdir: cannot create directory ~/home/pi/sandbox/test': No such file or directory」、ディレクトリが作れないというエラーが出ました。一度に深いパスを作るのは駄目だと言う事ね。じゃあ一つずつディレクトリを作りましょう:

mkdir ~/prj
mkdir ~/prj/sandbox
mkdir ~/prj/sandbox/test

今度は何も文句を言われませんでした。本当に出来たかtestフォルダに飛んでみます。フォルダ移動は「cd」です:

cd ~/prj/sandbox/test

飛べました(^-^)。ディレクトリがちゃんと作られたようです。んでは、ここにmain.cppを新規で作ります。新規でテキストファイルを作るのはvimで「:e」という事なので、vimを再度起動して「:e main.cpp」としてみよう:

:e main.cpp

何か新しくなったんですが、ファイルは作られているのかな?testフォルダの中をリストコマンド(ls)で見てみましょう:

お、何も無い。つまりまだmain.cppは出来て無いという事です。ではvimで保存をしましょう。保存は「:w」(write)のようです。保存後改めてlsで確認すると:

出来てます(^-^)。一度出来たテキストファイルを開くには、

vi main.cpp

です。よし、これで新規作成、保存、開くが出来ました。



B vimを意識しつつHello World

 vimで作ったmain.cpp。今は空テキストなので何も表示されていません。ではべたではありますが「Hello World」なC言語なプログラムを作る事にします。vimはコマンド入力をする「ノーマルモード」とテキストを挿入する「挿入モード」など、モードを意識する事が大切のようです。困った時にはescをたたたっと連打すればノーマルモードに戻ります。ノーマルモード時に「i」で挿入モードになります。esc⇔i…よし。

 挿入モードにして、abcdeと打ってみる:

お、テキスト編集できる。じゃ、消すにはBackSpace…おおぅ消えない(^-^;;;。カーソルが左に移動しただけでした:

なるほど、テキストを消すにはdeleteキーのようです。カーソルを移動するのはノーマルモードで「h,j,k,l」キー。りょ、了解…(訓練中)…。じゃ、じゃあ、本番。

 挿入モードで

int main() {
    printf( "Hello World" );
    return 0;
}

と入力。インデントはもちろん利かないのでTabで(Tabはちゃんと入る)。その後escキーをたたた(笑)。vimって常にノーマルモードに戻したくなるね。面白いです(^-^)。wで保存。qで終了。よし!…一応もう一度「vi main.cpp」で開いてみる…うん、ちゃんと保存されてる。じゃあ、これをコンパイルだ。



C g++でコンパイル

 Visual Studioの生温い環境でぬくぬくと育つとコマンドラインコンパイルも怪しくなります(^-^;。えーと、コンパイルの仕方は…(調査中)、なるほど、ターミナル上で、

g++ main.cpp

でとりあえず出来るようです。で、コンパイルしてみると:

コンパイルエラーがちゃんと出た(^-^)。あー、「printfなんて知らん」と言われてるのね。そりゃそーだ、stdio.hをインクルードしてない。再びvimでmain.cppを開く。行頭にヘッダーのインクルード文を追加したいんですが、ノーマルモードで空行挿入は…(調査中)、「o」か「O」ね。「o」で現在のカーソル位置の下に1行追加して入力モードに切り替えてくれる。「O」だとカーソルの上に挿入と。了解、「o」をぽちっ…:

違う、これ下挿入(=▽=;。えーと、「アンドゥ」はどうするんだ…(調査中)、「u」ね!リドゥは「Ctrl + r」、了解。んじゃ「u」してから今度は間違えずに「O」:

なるほどなぁ。vimというのは「ノーマルモードがホームポジション」なんだねぇ。Windowsのメモ帳などは「入力モード」が基準だから、vimでついつい入力モードにしちゃうけど、それは違う。この意識がvimを使うのに極めて大切なんだなぁ。

 んと、stdio.hのインクルードが足りなかったから行頭に追加(#include "stdio.h")。ターミナルに戻ってg++でmain.cppをコンパイル。…よし、コンパイラからの文句はありませんでした:

ん?で、どうなんだろう?何かが出来てるのかな?lsでtestフォルダ下をチェック:

「a.out」!お、んー…(調査中)…Wikipediaがあるね(a.outフォーマット)。どうやらUNIXの実行ファイルとの事。じゃ、これ、実行できるのかな?:

できねーじゃん(T-T)。Wikipediaを良く読むと「UNIXの実行ファイル及びリンク可能ファイルのファイルフォーマットである」とあります。んー、実行出来ても良さそうなのに…。(調査中)…、ぐぁ!なるほど。linuxのコマンドラインでは、現在のフォルダ(ディレクトリ)にあるファイルを実行するには、

./a.out

と現在のフォルダを明示的に指定する必要があると!なるほど!じゃぁ、上のように打ち直して再実行すると…:

出た!「Hello World」!でも改行が入って無い、あっはは…orz。

 まぁ、とにかく、Raspberry Pi上で何も無い所からvimを使ってコードを書いて、g++を使ってコンパイルして実行可能ファイルa.outが出来て、実際に実行してHello Worldが出た。これは大きな一歩ですね。



D まとめ

 ここで覚えた事を箇条書きにしておきます:

・ linuxにはテキストエディタであるvimがある。
・ vimは「ノーマルモードがホームポジション」(重要)
・ ファイルの新規作成は「:e hoge.txt」など
・ 保存は「:w」
・ vim終了は「:q」
・ カーソル移動は「h,j,k,l」。これは慣れよう。
・ deleteで文字を消せる
・ 「o」で下に一行追加。「O」で上に一行追加。
・ 「u」でアンドゥ。「Ctrl + r」でリドゥ。
・ Raspberry PiのRaspbianにはgccが入っていて、C++のコンパイラ「g++」もある
・ g++でコンパイルするには「g++ main.cpp」。すると「a.out」という実行可能ファイルが生成される。
・ 実行可能ファイルを実行するには、パスを明示する必要がある。「
./a.out」。

 うん、結果的には色々やれた章でした(^-^)。次はC++の流儀に則って、自分のヘッダーファイルでクラス宣言、.cppで実装してみよう。