7: 2009-11-20 (金) 20:14:07 sho | 8: 2009-11-24 (火) 20:09:36 sho | ||
---|---|---|---|
Line 1: | Line 1: | ||
*C言語の基礎 [#qde98ab5] | *C言語の基礎 [#qde98ab5] | ||
このページではFREEDOMライブラリを使用した場合のC言語について説明をします。~ | このページではFREEDOMライブラリを使用した場合のC言語について説明をします。~ | ||
- | 通常のC言語と若干異なる場合があります。 | + | 通常のC言語と若干異なる場合があります。~ |
+ | |||
+ | Chapter2以降で、このページで紹介されているC言語の用語や制御文が初めて出てきた箇所には、このページへのリンクがあります。~ | ||
**基本 [#o84a22ef] | **基本 [#o84a22ef] | ||
Line 10: | Line 12: | ||
2進数は0,1と増えて行くと、次は桁が上がって10になります。 | 2進数は0,1と増えて行くと、次は桁が上がって10になります。 | ||
+ | | 10進数 | 2進数 | | ||
+ | | 0 | 0 | | ||
+ | | 1 | 1 | | ||
+ | | 2 | 10 | | ||
+ | | 3 | 11 | | ||
+ | | 4 | 100 | | ||
+ | | 5 | 101 | | ||
+ | | 6 | 110 | | ||
+ | | 7 | 111 | | ||
+ | | 8 | 1000 | | ||
+ | | 9 | 1001 | | ||
+ | | 10 | 1010 | | ||
***ビット・バイト [#y24bb3d4] | ***ビット・バイト [#y24bb3d4] | ||
コンピュータの世界では2進数で表されことがありますが、その最小単位をビットと言います。~ | コンピュータの世界では2進数で表されことがありますが、その最小単位をビットと言います。~ | ||
またビットが8個で1バイトとなります。 | またビットが8個で1バイトとなります。 | ||
+ | #ref(bitbyte.png,100%) | ||
+ | 1バイトで表すことができる数値は10進数だと0~255です。 | ||
***変数 [#ib843ca5] | ***変数 [#ib843ca5] | ||
変数は数値や文字を置いておく入れ物です。~ | 変数は数値や文字を置いておく入れ物です。~ | ||
- | 使い始める前に「このようなデータを入れるこんな名前の入れ物を使います」と宣言しなければなりません。 | + | 変数を使い始める前に「このようなデータを入れるこんな名前の入れ物を使います」と宣言しなければなりません。 |
#ref(variable1.png,100%) | #ref(variable1.png,100%) | ||
「int型のデータを入れるaという名前の入れ物を使います」と宣言しています。 | 「int型のデータを入れるaという名前の入れ物を使います」と宣言しています。 | ||
int型というのは4バイトの整数という意味です。~ | int型というのは4バイトの整数という意味です。~ | ||
- | ※システムによっては異なる場合があります | + | |
#ref(variable2.png,100%) | #ref(variable2.png,100%) | ||
a=24; | a=24; | ||
Line 52: | Line 68: | ||
その他に以下の演算子があります。 | その他に以下の演算子があります。 | ||
- | 基本的な演算子で書き換えることもですが、プログラムを見易く、短くするために以下を使います。 | + | 基本的な演算子で書き換えることもできますが、プログラムを見易く、短くするために使います。 |
| 演算子 | 使用例 | 基本演算子で表すと | | | 演算子 | 使用例 | 基本演算子で表すと | | ||
| += | a+=b | a=a+b | | | += | a+=b | a=a+b | | ||
Line 73: | Line 89: | ||
| != | a!=b | aとbは等しくない | | | != | a!=b | aとbは等しくない | | ||
- | 例えば「もしa<bだったら、a++する」という制御文を書いた場合、a=3,b=4ならa++されますが、a=4,b=4なら何もされません。 | + | 例えば「もしa<bだったら、a++する」という制御文を書いた場合、a=3,b=4ならa<bが成り立ちa++されますが、a=4,b=4ならa<bが成り立たないので何もされません。 |
***論理演算子 [#k2bb26ac] | ***論理演算子 [#k2bb26ac] | ||
Line 81: | Line 97: | ||
| && | 3<=a && a<=8 | aは3以上かつ8以下 | | | && | 3<=a && a<=8 | aは3以上かつ8以下 | | ||
| ! | !(a==5) | aは5ではない | | | ! | !(a==5) | aは5ではない | | ||
- | || a<3 || 8<a aは3未満または8より大きい | + | | || | a<3 || 8<a | aは3未満または8より大きい | |
+ | ※ || は半角です。 | ||
***fd_printf文 [#ua9b7908] | ***fd_printf文 [#ua9b7908] | ||
文字や変数の値などを表示する時に使います。~ | 文字や変数の値などを表示する時に使います。~ | ||
通常のC言語ではprintfと書きますが、FREEDOMライブラリではfd_printfと書きます。 | 通常のC言語ではprintfと書きますが、FREEDOMライブラリではfd_printfと書きます。 | ||
#ref(printf1.png,100%) | #ref(printf1.png,100%) | ||
- | fd_printfの()内の"に挟まれた文字をそのまま表示しています。 | + | fd_printfの () 内の " に挟まれた文字をそのまま表示しています。 |
---- | ---- | ||
#ref(printf2.png,100%) | #ref(printf2.png,100%) | ||
- | aという変数の値を表示しています。変数の値は" "内の%dの部分に表示されます。%dの部分に何を表示するかを" "の後に,で区切って書きます。~ | + | aという変数の値を表示しています。変数の値は " " 内の %d の部分に表示されます。%d の部分に何を表示するかを " " の後に , で区切って書きます。~ |
- | %dは整数を表示します。その他に以下があります。~ | + | %d は整数を表示します。その他に以下があります。~ |
|%d|整数を10進数で表示|5, -17 など| | |%d|整数を10進数で表示|5, -17 など| | ||
|%c|文字|'G' など| | |%c|文字|'G' など| | ||
Line 96: | Line 114: | ||
|%o|整数を8進数で表示|12, 23 など| | |%o|整数を8進数で表示|12, 23 など| | ||
|%b|整数を2進数で表示|10, 1011 など| | |%b|整数を2進数で表示|10, 1011 など| | ||
- | |%u|整数を符号なし10進数で表示|37,2093 など| | + | |%u|整数を符号なし10進数で表示|37, 2093 など| |
|%x|整数を16進数で表示|1A, B89E など| | |%x|整数を16進数で表示|1A, B89E など| | ||
---- | ---- | ||
#ref(printf3.png,100%) | #ref(printf3.png,100%) | ||
- | %とdの間に数値を入れるとその桁数で表示します。空いている桁にはスペースが入れられます。~ | + | % と d の間に数値を入れるとその桁数で表示します。空いている桁にはスペースが入れられます。~ |
- | さらに数値の前に0を付けると空いている桁には0が入れられます。~ | + | さらに数値の前に 0 を付けると空いている桁には 0 が入れられます。~ |
\n | \n | ||
Line 108: | Line 126: | ||
\r | \r | ||
と書くと復帰(同じ行の頭から再び表示する)になります。 | と書くと復帰(同じ行の頭から再び表示する)になります。 | ||
+ | |||
+ | ***アドレス [#b45fcfd3] | ||
+ | アドレスとは変数がコンピュータのメモリのどこにあるかを指します。 | ||
+ | その名の通りコンピュータ上の住所のようなものです。~ | ||
+ | &a | ||
+ | と書くと変数aのアドレスとなります。 | ||
+ | int a, b = 3; | ||
+ | a = &b; | ||
+ | aには3ではなく、bのアドレスの値が入れられます。 | ||
**制御文 [#b3400d86] | **制御文 [#b3400d86] | ||
Line 115: | Line 142: | ||
「もし○○だったら△△する」というif文です。~ | 「もし○○だったら△△する」というif文です。~ | ||
- | ()内の条件が成り立っている時は{}内の処理を実行します。成り立っていない時は何もしません。 | + | () 内の条件が成り立っている時は {} 内の処理を実行します。成り立っていない時は何もしません。 |
main() { | main() { | ||
int a =10; | int a =10; | ||
Line 123: | Line 150: | ||
} | } | ||
} | } | ||
- | もし変数aが5より大きかったらaから1引くというプログラムです。 | + | もし変数aが5より大きかったら a から1引くというプログラムです。aは10なのでa>5が成り立っており、aから1が引かれます。 |
---- | ---- | ||
#ref(if2.png,100%) | #ref(if2.png,100%) | ||
「もし○○だったら△△する。それ以外だったら□□する」というif文です。~ | 「もし○○だったら△△する。それ以外だったら□□する」というif文です。~ | ||
- | ()内の条件が成り立っている時はその直後の{}内の処理を実行し、成り立っていない時はelse後の{}内の処理を実行します。 | + | () 内の条件が成り立っている時はその直後の {} 内の処理を実行し、成り立っていない時はelse後の {} 内の処理を実行します。 |
main() { | main() { | ||
- | int a =10; | + | int a =3; |
if (a > 5) { | if (a > 5) { | ||
Line 139: | Line 166: | ||
} | } | ||
} | } | ||
- | もし変数aが5より大きかったらaから1引いて、それ以外(aが5以下)なら1足すというプログラムです。 | + | もし変数a が5より大きかったら a から1引いて、それ以外(aが5以下)なら1足すというプログラムです。a は3なので a>5 は成り立たずelse内の a に1足すが実行されます。 |
---- | ---- | ||
#ref(if3.png,100%) | #ref(if3.png,100%) | ||
「もし○○だったら△△する、それ以外でもし●●だったら□□する、更にそれ以外は■■する」というif文です。~ | 「もし○○だったら△△する、それ以外でもし●●だったら□□する、更にそれ以外は■■する」というif文です。~ | ||
- | 最初のifの()内の条件が成り立っている時はその直後の{}内の処理を実行し、成り立っていない時は次のelse ifへ行きます。else ifの()内の条件が成り立っている時はその直後の{}内の処理を実行し、成り立っていない時はelse後の{}内の処理を実行します。 | + | 最初のifの () 内の条件が成り立っている時はその直後の {} 内の処理を実行し、成り立っていない時は次のelse ifへ行きます。else ifの () 内の条件が成り立っている時はその直後の {} 内の処理を実行し、成り立っていない時はelse後の {} 内の処理を実行します。~ |
+ | else ifは複数書くことができます。 | ||
main() { | main() { | ||
- | int a =10; | + | int a = -3; |
if (a > 5) { | if (a > 5) { | ||
Line 158: | Line 186: | ||
} | } | ||
} | } | ||
- | もし変数aが5より大きかったらaから1引いて、それ以外(aが5以下)でaが0より小さかったらaに0を代入して、更にそれ以外(aは0以上,5以下)ならaに1足すというプログラムです。 | + | もし変数a が5より大きかったら a から1引いて、それ以外(aが5以下)でかつ a が0より小さかったら a に0を代入して、更にそれ以外(aは0以上,5以下)なら a に1足すというプログラムです。~ |
+ | a は-3なので a>5 は成り立たず、else ifの a<0 が成り立ち、aは0になります。 | ||
***for文 [#l1911408] | ***for文 [#l1911408] | ||
Line 166: | Line 195: | ||
事前にカウンタを変数として宣言しておきます。 | 事前にカウンタを変数として宣言しておきます。 | ||
- | 処理を行うごとにカウンタが0,1,2,3,4と増え5になったら繰返しを止めます。~ | + | 処理を行うごとにカウンタが0,1,2,3,4と増え5になったら繰返しを止めます。つまり5回同じ処理を繰り返します。~ |
i++はi=i+1と同じ意味です。 | i++はi=i+1と同じ意味です。 | ||
main() { | main() { | ||
Line 178: | Line 207: | ||
***while文 [#of5e8829] | ***while文 [#of5e8829] | ||
- | 同じ処理を繰り返す時に使います。for文との違いは、繰り返す回数が決まっていない時に使うということです。 | + | 同じ処理を繰り返す時に使います。for文との違いは、繰り返す回数が定かではない時に使うということです。 |
#ref(while1.png,100%) | #ref(while1.png,100%) | ||
- | ()内の条件が成り立っている間は処理を繰り返し実行し、条件が成り立たなくなったら繰返しを止めます。 | + | () 内の条件が成り立っている間は処理を繰り返し実行し、条件が成り立たなくなったら繰返しを止めます。 |
main() { | main() { | ||
- | int i; | + | int i = 1; |
while (i < 1000) { | while (i < 1000) { | ||
Line 195: | Line 224: | ||
「変数・式が値1なら処理Aを実行、値2なら処理Bを実行、どれにも当てはまらなければ処理Cを実行する」というswitch文です。~ | 「変数・式が値1なら処理Aを実行、値2なら処理Bを実行、どれにも当てはまらなければ処理Cを実行する」というswitch文です。~ | ||
- | switch文の()内の変数又は式の値がcaseの後の値と同じならその直後の処理を行います。処理後はbreak;を書きましょう。忘れるとそのまま次の処理も行ってしまいます。defaultはどれにも当てはまらない場合です。 | + | switch文の () 内の変数又は式の値がcaseの値と同じならその直後の処理を行います。~ |
+ | 処理後はbreak;を書きます。忘れるとそのまま次の処理も行ってしまいます。~ | ||
+ | defaultはどれにも当てはまらない場合です。 | ||
main() { | main() { | ||
char c = '+'; | char c = '+'; | ||
Line 211: | Line 242: | ||
} | } | ||
} | } | ||
- | cが+ならmとnをたしてaに代入、cが-ならmからnを引いてaに代入、それ以外ならaに0を代入するというプログラムです。 | + | cが+ならmとnをたしてaに代入、cが-ならmからnを引いてaに代入、それ以外ならaに0を代入するというプログラムです。~ |
+ | cは+なのでaはm+nになります。~ | ||
+ | |||
+ | **関数 [#e7352b10] | ||
+ | 関数とは、パラメータを入れると何かしらの処理を行って結果を吐き出す箱です。~ | ||
+ | ***FREEDOMライブラリの関数 [#ybc328ea] | ||
+ | FREEDOMライブラリの関数は予め箱が用意されているので、箱の中身を気にせずに使う事ができます。~ | ||
+ | |||
+ | #ref(function1.png,100%) | ||
+ | |||
+ | パラメータは引数、結果は戻り値と言います。引数や戻り値がない関数もあります。~ | ||
+ | |||
+ | fd_DXWriteWordData (1, 34, 100); | ||
+ | Dynamixelに指令を送る関数です。~ | ||
+ | fd_DXWriteWordDataは関数名です。~ | ||
+ | () 内に3つの引数を入れます。~ | ||
+ | 戻り値はtrue(送信成功), false(送信失敗)です。~ | ||
+ | fd_DXWriteWordDataを呼び出し引数を与えるだけで、Dynamixelが指令通りに動きます。fd_DXWriteWordDataの詳細は後で紹介します。 | ||
+ | |||
+ | **プログラムの書き方 [#y8e712e1] | ||
+ | プログラムは唯でさえ英語が並んで読みにくいものです。暫くたって読み返す時や他人に見せる時に分かりやすいように書く必要があります。~ | ||
+ | また自分で書き方を統一して書くと更に分かりやすくなります。 | ||
+ | |||
+ | ***インデント(字下げ) [#a80eec80] | ||
+ | void main (void) { | ||
+ | int i; | ||
+ | for (i = 0, i < 5; i++){ | ||
+ | if (i > 3){ | ||
+ | fd_printf("%d\n",i); | ||
+ | } | ||
+ | } | ||
+ | while(1){ | ||
+ | i++; | ||
+ | } | ||
+ | } | ||
+ | 各関数内にインデントを付け、階層化することで、それぞれの関数の開始位置と終了位置が分かりやすくなります。 | ||
[[FDIII-HC Starter Kit Guid]]に戻る | [[FDIII-HC Starter Kit Guid]]に戻る |