4: 2009-11-19 (木) 12:22:09 sho | 現: 2011-02-02 (水) 19:28:16 eid7gud | ||
---|---|---|---|
Line 1: | Line 1: | ||
+ | TITLE:FDIII-HC Starter Kit Guide Chapter1.4 | ||
+ | *C言語の基礎 [#qde98ab5] | ||
+ | このページではFREEDOMライブラリを使用した場合のC言語について説明をします。~ | ||
+ | 通常のC言語と若干異なる場合があります。~ | ||
+ | |||
+ | Chapter2以降で、このページで紹介されているC言語の用語や制御文が初めて出てきた箇所には、このページへのリンクがあります。~ | ||
+ | |||
**基本 [#o84a22ef] | **基本 [#o84a22ef] | ||
- | ***2進数 [#ea68bb60] | + | ***2進数・16進数 [#ea68bb60] |
- | 私たちが普段使っているのは10進数です。 | + | 私たちが普段使っている数の数え方は10進数です。 |
+ | 0,1,2,3,4…と増えてゆき、9の次は桁が上がって10になります。~ | ||
+ | コンピュータでは2進数や16進数といった異なる基数で表されることがあります。 | ||
+ | たとえば2進数は0,1…と増えて行くと、1の次は桁が上がって10になります。~ | ||
+ | 下表は10進数・2進数・16進数の対応表です。 | ||
+ | | 10進数 | 2進数 | 16進数 | | ||
+ | | 0 | 0 | 0 | | ||
+ | | 1 | 1 | 1 | | ||
+ | | 2 | 10 | 2 | | ||
+ | | 3 | 11 | 3 | | ||
+ | | 4 | 100 | 4 | | ||
+ | | 5 | 101 | 5 | | ||
+ | | 6 | 110 | 6 | | ||
+ | | 7 | 111 | 7 | | ||
+ | | 8 | 1000 | 8 | | ||
+ | | 9 | 1001 | 9 | | ||
+ | | 10 | 1010 | A | | ||
+ | | 11 | 1011 | B | | ||
+ | | 12 | 1100 | C | | ||
+ | | 13 | 1101 | D | | ||
+ | | 14 | 1110 | E | | ||
+ | | 15 | 1111 | F | | ||
+ | | 16 | 10000 | 10 | | ||
+ | ***ビット・バイト [#y24bb3d4] | ||
+ | コンピュータの世界で使われる情報(データ)の最小単位をビットと言います。1ビットは0か1の値を扱い、2進数の1桁分が扱う大きさとなります。 | ||
+ | |||
+ | また1ビットが8個集まったものを1バイト(=8ビット)と言います。 | ||
+ | #ref(bitbyte.png,100%) | ||
+ | 1バイトで表すことができる数値は10進数で表すと0~255です。 | ||
+ | |||
+ | 下表は10進数を2進数(1バイト)で表した例です。 | ||
+ | | 10進数 | 2進数(1バイド) | | ||
+ | | 0 | 00000000 | | ||
+ | | 50 | 00110010 | | ||
+ | | 128 | 01000000 | | ||
+ | | 200 | 11001000 | | ||
+ | | 255 | 11111111 | | ||
***変数 [#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 16: | Line 59: | ||
***データ型 [#n1ebdc94] | ***データ型 [#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| | + | |
- | ※int型はシステムによっては異なる場合があります | + | |
+ | | 型の名前 | サイズ | 入る値の範囲 | | ||
+ | | 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 | | ||
+ | 変数は数値や文字を置いておく入れ物でした。 | ||
+ | 大きい入れ物なら大きな数字も入れられるので、変数のサイズが大きい型を選べば良いと思うかもしれません。 | ||
+ | しかしコンピュータが大きいサイズの変数を扱うには、小さいサイズの変数に比べて記憶しておく場所も大きくなり、それに伴う様々な処理にかかる時間も必要になってきます。 | ||
- | **制御文 [#b3400d86] | + | ***演算子 [#reb3a365] |
- | ***printf文 [#ua9b7908] | + | 基本的な演算子には以下があります。 |
- | 文字や変数の値などを表示する時に使います。~ | + | | 演算子 | 意味 | 使用例 | |
+ | | = | 右辺を左辺に代入 | a = b | | ||
+ | | + | 足し算 | c = a + b | | ||
+ | | - | 引き算 | c = a - b | | ||
+ | | * | 掛け算 | c = a * b | | ||
+ | | / | 割り算 | c = a / b | | ||
+ | | % | 割り算の余り | c = a % b | | ||
- | GCC Developer LiteでマイコンボードやFDIII-HCにプログラムを書き込む場合、C言語のprintf文を使用することはできませんので、それに相当する関数がそれぞれのライブラリに用意されています。~ | + | 算数でa=bは、aとbは同じという意味で使うのが一般的ですが、C言語では右辺を左辺に代入します。例えばa=2を左辺、b=3を右辺とし、a=bにすると、bの値がaに代入されa、b両方とも3になります。 |
- | 例えばFREEDOMライブラリには、fd_printf文が用意されています。ここではprintfと書きますので、それぞれのライブラリに合わせて読み替えて下さい。 | + | |
+ | その他に以下の演算子があります。 | ||
+ | 基本的な演算子で書き換えることもできますが、プログラムを見易く、短くするために使います。 | ||
+ | | 演算子 | 使用例 | 基本演算子で表すと | | ||
+ | | += | 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に1足す」という制御文を書いた場合、a=3,b=4ならa<bが成り立ちaに1が足されますが、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] | ||
+ | 文字や変数の値などを[[Chapter1.2>FDIII-HC Starter Kit Guide Chapter1.2]]でインストールしたSIMPLE TERM上で表示する時に使います。~ | ||
+ | |||
+ | 通常のC言語ではprintfと書きますが、FREEDOMライブラリではfd_printfと書きます。 | ||
#ref(printf1.png,100%) | #ref(printf1.png,100%) | ||
- | 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 など | |
- | |%f|実数|0.3, 3.8 など| | + | | %c | 文字 | 'G' など | |
- | |%c|文字|'G' など| | + | | %s | 文字列 | "Hello" など | |
- | |%s|文字列|"Hello" など| | + | | %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 など| | + | |
- | ※FREEDOMライブラリのfd_printfでは%fを使用できません。 | + | |
---- | ---- | ||
#ref(printf3.png,100%) | #ref(printf3.png,100%) | ||
- | %とdの間に数値を入れるとその桁数で表示します。空いている桁にはスペースが入れられます。~ | + | %とdの間に入る数値は桁数を表します。空いている桁にはスペースが入ります。~ |
- | さらに数値の前に0を付けると空いている桁には0が入れられます。~ | + | さらに数値の前に0を付けると空いている桁には0が入ります。~ |
\n | \n | ||
は改行です。その他に | は改行です。その他に | ||
\r | \r | ||
- | は復帰(同じ行の頭から再び表示する)になります。 | + | と書くと復帰(同じ行の頭から再び表示する)になります。 |
+ | |CENTER:BGCOLOR(red):||c | ||
+ | | :idea:|お使いのブラウザ(Internet Explorer、Firefox、Safariなど)によっては、文中の¥(円記号)が\(バックスラッシュ)で表示される場合がありますが、GCC Developer Liteでは¥で表示されます。&br;また本文中のプログラムコード(プログラムを書いたもの)をGCC Developer Liteへコピーして貼り付けた場合、\は¥になりますので問題ありません。&br;※説明のためここでは¥と\を全角で書いていますが、実際には半角です。| | ||
+ | ***アドレス [#b45fcfd3] | ||
+ | アドレスとは変数がコンピュータのメモリのどこにあるかを指します。 | ||
+ | その名の通りコンピュータ上の住所のようなものです。~ | ||
+ | &a | ||
+ | と書くと変数aのアドレスとなります。 | ||
+ | int a, b = 3; | ||
+ | a = &b; | ||
+ | aには3ではなく、bのアドレスの値が入ります。 | ||
+ | |||
+ | **制御文 [#b3400d86] | ||
***if文 [#c6144380] | ***if文 [#c6144380] | ||
- | if文は「もし○○だったら△△する。それ以外だったら□□する」というような、条件によって実行することを分ける時に使います。 | + | if文は「もし○○だったら△△する。それ以外だったら□□する」というような、条件によって実行を分岐する時に使います。 |
#ref(if1.png,100%) | #ref(if1.png,100%) | ||
「もし○○だったら△△する」というif文です。~ | 「もし○○だったら△△する」というif文です。~ | ||
- | ()内の条件が成り立っている時は{}内の処理を実行します。成り立っていない時は何もしません。 | + | ()内の条件が成り立っている時は{}内の処理を実行します。成り立っていない時は実行しません。 |
main() { | main() { | ||
int a =10; | int a =10; | ||
+ | |||
if (a > 5) { | if (a > 5) { | ||
a = a - 1; | a = a - 1; | ||
} | } | ||
} | } | ||
- | もし変数aが5より大きかったらaから1引くというプログラムです。 | + | もし変数aが5より大きかったらaから1を引くというプログラムです。aは10なのでa>5が成り立っており、aから1が引かれます。 |
---- | ---- | ||
#ref(if2.png,100%) | #ref(if2.png,100%) | ||
Line 84: | Line 182: | ||
()内の条件が成り立っている時はその直後の{}内の処理を実行し、成り立っていない時はelse後の{}内の処理を実行します。 | ()内の条件が成り立っている時はその直後の{}内の処理を実行し、成り立っていない時はelse後の{}内の処理を実行します。 | ||
main() { | main() { | ||
- | int a =10; | + | int a =3; |
+ | |||
if (a > 5) { | if (a > 5) { | ||
a = a - 1; | a = a - 1; | ||
Line 93: | Line 191: | ||
} | } | ||
} | } | ||
- | もし変数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) { | ||
a = a - 1; | a = a - 1; | ||
Line 112: | Line 211: | ||
} | } | ||
} | } | ||
- | もし変数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] | ||
- | 同じ処理を繰り返す時に使います。通常はカウンタを使って繰り返す回数を決めます。 | + | 同じ処理を繰り返す時に使います。通常はカウンタ(何回繰り返したかをカウントする変数)を使って繰り返す回数を決めます。 |
#ref(for1.png,100%) | #ref(for1.png,100%) | ||
「iの初期値を0とし、iが5より小さい間は処理を繰り返す。ただし処理を1回行ったらiを1増やす。」というfor文です。~ | 「iの初期値を0とし、iが5より小さい間は処理を繰り返す。ただし処理を1回行ったらiを1増やす。」というfor文です。~ | ||
事前にカウンタを変数として宣言しておきます。 | 事前にカウンタを変数として宣言しておきます。 | ||
- | 処理を行うごとにカウンタが0,1,2,3,4と増え5になったら繰返しを止めます。~ | + | 処理を行うごとにカウンタが0,1,2,3,4と増え5になったら繰返しを止めます。つまり5回同じ処理を繰り返します。~ |
i++はi=i+1と同じ意味です。 | i++はi=i+1と同じ意味です。 | ||
main() { | main() { | ||
int i, a = 1; | int i, a = 1; | ||
+ | |||
for (i = 0; i < 5; i++) { | for (i = 0; i < 5; i++) { | ||
a = a * 3; | a = a * 3; | ||
Line 132: | Line 232: | ||
***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) { | ||
i = i * 2; | i = i * 2; | ||
} | } | ||
} | } | ||
- | i×2を繰り返し、iが1000より少ない状態でなくなったら(1000以上になったら)繰り返しを止めるというプログラムです。 | + | i×2をiに代入する処理を繰り返し、iが1000より少ない状態でなくなったら(1000以上になったら)繰り返しを止めるというプログラムです。 |
***switch文 [#x577fb19] | ***switch文 [#x577fb19] | ||
Line 149: | Line 249: | ||
「変数・式が値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 = '+'; | ||
int a, m = 5, n = 3; | int a, m = 5, n = 3; | ||
+ | |||
switch(c) { | switch(c) { | ||
case '+': | case '+': | ||
Line 165: | Line 267: | ||
} | } | ||
} | } | ||
- | 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 Guide]]に戻る |