7: 2011-07-01 (金) 19:06:37 yoshida | 現: 2011-08-09 (火) 20:23:18 takaboo | ||
---|---|---|---|
Line 1: | Line 1: | ||
- | TITLE:FDIII-HC Starter Kit Guide Capter1.4 | ||
*C言語の基礎 [#pcd8150f] | *C言語の基礎 [#pcd8150f] | ||
- | このページではFREEDOMライブラリを使用した場合のC言語について説明をします。~ | + | このページでは[[FREEDOM IIIライブラリ>FDIIILIB]]を使用した場合のC言語について説明をします。~ |
**基本 [#f828bd2e] | **基本 [#f828bd2e] | ||
Line 34: | Line 33: | ||
1バイトで表すことができる数値は10進数で表すと0~255です。 | 1バイトで表すことができる数値は10進数で表すと0~255です。 | ||
- | 下表は10進数を2進数(1バイト)で表した例です。 | + | 下表は10進数を2進数で表した例です。 |
- | | 10進数 | 2進数(1バイド) | | + | | 10進数 | 2進数 | |
| 0 | 00000000 | | | 0 | 00000000 | | ||
| 50 | 00110010 | | | 50 | 00110010 | | ||
Line 41: | Line 40: | ||
| 200 | 11001000 | | | 200 | 11001000 | | ||
| 255 | 11111111 | | | 255 | 11111111 | | ||
+ | |||
***変数 [#h0d4cb7f] | ***変数 [#h0d4cb7f] | ||
変数は数値や文字を置いておく入れ物です。~ | 変数は数値や文字を置いておく入れ物です。~ | ||
Line 56: | Line 56: | ||
| 型の名前 | サイズ | 入る値の範囲 | 備考 | | | 型の名前 | サイズ | 入る値の範囲 | 備考 | | ||
- | | int8_t | 8ビット | -128~127 | (8)ビット指定 | | + | | int8_t | 8ビット | -128~127 | 8ビット指定 | |
| char | 8ビット | -128~127 | | | | char | 8ビット | -128~127 | | | ||
| uint8_t | 8ビット | 0~255 | (8)ビット指定 | | | uint8_t | 8ビット | 0~255 | (8)ビット指定 | | ||
| unsigned char | 8ビット | 0~255 | | | | unsigned char | 8ビット | 0~255 | | | ||
- | | int16_t | 16ビット | -32768~32767 | (16)ビット指定 | | + | | int16_t | 16ビット | -32768~32767 | 16ビット指定 | |
| short | 16ビット | -32768~32767 | short int | | | short | 16ビット | -32768~32767 | short int | | ||
- | | uint16_t | 16ビット | 0~65535 | (16)ビット指定 | | + | | uint16_t | 16ビット | 0~65535 | 16ビット指定 | |
| unsigned short | 16ビット | 0~65535 | | | | unsigned short | 16ビット | 0~65535 | | | ||
- | | int32_t | 32ビット | -2147483648~2147483647 | (32)ビット指定 | | + | | int32_t | 32ビット | -2147483648~2147483647 | 32ビット指定 | |
| long | 32ビット | -2147483648~2147483647 | long int | | | long | 32ビット | -2147483648~2147483647 | long int | | ||
| int | 32ビット | -2147483648~2147483647 | | | | int | 32ビット | -2147483648~2147483647 | | | ||
- | | uint32_t | 32ビット | 0~4294967295 | (32)ビット指定 | | + | | uint32_t | 32ビット | 0~4294967295 | 32ビット指定 | |
| unsigned long | 32ビット | 0~4294967295 | | | | unsigned long | 32ビット | 0~4294967295 | | | ||
| unsigned int | 32ビット | 0~4294967295 | | | | unsigned int | 32ビット | 0~4294967295 | | | ||
Line 98: | Line 98: | ||
| ++ | a++ | a = a + 1 | | | ++ | a++ | a = a + 1 | | ||
| -- | a-- | a = a - 1 | | | -- | a-- | a = a - 1 | | ||
+ | - 補足 | ||
+ | a++と++aの違いについて~ | ||
+ | a++; | ||
+ | と単一行で使用する場合は、 | ||
+ | ++a; | ||
+ | と同じ意味になりますが、単一行以外の使用では加算するタイミングが異なります。~ | ||
+ | #html{{ | ||
+ | <pre class="brush: c"> | ||
+ | void main (void) { | ||
+ | int i = 0; | ||
+ | while (i++ < 10); | ||
+ | } | ||
+ | </pre> | ||
+ | }} | ||
+ | 上記の場合、iは0 1 2 3 4 5 6 7 8 9 10と遷移し0~9の10回の繰り返しが行われます。 | ||
+ | #html{{ | ||
+ | <pre class="brush: c"> | ||
+ | void main (void) { | ||
+ | int i = 0; | ||
+ | while (++i < 10); | ||
+ | } | ||
+ | </pre> | ||
+ | }} | ||
+ | 上記の場合は、iは1 2 3 4 5 6 7 8 9 10と遷移します。そのため、1~9の9回しか繰り返しは行われません。~ | ||
+ | これは++の位置により、1を加えるタイミングが異なるからです。~ | ||
+ | ~i++ではiを参照(ここではwhileの条件判断)後、1を加えます。 | ||
+ | ~++iは1を加えた後、iを参照します。 | ||
+ | ~このルールは--を使用する際も適用されます。但し、--の場合は加算ではなく、減算となります。 | ||
***比較演算子 [#db59b61c] | ***比較演算子 [#db59b61c] | ||
Line 134: | Line 162: | ||
aには3ではなく、bのアドレスの値が入ります。~ | aには3ではなく、bのアドレスの値が入ります。~ | ||
- | ***ポインタ [#de8fd791] | + | ***配列とポインタ [#de8fd791] |
- | アドレスを利用する別の方法としてポインタがあります。~ | + | アドレスを利用するには配列とポインタをしっかりと学ぶ必要があります。~ |
- | char *a = "BEST"; | + | ****配列とは [#ze3b2962] |
- | 以上がchar型のポインタ宣言となります。BESTという文字列はメモリ上のどこかに格納されており、そのアドレスを示しているのがポインタです。~ | + | 配列はその変数の型の配列数分メモリ領域を確保します。確保された配列上は型さえ一致すれば何を代入しても問題ありません。~ |
- | BESTという文字列を操作するにはアドレスを介して操作するしかありません。そのため、*を間接演算子と呼びます。~ | + | 宣言方法は以下の通りです。 |
- | 以下にアドレス演算子を使用した場合と比較してみます。 | + | #html{{ |
- | | 状態 | アドレス演算子 | 間接演算子 | | + | <pre class="brush:c"> |
- | | 宣言 | int a; | int *a; | | + | char a[5] = "BEST"; |
- | | アドレスを渡す | b = &a; | b = a; | | + | </pre> |
- | | 内容を渡す | b = a; | b = *a; | | + | }} |
+ | #ref(table.png,100%) | ||
+ | |||
+ | ****ポインタとは [#o91e72b0] | ||
+ | ポインタは実体をもちません。ポインタはメモリ上のどこかに確保されたデータのアドレスのみを受け渡します。 | ||
+ | 宣言方法は以下の通りです。 | ||
+ | #html{{ | ||
+ | <pre class="brush:c"> | ||
+ | char *a = "BEST"; | ||
+ | </pre> | ||
+ | }} | ||
+ | #ref(pointer.png,100%) | ||
+ | 使用方法は配列とあまり変わりませんが、BESTという文字列を操作するにはアドレスを介して操作するしかありませんので、*を間接演算子と呼びます。~ | ||
+ | 間接演算子の簡単な使い方を紹介します。 | ||
+ | #html{{ | ||
+ | <pre class="brush:c"> | ||
+ | #include <fd.h> | ||
+ | void main (void) { | ||
+ | char *a = "BEST", *b; | ||
+ | int i = 0; | ||
+ | b = a; | ||
+ | while (*b++) i++; | ||
+ | fd_printf ("%s is %d byte\n", a, i); | ||
+ | } | ||
+ | </pre> | ||
+ | }} | ||
+ | b = a; | ||
+ | ポインタaが示すアドレスをポインタbへ代入します。(この時点でa/bは同じアドレスを指し示します)~ | ||
+ | while (*b++) i++; | ||
+ | これは以下の命令を簡素化したものです。 | ||
+ | while (1) { | ||
+ | if (*b == NULL) break; | ||
+ | b++; | ||
+ | i++; | ||
+ | } | ||
+ | |||
+ | 以下にアドレス演算子、配列を使用した場合と比較してみます。 | ||
+ | | 状態 | アドレス演算子 | 間接演算子 | 配列 | | ||
+ | | 宣言 | char a; | char *a; | char a[3]; | | ||
+ | | アドレスを渡す | b = &a; | b = a; | b = &a[0]; | | ||
+ | | 内容を渡す | b = a; | b = *a; | b = a[0]; | | ||
文字列の場合は配列と同じ扱いとなります。 | 文字列の場合は配列と同じ扱いとなります。 | ||
- | | アドレス | 文字 | 説明 | | + | "BEST"は、文字としては4文字ですが、メモリ上は5バイト確保されます。C言語では"BEST"は只の文字データが4つ集まっているだけであり、文字列としては扱われません。"BEST"の最後にNULLが付与されて初めて文字列として扱われます。~ |
- | | 00112239 | B |アドレスは例です | | + | |
- | | 0011223A | E | | | + | |
- | | 0011223B | E | | | + | |
- | | 0011223C | T | | | + | |
- | | 0011223D | Null |最後にNULLがセットされます | | + | |
- | BESTは、文字としては4文字ですが、メモリ上は5バイト確保されます。C言語ではBESTは只の文字データであり、文字列ではありません。BESTの最後にNULLが付与されて初めて文字列として扱われます。~ | + | |
つまり~ | つまり~ | ||
char *a = "BEST"; | char *a = "BEST"; | ||
は~ | は~ | ||
char a[5] = { 'B', 'E', 'S', 'T', NULL }; | char a[5] = { 'B', 'E', 'S', 'T', NULL }; | ||
- | と同じです。~ | + | と同じことです。~ |
- | このため、配列として扱い、インデックスを使用することで、文字の取得が可能です。以下はbに'E'を代入します。~ | + | このため、配列として扱うことで、文字の取得が可能となっています。以下はbに'E'を代入します。~ |
#html{{ | #html{{ | ||
<pre class="brush: c"> | <pre class="brush: c"> | ||
char *a = "BEST", b; | char *a = "BEST", b; | ||
- | b = a[1]; // 2文字目を代入します(インデックスは0から開始) | + | b = a[1]; // 2文字目を代入します |
</pre> | </pre> | ||
}} | }} | ||
Line 171: | Line 233: | ||
c = a; // アドレスをコピーします | c = a; // アドレスをコピーします | ||
c++; // アドレスを1つ進めます | c++; // アドレスを1つ進めます | ||
- | b = *c; // アドレスの示す内容を代入します | + | b = *c; // アドレスの示す内容(E)を代入します |
</pre> | </pre> | ||
}} | }} | ||
+ | |||
**制御文 [#j38a6a23] | **制御文 [#j38a6a23] | ||
***if文 [#c6144380] | ***if文 [#c6144380] | ||
Line 363: | Line 426: | ||
各関数内にインデントを付け、階層化することで、それぞれの関数の開始位置と終了位置が分かりやすくなります。 | 各関数内にインデントを付け、階層化することで、それぞれの関数の開始位置と終了位置が分かりやすくなります。 | ||
- | [[FDIII-HC Learning Guide]]に戻る | + | [[FDIII-HC Starter Kit Guide>LEARNINGGUIDE]]に戻る |