*C言語の基礎 [#qde98ab5] このページではFREEDOMライブラリを使用した場合のC言語について説明をします。~ 通常のC言語と若干異なる場合があります。~ Chapter2以降で、このページで紹介されているC言語の用語や制御文が初めて出てきた箇所には、このページへのリンクがあります。~ **基本 [#o84a22ef] ***2進数 [#ea68bb60] 私たちが普段使っているのは10進数です。 0から9まで増えて行くと、次は桁が上がり10になります。~ コンピュータでは2進数や16進数で表されることがあります。 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] コンピュータの世界では2進数で表されことがありますが、その最小単位をビットと言います。~ またビットが8個で1バイトとなります。 #ref(bitbyte.png,100%) 1バイトで表すことができる数値は10進数だと0~255です。 ***変数 [#ib843ca5] 変数は数値や文字を置いておく入れ物です。~ 変数を使い始める前に「このようなデータを入れるこんな名前の入れ物を使います」と宣言しなければなりません。 #ref(variable1.png,100%) 「int型のデータを入れるaという名前の入れ物を使います」と宣言しています。 int型というのは4バイトの整数という意味です。~ #ref(variable2.png,100%) a=24; は変数aに24という整数を入れることになります。 ***データ型 [#n1ebdc94] 変数を宣言する際にはどのようなデータなのかを言う必要がありました。 この「どのようなデータなのか」というのを型と言います。 型には以下があります。 |char|1バイト|-128~127| |unsigned char|1バイト|0~255| |short|2バイト|-32768~32767| |unsigned short|2バイト|0~65535| |long|4バイト|-2147483648~2147483647| |unsigned long|4バイト|0~4294967295| |int|4バイト|-2147483648~2147483647| |unsigned int|4バイト|0~4294967295| ***演算子 [#reb3a365] 基本的な演算子には以下があります。 | 演算子 | 意味 | 使用例 | | = | 右辺を左辺に代入 | a=b | | + | 足し算 | c=a+b | | - | 引き算 | c=a-b | | * | 掛け算 | c=a*b | | / | 割り算 | c=a/b | | % | 割り算の余り | c=a%b | 算数でa=bは、aとbは同じという意味です。しかしC言語ではa=2でb=3の時にa=bとす ると、aにbの値が代入されa、b両方とも3になります。 その他に以下の演算子があります。 基本的な演算子で書き換えることもできますが、プログラムを見易く、短くするために使います。 | 演算子 | 使用例 | 基本演算子で表すと | | += | a+=b | a=a+b | | -= | a-=b | a=a-b | | *= | a*=b | a=a*b | | /= | a/=b | a=a/b | | %= | a%=b | a=a%b | | ++ | a++ | a=a+1 | | -- | a-- | a=a-1 | ***比較演算子 [#j7650a08] 比較演算子は後で説明する制御文の条件になります。 | 比較演算子 | 使用例 | 意味 | | == | a==b | aとbは等しい | | ''<'' | a<b | aはbより小さい | | ''>'' | a>b | aはbより大きい | | <= | a<=b | aはb以下 | | >= | a>=b | aはb以上 | | != | a!=b | aとbは等しくない | 例えば「もしa<bだったら、a++する」という制御文を書いた場合、a=3,b=4ならa<bが成り立ちa++されますが、a=4,b=4ならa<bが成り立たないので何もされません。 ***論理演算子 [#k2bb26ac] いくつかの条件を組み合わせる時に使用します。 | 論理演算子 | 使用例 | 意味 | | && | 3<=a && a<=8 | aは3以上かつ8以下 | | ! | !(a==5) | aは5ではない | | || | a<3 || 8<a | aは3未満または8より大きい | ※ || は半角です。 ***fd_printf文 [#ua9b7908] 文字や変数の値などを表示する時に使います。~ 通常のC言語ではprintfと書きますが、FREEDOMライブラリではfd_printfと書きます。 #ref(printf1.png,100%) fd_printfの () 内の " に挟まれた文字をそのまま表示しています。 ---- #ref(printf2.png,100%) aという変数の値を表示しています。変数の値は " " 内の %d の部分に表示されます。%d の部分に何を表示するかを " " の後に , で区切って書きます。~ %d は整数を表示します。その他に以下があります。~ |%d|整数を10進数で表示|5, -17 など| |%c|文字|'G' など| |%s|文字列|"Hello" など| |%o|整数を8進数で表示|12, 23 など| |%b|整数を2進数で表示|10, 1011 など| |%u|整数を符号なし10進数で表示|37, 2093 など| |%x|整数を16進数で表示|1A, B89E など| ---- #ref(printf3.png,100%) % と d の間に数値を入れるとその桁数で表示します。空いている桁にはスペースが入れられます。~ さらに数値の前に 0 を付けると空いている桁には 0 が入れられます。~ \n は改行です。その他に \r と書くと復帰(同じ行の頭から再び表示する)になります。 ***アドレス [#b45fcfd3] アドレスとは変数がコンピュータのメモリのどこにあるかを指します。 その名の通りコンピュータ上の住所のようなものです。~ &a と書くと変数aのアドレスとなります。 int a, b = 3; a = &b; aには3ではなく、bのアドレスの値が入れられます。 **制御文 [#b3400d86] ***if文 [#c6144380] if文は「もし○○だったら△△する。それ以外だったら□□する」というような、条件によって実行することを分ける時に使います。 #ref(if1.png,100%) 「もし○○だったら△△する」というif文です。~ () 内の条件が成り立っている時は {} 内の処理を実行します。成り立っていない時は何もしません。 main() { int a =10; if (a > 5) { a = a - 1; } } もし変数aが5より大きかったら a から1引くというプログラムです。aは10なのでa>5が成り立っており、aから1が引かれます。 ---- #ref(if2.png,100%) 「もし○○だったら△△する。それ以外だったら□□する」というif文です。~ () 内の条件が成り立っている時はその直後の {} 内の処理を実行し、成り立っていない時はelse後の {} 内の処理を実行します。 main() { int a =3; if (a > 5) { a = a - 1; } else { a = a + 1; } } もし変数a が5より大きかったら a から1引いて、それ以外(aが5以下)なら1足すというプログラムです。a は3なので a>5 は成り立たずelse内の a に1足すが実行されます。 ---- #ref(if3.png,100%) 「もし○○だったら△△する、それ以外でもし●●だったら□□する、更にそれ以外は■■する」というif文です。~ 最初のifの () 内の条件が成り立っている時はその直後の {} 内の処理を実行し、成り立っていない時は次のelse ifへ行きます。else ifの () 内の条件が成り立っている時はその直後の {} 内の処理を実行し、成り立っていない時はelse後の {} 内の処理を実行します。~ else ifは複数書くことができます。 main() { int a = -3; if (a > 5) { a = a - 1; } else if (a < 0) { a = 0; } else { a = 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] 同じ処理を繰り返す時に使います。通常はカウンタを使って繰り返す回数を決めます。 #ref(for1.png,100%) 「iの初期値を0とし、iが5より小さい間は処理を繰り返す。ただし処理を1回行ったらiを1増やす。」というfor文です。~ 事前にカウンタを変数として宣言しておきます。 処理を行うごとにカウンタが0,1,2,3,4と増え5になったら繰返しを止めます。つまり5回同じ処理を繰り返します。~ i++はi=i+1と同じ意味です。 main() { int i, a = 1; for (i = 0; i < 5; i++) { a = a * 3; } } a×3を5回繰り返す(3の5乗を計算する)プログラムです。 ***while文 [#of5e8829] 同じ処理を繰り返す時に使います。for文との違いは、繰り返す回数が定かではない時に使うということです。 #ref(while1.png,100%) () 内の条件が成り立っている間は処理を繰り返し実行し、条件が成り立たなくなったら繰返しを止めます。 main() { int i = 1; while (i < 1000) { i = i * 2; } } i×2を繰り返し、iが1000より少ない状態でなくなったら(1000以上になったら)繰り返しを止めるというプログラムです。 ***switch文 [#x577fb19] 変数や式の値によって処理を分けるときに使用します。 #ref(switch1.png,100%) 「変数・式が値1なら処理Aを実行、値2なら処理Bを実行、どれにも当てはまらなければ処理Cを実行する」というswitch文です。~ switch文の () 内の変数又は式の値がcaseの値と同じならその直後の処理を行います。~ 処理後はbreak;を書きます。忘れるとそのまま次の処理も行ってしまいます。~ defaultはどれにも当てはまらない場合です。 main() { char c = '+'; int a, m = 5, n = 3; switch(c) { case '+': a = m + n; break; case '-': a = m - n; break; default: 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]]に戻る
(This host) = http://www.besttechnology.co.jp