5: 2011-06-28 (火) 14:38:17 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言語について説明をします。~
-通常のC言語と若干異なる場合があります。+
**基本 [#f828bd2e] **基本 [#f828bd2e]
Line 35: 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 42: Line 40:
| 200 | 11001000 | | 200 | 11001000 |
| 255 | 11111111 | | 255 | 11111111 |
 +
***変数 [#h0d4cb7f] ***変数 [#h0d4cb7f]
変数は数値や文字を置いておく入れ物です。~ 変数は数値や文字を置いておく入れ物です。~
Line 54: Line 53:
***データ型 [#p7400a94] ***データ型 [#p7400a94]
変数は使い始める前に「このようなデータを入れるこんな名前の入れ物を使います」と予め宣言しておかなければなりません。「このようなデータ」を型と言います。~ 変数は使い始める前に「このようなデータを入れるこんな名前の入れ物を使います」と予め宣言しておかなければなりません。「このようなデータ」を型と言います。~
-型には以下があり、それぞれサイズと入る値の範囲が異なります。+FDIII-HCを使用する際のデータ型には以下のように、それぞれサイズと入る値の範囲が異なります。
-| 型の名前 | サイズ | 入る値の範囲 | +| 型の名前 | サイズ | 入る値の範囲 | 備考 | 
-| char | 1バイト | -128~127 | +| int8_t  | 8ビット |    -128~127 | 8ビット指定
-| unsigned char | 1バイト | 0~255 | +| char     | 8ビット |   -128~127 | | 
-| short | 2バイト | -32768~32767 | +| uint8_t  | 8ビット | 0~255 | (8)ビット指定
-| unsigned short | 2バイト | 0~65535 | +| unsigned char | 8ビット | 0~255 | | 
-| long | 4バイト | -2147483648~2147483647 | +| int16_t  | 16ビット | -32768~32767 | 16ビット指定
-| unsigned long | 4バイト | 0~4294967295 +| short   | 16ビット | -32768~32767 | short int | 
-| int | 4バイト | -2147483648~2147483647 | +| uint16_t | 16ビット | 0~65535 | 16ビット指定
-| unsigned int | 4バイト | 0~4294967295 |+| unsigned short | 16ビット | 0~65535 |
 +| int32_t  | 32ビット | -2147483648~2147483647 | 32ビット指定
 +| long     | 32ビット | -2147483648~2147483647 | long int
 +| int     | 32ビット | -2147483648~2147483647 | | 
 +| uint32_t | 32ビット | 0~4294967295 | 32ビット指定 | 
 +| unsigned long | 32ビット | 0~4294967295 |
 +| unsigned int | 32ビット | 0~4294967295 | |
変数は数値や文字を置いておく入れ物でした。 変数は数値や文字を置いておく入れ物でした。
大きい入れ物なら大きな数字も入れられるので、変数のサイズが大きい型を選べば良いと思うかもしれません。 大きい入れ物なら大きな数字も入れられるので、変数のサイズが大きい型を選べば良いと思うかもしれません。
-しかしコンピュータが大きいサイズの変数を扱うには、小さいサイズの変数に比べて記憶しておく場所も大きくなり、それに伴う様々な処理にかかる時間も必要になってきます。+しかしコンピュータが大きいサイズの変数を扱うには、小さいサイズの変数に比べて記憶しておく場所も大きくなり、それに伴う様々な処理にかかる時間も必要になってきます。
-+
-unsignedの付いている型はマイナスを扱うことができませんが、表すことでのできる最大値は倍となります。~+
***演算子 [#k3be0d0f] ***演算子 [#k3be0d0f]
Line 83: Line 86:
算数でa=bは、aとbは同じという意味で使うのが一般的ですが、C言語では右辺を左辺に代入します。例えばa=2を左辺、b=3を右辺とし、a=bにすると、bの値がaに代入されa、b両方とも3になります。このため、代入演算子と呼ばれています。~ 算数でa=bは、aとbは同じという意味で使うのが一般的ですが、C言語では右辺を左辺に代入します。例えばa=2を左辺、b=3を右辺とし、a=bにすると、bの値がaに代入されa、b両方とも3になります。このため、代入演算子と呼ばれています。~
-その他の四則演算に加え、余りを出す演算子を合わせて算術演算子と呼びます。+四則演算に加え、余りを出す演算子を合わせて算術演算子と呼びます。
その他に以下の演算子があります。 その他に以下の演算子があります。
Line 95: 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 131: 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 168: Line 233:
 c = a;  // アドレスをコピーします  c = a;  // アドレスをコピーします
 c++;    // アドレスを1つ進めます  c++;    // アドレスを1つ進めます
- b = *c; // アドレスの示す内容を代入します+ b = *c; // アドレスの示す内容(E)を代入します
</pre> </pre>
}} }}
 +
**制御文 [#j38a6a23] **制御文 [#j38a6a23]
***if文 [#c6144380] ***if文 [#c6144380]
Line 360: Line 426:
各関数内にインデントを付け、階層化することで、それぞれの関数の開始位置と終了位置が分かりやすくなります。 各関数内にインデントを付け、階層化することで、それぞれの関数の開始位置と終了位置が分かりやすくなります。
-[[FDIII-HC Learning Guide]]に戻る+[[FDIII-HC Starter Kit Guide>LEARNINGGUIDE]]に戻る


トップ   差分 リロード印刷に適した表示   全ページ一覧 単語検索 最新ページの一覧   最新ページのRSS 1.0 最新ページのRSS 2.0 最新ページのRSS Atom