ご愛顧いただいたOsask-Wikiでしたが2016/9/30をもって終了・凍結としました。ページの内容やボタン等に編集可能だった時の名残りが残っておりますが新たなページ設置や内容の変更等はできません。K)5/12も近づいて参りました。今年の512コンテストの一位はもはやネタのセンスでMt.orz0ではないかと思うのですが、まあ4/1企画のときのようにすごいのがたくさん出てくるかもしれないので、最後まで油断はできません。512バイトに収めるということになると、どうしてもアセンブラが有利になってしまうので(いやもちろん1KBでもアセンブラが有利ですが)、C言語ファンの人がもっと有利に戦えるように、ここにテクニックをまとめたいと思います。最新版<guigui00.h>を入手しましょう。これはosa_dir3にバンドル予定されているものですが、たぶん5/12にosa_dir3が間に合わないので、とりあえず以下のURLからダウンロードしてください。osa_dir2のz_tools/guigui00/guigui00.hを上書きすればOKです。(26.3KB)さて結局のところ、アセンブラがC言語に対してやたらと有利なのは、lib_execcmdをじゃんじゃん使うからです(と僕は思う)。そりゃあもちろん出力されるコードの質も違いますが。Cでもlib_execcmdを活用すれば、その差は縮むのです。いうことでここではlib_execcmdの活用を中心に説明します。原則lib_execcmdの使い方の基本形1.lib関数のうち、引数に変数が入っていないものを探す。値を受け取るものもダメ。staticな変数のポインタ(&)は、変数のうちには数えない(static配列は&をつけなくてもポインタ)。この状態になっていないと思うので、まずはこの状態に近づけることからはじめる。non-malloc化が非常に有効。lib関数が連続しているところが狙い目。単発のところは書き換えるとかえって大きくなっちゃうこともある。2.この世界ではおなじみのVPマクロとVPSマクロを定義。その際に全部VP()をつける。};4.あとはlib関数を呼んでいた場所で、lib_execcmd(cmd0);とやればOK。Q&A一ヶ所をexeccmd化したら全部execcmd化しないといけないの?そんなことないです。execcmd化したら小さくなるところだけexeccmd化して、あとはいつもどおりlib系の普通のやつを使っていいです。execcmd化できそうなところが見つけられません。最初のところが狙い目です。lib_initからシグナルボックスをオープンしてウィンドウを開いてウィンドウタイトルをつけて、defsigするあたりまでは変数を使わずに書けるはずです。この部分が一番execcmd化しやすいです。他はやりにくいのでそのままにしておいていいでしょう(苦労してやってもたいしてコンパクトにも高速にもならない)。下の関数表に出てない関数はどうやってexeccmd化するの?簡単にはexeccmd化できないので(やっても多分コンパクトにならない)、そのまま普通のままにしておいてください。lib_putstring_ASCIIは、まずlib_putstring1に書き換えておくといいでしょう。完全にnon-mallocにする必要はなくて、lib_execcmdの妨げになっている部分、おもにtextboxとかgraphboxとかwindowとかシグナルボックスとかをnon-malloc化するとよい。ついでに完全non-malloc化してもいい。