2: 2009-01-12 (月) 23:38:34 [6] | 現: 2024-01-08 (月) 12:58:42 k-tan[7] [8] | ||
---|---|---|---|
Line 1: | Line 1: | ||
- | * ぐいぐい01に関するメモ-26 | + | TITLE:x |
+ | * ぐいぐい01に関するメモ-26 [#tcc7397f] | ||
-(by [[K]], 2009.01.12) | -(by [[K]], 2009.01.12) | ||
-メモのうち重要な部分をそのうちまとめてまともなページを作る | -メモのうち重要な部分をそのうちまとめてまともなページを作る | ||
- | *** (38) GOで「ぐいぐい01」アプリを作る(4) | + | *** (38) GOで「ぐいぐい01」アプリを作る(4) [#e629ed35] |
-[[GUIGUI01/memo25]]の続きです。仕様変更ももうそんなにはないと思うので、書いても問題はないかなと。 | -[[GUIGUI01/memo25]]の続きです。仕様変更ももうそんなにはないと思うので、書いても問題はないかなと。 | ||
---- | ---- | ||
-ex0016では、cmdusage[ ]が合計18バイトにまで増えました。しかしこれは13バイトにまで減らせます。小さいことは「ぐいぐい01」ではとても重要なことなので、最初はそれを説明しようと思います。 | -ex0016では、cmdusage[ ]が合計18バイトにまで増えました。しかしこれは13バイトにまで減らせます。小さいことは「ぐいぐい01」ではとても重要なことなので、最初はそれを説明しようと思います。 | ||
-ex0016のcmdusage[ ]の中には、16進数の1の位に「c」が出てくる場所が5ヶ所あります。これは、gh4のコードで「次の1バイトを数値として解釈」させるために使っています。しかし、もし値が0~4の範囲であれば、わざわざこんなことしないで、「c」の位置にその値を直接書いてしまっていいのです。gh4とはそういうものなのです。 | -ex0016のcmdusage[ ]の中には、16進数の1の位に「c」が出てくる場所が5ヶ所あります。これは、gh4のコードで「次の1バイトを数値として解釈」させるために使っています。しかし、もし値が0~4の範囲であれば、わざわざこんなことしないで、「c」の位置にその値を直接書いてしまっていいのです。gh4とはそういうものなのです。 | ||
+ | //ちなみに最初の 0x86, 0x5c, ?, の「c」の部分は4までしか置き換えられませんが、その他の「c」は5もOKです。 | ||
-何を言っているのかよく分からないと思いますが、たとえば、 | -何を言っているのかよく分からないと思いますが、たとえば、 | ||
0x86, 0x5c, 0, | 0x86, 0x5c, 0, | ||
Line 13: | Line 15: | ||
-と短く書けるのです。これで1バイト節約できます。同じようにして、他の部分を全部整理するとこうなります。ex0017.cです。 | -と短く書けるのです。これで1バイト節約できます。同じようにして、他の部分を全部整理するとこうなります。ex0017.cです。 | ||
#include <guigui01.h> | #include <guigui01.h> | ||
+ | |||
unsigned char cmdusage[] = { | unsigned char cmdusage[] = { | ||
0x86, 0x50, | 0x86, 0x50, | ||
Line 20: | Line 22: | ||
0x40 | 0x40 | ||
}; | }; | ||
+ | |||
void G01Main() | void G01Main() | ||
{ | { | ||
(ex0015.cと同じ内容) | (ex0015.cと同じ内容) | ||
} | } | ||
- | -(書き途中) | + | -これをmakeすると128バイトになります。でも動作はex0016と完全に同じです。 |
- | //-(フラグ型) | + | ---- |
- | //-(usage改行) | + | -じゃあもう一つ小さくする技を。ex0017では引数が「s:str」と「n:#」でしたが、これを「str:string」と「num:number」にしたいとしましょう。まあどうせ順序を覚えていれば「str:」や「num:」とタイプする必要はないですしね。それなら分かりやすいほうがいい、と考える人もいるでしょう。 |
- | //-(ファイル例はtypeコマンド) | + | --そういえば今まで説明してきませんでしたが、引数名は半角で文字コード0x21~0x7eの範囲で(つまり数字はいいけどスペースはダメ)、「"」や「:」を含まないものにしなければいけません。というか記号類は避けたほうがいいです。確実に使っても問題がない記号を以下に挙げておきますが、とにかく記号なんて使うと、OSによっては(というかシェルによっては)、入力しにくくなること請け合いです(後半のものはできれば使わないで置いたほうがいいんじゃないかと思ったもの)。 |
+ | !#'=~+-/@_\^` ;?*& | ||
+ | -ということでex0018.cです。 | ||
+ | #include <guigui01.h> | ||
+ | |||
+ | unsigned char cmdusage[] = { | ||
+ | 0x86, 0x50, | ||
+ | 0x02, 's', 't', 'r', 0x34, 0x01, 'i', 'n', 'g', | ||
+ | 0x12, 'n', 'u', 'm', 0x14, 0x01, 'b', 'e', 'r', | ||
+ | 0x40 | ||
+ | }; | ||
+ | |||
+ | void G01Main() | ||
+ | { | ||
+ | (ex0015.cと同じ内容) | ||
+ | } | ||
+ | -ここでまたサイズを節約するテクニックを使いました。というのは引数説明のところで、0x01というのを使っているからです。これはusage表示するときに引数名に置換されます。これを使うことで 0x3c や 0x1c を使わずに済んでいますし、そもそも置換することでそれぞれ2バイト節約しています。 | ||
+ | -makeすると136バイトになります。一応usage表示を見て確認しておきましょう。 | ||
+ | >efg01 ex0018.g01 | ||
+ | usage>ex0018.g01 [str:]string [[num:]number] | ||
+ | ---- | ||
+ | -こうしてコマンドラインにたくさん引数を使うようになると、usage表示がかなり長くなることがあります。「usageなんかみないぜ!そんなの気にしない」っていう人はそれで問題ないんですが、やっぱりどうせならきれいにusage表示してほしいって思う人もいるでしょう。ここではその方法を説明したいと思います。 | ||
+ | -ということでex0019.cです。 | ||
+ | #include <guigui01.h> | ||
+ | |||
+ | unsigned char cmdusage[] = { | ||
+ | 0x86, 0x50, | ||
+ | 0x02, 's', 't', 'r', 0x34, 0x01, 'i', 'n', 'g', | ||
+ | 0x87, | ||
+ | 0x12, 'n', 'u', 'm', 0x14, 0x01, 'b', 'e', 'r', | ||
+ | 0x40 | ||
+ | }; | ||
+ | |||
+ | void G01Main() | ||
+ | { | ||
+ | (ex0015.cと同じ内容) | ||
+ | } | ||
+ | -これをmakeすると137バイトになりますが、注目ポイントは 0x87, です。これがあると、usage表示のときにここで改行します。それ以外の効果はありません。この改造をしてももちろん「num:」は引数番号1のままです(2になったりはしない)。 | ||
+ | -これをusage表示させるとこうなります。 | ||
+ | >efg01 ex0019.g01 | ||
+ | usage>ex0019.g01 [str:]string | ||
+ | [[num:]number] | ||
+ | ---- | ||
+ | -さてここまでで整数型引数と文字列型引数を紹介してきましたが、次はフラグ型引数を紹介します。これは値を指定するのではなく、単にその引数名が現れたかどうかだけを問題にします。・・・どんな例にしましょうか。じゃあたとえば0からnまで数えるプログラムを使いましょう。ex0020.cです。 | ||
+ | #include <guigui01.h> | ||
+ | |||
+ | unsigned char cmdusage[] = { | ||
+ | 0x86, 0x51, /* フラグ型は自動当てはめ対象からははずすようにする */ | ||
+ | 0x13, 'd', 'o', 'w', 'n', 0x20, | ||
+ | /* フラグ型は当然省略可能に。そしてフラグ型には説明を付けない。 */ | ||
+ | 0x00, 'n', 0x11, '#', | ||
+ | 0x40 | ||
+ | }; | ||
+ | |||
+ | void setdec(char *s, int i, int n) | ||
+ | { | ||
+ | (ex0010.cと同じ内容) | ||
+ | } | ||
+ | |||
+ | void G01Main() | ||
+ | { | ||
+ | int i, n; | ||
+ | char s[4]; | ||
+ | g01_setcmdlin(cmdusage); | ||
+ | n = g01_getcmdlin_int_s(1); | ||
+ | if (g01_getcmdlin_flag_o(0) == 0) { | ||
+ | /* down指定がない場合 */ | ||
+ | for (i = 0; i <= n; i++) { | ||
+ | setdec(s, i, 3); | ||
+ | s[3] = 0; | ||
+ | g01_putstr0(s); | ||
+ | } | ||
+ | } else { | ||
+ | /* down指定がある場合 */ | ||
+ | for (i = n; i >= 0; i--) { | ||
+ | setdec(s, i, 3); | ||
+ | s[3] = 0; | ||
+ | g01_putstr0(s); | ||
+ | } | ||
+ | } | ||
+ | return; | ||
+ | } | ||
+ | -これをmakeすると249バイトになります。そしてusageを出してみると、こうなります。 | ||
+ | >efg01 ex0020.g01 | ||
+ | usage>ex0020.g01 [down] [n:]# | ||
+ | -適当に実行してみるとこんな感じです。 | ||
+ | >efg01 ex0020.g01 10 | ||
+ | 0 1 2 3 4 5 6 7 8 9 10 | ||
+ | |||
+ | >efg01 ex0020.g01 7 down | ||
+ | 7 6 5 4 3 2 1 0 | ||
+ | -プログラムから推測できるように、 0x2c がフラグ型になります。しかしフラグ型では説明は付けないので、 0x20 を使うことになります。フラグ型を指定するときは、「down:」のように末尾に「:」があっても構いません。 | ||
+ | >efg01 ex0020.g01 7 down: | ||
+ | 7 6 5 4 3 2 1 0 | ||
+ | -フラグがコマンドライン中に存在していれば、g01_getcmdlin_flag_o()の値が0以外になります。存在しなければ0です。 | ||
- | * こめんと欄 | + | * こめんと欄 [#jffae6b6] |
+ | - このシリーズは好評のようです。実際にアプリを作って遊んでくれる人も出てきました。 -- [[K]] &new{2009-01-13 (火) 11:07:16}; | ||
+ | - abcdw014向けの記述に修正。 -- ''K'' &new{2009-01-16 (金) 22:12:08}; | ||
#comment | #comment |
(This host) = http://osask.net