ページへ戻る

− Links

 印刷 

hideyosi​/hijk​/引数やUsage のバックアップの現在との差分(No.6) :: OSASK計画

osaskwiki:hideyosi/hijk/引数やUsage のバックアップの現在との差分(No.6)

« Prev[4]  Next »[5]
6: 2010-02-05 (金) 12:29:21 lina[6] ソース[7] 現: 2024-01-08 (月) 12:58:58 lina[6] ソース[8]
Line 12: Line 12:
 #include <guigui01.h>  #include <guigui01.h>
 + 
 /* これは関数の外で宣言するのが望ましい */  /* これは関数の外で宣言するのが望ましい */
 unsigned char cmdusage[] = {  unsigned char cmdusage[] = {
Line 19: Line 19:
     0x40 /* 最後のこれも決まり文句なので変更しない */      0x40 /* 最後のこれも決まり文句なので変更しない */
 };  };
 + 
 この設定で表示されるUsage。  この設定で表示されるUsage。
 usage>ex0012.g01 n:#  usage>ex0012.g01 n:#
Line 83: Line 83:
-0x0c, 0, 's', 0x3c, 3, 's', 't', 'r', /* 0x3cは文字列型引数 */+ 0x0c, 0, 's', 0x3c, 3, 's', 't', 'r', /* 0x3cは文字列型引数 */
|0x0c|(引数名の文字数-1)|(引数名)|''0x3c''|(説明部分の文字数)|(説明)| |0x0c|(引数名の文字数-1)|(引数名)|''0x3c''|(説明部分の文字数)|(説明)|
|これは省略不可な引数だというサイン| | |この引数は文字列だというサイン| | | |これは省略不可な引数だというサイン| | |この引数は文字列だというサイン| | |
- 
**引数がファイルパスである場合 [#yb36c68d] **引数がファイルパスである場合 [#yb36c68d]
-0x0c, 1, 'i','n', 0x3c, 10, 'i', 'n', 'p','u','t','-','f','i','l','e' /* 0x0cはファイルパス型引数 */+ 0x0c, 1, 'i','n', 0x3c, 10, 'i', 'n', 'p','u','t','-','f','i','l','e' /* 0x0cはファイルパス型引数 */
|0x0c|(引数名の文字数-1)|(引数名)|''0x0c''|(説明部分の文字数)|(説明)| |0x0c|(引数名の文字数-1)|(引数名)|''0x0c''|(説明部分の文字数)|(説明)|
Line 137: Line 136:
   0x86,  /* これは決まり文句なのでとりあえず変更しない */    0x86,  /* これは決まり文句なのでとりあえず変更しない */
   0x55,  /* 引数名省略可能モード */    0x55,  /* 引数名省略可能モード */
 + 
   0x1c, 2, 'o','p','t', 0x0c, 9, 0x01, 'i', 'o', 'n', '-', 'f', 'i', 'l', 'e',    0x1c, 2, 'o','p','t', 0x0c, 9, 0x01, 'i', 'o', 'n', '-', 'f', 'i', 'l', 'e',
   0x0c, 2, 'o','u','t', 0x0c, 9, 0x01, 'p', 'u', 't', '-', 'f', 'i', 'l', 'e',    0x0c, 2, 'o','u','t', 0x0c, 9, 0x01, 'p', 'u', 't', '-', 'f', 'i', 'l', 'e',
 + 
   0x40 /* 最後のこれも決まり文句なので変更しない */    0x40 /* 最後のこれも決まり文句なので変更しない */
 };  };
第一引数をプログラム内に受け取るにはどうしたらえぇんじゃろ・・・見つからないなぁ・・・ 第一引数をプログラム内に受け取るにはどうしたらえぇんじゃろ・・・見つからないなぁ・・・
 +
 +COLOR(blue){関数で、戻り値があるのかないのかは、guiguo01.h内を見ればわかるらしい。strct inlune int なんてやってるのは、int型の戻り値を持つもの!・・・だと思う。多分・・・}
