=========================================================================== 【ソ フ ト名】 C言語学習向けコンパイラ&実行 C machine Version 1.11 【登 録 名】 cmkt111.lzh 【著作権 者】 武石 健(Ken Takeishi) 【対応 環境】 Windows95、98、2000 【動作 確認】 ショップブランドDOS/V機・PC9821で、Windows95・98・2000 【ソフトウェア種別】 フリーソフトウェア 【転載 条件】 付属のヘルプをご覧ください =========================================================================== 【ソフト紹介】 本ソフトは標準的なC言語ソースプログラムをコンパイル・実行するソフトウェア です。 独自に作成したプリプロセッサ・コンパイラ・リンカを備えており、C言語の学習 向けコンパイラです。 【使い方】 解凍すると「Cmachine」フォルダができます。その下の「bin」フォルダ中の 「Cmachine.exe」ファイルをダブルクリックしてプログラムを起動して、お使い ください。 使い方の詳細については、付属のヘルプをご覧ください。 【注意】 このソフトウェアを使用したことによって障害やその他の不具合等が生じたとして も、私はその責任は負いません。各自の責任においてご使用ください。また、本ソ フトの改造、リバースエンジニアリング、またそれに近い行為は禁止します。 【アンインストール】 解凍してできたフォルダを丸ごと削除して、アンインストールしてください。 【本ソフトの最新版の入手先】 Vector(プログラミング→C言語→C machine)から入手できます。 また、私のWebページ(http://homepage1.nifty.com/kentake/) からでも入手できます。最新版はまず、私のWebページの方にアップロードするよう にします。 【連絡先】 email : ken_takeishi@mbf.nifty.com 【履歴】 Version 1.11 2000/10/01(日) ・0.12β→0.13β変更時のミスで、配列へのポインタ型の式に*単項演 算子適応時、動作不可となってしまっていたのを修正。 他にも、配列へのポインタ型の式におけるバグがあったのを修正。 Version 1.10 2000/09/22(金) ・明示的型変換で、キャストがかかっている式の外側に()があるような  場合、外側の()でくくられた式にも、内部の式にかかっているキャス  トがかかってしまっていたのを修正。 ・浮動小数点型の暗黙の型変換処理が一部正しくなかったのを修正。 ・可変引数を持つ関数で動作がおかしくなることがあったのを修正。 ・標準入出力の水平タブ位置を4から8に修正。 Version 1.09 2000/09/18(月) ・構造体中のメンバに対して文字列リテラル初期化後、{が出現すると、 コンパイラのバグで内部的に初期化次元がおかしくなってしまったた め、正常な初期化ができなかった。 (例) struct { char a[10]; int b[10]; } a = {"abcde", {5}}; が正しく初期化されなかった。 ・初期化処理で、対応する{}なしに集合体中のオブジェクト初期化後、{ が出現すると、コンパイラのバグで内部的に初期化次元がおかしくなっ てしまったため、正常な初期化ができなかった。 (例) struct { int a; struct { int a; int b; }b; int c[10]; } a = { 1, 2, 3, {4, 5, 6} }; ↑ ↑ ここに対応する{}がない場合、その後の{出現で、まだ 前の集合体内と認識してしまっていたため正しく処理さ れなかった。 ・Version1.05→Version1.051修正時の副作用で、集合体オブジェクトを メンバに持つ構造体(共用体)オブジェクトで、動作がおかしくなる  場合があったのを修正 Version 1.08 2000/09/14(木)  ・#ifdef マクロ名、#ifndef マクロ名で、マクロ名の終わりに空白文字   が入っているとき、それもマクロ名に含めてしまっていたため動作がお   かしくなってしまっていたのを修正。  ・0.21β→0.22 Finalβ修正時のバグで、16進数表記でe(E)を使用する   と動作がおかしくなってしまっていたのを修正。 Version 1.07 2000/09/11(月)  ・タブ名付きのstruct(union)で定義した構造体(共用体)型を、他のstruct(union)   のメンバで使用すると、コンパイルエラーとなってしまう場合があったのを修正。   (例)struct tab1 {int a;}; struct {struct tab1 a;} でコンパイルエラーとな   ってしまっていた。 Version 1.06 2000/09/10(日)  ・ポインタ型どうしの変数に対して-演算子適応時、正常に演算されない場合があった   のを修正。 Version 1.051 2000/09/09(土)  ・Version1.04 → Version1.05変更時の処理が完全でなかったため、Version1.04時に   修正した不都合「関数へのポインタ型変数を初期化子として使用すると、正しく処理 されなくなっていた」が再発してしまったのを修正。  ・Version1.04 → Version1.05変更時の副作用で、ポインタ情報を持つtypedef定義を、   明示的型変換の型名に適応したとき、ポインタ情報が抜けてしまうようになってしま   ったのを修正。 Version 1.05 2000/09/08(金)  ・関数(ポインタ)の戻り値型が、更に関数ポインタ型になっている宣   言子に対応していなかったのを修正。   (例)void* (***(**(*func_pt)(int))(short))(double);   これは、「「「voidへのポインタ型を戻り値に持ち、double型の引数を一つ持つ関数  へのポインタ型へのポインタ型へのポインタ型」を戻り値型に持ち、short型の引  数を一つ持つ関数へのポインタ型へのポインタ型」を戻り値型に持ち、int型の引  数を一つ持つ関数へのポインタ型変数」である。   このようなANSI C規格上許される限りの関数(ポインタ)情報を宣言及び式の型とし て認識できるようにした。  ・関数型のユーザー定義型の場合、正常に動作していなかったのを修正。  ・プリプロセッサ 関数形式#define呼び出しの実引数の先頭の空白文字   類カット処理がなかったのを修正。   (例)#define MF(arg) func##arg で、「MF( 1)」が「func 1」と置換されてしまっ      ていた。 Version 1.04 2000/08/30(水)  ・関数へのポインタ型変数に対して、単項*,&演算子適応時正しい処理   がされなくなっていたのを修正。  ・関数へのポインタ型変数を初期化子として使用すると、正しく処理さ   れなくなっていたのを修正。   (例)void kansu(int a){} void (*fcpt0)(int) = kansu; void (**fcpt1)(int) = &fcpt0; の初      期化が正しく行われないため、(*fcpt1)(3); などの関数呼び出しで動      作不可となってしまっていた。(初期化ではなく、式文中における代入      の場合は正しく処理されていた)  ・Ver1.02→Ver1.021に移行時に修正した個所の副作用で、代入演算子   関係のエラー・警告チェックが正しく行われていなくなっていたのと、   結果の型が正しくなっていなかったのを修正。 Version 1.03 2000/08/24(木) ・0.18β→0.19β変更時、typedefで関数へのポインタ型定義が できなくなってしまっていたのを修正。 ・typedefでの関数へのポインタ型定義中の仮引数定義内で、変数の省略 をするとコンパイルエラーがでてしまっていたのを修正。 Version 1.021 2000/08/23(水)  ・Ver1.01→Ver1.02移行時、演算代入演算子関係の処理を変更したため、   それによる副作用で、例えばa+=b;というような式のaとbの式の型を、   コンパイル時逆に認識してしまっていたのを修正。 Version 1.02 2000/08/22(火)  ・単項*演算子の結果の式が値可変左辺値になっていなかったのを修正。  (例)int b[3], *a = b; で、*(a+1) = 3;のとき、コンパイルエラーと     なってしまっていた。  ・演算代入演算子適応時、(例えば、式+=3; のとき、)式が2回評価さ   れてしまっていたのを修正。  ・構造体(共用体)型のオブジェクトにアドレス演算子(&)をつけた式に   対して、明示的型変換時コンパイルエラーとなってしまっていたのを修正。   (例)struct {int a;} a; で、(void *)&a;で、コンパイルエラーとなっ      てしまっていた。  ・strncat()、strncmp()、memcmp()関数追加。 Version 1.01 2000/08/20(日)  ・エディタに行番号表示可能なようにした。  ・戻り値型を省略した関数定義時、戻り値型がsigned intではなく、   void になってしまっていたのを修正。  ・log10()、strchr()、strstr()関数を追加。  ・画面サイズ(分割ウィンドウのサイズも)が次回起動時反映される   ようにした。  ・Ver1.00から、実行時にマウスカレットを入出力ウィンドウに持って   いく機能をカットしていたが、今回再びその機能をつけた。  ・一部ソフトで解凍したとき、圧縮時のモードが原因で解凍時のディ   レクトリ名が正しくならないため、システムインクルードファイル   が読み込みエラーとなってしまっていたのを修正。 Version 1.00 2000/07/16(日)  ・16進数表記の時、大文字の'A'〜'F'を使用すると正しい値が得られなくなっていた   のを修正。  ・アドレス演算子(&)のオペランドの型に配列名を指定すると、エラーチェックに引っ   かかってしまっていたのを修正。  ・is*系、to*系の文字分類マクロ定義追加。  ・stdout, stderrが制限付きで擬似的に使用できるようにした。(ファイル出力系関数   の引数においてのみ指定可能です。例えば、fprintf(stdout, "hello!\n"); のような   使い方はできます。また、ファイルポインタとしてのstdinは定義していないので使用   できません。)  ・印刷処理の強化。(3つのそれぞれのウィンドウ内の印刷及び、プレビューができ   るようにした)  ・Windows2000で動かなかったのを修正。  ・エディットウィンドウにプログラムをうった時点で(ファイルとして保存しなくて   も)実行可能なようにした。  ・どのようなファイル名のソースに対しても実行可能なようにした。  ・各種設定を次回起動時反映できるようにした。 Version 0.22 Finalβ 2000/07/03(月)  ・前置後置増減演算子のコード生成処理を全体的に変更。今までは、a[kansu()]++;   の記述だとコード生成に矛盾がでて、動作不可だった。また、a[b+=1]++;などの   場合は、b+=1が2回評価されてしまっていた。  ・単項演算子(+, -, !, ~)適応時、オブジェクトの型がおかしくなってしまって   いたのを修正。  ・1e-5のように、仮数部に小数点がない場合は動作不可になってしまっていたのを   修正。  ・void *型からみの型チェック処理変更。  ・exit()関数、fabs()関数追加。 Version 0.21β 2000/06/30(金)  ・構造体(共用体)のオブジェクト間での代入が正しく行われていなかったのを   修正  ・while(条件式){...}文の条件式中に前置増減演算子があると動作不可になって   いたのを修正  ・配列添え字演算子のオペランドの汎整数型チェックが正しく行われていなかっ   たのを修正  ・記憶クラス指定子・型修飾子と、typedef名の組み合わせの宣言のとき、記憶   クラス指定子・型修飾子が内部的に消えてしまっていたのを修正  ・インクルードファイル内でのエラー警告メッセージの現在処理しているファイ   ル名表示が正しく行われていなかったのを修正  ・#if*で状態が偽になり、かつ#endifが抜けているとプリプロセッサプロセスが   終了しないのを修正 Version 0.20β 2000/06/29(木)  ・+, -, +=, -= 演算子のオペランドの型が、一方が汎整数型でもう一方がポイン   タ型のとき、汎整数型の方の式がオブジェクト指名子のとき動作不可となって   いたのを修正  ・-演算子の両オペランドの型が互換ポインタ型の場合、演算結果が負になるよう   な場合、値がおかしくなってしまっていたのを修正  ・unsigned int(unsigned long)型のオブジェクトが通常型変換の際に、値が0に   なってしまっていたのを修正  ・関数定義の戻り値型とreturn 式の型のエラー警告チェック処理を追加  ・1.2e-2fのような記述をしても、小数定数がfloat型にならず、double型になっ   てしまっていたのを修正  ・入力待ち時Ctrlキーを押したときに、標準入力へのEOF入力をできるようにした  ・scanf系関数の変換仕様中の*指定に対応  ・printf系関数の変換仕様中の*指定に対応  ・scanf系関数の変換仕様中に数字指定があると、それ以降の読み込みがずれてし   まっていたのを修正  ・余分なコードの整理 Version 0.19β 2000/06/25(日)  ・大きさ不明の1次元配列に文字列リテラル初期化をしたオブジェクトのsizeof演算   子の値が1となってしまっていたのを修正   (例)char a[]="abcde"; sizeof(a)が本当は6にならなければならないのに、1にな      ってしまっていた。  ・関数定義の仮引数に関数ポインタ型の変数宣言があると、コンパイル時内部的に不   都合があったため動作不定だったのを修正   (例)void func(int a, void (*fp)(int a, int b)) {}                           ↑ここ以降も名前空間が仮引数内として、                            処理していたため諸所の不都合がでていた  ・関数定義の仮引数に、変数を省略した関数ポインタ型の変数宣言があると、関数定義   の仮引数が省略されたと誤認してしまっていたのを修正   (例)void func(int a, void (*fp)(int, int b)) {} は正しい宣言だが、コンパイ      ルエラーとなってしまっていた  ・文字列が終了していませんのエラーメッセージのエラー行番号が0行になってしまっ   ていたのを修正  ・*.c以外のファイル名のファイルを実行させようとしたときのエラーメッセージが意味   不明なものになってしまっていたのを修正 Version 0.18β 2000/06/24(土)  ・0.12β→0.13βへのアップ時(仮想機械コードを変更したため、それによる副作用   で)fopen関数を呼ぶと内部エラーになってしまっていたのを修正  ・関数の最後ではなく途中でreturnで呼び出し元に返ると、場合によっては、仮想機械   の動的エリアスタックポインタがずれることがあったのを修正(重要!)  ・fclose()関数で正しくファイル閉じられていなかったのを修正  ・fscanf()関数でファイルの最後まで読み込んだとき、EOF(-1)が返却されていなかった   のを修正 Version 0.17β2 2000/06/23(金)  ・関数定義時戻り値型を省略すると、動作不可になっていたのを修正 Version 0.17β 2000/06/22(木)  ・明示的型変換処理がまったく動作していなかった(おかしくなってしまって   いた)のを修正  ・配列・前置後置増減演算子コード生成一部仮修正 Version 0.16β 2000/06/20(火)  ・小数定数の精度がおかしくなっていたのを修正  ・文字列リテラル内の2バイト文字の種類によっては、後続バイトがエスケープ   文字とぶつかるためおかしくなっていたのを修正(しかし、対応している関数がま   だないため表面的には意味を持たない)  ・#elifに対応  ・標準入出力ウィンドウ内の文字を整列するようにした  ・標準入出力ウィンドウ内に表示できるバイト数を設定できるようにした   (1000 〜20000バイト範囲) Version 0.15β 2000/06/18(日)  ・大きさ不明の配列に対しての文字列リテラル初期化で動作不可(1次元配列の場合   のみおかしくなっていた)になっていたのを修正   (例)char a[] = "abcde";  ・静的エリアオブジェクトに対しての文字列リテラル初期化処理で動作不可になって   いたのを修正   (例)static char *a[3] = {"abcde", "fghij", "klm"}; ・sin, cos, tan, log関数の引数・戻り値型をdoubleに変更 Version 0.14β2 2000/06/16(金)  ・0.12β→0.13βへのアップ時(仮想機械コードを変更したため、それによる副作用   で)main()関数の引数指定があると動作不定となってしまっていたのを修正 Version 0.14β 2000/06/16(金)  ・引数指定がある#defineマクロの、呼び出し中の実引数に')'が使用されていると、   その時点でマクロ呼び出し終了とみなしていたため、仮引数と実引数の数不一致と   なっていたのを修正  ・#if、#ifdef、#ifndefが入れ子になっているときに正常に動作していなかったのを   修正  ・#if〜#endifの2回目以降の使用のときエラーとなってしまっていたのを修正  ・記憶クラス指定子のみで型指定子なしの変数定義時に、内部的にsigned intが付加   されていなかったためエラーとなっていたのを修正 Version 0.13β 2000/06/15(木)  ・構造体(共用体)型のオブジェクトを関数の戻り値に指定すると動作不能になって   いたのを修正  ・return での関数の戻り値受け渡し間での(暗黙の)型変換が正常に行われていな   かったのを修正  ・for文中にcontinue;が使われていると、for()の再設定式評価が行われていなかった   のを修正  ・「sizeof 単項式」を式中の式として使用すると、動作不能になっていたのを修正   (例)int a; printf("%u\n", sizeof(a));  ・「sizeof (型名)」の型名中の抽象宣言子中に定数式があると動作不能になっていた   のを修正   (例)sizeof(int [2][3]); Version 0.12β 2000/06/13(火) ・配列添え字演算子のオペランドの「式」中に、前置後置増減演算子が使用   されていると、動作不定になっていたのを修正。   (例)a[i++]や、a[--i]のとき ・double、long double型のオブジェクトに単項演算子(-, !)適応時、仮想   機械のバグで、正常動作していなかったのを修正。 Version 0.11β 2000/06/10(土) ・グラフィックスウィンドウにスクロールバー追加 ・余分な初期化子の場合もポインタ型関連の型チェック処理を行っていたのを修正 ・インクルードパス読み込み領域処理を変更 Version 0.10β 2000/05/22(月)  ・βテスト版公開