2012年2月14日火曜日

B言語

懐かしきB言語です
使った事無いですけど

さて
某コンパイラのヘッダ見てたらこんなのがありました

int putc (auto char c, auto FILE *f);

auto?
なにそれ 美味しい物?
んで 調べてみると
どうやらB言語の名残でC言語では見ることはないらしい
(組み込みCコンパイラのstdio.hにふっつーに書いてあったけどな!)

んで B言語を調べてて 面白そうなコードを発見
Wikipediaに書いてあるんだけど与えた数値を与えた進数で表示するコード

んで C言語に移植したコード


Wikipediaのコードは最大10進数まで(※)なので
改造して36進数まで対応させました
36以上は数字もアルファベットも使い切るので
これ以上は実用性なくなるなぁ
256進数なんて誰も使わねぇよ...

んで 実行するとこうなる

左から 10進/16進/36進
もうちょっと機能を足したら
プログラムの動き方の説明とかで使えるかな?

ただこのコード
PICとかで使うのはやめたほうがいいと思います
PICのプログラムカウンタは通常の場合8レベルでスタックされるので
関数が8回くらい以上呼び出されるとマズイです
int型の場合は最大で10回くらい呼び出される可能性があるので
それよりも少ない数 たとえば120で3回としても
それ以前に複数回呼び出されていないとも限りません
なので PICでこのコードはマズイと思います
(ここらへんの動作は試していないのでテキトーに書いてるだけですけども)
まぁわざわざPICでこういうコードを使う必要もないと思いますが…


とりあえず 暇つぶしにB言語をC言語に移植(コラ)してみましたというお話

B言語ってぐぐってもC言語しか出てこないんだよなぁ




※)/* 以下 読み飛ばしても大丈夫な感じの記述 */
 アスキーコードで数字は'0'(0x30)から続いてることを利用した処理
 結構な頻度で使われる
 ただし9からAは連続していないから
 元のコードでは9までを使う10進しか対応していない
 そこでifを使って10以上は+=7で7個の記号を飛ばしてAにしている
 小文字を使いたい場合は+=39とすればいい
 んで今回はZ以降の処理をしていないので37進数を使うと36に'['が使われる
 そして42に'a'が来る
 ASCIIでは71(~)まで対応していてそれ以上はおかしな表示になる
 (半角カタカナでも表示されるかと思ったらされなかった)

0 件のコメント:

コメントを投稿