[自己紹介][工学を学ぶ][電子工作][プログラミング入門]
C言語用簡易グラフィックライブラリを公開しました。
C言語によるプログラミング入門
このページでは担当した講義用に作成した資料等から抜粋してプログラミング(C言語)の入門用の資料を自習用に公開します。お役に立てれば幸いです。ただし、
- 公開資料・サンプルソースの無断再配布(有償・無償を問わず)
- 問題の解答例のインターネットでの公開(解答を導くまでの過程が非常に重要です)
をしないでください。このページへのリンクを張っていただいたり、メールで友人に知らせていただくのは、ご自由にどうぞ。なお、講義等で使いたいという奇特な方がいらっしゃればご連絡ください。また誤りやご感想があればお知らせください。
1 C言語入門
1.1 はじめに
講義では、開発環境として Windows PC 上の Code::Blocks を利用しました。以下に自習用として、配布資料と演習問題に必要なソースファイルを公開します。
1.2 少し遊んでみる
1.2.1 音を出して遊んでみる
押したキーによって違う音を出すプログラムを作ってみました。ex-beep.cです。ゲームのビープ音がします。キーと音の対応は、ソースファイルを眺めてください。
プログラムで使っている関数は以下の通りです。
- getch関数は押されたキーの文字を返す関数です。conio.hヘッダが必要です。
- Beep関数は音の高さ(周波数)と、長さ(時間, ミリ秒単位)を引数にとって音を出す関数です。windows.hヘッダが必要です。
- ex-beep.c では使っていませんが、Sleep関数は、長さ(時間, ミリ秒単位)を引数をとり、その長さだけプログラムを中断する関数です(windows.hヘッダが必要)。Sleep関数を使うと無音の待ちが作れます。
1.2.2 マウスカーソルで遊んでみる
マウスカーソルを移動させるプログラムを2つ作ってみました。ex-mouse.cとex-mouse2.cです。ex-mouse.cはプログラムを実行するとマウスカーソルを(0,0)(左上)に移動します。ex-mouse2.cはプログラムを実行中にマウスカーソルのx座標が1000を超えるとカーソルを左端に移動します。使用している関数は以下の通りです。
- SetCurosorPos関数は、引数で渡されたマウスカーソルの位置(x, y)にマウスカーソルをセットします。
- GetCursorInfo関数は、現在のマウスカーソルの位置を返します。引数には構造体のポインタを指定します。GetCursorInfoを呼び出す前にメンバ変数のcbSizeを0にします。
1.2.3 演習問題
- 演習1: Beep関数を3回以上呼ぶ関数(ドレミとドミソなど)を2つ以上つくり、押したキーによって、作成した関数を呼び出すプログラムを作りなさい
- 演習2: マウスの位置にあわせて、違う音が鳴るプログラムを書きなさい
- 目的:構造体について基本的な使い方(ポインタ渡し、メンバ変数の使い方)を覚える
- プログラムの例:画面を左右・上下に分割して4種類の音が鳴る
- 演習3: メロディ(3音以上)が流れるプログラムを作りなさい
1.3 自習用書籍
以下の本が役に立つのではないかと思います。
-
内田 智史 監修, システム計画研究所 編.
C言語によるプログラミング 基礎編(第2版), オーム社, 2001.
(入門者向け, サンプルが int main(void) となっていますが、コマンドライン引数を使うときは int main(int argc, char **argv)とするのが一般的です。ほかの本も読んでください。)
- 藤原 博文. C プログラミング診断室, 技術評論社, 2003. (中級者向け, プログラミングテクニックが分かります)
- B.W. カーニハン (著), D.M. リッチー (著), 石田 晴久 (翻訳). プログラミング言語C 第2版, 共立出版, 1989. (中級者向け, 復習にいいでしょう)
2.ODEで遊んでみよう
ODE は Open Dynamics Engine の略で、動力学計算(大学で習う剛体の運動計算)のライブラリです。物体の運動(等速直線運動、投下速度運動、回転など)の計算、衝突・摩擦の計算、グラフィカルな表示の3つのライブラリが収められています。ODEを使うと簡単に物理シミュレーションで、ゲーム(ボーリングやドミノなどなど)を作ることが出来ます。
2.1 ODE で遊んでみる
ODE を使って物理シミュレーションをする簡単なサンプルプログラムhello-ode.cppで遊んでみてください。実行すると赤いボールと青いボールが表示されます:
キーボードから以下の操作が出来ます。
- スペースで赤い球が運動(動力学計算)開始/停止
- j, k で赤い玉の x 座標を減/増
- r でリセット
うまい位置で赤いボールを落とすと、青いボールに衝突します。またウィンドウ内でマウスをクリックしドラッグすると視点が変わります(ODEのDrawStuffの機能)。
2.2 と 2.3 にインストールとコンパイル方法を書いています。以下が演習問題などです。
- サンプルプログラムについての説明
- 演習1
- hello-ode.cpp をダウンロードして、ビルド・実行してみる
- hello-ode.cpp の command 関数を変えて k で赤い球の y 座標を減らし l で赤い球の y 座標を増やすようにする
- hello-ode.cpp の CreateObjects 関数を変えて球の数を増やしてみる
- 演習2: hello-ode.cpp をもとにして、
- 球の数を 20 個以上に増やしなさい(配置は自由)
- 球の色を 5色以上に増やしなさい
- h, j, k, l で赤い玉がx軸とy軸方向(+/-)に動くこと
演習の目的は、for ループ、構造体の使い方、配列の受け渡し、メンバ変数の扱い方などを理解することです。
- 演習3
- 直方体など球以外の物体を作ってみる
- 力やトルクを加えてみる
- 高さに応じてボールの色を変えてみる
- fixed joint を使って物体を地面に固定してみる
- ボディのない板を作ってみる
- ヒンジジョイントを使ってみる
- その他のジョイントを使ってみる
上のサンプルや演習を基に、いろいろな物体(ボーリングのピンやドミノ、的、玉)を配置して操作できるようにしてみてください。すると、物体の運動や衝突判定などは ODE にお任せして、
ボーリング、ドミノ、射的、迷路などの物理シミュレーションを簡単に作成できます。
2.2 ODEのインストール
Code::Blocks を使った ODE の開発環境は、
http://demura.net/9ode/3850.html(出村先生の文章)の通りにすると準備できます。
- 補足1:ode-0.11.1.zip を展開したとき、ode-0.11.1 の中に ode-0.11.1 ができる場合があります。そのときは、内側の ode-0.11.1 を c:\ode-0.11.1 へコピーしてください。正しくコピーができれば c:\ode-0.11.1\build ができています。
- 補足2:コマンドプロンプトに、以下のような文字を入力した(打ち込んだ)後には、エンターキー(Enter キー)を押してください。scanf()関数と同じでエンターを押すまで何も起きません。
cd c:\ode-0.11.1\build
- 補足3:画面キャプチャに表示されている「c:\ode-0.1.11\build>」といった文字は、コマンドプロンプトが表示しているものです。入力する必要はありません。
2.3 Code::Blocks のプロジェクトの作り方
ODEをインストールしたディレクトリ (c:\ode-0.11.1) の中に myprogs というディレクトリを作ります。この作業は1回だけで OK です。「ディレクトリ」と「フォルダ」は同じものと思ってOKです。
c:\ode-0.11.1\myprogs の中に、プロジェクト用のディレクトリを作ります。新しいプロジェクト(プログラム)を作るときに毎回作ります。ディレクトリの名前は、英数字のみを使うこと。今回は hello というのを作ってみます。
ODE のライブラリを使うためのプロジェクトを作ります。Code::Blocks のプロジェクト作成の手順で作っても良いのですが、簡単に出来上がったものをコピーして使ってしまいます。
- template090611.zipをダウンロードして適当なディレクトリに展開します。
- 展開してできた template.cbp を先ほど作った hello ディレクトリ (c:\ode-0.11.1\hello) にコピーします。
コンパイルするプログラムをプロジェクトに登録します。ここでは hello.cpp を登録してみましょう。
hello.zipをダウンロードして、展開してできた hello.c を先ほどのディレクトリ (c:\ode-0.11.1\myprogs\hello) にコピーしておいてください。
ソースファイルの登録は次のようにします。
- template.cbp をダブルクリックして Code::Blocks を起動します。
- メニューから「プロジェクト」→「ファイルを追加」をクリックし、hello.cpp を追加します。
- いつも通り「ビルドして実行」ボタンを押せば、コンパイルが始まり実行されます。
ODE は C++ ですが、基本は C と変わらないので怖がる必要はありません :-)
上の手順で作ると template.exe というのが出来てしまいます。自分でつけた名前にするには次のようにします。
- Code::Blocks を起動する前に template.cbp と template.layout の名前を、適切な名前 hello.cbp と hello.layout に変えておきます。
- 「プロジェクト」→「プロパティ」をクリック
- 表示されたウィンドウの「プロジェクト設定」タブで、タイトルを template から、適切な名前、たとえば hello に変える
- 「ビルドターゲット」タブで、出力ファイル名が template.exe になっているので、適切な名前、たとえば hello.exe に変える
2.4 参考資料
ODE について、インターネットでは以下が参考になります。
3 その他のメモ
3.1 Code::Blocks のデバッグ機能がうまく動かない
Code::Blocks でデバッグ機能を使うことが、できない場合には以下を確認してみてください。
- プロジェクトを作成しているか
- プロジェクトのソースファイル(たとえばmain.c)を変更しているか(プロジェクト外でないか)
- ビルドは成功しているか(通常に実行できるか)
- プロジェクトのディレクトリ名はアルファベットのみか(デスクトップ、マイドキュメントは使わず、C:\src や D:\src などを使うこと)
デバッグ機能を使っていておかしくなったときは、タスクマネージャから gdb.exe をとめてみるとよい。
3.2 Code::Blocksと日本語文字
printf関数で日本語を使うと全部の文字が文字化けして表示されることがあります。そのときは、Code::Blocks のメニューの「編集」→「ファイルエンコーディング」で、「システムデフォルト」を選択して、「ファイル」→「保存」をクリックしてから、再度ビルド・実行してみてください。「保存」しないと、うまく変更が反映されないことがあるようなので、注意してください。
特定の文字がうまく表示できないのは、漢字コードの関係(shift-jisとgccの組み合わせ)です。簡単な対応方法はないので、その文字を使わないようにしてください。
3.3 ODEの衝突検出
ODEの衝突検出は、計算の高速化などのためか円柱(cylinder)同士の衝突や、円柱(cylinder)とカプセル(capsule)の衝突などが検出されません(すり抜けてしまう)。詳しくは次のページの表を見てください。
戻る
Copyright (c) 2009 Noriaki Mitsunaga
(本を出しました:
はじめてのPICアセンブラ入門 |
センサとデジカメで遊ぶ電子工作入門 |
玄箱PROと電子工作で遊ぼう
)