Copyright: KenTakeishi


C machine

C言語学習向けコンパイラ「C machine」

　標準的なC言語ソースプログラムをコンパイル・実行するソフトウェアです。独自に作成したプリプロセッサ・コンパイラ・リンカを備えており、(仮想機械用コードを出力し、実行する)C言語の学習向け処理系です。

  なお、本ソフトウェアはフリーソフトです。

注意

　本ソフトで、実行可能ファイルを作成することはできません。


最初にお読みください

著作権

　本ソフトウェアの著作権は武石健にあります。

開発環境

　PC-AT互換機にてVisualC++ Ver6.0＋旧Ver

配布・転載について

　雑誌等紙面に掲載する場合や、ネットワークでの配布、雑誌付録のCD－ROMなどに収録する場合は、事前に連絡をください。配布の際には、アーカイブ内容を絶対に変更しないで私が配布しているアーカイブのまま配布してください。また、金銭の授受が行われる配布は禁止します。

使用上の注意

　このソフトウェアを使用したことによって障害やその他の不具合等が生じたとしても、私はその責任は負いません。各自の責任においてご使用ください。品質の保証はしません。（しかしバグに関してはできる限り対応します。）また、本ソフトの改造、リバースエンジニアリング、またそれに近い行為は禁止します。

要望、質問など

  C machineサポート掲示板(http://hpmboard1.nifty.com/cgi-bin/thread.cgi?user_id=DQH06540)

  （掲示板です。要望・質問・バグ報告を承っております。）

  C machineホームページ(http://homepage1.nifty.com/kentake/)

　（C machineのWebページです。最新バージョンをいち早くダウンロードできます。）

連絡先

  電子メール：ken_takeishi@mbf.nifty.com（ken_takeishi@mbf.nifty.com）


画面構成

　本アプリケーションは以下のように３つのウィンドウを持つ画面構成をしています。各ウィンドウの境界の線（スプリットバー）を動かすことにより、各々のウィンドウの大きさを自由に変更できます。

①プログラムエディットウィンドウ

　ここにＣ言語プログラムを書きます。

②グラフィックス出力ウィンドウ

　プログラムソース内にグラフィックス命令があったときに、ここに出力します。

③標準入出力ウィンドウ

　プログラムソース内に printf関数や scanf関数があったときに、ここがその入出力を受け持ちます。また、エラー・警告メッセージもここに出力されます。

以下、画面についてもっと詳しい説明．．．

グラフィックス出力ウィンドウ

　現バージョンでは、グラフィックス画面の大きさは、640x480です。これは、このウィンドウの最左上を(0, 0)として、右下にいくにつれて1ドットずつ増えていくピクセル値での大きさです。なお、この範囲以外にはグラフィックス出力はされません。グラフィックス出力領域とそれ以外の領域をわける境界線がうたれています。グラフィックス処理については、グラフィックス全般を参照してください。

標準入出力ウィンドウ

　背景色が灰色になっているときは、キー入力を受け付けません。Ｃプログラム実行中に、メイン関数の入力待ちか、または標準入力ファイルが空で入力待ち関数コール時に、背景色が白に変わり入力待ちのためキー入力できるようになります。入力待ち時、Ctrlキーを押下することによりEOFを入力できます。


コンパイル・実行してみましょう

　メニューの「ファイル・開く」で sampleフォルダにある「C machine.c」ファイルを開いてみてください。そして、メニューの「実行・実行」か、実行ツールバーをクリックしてください。

　コンパイル・実行されて、標準入出力ウィンドウに「C machine !」と出力されました。

　同じような手順でサンプルフォルダにある「*.c」を開いて、いろいろコンパイル・実行してみてください。

　以前（βテストバージョン）は、ファイルとして保存してあるプログラムソースに対してのみ実行可能だったのですが、現バージョンでは、エディットウィンドウにうちこまれているプログラムソースに対して実行可能です。


エラー・警告について

コンパイル時のエラー（警告）

　プログラムをコンパイル・実行したときにエラーがあると、エラー（警告）メッセージを標準入出力ウィンドウに出力します。本処理系ではエラーが一つ見つかった時点でコンパイル（プリプロセス・リンク）を中断する仕様になっています。エラーメッセージと行番号からエラーを修正してコンパイル・実行しなおしてください。警告エラーの場合にはメッセージは出力しますが、処理を中断することなくコンパイル・実行を続行します。

実行時のエラー

　本処理系では実行時に、「不正メモリ領域を参照した時点」でエラーとなり実行を中断します。（実行時エラーは、すべての場合でキャッチできるわけではありません。強制終了になってしまう場合もあります。）


設定

　以下の各種設定は、次回起動時にも反映されます。

インクルードファイルパス設定

　メニューの「設定・インクルードパス」で、ユーザーインクルードファイル読みこみのパスが設定できます。クリックすると、「インクルードファイルパス設定」ダイアログボックスが表示されます。更に「追加」ボタンを押すと、フォルダパス設定ダイアログが表示されますので、そこで追加したいフォルダを選んで「OK」ボタンを押してください。そうすると、今選んだフォルダへのパスが「インクルードファイルパス設定」ダイアログ内に加わります。最後に「OK」ボタンを押せば、インクルードファイルパスが設定されます。「キャンセル」ボタンを押した場合は、設定されません。パスを削除したい場合は「インクルードファイルパス設定」ダイアログ上で、削除したいパスを選択したうえで、「削除」ボタンを押してください。この場合も最後に、「OK」ボタンを押した段階で設定されます。「キャンセル」ボタンを押した場合は設定されません。

標準入出力設定

  メニューの「設定・標準入出力」で、標準入出力ウィンドウの表示できる最大のバイトサイズの設定ができます。クリックすると、「標準入出力設定」ダイアログボックスが表示されます。そこで、サイズを必要があれば設定してください。標準入出力ウィンドウ内に出力された文字は、ウィンドウ内のバイト数がここで設定した値を超えると、消去されます。より多くの出力結果を画面に残したい場合に、ここの数値を上げてください。

仮想機械設定

  メニューの「設定・仮想機械」で、仮想機械の静的・動的領域のサイズの設定ができます。クリックすると、「仮想機械設定」ダイアログボックスが表示されます。そこで、静的・動的領域のサイズを必要があれば設定してください。通常の場合はデフォルト値で問題はありません。

フォント設定

　メニューの「設定・フォント選択」で、プログラムエディットウィンドウ内で使用するフォントの設定ができます。

行番号を表示

　メニューの「設定・行番号を表示」についているチェックの有無で、プログラムエディットウィンドウ内の行番号の表示の有無を設定できます。


印刷・コピー

　３つのウィンドウ内のテキストやグラフィックスはそれぞれ印刷・クリップボードへの保存ができます。

印刷

　印刷は、メニューの「ファイル・印刷」を選ぶ前に、印刷したいウィンドウをマウスでクリックしてください。そうすると、例えばグラフィックス出力ウィンドウをクリックすると、メニューの「ファイル・印刷・グラフィックス画面印刷」が選べるようになります。このことは、印刷プレビューをするときも同じです。

コピー

　グラフィックス出力ウィンドウ内のコピーは、メニューの「編集・グラフィックス画面コピー」でできます。グラフィックスウィンドウ内の640x480の領域をビットマップデータとしてクリップボードに保存します。

　標準入出力ウィンドウ内のコピーは、メニューの「編集・入出力画面テキストコピー」でできます。標準入出力ウィンドウ内のテキストデータをクリップボードに保存します。


特有の制限

ファイル

　１ファイルのみコンパイル実行できます。

１行内の文字数

　Ｃ言語ソースプログラムの１行は512文字以内にしてください。

　'\'による行連結には対応していますが、連結後の文字数も512文字以内という制限があります。また、実行中の標準入力からの入力は255文字以内にしてください。

識別子長

　識別子の長さ（変数や関数名の長さ）は、100文字以内にしてください。

プリプロセッサ制御行

　#line行、#error行には対応していません。これらが記述されていても無視します。

エスケープシーケンスについて

  対応しているエスケープシーケンスは、'\t'と'\n'と'\0'のみです。

stdin、stdout、stderr

　当処理系では、ファイルポインタとしてのstdinは使用できません。また、stdout、stderrは、ファイル出力系関数へのファイルポインタとしてのみ指定可能です。

配列についての制限

  現バージョンでは、配列添え字演算子のオペランドの型に、整数型[配列名orポインタ型]の指定はできません。（例）定義 int a[10]; のとき、式中で5[a]という使い方をすると、エラーとなります。

構造体についての制限

　現バージョンでは、構造体のメンバにビットフィールド指定はできません。

　内容不明の構造体は定義できません。

記憶クラス指定子について

　register、volatileは指定できますが、意味を持ちません。無視します。

関数について

　関数呼び出しの前に、関数定義か関数プロトタイプ宣言がなくてはいけません。

　関数定義の分離形式（旧形式）には対応していません。

合成型について

　合成型はサポートしていません。

標準ライブラリ関数

  すべての ANSI C の標準ライブラリ関数はサポートしていません。使用できる関数は、標準ライブラリ関数で確認してください。


標準ライブラリ関数

　本処理系では、以下のライブラリ関数が使用できます。

　以下の関数は基本的にANSI準拠の動作をします。

　（注意：現バージョンでは、scanf系関数において変換仕様中の[...]指定はできません）

  int putchar(int);

  void puts(char *);

  int printf(const char *, ...);

  int getchar(void);

  char *gets(char *);

  int scanf(const char *, ...);

  FILE *fopen(char *, char *);

  int fclose(FILE *);

  size_t fread(void *, size_t, size_t, FILE *);

  size_t fwrite(void *, size_t, size_t, FILE *);

  int fputs(char *, FILE *);

  int fputc(int, FILE *);

  int fprintf(FILE *, const char *, ...);

  char *fgets(char *, int, FILE *);

  int fgetc(FILE *);

  int fscanf(FILE *, const char *, ...);

  char *strcat(char *, char *);

  char *strncat(char *, char *, size_t);

  char *strcpy(char *, char *);

  char *strncpy(char *, char *, size_t);

  int strlen(char *);

  char *strchr(char *, int);

  char *strstr(char *, char *);

  char *strtok(char *, char *);

  int strcmp(char *, char *);

  int strncmp(char *, char *, size_t);

  int memcmp(void *, void *, size_t);

  void *memcpy(void *, void *, size_t);

  void *memset(void *, int, size_t);

  int sprintf(char *, const char *, ...);

  int sscanf(char *, const char *, ...);

  void *malloc(unsigned int);

  void free(void *);

  time_t time(time_t *);

  void srand(unsigned int);

  int rand(void);

  int abs(int);

  int atoi(char *);

  double atof(char *);

  void qsort(void *, size_t, size_t, int (*)(void *, void *));

  void exit(int);

  int isdigit(int);

  int islower(int);

  int isupper(int);

  int isprint(int);

  int isalpha(int);

  int isalnum(int);

  int isgraph(int);

  int ispunct(int);

  int isxdigit(int);

  int isspace(int);

  int tolower(int);

  int toupper(int);

　また、以下の数学系関数にも対応しています。

  double sin(double);

  double cos(double);

  double tan(double);

  double log(double);

  double log10(double);

  double sqrt(double);

  double exp(double);

  double fabs(double);

  double pow(double, double);


グラフィックス全般

  本処理系では、グラフィックス出力ができます。グラフィックス関数（setwindow関数、setpixel関数、setline関数）を呼び出すことにより、グラフィックス出力を行います。これらの関数を呼び出すためには、graphic.hヘッダーファイルをインクルードしてください。

色と色番号

　グラフィックス関数における色番号と色の対応は以下の通りです。


setwindow関数

プロトタイプ

　void setwindow(int width, int height);

引数

　width

　　グラフィックスウィンドウ内のX方向のピクセル数を指定します。

　height

　　グラフィックスウィンドウ内のY方向のピクセル数を指定します。

戻り値

　なし

説明

　グラフィックスウィンドウの座標の設定をします。本関数を呼ぶとグラフィックスウィンドウ内の真中が座標(0, 0)になり、右が+X方向、上が+Y方向になります。本関数を呼び出さない場合は、座標(0, 0)はグラフィックス画面の左上端です。


setpixel関数

プロトタイプ

　void setpixel(int x, int y, short color);

引数

　x

　　描画する点のX値を指定します。

　y

　　描画する点のY値を指定します。

　color

　　描画する点の色を指定します。

戻り値

　なし

説明

　指定された位置に指定された色で、点（１ドットピクセル）を描画します。


setline関数

プロトタイプ

  void setline(int sx, int sy, int ex, int ey, int width, short color);

引数

  sx

    描画する直線の始点のX値を指定します。

  sy

    描画する直線の始点のY値を指定します。

  ex

    描画する直線の終点のX値を指定します。

  ey

    描画する直線の終点のY値を指定します。

  width

    描画する直線の幅の大きさを指定します。

  color

　　描画する点の色を指定します。

戻り値

  なし

説明

  (sx, sy)から(ex, ey)まで、widthの幅、colorの色で直線を引きます。