引数をプログラム内に受け取ると思われる関数は以下のとおり。 引数をプログラム内に受け取ると思われる関数は以下のとおり。
- +-Void g01_getcmdlin_exit1() 
- +-Void g01_getcmdlin_fopen_s(i) 
--g01_getcmdlin_exit1() __asm__ __volatile__("call _g01_execcmd0\n\t.byte 0x86,0xbf"+-Void g01_getcmdlin_fopen_o(i) 
--g01_getcmdlin_fopen_s(i) +-Void g01_getcmdlin_fopen_m(i, j) 
--g01_getcmdlin_fopen_o(i) +-Void g01_getcmdlin_fopen_s_0_4(i) 
--g01_getcmdlin_fopen_m(i, j) +-Void g01_getcmdlin_fopen_s_3_5(i) 
--g01_getcmdlin_fopen_s_0_4(i) __asm__ __volatile__("call _g01_execcmd0\n\t.byte 0x86,0x60,0x04"::"a"(i):"%esi","%edi","cc"+-int g01_getcmdlin_fopen_m_0_4(int i, int j) 
--g01_getcmdlin_fopen_s_3_5(i) __asm__ __volatile__("call _g01_execcmd0\n\t.byte 0x86,0x60,0x35"::"a"(i):"%esi","%edi","cc"+-int g01_getcmdlin_fopen_o_0_4(int i) 
--g01_getcmdlin_fopen_m_0_4(int i, int j) +-int g01_getcmdlin_fopen_o_3_5(int i) 
--g01_getcmdlin_fopen_o_0_4(int i) +-int g01_getcmdlin_flag_s(int i) 
--g01_getcmdlin_fopen_o_3_5(int i) +-Void g01_getcmdlin_flag_o(i) 
--g01_getcmdlin_flag_s(int i) +-Void g01_getcmdlin_int_s(i) COLOR(red){あっれえぇ?これはdevineなのに戻り値があるはず? 法則がわからん・・・} 
--g01_getcmdlin_flag_o(i) g01_getcmdlin_flag_s(i) +-int g01_getcmdlin_int_o(int i, int d) 
--g01_getcmdlin_int_s(i) g01_getcmdlin_flag_s(i+-Void g01_getcmdlin_str_s0(i, n, p) 
--g01_getcmdlin_int_o(int i, int d) +-Void g01_getcmdlin_str_s0_0(n, p) 
--g01_getcmdlin_str_s0(i, n, p) __asm__ __volatile__("call _g01_execcmd0\n\t.byte 0x86, 0x61, 0x36, 0x02"::"c"(i),"a"(n),"d"(p):"%esi","%edi","cc","memory"+-int g01_getcmdlin_str_o0(int i, int n, void *p)
--g01_getcmdlin_str_s0_0(n, p) __asm__ __volatile__("call _g01_execcmd0\n\t.byte 0x86, 0x03, 0x60, 0x20"::"a"(n),"d"(p):"%esi","%edi","cc","memory"+
--g01_getcmdlin_str_o0(int i, int n, void *p)+
-int g01_getcmdlin_str_m0_1(int j, int n, void *p) -int g01_getcmdlin_str_m0_1(int j, int n, void *p)
--g01_getcmdlin_argc(int i) +-int g01_getcmdlin_argc(int i) 
--g01_getcmdlin_put0_s(i) __asm__ __volatile__("call _g01_execcmd0\n\t.byte 0x86,0xbc,0x60"::"a"(i):"%esi","%edi","cc"+-Void g01_getcmdlin_put0_s(i) 
--g01_getcmdlin_put1_s(i) __asm__ __volatile__("call _g01_execcmd0\n\t.byte 0x86,0xbd,0x60"::"a"(i):"%esi","%edi","cc"+-Void g01_getcmdlin_put1_s(i) 
--g01_getcmdlin_put0_m_exit1(i, j) __asm__ __volatile__("call _g01_execcmd0\n\t.byte 0x38,0x6b,0xc6,0x01,0x43,0x10"::"a"(i),"c"(j)+-Void g01_getcmdlin_put0_m_exit1(i, j) 
--g01_getcmdlin_put1_m_exit1(i, j) __asm__ __volatile__("call _g01_execcmd0\n\t.byte 0x38,0x6b,0xd6,0x01,0x43,0x10"::"a"(i),"c"(j)+-Void g01_getcmdlin_put1_m_exit1(i, j) 
--g01_cmdlin3s(int l) {} +-int g01_cmdlin3s(int l) {} 
--g01_cmdlin3m(int l, int i) {} +-int g01_cmdlin3m(int l, int i) {} 
--g01_cmdlin4s(int l) {} +-int g01_cmdlin4s(int l) {} 
--g01_cmdlin4m(int l, int i) {} +-int g01_cmdlin4m(int l, int i) {} 
--g01_cmdlin5s(int l) {} +-int g01_cmdlin5s(int l) {} 
--g01_cmdlin5m(int l, int i) {} +-int g01_cmdlin5m(int l, int i) {} 
--g01_cmdlin6s1(int l, int n, void *p) {} +-int g01_cmdlin6s1(int l, int n, void *p) {} 
--g01_cmdlin6m1(int l, int i, int n, void *p) {} +-int g01_cmdlin6m1(int l, int i, int n, void *p) {} 
--jg01_getcmdline0 jg01_getcmdlin1 +-Void jg01_getcmdline0 
--jg01_getcmdline1 jg01_getcmdlin0 +-Void jg01_getcmdline1 
--jg01_getcmdlin0(int n, void *p) +-int jg01_getcmdlin0(int n, void *p) 
--jg01_getcmdlin1(n, p) __asm__ __volatile__("call _g01_execcmd0\n\t.byte 0x7b,0x99,0x80,0x10,0x36,0x02"::"a"(n),"d"(p):"%esi","%edi","cc")+-Void jg01_getcmdlin1(n, p)
**引数受け取り関数の整理(予測ね。実験しながら・・・) [#y256f834] **引数受け取り関数の整理(予測ね。実験しながら・・・) [#y256f834]
Line 193: Line 192:
   0x86,  /* これは決まり文句なのでとりあえず変更しない */    0x86,  /* これは決まり文句なのでとりあえず変更しない */
   0x55,  /* 引数名省略可能モード */    0x55,  /* 引数名省略可能モード */
 + 
   0x1c, 2, 'o','p','t', 0x0c, 9, 0x01, 'i', 'o', 'n', '-', 'f', 'i', 'l', 'e', ←引数番号0    0x1c, 2, 'o','p','t', 0x0c, 9, 0x01, 'i', 'o', 'n', '-', 'f', 'i', 'l', 'e', ←引数番号0
   0x0c, 2, 'o','u','t', 0x0c, 9, 0x01, 'p', 'u', 't', '-', 'f', 'i', 'l', 'e',  ←引数番号1    0x0c, 2, 'o','u','t', 0x0c, 9, 0x01, 'p', 'u', 't', '-', 'f', 'i', 'l', 'e',  ←引数番号1
 + 
   0x40 /* 最後のこれも決まり文句なので変更しない */    0x40 /* 最後のこれも決まり文句なので変更しない */
 };  };
 + 
 ↓Usage表示(コマンドラインの設定)はこうなる。  ↓Usage表示(コマンドラインの設定)はこうなる。
 usage>test.g01 [opt:option-file] out:output-file  usage>test.g01 [opt:option-file] out:output-file
Line 208: Line 207:
 >hijk.exe test.g01 opt:hogehoge.txt out:ugougo.txt  >hijk.exe test.g01 opt:hogehoge.txt out:ugougo.txt
  i=1                                                    ←0番目の引数が存在するぞ!   i=1                                                    ←0番目の引数が存在するぞ!
 + 
 >hijk.exe test.g01 out:ugougo.txt  >hijk.exe test.g01 out:ugougo.txt
  i=0                                                    ←0番目の引数は指定されてない(空)だぞ!   i=0                                                    ←0番目の引数は指定されてない(空)だぞ!
Line 260: Line 259:
 g = g01_getcmdlin_int_s(i);      ←問題なければgに引数の内容が入る  g = g01_getcmdlin_int_s(i);      ←問題なければgに引数の内容が入る
 +
 +-g01_getcmdlin_int_s(i)
***g01_getcmdlin_int_o系 [#l0f77b1a] ***g01_getcmdlin_int_o系 [#l0f77b1a]
省略可能(オプショナル型というらしい)の引数を取得する。省略可能なのだから、指定がなかったりしてもエラーにならない 省略可能(オプショナル型というらしい)の引数を取得する。省略可能なのだから、指定がなかったりしてもエラーにならない
 +
 +省略された場合の規定値が必要になる。第二引数の int d がこれを担当する。
 +
 + int g;                              ←引数を受け取る変数
 + int i; i = 0;                        ←引数番号を指定する。0なので、一番最初に定義された引数
 + g = g01_getcmdlin_int_o(i,100);      ←問題なければgに引数の内容が入る。
 +                                       もしこの引数が指定されてなかった場合は、100が指定された
 +                                       (規定値)とみなしてgに100が返される。
 +
 +
 +
 +
 +-g01_getcmdlin_int_o(int i, int d)
**g01_getcmdlin_str系 [#t4f1bd5b] **g01_getcmdlin_str系 [#t4f1bd5b]
文字列型のデータを受け取る。 文字列型のデータを受け取る。
 +***g01_getcmdlin_str_s0系 [#u8ec31e9]
 +シングル型。省略不可の引数の場合に使う。(s0となっているのは「文字列として受け取り、末尾に0をつけるという働きのためだと思われる。~
 +COLOR(red){戻り値を持たないことに注意!}
 + int i; i = 0;                            ←取得する引数番号
 + int n; n = 16;                            ←取得する文字列の最大長(この場合は16バイト分)
 + char s[16];                              ←取得した引数(文字列)を格納する配列orポインタ
 + 
 + g01_getcmdlin_str_s0(i, n, s)            ←戻り値なし。引数がs[]に格納され、末尾に0が付く
 +
 +
 +
 +-g01_getcmdlin_str_s0(i, n, p)
 +
 +
 +
 +
 +
 +-g01_getcmdlin_str_s0_0(n, p)
 +
 +
 +COLOR(red){ダメダ・・・これも規定値の扱いがわからん・・・・}
 +
 +
 +-g01_getcmdlin_str_o0(int i, int n, void *p)
 +-g01_getcmdlin_str_m0_1(int j, int n, void *p)
 +
 +COLOR(blue){うっちゃんの予測を検証すべく、実験をしてみた}
 +
 +COLOR(red){ちなみにオイラの予想してたこと。intタイプと同じように、コード内に規定値を打ち込むような形式だと思ってた}
 + 例:
 + intタイプは戻り値として取得したコマンドラインパラメータを返してくれる。
 +       g = g01_getcmdlin_int_s(0);    // 0番目の引数を取得し、gに渡す
 + 省略可能の場合・・・
 +       g = g01_getcmdlin_int_o(0,100);    // 0番目の引数を取得し、もしなかったら規定値として
 +                                             100を返す
 + 
 + この流れで行くとstrタイプも・・・・
 +       *g = g01_getcmdlin_str_s0(0);    // 0番目の文字型引数を取得し、gに渡す
 + 省略可能の場合・・・
 +       *g = g01_getcmdlin_str_s0(0,"イカ自身");    // 0番目の文字型引数を取得し、gに渡すが、
 +                                                       もし指定がなかったら規定値として
 +                                                       「イカ自身」という文字を返す
 +
 +しかし、実際には戻り値がないタイプだったのでこれは間違い。
 +
 +こんなコードを書いてみる。
 + #include <guigui01.h>
 + #include <stdio.h>
 + 
 + unsigned char cmdusage[] = {
 +   0x86,  /* これは決まり文句なのでとりあえず変更しない */
 +   0x55,  /* 通常モード(引数名省略不可) */
 + 
 +   0x0c, 2, 'o','p','t', 0x3c, 9, 0x01, 'i', 'o', 'n', '-', 'f', 'i', 'l', 'e',
 + 
 +   0x40 /* 最後のこれも決まり文句なので変更しない */
 + };
 + 
 + void G01Main()
 + {
 +   g01_setcmdlin(cmdusage);          //コマンドライン定義
 + 
 +   char *buffer = g01_bss1a1;        //お便利バッファ2MBを宣言
 +   g01_getcmdlin_str_s0(0,100,buffer);    //引数受け取り
 + 
 +   g01_putstr0(buffer);
 +   return;
 + }
 +
 +-これは問題ない。引数無指定ならUsageが表示される。
 +-opt:uniba-G! なんて引数を与えると、ちゃんと画面に表示されて終了する。
 +
 +-ここで、引数のタイプを省略可能にしてみる。  0x1c, 2, 'o','p','t', 0x3c, 9, 0x01, 'i', 'o', 'n', '-', 'f', 'i', 'l', 'e',
 +-このままコンパイルしても、エラーになってしまう。(引数指定と受け取り指定がズレるからかなたぶん)
 +-なので、受け取り側も省略可能タイプと指定。  g01_getcmdlin_str_o0(0,100,buffer);    //引数受け取り
 +-これでいままでと同じように動作する。(しいて違いを言えば、無指定の時、省略可能なのでUsage表示をしない)
 +
 +
 +うーん・・・やはり、intが特殊だったって法則でいいのかな。COLOR(blue){本来は規定値なんて概念はない。自分で戻り値を検証するコードを書け。・・・で。intだけは便利にしといたよ!・・・みたいな? www}
**g01_getcmdlin_fopen系 [#t3509916] **g01_getcmdlin_fopen系 [#t3509916]
ファイルパスタイプのデータを受け取る。(ファイルパスを受け取って開かないわけはない!ということで、fopenと一体型になっているのだろう。きっと) ファイルパスタイプのデータを受け取る。(ファイルパスを受け取って開かないわけはない!ということで、fopenと一体型になっているのだろう。きっと)
 +
 +***g01_getcmdlin_fopen_s系 [#s43bdb52]
 +省略不可に設定されたファイルパスを取得し、オープンする???
 +-g01_getcmdlin_fopen_s(i)
 +
 +
 +
 +
 +COLOR(red){・・・この流れで行けばoは省略可能の場合だと思うのだが、じゃ、''規定値''はどうするのこれ???}
 +
 +COLOR(red){iは?? スロットの指摘? 引数番号??}
 +
 +COLOR(red){困ったなぁ 載ってないぞ・・・・}
 +
 +-g01_getcmdlin_fopen_o(i)
 +
 +
 +
 +
 +
 +
 +
 +-g01_getcmdlin_fopen_m(i, j)
 +
 +
 +-g01_getcmdlin_fopen_s_0_4(i)
 +COLOR(red){こいつの正体はわかってるけど省略形なので後回し・・・・・・}
 +
 +
 +-g01_getcmdlin_fopen_s_3_5(i)
 +-g01_getcmdlin_fopen_m_0_4(int i, int j)
 +-g01_getcmdlin_fopen_o_0_4(int i)
 +-g01_getcmdlin_fopen_o_3_5(int i)
 +
 +
 +COLOR(blue){うっちゃんの予測を検証すべく、実験をしてみた}
 +
 +こんなコードを書く。
 + #include <guigui01.h>
 + #include <stdio.h>
 + 
 + unsigned char cmdusage[] = {
 +   0x86,  /* これは決まり文句なのでとりあえず変更しない */
 +   0x55,  /* 通常モード(引数名省略不可) */
 + 
 +   0x0c, 2, 'o','p','t', 0x0c, 9, 0x01, 'i', 'o', 'n', '-', 'f', 'i', 'l', 'e',
 + 
 +   0x40 /* 最後のこれも決まり文句なので変更しない */
 + };
 + 
 + void G01Main()
 + {
 +   g01_setcmdlin(cmdusage);          //コマンドライン定義
 + 
 +   char *buffer = g01_bss1a1;        //お便利バッファ2MBを宣言
 +   g01_getcmdlin_fopen_s_0_4(0);    //引数受け取り&ファイルオープン
 + 
 +   jg01_fread0_4(2 * 1024 * 1024, buffer); /* 最大2MB, 終端に0がつく */
 +   g01_putstr0(buffer);
 +   return;
 + }
 +
 +-まずこれは正常に動作した。引数は省略不可なので指定しないとUsageが表示される。(一種のエラーかな・・)
 +-次に、引数側を省略可能にした。つまりこう。 0x1c, 2, 'o','p','t', 0x0c, 9, 0x01, 'i', 'o', 'n', '-', 'f', 'i', 'l', 'e',
 +-引数を指定しないと跳んでしまう・・・・
 +-引数を前回と同じもので指定しても、エラーが返される。
 + debug: cmdlin_fopen: 4 56 test.txt
 + c_api: junk_fopen: error
 +
 +省略可能引数なので、それに合わせるべく、fopen側をイジる。つまり、g01_getcmdlin_fopen_o_0_4(0);
 +
 +-跳ばない。でもUsageを表示せずに終了(・・・これはええと。正しい動作なのかな???たぶん)
 +-引数(ファイル名)を指定すると、最初の引数省略不可の場合と同じ動作をしてくれる(つまり、正常動作?)
 +
 +**m系列・・・? [#d3122612]
 +
 + if (g01_getcmdlin_fopen_m_0_4(0, j) == 0)
 +
 +cpyのソース内でこんなことしてる・・・ぞ? m系列はあえて後回しにしてたんだけど、これは戻り値をもっている??
 +
 +**g01_getcmdlin_argc [#t240815c]
 +指定した引数番号の引数が指定されているかどうかを判定する。
 +
 + int g;                            ←引数の状態を受け取る変数
 + int i; i = 0;                    ←何番の引数について調べるか?
 + g = g01_getcmdlin_argc(i);        ←引数番号0の引数が指定されているかどうかの答えがgに入る。
 +                                       指定されていれば1、なければ0が返される。
 +
 +
 +-g01_getcmdlin_argc(int i)
 +
 +
 +**g01_getcmdlin_flag系 [#g99d3588]
 +
 +g01_getcmdlin_flag_o(0)
 +
 +-g01_getcmdlin_flag_s(int i)
 +-g01_getcmdlin_flag_o(i)
 +-g01_getcmdlin_flag_s(i)
 +-g01_getcmdlin_flag_s(i)
 +
 +
 +
 +
 +**未分類 [#pf4705d9]
 +-g01_getcmdlin_exit1()
 +-g01_getcmdlin_put0_s(i)
 +-g01_getcmdlin_put1_s(i)
 +-g01_getcmdlin_put0_m_exit1(i, j)
 +-g01_getcmdlin_put1_m_exit1(i, j)
 +-g01_cmdlin3s(int l) {}
 +-g01_cmdlin3m(int l, int i) {}
 +-g01_cmdlin4s(int l) {}
 +-g01_cmdlin4m(int l, int i) {}
 +-g01_cmdlin5s(int l) {}
 +-g01_cmdlin5m(int l, int i) {}
 +-g01_cmdlin6s1(int l, int n, void *p) {}
 +-g01_cmdlin6m1(int l, int i, int n, void *p) {}
 +-jg01_getcmdline0
 +-jg01_getcmdlin1
 +-jg01_getcmdline1
 +-jg01_getcmdlin0
 +-jg01_getcmdlin0(int n, void *p)
 +-jg01_getcmdlin1(n, p)
*COLOR(red){オイラ的な備考} [#o91a8f8f] *COLOR(red){オイラ的な備考} [#o91a8f8f]
このUsage表示(コマンドライン定義)では、省略形を使う場合はかならずソースにベタ書きをのこしておくといいと思う。 このUsage表示(コマンドライン定義)では、省略形を使う場合はかならずソースにベタ書きをのこしておくといいと思う。
« Prev[4]  Next »[5]