低レベルなヒトの覚え書き

●LSI C-86のエラー: とりわけ印象に残っているもの

1. 「out of memory」


[実験]

目的は4つ。
第1に、main関数の大きさとエラーの因果関係を確認すること。
第2に、どれくらいの大きさからエラー扱いされるのか調べること。
第3に、関数の大きさが何を単位として測られているのか調べること。
第4に、main以外の関数でも同様なのかを確かめること。
実際の手続きとしては、リスト1,2,3のようなプログラムを用意して、目的に応じた操作を加えつつ、コンパイル時のエラーの有無をチェックしました。
なお、以下において関数の行数とは、「{」から「}」までの行数を指します。

◆実験1

まず、リスト1のようなプログラムを材料として、printf文の行数を操作したところ、main関数が225行以上でエラーとなりました(目的1,2)。
個々のprintfで出力する文字の数を変えた場合も、結果は同じ。
注釈だけの行を入れたり、1つの命令を複数の行に分けて書いた場合は、新たに加えた改行の分だけ、多い行数でエラー。
逆に、1つの行に複数の命令を書いた場合は、減少した改行の分だけ、少ない行数でエラーとなりました(目的2,3)。

[リスト1]
 | #include<stdio.h>
 | int main() {
 |   printf("A\n");
 |   /* 以下、繰り返し */
 |   return 0;
 | }
◆実験2

リスト2のプログラムでは、mainとsub、それぞれの行数を操作しました(目的2,4)。
mainはsubを呼び出すだけにして(printf文抜きの4行)、subの行数を操作した場合は、subが224行以上でエラー。
subを223行に固定して、mainの行数を操作した場合は、mainが225行以上でエラー。
逆に、mainを224行に固定した場合は、subが224行でエラーとなりました。

[リスト2]
 | #include<stdio.h>
 | void sub();
 | int main() {
 |   printf("A\n");
 |   /* 以下、繰り返し */
 |   sub();
 |   return 0;
 | }
 | void sub() {
 |   printf("B\n");
 |   /* 以下、繰り返し */
 | }
◆実験3

リスト3のプログラムは、インクルードファイルの影響を検討するために用意したものです。
この場合は、mainが1778行以上でエラーとなりました(目的2)。

[リスト3]
 | int main() {
 |   int x;
 |   x=1;
 |   x++;
 |   /* 以下、繰り返し */
 |   return 0;
 | }

→トップ , →ひとつ上(lsic1)


R.2: 2006/08/01
Copyright (C) 2005,2006 A.Satoshi