もしかしたら困ったときに開くとうれしいことがあるかもしれないヒント集

剰余演算子

C言語には、割り算の余り(剰余)を求める演算子として、%があります。 例えば以下の記述では、13を10で割った余りである3がiに代入されます。
  i = 13 % 10;
なおこの余りの3は、「13」の一の位の数であることに注意しましょう。

変数の型とビット数と数値の限界

変数にはchar型やint型などの「型」がありますが、 これはその変数に割り当てられたメモリのビット数に対応します。 例えば、一般にchar型は8ビット(1バイト)となります。

これは、その変数に代入できる数値の限界に関係してきます。 例えば符号なし8ビット(unsigned char型)では0〜255の数値を 表現できますが、その上限である255の次は0になります。 例えば次のプログラムでは、最終的に変数xに値は0になります。

  unsigned char x;
  x = 255;
  x = x + 1;
このように変数がプログラム中でとりうる値に 注意する必要があります。

代入できる数値の限界には、符号の有無も関係しています。 同じ8ビット(1バイト)であっても、 符号つき8ビット(char型)では-128〜127になります。

なお、一般には、ある型が何ビット(何バイト)であるかは、一定ではなく、 CPUの種類や用いるコンパイラに依存します。 変数の型が何バイトであるかはsizeof()という関数で得ることができますので、 次のような記述を含むプログラムを実行し、確認をしておくとよいでしょう。

  num3 = sizeof(long);
  num2 = sizeof(int);
  num1 = sizeof(short);
  num0 = sizeof(char);
ビット数ととりうる値の範囲
ビット数 符号あり 符号なし
8bit -128〜+127 0〜255
16bit -32,768〜+32,767 0〜65,536
32bit -2,147,483,648〜+2,147,483,647
概ね -2×109〜+2×109
0〜4,294,967,296
概ね 0〜4×109

実数演算

実験用CPUボードのCコンパイラでは実数型 (floatとdouble) を使えません。 実定数や実数を扱う関数も使えません。

電圧1.3Vのように小数点以下1桁の実数値を扱いたい場合には、 10倍して整数演算すると良いでしょう。 100倍や1000倍でもかまいません。

実数を使おうとすると、以下のようなエラーになります。

*** FATAL ERROR L210: I/O ERROR ON INPUT FILE:
    EXCEPTION 0021H: PATH OR FILE NOT FOUND
    FILE: C:\KEIL\C51\LIB\C51FPS.LIB

べき乗

C言語では、べき乗を表現する演算子はありません。 LaTeXなどでは、「2^n」のように「^」を用いた記述でべき乗を表現できますが、 C言語では、この「^」は排他的論理和(ExclusiveOR)を表します。

演算子の優先順位

演算子の優先順位には、必ずしも直感とは一致しないものがあります。 詳細は、 「 【C言語講座】演算子一覧表」 などを参照。 自信がない時には括弧でくくってしまうと安全です。

引数を持たない関数

一般に、関数には、呼び出すときに与える値(引数)がありますが、 これをもたない関数を使う場合は、明示的に「引数がない」ことを 示す必要があります。 これは、次のように記述します。(前半が関数の定義、後半が関数呼び出し)
char hoge(void) /* 関数の定義 */
{
...
}

main()
{
...
  a = hoge();   /* 関数の呼び出し */
...
}

変数の宣言

変数の宣言は、ブロックの先頭で行う必要があります。 例えば、下記の「int b;」はエラー (Syntax error) になります。 最初の実行文「a = 0;」より前に置く必要があります。
int a;

main()
{
  a = 0;

  int b;

インデント

特にC言語でプログラムを記述するときには、次のように{}ごとに 適宜インデント(段そろえ)をすると、格段に読みやすくなります。
main()
{
  char i;
  for(i = 0; i < 10; i++){
    hoge(i);
  }
}
これは、あとでプログラムをデバッグしたり読み直すときに、 格段に効率が高くなるでしょう。

括弧の対応づけ

ある括弧がどの括弧と対応しているのかがわからなくなったときは、 その括弧にカーソルをあわせて、 「Edit」メニューの「Goto Matching Brace」を実行してみましょう。

もちろん、このような機能に頼らなくても済むように、 インデントをきちんとする、 コメントを書くなどの工夫をしておくことをお勧めします。

プログラムの転送ができない

 プログラムを転送しようとすると下記のようなエラーになる場合には、 USBケーブルを抜いて、もう一度挿し直してみましょう。 なお、CPUボードのリセットボタンを押すと、 このような症状になることがあるようです。
Toggle 8051 Reset
Failed to Open Driver
Reset Failed
指定されたファイルが見つかりません。

実験用CPUボードの動作がおかしい

プログラムを変更しても変更が反映されていない場合で、 「プログラムの転送ができない」 には該当しないときには、 実験用CPUボードが誤動作していることもあります。 CPUボードのリセットボタンを押すか、 USBケーブルを抜いて挿し直せば正常に動作することがあります。

急がば回れ

「わかったつもり」は、結局後で元に戻って理解しなおさねばならず、 しかも先入観がその理解の妨げになりかねません。

最初から、順番に手引書を読んでいくのが、結果として効率がよいことが 多いようです。

印刷

プログラムリストなどを印刷したいときは、Windowsの印刷機能を 用いれば可能です。
プリンタの設定ページを参考に設定するか、 「\\exp1gw\lp」を選択してください。 「Microsoft Office Document Image Writer」を指定しても印刷はできません。 プリンタは実験室の右前にあり、ネットワーク経由で接続されています。 なおプリンタの電源がONになっていることや用紙があることを確認しましょう。
戻る