K.Maebashi's BBS

ご自由に書き込んでください。雑談も可。
テスト書き込みの類はテスト用掲示板にどうぞ

[日付順表示] [日付順インデックス] [スレッド順インデックス]

新規投稿 | 開設者ホームページへ戻る | ヘルプ

[2291] 無題
投稿者:mhash
2022/05/20 00:53:19

現在某所で話題になってるゆっくり動画問題ってどう思われますか? 過去ののまネコ問題との類似性も指摘されているようですが(私はのまネコの方は当時中学生くらいだったので詳しくないのですが…)
[この投稿を含むスレッドを表示] [この投稿を削除]
[2290] Re:C言語ポインタ完全制覇、記述に関する愚痴(^^;
投稿者:(ぱ)こと管理人
2022/05/12 01:08:24

>ちなみに、手元のK&Rの第2版日本語訳(共立出版、1992年10月10日初版121刷、 >年齢がバレる?前橋さんより4年年上のようです)を開いてみたら、p.35(1.8 引数)の上部に、 >『配列の名前が引数として使われるときは、関数に渡される値は、実際には配列の先頭番地 >すなわちアドレスである。配列の要素のコピーは行われない。』 これはまったくその通りなのですが、『配列の名前が引数として使われるときは』という 限定は本当は不要なんですよね。もちろんここでそれを書く必要もないので、この説明が 悪いというわけではないのですが。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2288] Re:C言語ポインタ完全制覇、記述に関する愚痴(^^;
投稿者:かずちゃん
2022/05/10 05:16:53

>>Kenneth A. Reek の"Pointers on C"とかではどう表現されているのか読み直してみようかしらん… > >これは私は読んでいないので、何か面白いことが書いてあったら教えてください。 ちなみに、手元のK&Rの第2版日本語訳(共立出版、1992年10月10日初版121刷、年齢がバレる?前橋さんより4年年上のようです)を開いてみたら、p.35(1.8 引数)の上部に、 『配列の名前が引数として使われるときは、関数に渡される値は、実際には配列の先頭番地すなわちアドレスである。配列の要素のコピーは行われない。』 と、「C言語ポインタ完全制覇」を読んだあとである今読むと素直にピピッと理解でき曖昧さも少ない表現がされていました… その他、英語で書かれたCの本で、(英語での)Cの変数の宣言の読み解き方が、「C言語ポインタ完全制覇」同様にわかりやすく書かれた本があったと記憶していた(それが上記Reekの本だと思っていた)のですが、「ポインタ」含め、いまいち、"あぁ、これだこれだ"という箇所がなく… Reek氏の本は、もう一度ひっくり返してみます。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2287] Re:C言語ポインタ完全制覇、記述に関する愚痴(^^;
投稿者:(ぱ)こと管理人
2022/05/09 23:10:42

>どう書いたら自然な言い回しと(お感じに)なりますかね? 僕は、今回新板を初めから >読み直して、あらためて、この『単に「ポインタ」と呼んでしまう』中身をキチンと >区別することが正確な理解に繋がるように思えたのですが。(例えば、新板のp.43に >『混同しないように…』と記した直後のp.46の中程では(この場合の「ポインタ」は >「ポインタ型の変数」のことですね)と書いて下さっています) 初版執筆当時、『どう書いても自然な>いい回しにならないので断念』して、 当時の編集さんにも「それは残念ですね」というようなことを言われた記憶があるのですが、 確かにp.71の「…式の中では、配列はその先頭要素へのポインタに読み替えられるのです。」は 「…式の中では、配列はその先頭要素へのポインタ(ポインタ値)に読み替えられるのです。」と 書いてもそんなには違和感はなかったように思いますね。 当時主に気にしていたのは、「ポインタ型」と、「ポインタ型の変数または値」の 区別だったように思いますが…… >Kenneth A. Reek の"Pointers on C"とかではどう表現されているのか読み直してみようかしらん… これは私は読んでいないので、何か面白いことが書いてあったら教えてください。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2286] Re:C言語ポインタ完全制覇、"「式」に対するsizeof"のキモは?
投稿者:かずちゃん
2022/05/08 11:18:49

>はじめまして。 遅まきながら、はじめまして。 私めがどういう人間であるかということは、別の投稿の方の末尾に記しました(_o_) ご回答ありがとうございます。 >>「2種類の使い方」"sizeof(型名)"と"sizeof 式"のキモ(使い方・形式は何が違うと言っているのか)は、 >>・括弧の有無、 >>・型名に対してsizeofを使うか、式に対して使うか、 >>のいずれなのでしょうか? > >後者です。 ありがとうございます。 >>ページのほぼ中央部で"「sizeof 式」形式にメリットがあるのは…" >>と書かれており、形式、と言われると、式に対して使うのかそれとも型名に対してか、 >>というよりは、括弧の有無のことか?とも迷ってしまいまして… > >言葉がまずかったですかね。括弧の有無のことを言いたかったわけではなくて、 >あくまで「式に対して使うのかそれとも型名に対してか」のつもりでした。 「形式」、とあったので、迷ってしまいました。「対象とできるものが2種類あって、一つは型名、もう一つは式である」と書かれていれば、迷う可能性も低くなったのかもしれませんが… ご著書のような種類の本にすがるのは、僕のようなトーシロ、つまり、理解があやふやなヤツが正しく理解したいがために、なので、なるべく「読むことによって迷ってしまう」表現が少ないと有り難いです。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2285] Re:C言語ポインタ完全制覇、記述に関する愚痴(^^;
投稿者:かずちゃん
2022/05/08 11:10:24

ご返信ありがとうございます。 >>と言っているところの、「ポインタ型の値」のことですよね? >>だから「左辺値ではありません」のですよね? > >その通りです。 ありがとうございます。スッキリしました。 今後も、コード・フラグメントと睨めっこしながら、「3つのうちのどれだ?」と考えるようにします。 >>せめて、『単に「ポインタ」と呼んでしまうことが多いので、混同しないように気をつけてください』と >>注意を喚起しているこの本では、随所の「ポインタ」という記述を、混同しにくいように〈クドく〉 >>書き下して書いておいて頂けると有り難かったです。(文字数が増えるのを防ぐなら、「アドレス」とか?) > >『混同しないように気をつけてください』のところについては、実は本書の、 >「新・標準プログラマーズライブラリ」になる前の旧版では、注に >「※せめて本書の中では、区別して表記しようかと思ったのですが、どう書いても自然な >いい回しにならないので断念しました…… すみません」と書いてありました。 >(あれ? 新版では削ったんだっけ?) >というわけで、ここは著者としても忸怩たるところではあります。 をを、確かに、旧版のp.032に(2016年9月15日初版第18刷発行)、その旨書かれていますね。 (旧版、途中でなにか他のことに興味が移ったのか、3-4辺りで読むのが止まってしまっていたようですが…) どう書いたら自然な言い回しと(お感じに)なりますかね? 僕は、今回新板を初めから読み直して、あらためて、この『単に「ポインタ」と呼んでしまう』中身をキチンと区別することが正確な理解に繋がるように思えたのですが。(例えば、新板のp.43に『混同しないように…』と記した直後のp.46の中程では(この場合の「ポインタ」は「ポインタ型の変数」のことですね)と書いて下さっています) 「ポインタ型」、「ポインタ型の変数」等と明示して頂けると、かなり理解のスピードが早まると思います。 Kenneth A. Reek の"Pointers on C"とかではどう表現されているのか読み直してみようかしらん… (実は、暫く触っていなかったC++の勉強を(Lippmanの本で)し直しているうちに、constがまたまたわからなくなって、ご著書を読み返しておりまして… 基礎がしっかりできていないと、結局基礎的なところに戻って理解し直す、ということの繰り返しです… あ、ワタシは、定年もそう遠くないジジイの自称物理屋で、シミュレーション用のツール・キットを使うためにこういう言語を学んでおります。今頃このレベルってのがナニですが…)
[この投稿を含むスレッドを表示] [この投稿を削除]
[2284] Re:C言語ポインタ完全制覇、記述に関する愚痴(^^;
投稿者:(ぱ)こと管理人
2022/05/08 00:43:54

ご意見ありがとうございます。 >p.71には「…式の中では、配列はその要素へのポインタに読み替えられるのです。」と >あります。これって、"ポインタ"とは書かれていますが(そして上のp.193の記述でも >「ポインタに読み替えられ」とありますが)これらって、全て、p.43に『…厄介なことに、 >世間では「ポインタ型」も「ポインタ型の変数」も「ポインタ型の値」も、単に >「ポインタ」と呼んでしまうことが多いので、混同しないように気をつけてください。』 >と言っているところの、「ポインタ型の値」のことですよね? >だから「左辺値ではありません」のですよね? その通りです。 >せめて、『単に「ポインタ」と呼んでしまうことが多いので、混同しないように気をつけてください』と >注意を喚起しているこの本では、随所の「ポインタ」という記述を、混同しにくいように〈クドく〉 >書き下して書いておいて頂けると有り難かったです。(文字数が増えるのを防ぐなら、「アドレス」とか?) 『混同しないように気をつけてください』のところについては、実は本書の、 「新・標準プログラマーズライブラリ」になる前の旧版では、注に 「※せめて本書の中では、区別して表記しようかと思ったのですが、どう書いても自然な いい回しにならないので断念しました…… すみません」と書いてありました。 (あれ? 新版では削ったんだっけ?) というわけで、ここは著者としても忸怩たるところではあります。 >これまでの僕の間違った理解では「strと書くことによって、str[0]の(1文字分を記録できる)アドレスが >渡り、そこにリテラルで3文字も(ヌルを入れると4文字)押し込もうとしているから駄目なんだよな?」と >思っていたのですが、その理解は完全に間違っていて… この「間違った理解」は、strを「ポインタ型の変数」と間違って解釈した、ということであれば、 クドく書き下すべきだったんですかねえ。 ただ、strが「ポインタ型の変数」と解釈したとするとそれは「str[0]の(1文字分を記録できる)アドレス」 とも違うのでは、とは思いますが。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2283] Re:C言語ポインタ完全制覇、"「式」に対するsizeof"のキモは?
投稿者:(ぱ)こと管理人
2022/05/08 00:15:24

はじめまして。 >「2種類の使い方」"sizeof(型名)"と"sizeof 式"のキモ(使い方・形式は何が違うと言っているのか)は、 >・括弧の有無、 >・型名に対してsizeofを使うか、式に対して使うか、 >のいずれなのでしょうか? 後者です。 型名に対するsizeof … sizeof(型名) 式に対するsizeof … sizeof 式 です。 >このページの下の方の例で"sizeof(hoge)"と、型名でないhogeに対してsizeof()と >括弧ありの用法をしているので、式に対して使う場合は括弧が必要である、という >可能性は無いとは思いますが… 式に対して使う場合は括弧が必要である、ということはなく、逆に、 型名に対して使う場合は括弧が必須です。上の例、および本の中の例で 「sizeof(型名)」となっている通りです。 もちろん、式を括弧で囲んだものも式ですから、sizeof(式)という書き方は可能です。 優先順位の低い演算子を含む式なら、括弧が必須になるでしょう。「sizeof 3 + 5」は sizeof(int) + 5でintが4バイトなら9になるでしょうが、「sizeof(3 + 5)」は sizeof(8)なので4です。 その意味では、sizeof(hoge)の場合は括弧は必須ではありませんが、 私はこういう場合たいてい括弧を付けるので書いてしまっています。 >ページのほぼ中央部で"「sizeof 式」形式にメリットがあるのは…" >と書かれており、形式、と言われると、式に対して使うのかそれとも型名に対してか、 >というよりは、括弧の有無のことか?とも迷ってしまいまして… 言葉がまずかったですかね。括弧の有無のことを言いたかったわけではなくて、 あくまで「式に対して使うのかそれとも型名に対してか」のつもりでした。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2282] Re:C言語ポインタ完全制覇、記述に関する愚痴(^^;
投稿者:かずちゃん
2022/05/07 21:56:13

あ、勿論、「四季」→「式」です。 >新・標準プログラマーズライブラリ「C言語ポインタ完全制覇」(2017年12月21日初版第1刷発行)について、少々愚痴をば… > >「3-3-3配列→ポインタの読み替え」のp.192の下部には「そして、配列がポインタに読み替えられたとき、そのポインタは左辺値ではありません。」と記述されていて、次のページに続いて > >char str[10]; >str = "abc"; > >に対して、「代入の左辺のstrはもともと配列であり、四季の中ではポインタに読み替えられますが、左辺値ではありませんから、…」と記されています。 > >これって、これまでの僕の間違った理解では「strと書くことによって、str[0]の(1文字分を記録できる)アドレスが渡り、そこにリテラルで3文字も(ヌルを入れると4文字)押し込もうとしているから駄目なんだよな?」と思っていたのですが、その理解は完全に間違っていて… > >p.71には「…式の中では、配列はその要素へのポインタに読み替えられるのです。」とあります。これって、"ポインタ"とは書かれていますが(そして上のp.193の記述でも「ポインタに読み替えられ」とありますが)これらって、全て、p.43に『…厄介なことに、世間では「ポインタ型」も「ポインタ型の変数」も「ポインタ型の値」も、単に「ポインタ」と呼んでしまうことが多いので、混同しないように気をつけてください。』と言っているところの、「ポインタ型の値」のことですよね? >だから「左辺値ではありません」のですよね? > >せめて、『単に「ポインタ」と呼んでしまうことが多いので、混同しないように気をつけてください』と注意を喚起しているこの本では、随所の「ポインタ」という記述を、混同しにくいように〈クドく〉書き下して書いておいて頂けると有り難かったです。(文字数が増えるのを防ぐなら、「アドレス」とか?) > >という愚痴(雑談)でした…
[この投稿を含むスレッドを表示] [この投稿を削除]
[2281] C言語ポインタ完全制覇、記述に関する愚痴(^^;
投稿者:かずちゃん
2022/05/07 17:58:42

新・標準プログラマーズライブラリ「C言語ポインタ完全制覇」(2017年12月21日初版第1刷発行)について、少々愚痴をば… 「3-3-3配列→ポインタの読み替え」のp.192の下部には「そして、配列がポインタに読み替えられたとき、そのポインタは左辺値ではありません。」と記述されていて、次のページに続いて char str[10]; str = "abc"; に対して、「代入の左辺のstrはもともと配列であり、四季の中ではポインタに読み替えられますが、左辺値ではありませんから、…」と記されています。 これって、これまでの僕の間違った理解では「strと書くことによって、str[0]の(1文字分を記録できる)アドレスが渡り、そこにリテラルで3文字も(ヌルを入れると4文字)押し込もうとしているから駄目なんだよな?」と思っていたのですが、その理解は完全に間違っていて… p.71には「…式の中では、配列はその要素へのポインタに読み替えられるのです。」とあります。これって、"ポインタ"とは書かれていますが(そして上のp.193の記述でも「ポインタに読み替えられ」とありますが)これらって、全て、p.43に『…厄介なことに、世間では「ポインタ型」も「ポインタ型の変数」も「ポインタ型の値」も、単に「ポインタ」と呼んでしまうことが多いので、混同しないように気をつけてください。』と言っているところの、「ポインタ型の値」のことですよね? だから「左辺値ではありません」のですよね? せめて、『単に「ポインタ」と呼んでしまうことが多いので、混同しないように気をつけてください』と注意を喚起しているこの本では、随所の「ポインタ」という記述を、混同しにくいように〈クドく〉書き下して書いておいて頂けると有り難かったです。(文字数が増えるのを防ぐなら、「アドレス」とか?) という愚痴(雑談)でした…
[この投稿を含むスレッドを表示] [この投稿を削除]
[2280] C言語ポインタ完全制覇、"「式」に対するsizeof"のキモは?
投稿者:かずちゃん
2022/05/07 14:45:09

くだらない質問で申し訳ありませんが、新・標準プログラマーズライブラリ「C言語ポインタ完全制覇」(2017年12月21日初版第1刷発行)のp.188, "「式」に対するsizeof"の記述に対して質問させて下さいませ。 「2種類の使い方」"sizeof(型名)"と"sizeof 式"のキモ(使い方・形式は何が違うと言っているのか)は、 ・括弧の有無、 ・型名に対してsizeofを使うか、式に対して使うか、 のいずれなのでしょうか? このページの下の方の例で"sizeof(hoge)"と、型名でないhogeに対してsizeof()と括弧ありの用法をしているので、式に対して使う場合は括弧が必要である、という可能性は無いとは思いますが… ページのほぼ中央部で"「sizeof 式」形式にメリットがあるのは…"と書かれており、形式、と言われると、式に対して使うのかそれとも型名に対してか、というよりは、括弧の有無のことか?とも迷ってしまいまして…
[この投稿を含むスレッドを表示] [この投稿を削除]
[2279] Re:「C言語 ポインタ完全制覇」正誤表に「配列とポインタの完全制覇」URLの変更の記載
投稿者:(ぱ)こと管理人
2022/04/28 20:20:21

追記ですが、 とりあえず、第3刷ではmember.nifty.ne.jpになっていて、 第11刷ではkmaebashi.comになっていることは確認しました……
[この投稿を含むスレッドを表示] [この投稿を削除]
[2278] Re:「C言語 ポインタ完全制覇」正誤表に「配列とポインタの完全制覇」URLの変更の記載
投稿者:(ぱ)こと管理人
2022/04/28 20:06:43

ご指摘ありがとうございます。 >C言語 ポインタ完全制覇 の、初版と第2版を比較していた時に気がついた事です。 確認ですが、比較されたのは、2001年の旧版と、2017年の 「新・標準プログラマーズライブラリ」版のものですよね(旧版の1刷と2刷の比較ではなく)。 私の手元にも旧版のすべての刷が整理されて揃っているわけではないので、 どの時点で直したのかはもはや不明ですが、それも含め、正誤表に記載いたしました。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2277] 「C言語 ポインタ完全制覇」正誤表に「配列とポインタの完全制覇」URLの変更の記載
投稿者:jcv
2022/04/27 18:18:19

C言語 ポインタ完全制覇 の、初版と第2版を比較していた時に気がついた事です。 第2版の「はじめに」には、元になった初版からの追加/修正内容が記載されていますが、 旧版の「はじめに」には、その前のベースになった「配列とポインタの完全制覇」の話が出ています。 しかし、ここに記載されているURL http://member.nifty.ne.jp/maebashi/programmer/pointer.html はリンク切れになっています。 URLを置き換えて、 「配列とポインタの完全制覇」(1999/6/29 updated) http://kmaebashi.com/programmer/pointer.html にたどりつきました。 この件、「C言語 ポインタ完全制覇」正誤表 http://kmaebashi.com/seiha/seigo.html に、URLの修正があるかもしれないと思い確認しましたが、ありませんでした。 同じページには、「ほげを考えるページ」のURLについて、修正された事が記載されていますので、 「配列とポインタの完全制覇」のページのURLについても、同様に修正しておくべきと思います。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2276] Re:Webアプリケーション開発入門のP97 コンパイルについて
投稿者:(ぱ)こと管理人
2022/03/24 23:12:25

遅くなりましてすみません。 >以下のコマンドを実行する。 >cd C:\maebashi\doc\webserver\src\chap03\testbbs\WEB-INF\classes >C:\maebashi\doc\webserver\src\chap03\testbbs\WEB-INF\classes 「以下のコマンド」の記載がないので、何が悪いのかわかりませんが、 >以下のコマンドでも同様のエラーとなります。 >javac -classpath ./;C:\Tomcat\lib\servlet-api.jar PostBBS.java ここから推測すると、*.javaではなく、PostBBS.javaを指定したのでしょうか? そうだとすると、私の環境でも、以下のエラーが起きました。 C:\maebashi\temp\src_20181021\src\chap03\testbbs\WEB-INF\classes>javac -classpath C:\Tomcat8\lib\servlet-api.jar PostBBS.java PostBBS.java:9: エラー: シンボルを見つけられません Message newMessage = new Message(request.getParameter("title"), ^ シンボル: クラス Message 場所: クラス PostBBS PostBBS.java:9: エラー: シンボルを見つけられません Message newMessage = new Message(request.getParameter("title"), ^ シンボル: クラス Message 場所: クラス PostBBS PostBBS.java:12: エラー: パッケージMessageは存在しません Message.messageList.add(0, newMessage); ^ エラー3個 PostBBS.javaを単独でコンパイルしようとしても、Message.classがまだないためです。 本にあるとおり、*.javaならコンパイルできます。 C:\maebashi\temp\src_20181021\src\chap03\testbbs\WEB-INF\classes>del *.class C:\maebashi\temp\src_20181021\src\chap03\testbbs\WEB-INF\classes>javac -classpath C:\Tomcat8\lib\servlet-api.jar *.java C:\maebashi\temp\src_20181021\src\chap03\testbbs\WEB-INF\classes>dir ドライブ C のボリューム ラベルは Windows です ボリューム シリアル番号は BAC7-DF60 です C:\maebashi\temp\src_20181021\src\chap03\testbbs\WEB-INF\classes のディレクトリ 2022/03/24 23:10 <DIR> . 2022/03/24 23:10 <DIR> .. 2022/03/24 23:10 666 Message.class 2016/06/19 15:47 409 Message.java 2022/03/24 23:10 1,008 PostBBS.class 2016/06/19 15:47 638 PostBBS.java 2022/03/24 23:10 2,720 ShowBBS.class 2016/06/19 15:47 1,883 ShowBBS.java 6 個のファイル 7,324 バイト 2 個のディレクトリ 114,802,692,096 バイトの空き領域
[この投稿を含むスレッドを表示] [この投稿を削除]
[2274] Webアプリケーション開発入門のP97 コンパイルについて
投稿者:mone
2022/03/20 19:44:11

コンパイルでエラーが発生します。 解決方法につきご教示いただけますと幸いです。 ■事象 以下をファイルをコンパイルするため ・ShowBBS.java ・PostBBS.java ・Message.java 以下のコマンドを実行する。 cd C:\maebashi\doc\webserver\src\chap03\testbbs\WEB-INF\classes C:\maebashi\doc\webserver\src\chap03\testbbs\WEB-INF\classes 下記のエラーとなる。(Message.class参照不可のエラー) === PostBBS.java:4: エラー: シンボルを見つけられません public class PostBBS extends HttpServlet { &#8942; === 以下のコマンドでも同様のエラーとなります。 javac -classpath ./;C:\Tomcat\lib\servlet-api.jar PostBBS.java
[この投稿を含むスレッドを表示] [この投稿を削除]
[2273] Re:比較演算子を使った式の変数への代入について
投稿者:mhash
2022/02/15 01:47:50

ご返信ありがとうございます。 比較演算子==の比較結果はint型の値なんですね。知りませんでした。 ご丁寧に教えて頂きありがとうございました。 >>はじめまして、mhashと申します。 > >はじめまして。 > >>bool = ( a == b ) >>(※bool,a,bは整数型の変数) >>のように比較演算子==での比較結果を直接変数に代入している箇所があったのですが、 >>この書き方は規格上保証されているものなのでしょうか? > >==(等価演算子)については、JIS X 3010:2003なら「6.5.9 等価演算子」に記載があって、 >「各演算子は指定された関係が真の場合は1 を,偽の場合は0 を返す。その結果は, > 型int をもつ。」 >とあるので、この結果をint型の変数に代入するのは完全に合法です。 > >>また、保証されている場合はどのバージョンからでしょうか? > >Cができた当初から、だと思います。いわゆる普通のif文で、 > >if (a == b) > >と書いたとしても、これは等価演算子の結果をもとに条件分岐しているにすぎません。 >
[この投稿を含むスレッドを表示] [この投稿を削除]
[2272] Re:比較演算子を使った式の変数への代入について
投稿者:(ぱ)こと管理人
2022/02/13 23:04:05

>はじめまして、mhashと申します。 はじめまして。 >bool = ( a == b ) >(※bool,a,bは整数型の変数) >のように比較演算子==での比較結果を直接変数に代入している箇所があったのですが、 >この書き方は規格上保証されているものなのでしょうか? ==(等価演算子)については、JIS X 3010:2003なら「6.5.9 等価演算子」に記載があって、 「各演算子は指定された関係が真の場合は1 を,偽の場合は0 を返す。その結果は,  型int をもつ。」 とあるので、この結果をint型の変数に代入するのは完全に合法です。 >また、保証されている場合はどのバージョンからでしょうか? Cができた当初から、だと思います。いわゆる普通のif文で、 if (a == b) と書いたとしても、これは等価演算子の結果をもとに条件分岐しているにすぎません。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2271] 比較演算子を使った式の変数への代入について
投稿者:mhash
2022/02/13 13:01:05

はじめまして、mhashと申します。 以前kmaebashi様の著書(『プログラミング言語を作る』だったかと思います)で、Cのソースで bool = ( a == b ) (※bool,a,bは整数型の変数) のように比較演算子==での比較結果を直接変数に代入している箇所があったのですが、この書き方は規格上保証されているものなのでしょうか? また、保証されている場合はどのバージョンからでしょうか? 一般的な処理系ではコンパイルできるのだろうとは想像できるのですが、自分はあまりみたことがない書き方なので、気になって質問させていただきました。 初歩的ですみませんがよろしくお願いします。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2270] Re:【ご質問】1.3.4 TCPクライアントでWebサーバーを叩
投稿者:mone
2022/01/31 17:25:20

>moneさん >>■事象 >>TcpCliet.javaを実行→client_rect.txtに408ステータスが出力される。(期待結果:200ステータス) > >これは以前にも同じ現象の問い合わせがありました。 >client_send.txt末尾の空行が入っていないと、この現象が発生します。 > >エディタによっては、最後の空行を勝手に消してしまうものもあるようです。 > >http://kmaebashi.com/bbs/list.php?boardid=kmaebashibbs&thread=2132 >http://kmaebashi.com/bbs/list.php?boardid=kmaebashibbs&thread=1960 > > ご回答ありがとうございます。 空行を追加したところ200ステータスが返却されました。 ヘッダの終わりを示す空行が必要のこと理解しました。 お手数おかけしました。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2269] Re:韓国からの読者です。
投稿者:(ぱ)こと管理人
2022/01/31 01:41:22

ドゥボーさん すみません、韓国語が化けてしまっていますよね。 この掲示板は大昔に作ったもので、文字コードとしてEUC-JPという日本独自の 文字コードを使っています。そのため韓国語は表示できません。 UTF-8にしたものをここに置きました(どのみち私には読めませんが……)。 http://kmaebashi.com/seiha/20220130_bbs.html >韓国語の語順も日本語の語順と一緒で、同じ説明ができます。 ありがとうございます。安心しました。 (実は「C言語 ポインタ完全制覇」は中国語にも翻訳されているのですが、 中国語は語順はむしろ英語に近いのに、直訳されたのでちょっと残念なことに なっているのです) >日本語版の文脈は「日本語(や韓国語)の語順は英語の語順とは違う」のを指摘して >説明をする文脈ですが、翻訳はいきなり「プログラマー」を仮定して文を書いていますね。 >プログラマーと言えば、韓国人だけではなくアメリカ人やイギリス人もありますから、 >これは理屈が立てない変な文章ですよね。(たとえ韓国人だけ読める韓国語版だとしても、 >やはり「プログラマー」を言うのは変です。) これはやっぱり変ですよね。教えていただきありがとうございました。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2268] Re:韓国からの読者です。
投稿者:ドゥボー
2022/01/30 22:34:55

>ドゥボーさん > >はじめまして。著者の前橋です。韓国からの投稿ありがとうございます。 >私の本を読んでいただき光栄です。 迅速なご回答有難うございます! > >ところで、私は韓国語がまったく分かりませんので、以下の2点について、 >よければ教えていただけないでしょうか。 > >①「普通の日本人には~」について >韓国語版: >http://kmaebashi.com/seiha/korean1.png > >日本語版(旧版): >http://kmaebashi.com/seiha/japanese1.png > >日本語版で「普通の日本人には~」となっている部分は、韓国語だとどのような >意味になっているのでしょうか? ざっとGoogle翻訳で見てみますと、 >「普通のプログラマには~」(?)となっているように見えますが、 >そんなニュアンスでよいのでしょうか? そうですよね。確かに変な翻訳ですね。 私は日本語の原板を読みませんでしたので、この問題を事前には分からなかったんです。 『そして、それは置いておくとしても、この文章を素直に読むと、普通の日本人には「逆じゃないか?」と思えるのではないでしょうか?』 の部分は韓国語にはこういう風に翻訳されるべきだと思われるんですね。 『&#44536;&#47532;&#44256; &#44536;&#44163;&#51008; &#52264;&#52824;&#54616;&#45908;&#46972;&#46020;, &#51068;&#48152;&#51201;&#51064; &#54620;&#44397;&#51064;&#51060;&#46972;&#47732; &#51060; &#47928;&#51109;&#51012; &#44536;&#45824;&#47196; &#51069;&#51008; &#54980; ‘&#48152;&#45824;&#51064; &#44163; &#44057;&#45796;’&#45716; &#45712;&#45196;&#51060; &#46308;&#51648; &#50506;&#49845;&#45768;&#44620;?』 (直訳:そして、それはさて置いても、一般的な韓国人ならこの文章をそのまま読んだ後、「逆だそうだ」と感じませんですか?) 韓国語では、「普通の~」という表現が「一般的な~」よりあまりよく使われませんので、こう翻訳しましたんです。 自分たちのことをあまり「韓国人なら」とかよく言わない韓国語の言語習慣を考えると、 『&#44536;&#47532;&#44256; &#44536;&#44163;&#51008; &#52264;&#52824;&#54616;&#45908;&#46972;&#46020;, &#51068;&#48152;&#51201;&#51004;&#47196; &#51060; &#47928;&#51109;&#51012; &#44536;&#45824;&#47196; &#51069;&#51008; &#54980; ‘&#48152;&#45824;&#51064; &#44163; &#44057;&#45796;’&#45716; &#45712;&#45196;&#51060; &#46308;&#51648; &#50506;&#49845;&#45768;&#44620;?』 (直訳:そして、それはさて置いても、一般的にはこの文章をそのまま読んだ後、「逆だそうだ」と感じませんですか?) の方がもっとよいかも知れませんね。 しかし、韓国語版の翻訳はとても変な翻訳です。 『&#45817;&#49888;&#51060; &#54217;&#48276;&#54620; &#54532;&#47196;&#44536;&#47000;&#47672;&#46972;&#47732; &#51060; &#47928;&#51109;&#51012; &#51069;&#50612;&#48376; &#54980; 「&#48152;&#45824;&#51064; &#44163; &#44057;&#45796;」&#45716; &#45712;&#45196;&#51060; &#46308;&#51648; &#50506;&#49845;&#45768;&#44620;?』 この文章は日本語にすると、こうなります。 『もしあなたが平凡なプログラマーだったら、この文章を読んだ後、「逆だそうだ」と感じませんですか?』 日本語版の文脈は「日本語(や韓国語)の語順は英語の語順とは違う」のを指摘して説明をする文脈ですが、翻訳はいきなり「プログラマー」を仮定して文を書いていますね。プログラマーと言えば、韓国人だけではなくアメリカ人やイギリス人もありますから、これは理屈が立てない変な文章ですよね。(たとえ韓国人だけ読める韓国語版だとしても、やはり「プログラマー」を言うのは変です。) > >「pfはintを返す関数へのポインタ」というような文章では、日本語と英語は、 >語順が逆になります。なので日本語でCの宣言を読もうとすると逆に見えるし、 >正しく読むなら英語で読めばよい、というのがここで書いていることです。 >これは日本語の語順の話ですので、韓国語だとどうなのだろう、というのが >気になっています。 > 韓国語の語順も日本語の語順と一緒で、同じ説明ができます。 (この理由で、世間では「外人のうちに韓国人が日本語を一番易く学ぶ」という話もありますが、漢字のことを除けていえば殆ど事実だと思います。語順が同じで、文法も殆ど同じ、漢語や表現も日本語の影響を多く受けたので、そうだと思われます。) しかし訳者が文脈のことを誤解したようですね。 >②Table3.1について >韓国語版: >http://kmaebashi.com/seiha/korean2.png > >日本語版(旧版): >http://kmaebashi.com/seiha/japanese2.png > >この部分の⑤のところは日本語版では「日本語に訳すと……」になっていますが、 >ここを見ると、韓国語でも、語順は日本語と同じのように見えます。 はい。その通りです。 >韓国の方にとっても、「英語で読め」というアドバイスは、的外れにはなっていない、 >と思ってよいでしょうか。 はい。少なくとも幼い私にはいいアドバイスになりました。 >韓国語版のTable3.1には、日本語版にはある「英語的表現」の列が >なくなっているようで、そこもちょっと不思議です。 その部分は確かに不思議ですね。事情はよく分からないんですけれども、もしかして紙面の都合のためかも知れませんね。 >あいさつの投稿に面倒くさい質問で返してしまって申し訳ありませんが、 >よろしければ教えてください。 いいえ、幼い頃に多く助かった本の著者さんとこうして直接話し合ったり、微力な力でも助けることが出来たり、するのは私にとっては光栄です。こんな機会を下さってとても嬉しいです。 >最近あまり投稿のない掲示板ですみませんが、お待ちしております。 > >よろしくお願いいたします。 改めてご回答有難うございます。 これからもよろしくお願いいたします。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2267] Re:【ご質問】1.3.4 TCPクライアントでWebサーバーを叩
投稿者:(ぱ)こと管理人
2022/01/30 20:55:07

moneさん >■事象 >TcpCliet.javaを実行→client_rect.txtに408ステータスが出力される。(期待結果:200ステータス) これは以前にも同じ現象の問い合わせがありました。 client_send.txt末尾の空行が入っていないと、この現象が発生します。 エディタによっては、最後の空行を勝手に消してしまうものもあるようです。 http://kmaebashi.com/bbs/list.php?boardid=kmaebashibbs&thread=2132 http://kmaebashi.com/bbs/list.php?boardid=kmaebashibbs&thread=1960
[この投稿を含むスレッドを表示] [この投稿を削除]
[2266] 【ご質問】1.3.4 TCPクライアントでWebサーバーを叩
投稿者:mone
2022/01/30 20:32:42

管理人様 基礎からのWebアプリケーション開発入門を勉強させていただいているものです。 初歩的な質問で恐縮ですが、ご確認いただけますと幸いです。 ■テキスト 1.3.4 TCPクライアントでWebサーバーを叩く(P25) ■事象 TcpCliet.javaを実行→client_rect.txtに408ステータスが出力される。(期待結果:200ステータス) Apatchは起動しており、http://localhost/index.htmlで「Itr works!」と表示されている。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2265] Re:韓国からの読者です。
投稿者:(ぱ)こと管理人
2022/01/30 17:30:35

ドゥボーさん はじめまして。著者の前橋です。韓国からの投稿ありがとうございます。 私の本を読んでいただき光栄です。 ところで、私は韓国語がまったく分かりませんので、以下の2点について、 よければ教えていただけないでしょうか。 ①「普通の日本人には~」について 韓国語版: http://kmaebashi.com/seiha/korean1.png 日本語版(旧版): http://kmaebashi.com/seiha/japanese1.png 日本語版で「普通の日本人には~」となっている部分は、韓国語だとどのような 意味になっているのでしょうか? ざっとGoogle翻訳で見てみますと、 「普通のプログラマには~」(?)となっているように見えますが、 そんなニュアンスでよいのでしょうか? 「pfはintを返す関数へのポインタ」というような文章では、日本語と英語は、 語順が逆になります。なので日本語でCの宣言を読もうとすると逆に見えるし、 正しく読むなら英語で読めばよい、というのがここで書いていることです。 これは日本語の語順の話ですので、韓国語だとどうなのだろう、というのが 気になっています。 ②Table3.1について 韓国語版: http://kmaebashi.com/seiha/korean2.png 日本語版(旧版): http://kmaebashi.com/seiha/japanese2.png この部分の⑤のところは日本語版では「日本語に訳すと……」になっていますが、 ここを見ると、韓国語でも、語順は日本語と同じのように見えます。 韓国の方にとっても、「英語で読め」というアドバイスは、的外れにはなっていない、 と思ってよいでしょうか。 韓国語版のTable3.1には、日本語版にはある「英語的表現」の列が なくなっているようで、そこもちょっと不思議です。 あいさつの投稿に面倒くさい質問で返してしまって申し訳ありませんが、 よろしければ教えてください。 >度々この場所にお訪れします。 最近あまり投稿のない掲示板ですみませんが、お待ちしております。 よろしくお願いいたします。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2264] 韓国からの読者です。
投稿者:ドゥボー
2022/01/30 05:03:53

初めまして。韓国からの読者です。 中学生の頃、前橋さんの本である「C言語ポインタ完全制覇」の韓国語版を読んで、C言語を深く理解することができた記憶があります。そのおかげで20代後半になった今もAI研究者としてコンピューターの仕事を続けています。本当に有難うございます! 当時は日本語が分からなかったので、お礼を言うことができませんでしたが、最近、この本についての情報を調べてこの本の改訂版が出たのを遅く分かりました。おめでとうございます!最新のC言語の標準であるC99やC11についてもアップデートされたようで、また買って読むつもりです!今度は日本語の原書で読みます。この間、僕はJLPT N1の試験に合格しましたので日本語の練習もすることも兼ねて。 お礼を言うことが遅れてしまってすみません。そして、改めて有難うございます! 度々この場所にお訪れします。 是非お元気で。 韓国からの読者 ドゥボーより
[この投稿を含むスレッドを表示] [この投稿を削除]
[2263] Re:ブログの誤字について
投稿者:(ぱ)こと管理人
2022/01/27 01:31:18

>はてなブログ「K.Maebashi's はてなブログ」の方のコメントしたのですが、 >通知などが飛ばなくて気づかない可能性があるのでこちらにも投稿します。 ありがとうございます。修正しました。 通知は来るのですが、こんな夜中しか時間が取れなくて……
[この投稿を含むスレッドを表示] [この投稿を削除]
[2262] ブログの誤字について
投稿者:rike1019
2022/01/26 19:22:00

はてなブログ「K.Maebashi's はてなブログ」の方のコメントしたのですが、通知などが飛ばなくて気づかない可能性があるのでこちらにも投稿します。 誤字を見つけました。 xコード下記 oコード書き > 俺もまだこんな風にコード下記に熱中できるんだなあ、という感慨はありますが、それが、何度も書いたことがあり過去コードを貼り合わせたような言語処理系、というのはちょっと残念ですね。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2261] Re:レビューのお願い
投稿者:(ぱ)こと管理人
2021/12/14 08:28:28

>何か感想や意見を聞かせてください。 >ちなみにポインタはまだ理解してないので、全部値渡しにしています。 >宜しくお願い致します。 すみません、Cはともかく数学的にこれは私の能力を超えるので、 どなたかわかる方に見ていただくのがよいかと。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2259] Re:完全初心者のためのプログラミング入門 lesson04_4
投稿者:Hiroyuki Naito
2021/11/23 23:23:51

ご回答ありがとうございました。 varからletに変わってスコープが有効になるというのは知識としてはあったのですが、関数のスコープしか頭に入っていませんでした。while文やfor文のブロックスコープも有効になるということをご教授いただき、自分の知識も一段深まった気がいたします。 >>しかし、下記の2つのfor文でxについて2回宣言しているように思うのですが、 >>エラーにならないのは何故でしょうか。 > >これは、letで宣言された変数は、ブロックスコープを持つからです。 >for文の第1式で宣言された変数は、for文のブロックの中だけのスコープを持ちます。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2258] Re:完全初心者のためのプログラミング入門 lesson04_4
投稿者:(ぱ)こと管理人
2021/11/23 20:02:16

>しかし、下記の2つのfor文でxについて2回宣言しているように思うのですが、 >エラーにならないのは何故でしょうか。 これは、letで宣言された変数は、ブロックスコープを持つからです。 for文の第1式で宣言された変数は、for文のブロックの中だけのスコープを持ちます。 よって、以下のプログラムは、 for (let i = 0; i < 10; i++) { console.log("i.." + i); } console.log("i.." + i); 「i..0」から「i..9」までは表示しますが、最後の、for文の後のconsole.log()の ところで、以下のエラーを出します。 Uncaught ReferenceError: i is not defined https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Statements/let | let 文はブロックスコープのローカル変数を宣言します。 https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Statements/for | let で宣言された変数は文内のローカル変数になります。 このあたりは、JavaとかC++とかC#とかC99とかと同じで、JavaScriptもletが導入されて ようやく「普通の言語になった」感があります。 昔のJavaScriptではvarしか使えませんでしたが、varによる変数宣言は関数スコープで、 クロージャという仕組みと相俟って、初心者には訳の分からない結果を出すことが ありました…… 例) https://teratail.com/questions/205789
[この投稿を含むスレッドを表示] [この投稿を削除]
[2257] 完全初心者のためのプログラミング入門 lesson04_4
投稿者:Hiroyuki Naito
2021/11/22 21:20:38

お世話になります。 首記のプログラムで1つ質問をさせていただきますので、よろしくお願いいたします。 JavaScriptでは同じ変数と2度宣言すると、 Uncaught SyntaxError: Identifier 'x' has already been declared というエラーが発生します。 しかし、下記の2つのfor文でxについて2回宣言しているように思うのですが、 エラーにならないのは何故でしょうか。 19: for (;;) { 20: for (let x = 0; x <= 720; x += 10) { 21: context.drawImage(ufoImage, x, 10); 22: } 23: for (let x = 720; x >= 0; x -= 10) { 24: context.drawImage(ufoImage, x, 10); 25: } 26: }
[この投稿を含むスレッドを表示] [この投稿を削除]
[2256] Re:C言語体当り学習 filter.cプログラム
投稿者:Hiroyuki Naito
2021/06/27 09:08:27

ご回答ありがとうございました。 今まで^Zによって、キーボードからはEOF(-1)が出力されると思い込んでいました。 「getchar()が行頭の^Z(=26)をファイルの末尾と判断して、EOFを戻り値として 出力する」というご説明ですっきりしました。 >つまり、コマンドプロンプト上で^Zを入力すると、それが行頭である場合に限り >getchar()はEOFを返すが、そうでなければ^Zをそのまま返す、ただし、行内で >^Zより後ろの文字は返さない、ということになります。 >これは、コマンドプロンプトの端末ドライバの仕様ということになると思います。 ----- 中略 ----- >ファイルの末尾に来たらEOFを返す、というだけで、そのEOFはどこからも読み込まれる >わけではありません。Hiroyuki Naitoさんも試されたとおり、^Zは26であって >-1ではありません。 >
[この投稿を含むスレッドを表示] [この投稿を削除]
[2255] Re:C言語体当り学習 filter.cプログラム
投稿者:(ぱ)こと管理人
2021/06/27 00:32:44

>123 >123 >^Z > >のように、 >123<enter>^Zと入力するとEOFを検知してプログラムが終了しますが、 >123^Z<enter>のように入力するとプログラムが終了しません。 本当ですね。正直なところ、この挙動は私は認識していませんでした。 ちなみに123^Z456<enter>と入力すると、プログラムは終了しませんが、 456は読み込まれません。 >if文の前にprintf(" %d ", ch);を挿入して文字コードを表示させると、 >前者の^Zは-1、後者の^Zは26と表示されます。^Zはよくひとつ前の状態に戻る >動作のショートカットキーに使われていたりするのが原因でしょうか。 後者の^Zの26は、ASCIIの制御文字におけるSUBで、これをキーボードから入力する 手段が^Zです。以下Wikipediaを参照してください。 https://ja.wikipedia.org/wiki/%E5%88%B6%E5%BE%A1%E6%96%87%E5%AD%97 つまり、コマンドプロンプト上で^Zを入力すると、それが行頭である場合に限り getchar()はEOFを返すが、そうでなければ^Zをそのまま返す、ただし、行内で ^Zより後ろの文字は返さない、ということになります。 これは、コマンドプロンプトの端末ドライバの仕様ということになると思います。 すっきりしない回答で申し訳ありません。 >また、getchar()は「標準入力から1文字読み込む」とありますが、EOF(FFFFFFFF) >という4バイトのコードに対してはどのような動作で読み込んでいるのでしょうか。 「C言語 体当たり学習徹底入門」では、getchar()について 『getchar()は、標準入力から1文字読み込み、その文字コードを返します。  ファイルの末尾に来たら、EOFを返します。』 と書きました。これはgetchar()(を含むCの標準ライブラリ)の仕様です。 ファイルの末尾に来たらEOFを返す、というだけで、そのEOFはどこからも読み込まれる わけではありません。Hiroyuki Naitoさんも試されたとおり、^Zは26であって -1ではありません。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2254] C言語体当り学習 filter.cプログラム
投稿者:Hiroyuki Naito
2021/06/25 23:45:12

首記のプログラムをダウンロードして、gcc+VSCode(ターミナルはcommnad prompt)で 実行してみました。 123 123 ^Z のように、 123<enter>^Zと入力するとEOFを検知してプログラムが終了しますが、 123^Z<enter>のように入力するとプログラムが終了しません。 if文の前にprintf(" %d ", ch);を挿入して文字コードを表示させると、 前者の^Zは-1、後者の^Zは26と表示されます。^Zはよくひとつ前の状態に戻る 動作のショートカットキーに使われていたりするのが原因でしょうか。 また、getchar()は「標準入力から1文字読み込む」とありますが、EOF(FFFFFFFF) という4バイトのコードに対してはどのような動作で読み込んでいるのでしょうか。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2253] Re:ポインタ完全制覇(第2版) p75 *pのループ中の計算
投稿者:Hiroyuki Naito
2021/06/13 23:52:20

ご回答ありがとうございました。 ポインタ演算*(p + i)が、array[i]の計算の「最適化の手を抜くために付けられた機能」という意味が理解できました。 今後はarray[i]の記法を活用していきたいと思います。 >はじめまして。読んでいただきありがとうございます。 > >>array[i]は、ループ中に出現するたびごとに「array + (i * 1要素のサイズ)」に相当する >>アドレス計算を行うというのは理解できますが、*pでも「p + (p++ごとに1要素のサイズ)」 >>に相当するアドレス計算を行っているように思えます。「掛け算と足し算はループの終わり >>の1回だけ」という意味をご教示いただけるとありがたいです。 > >「ループの終わりの1回だけ」というのは、たとえばループが100回回ったとして、 >各繰り返しの最後に1回、という意味です。つまり、100回ループが回れば、 >「p + 1要素のサイズ」という計算は100回は行います。 >ただし、ループの中に、array[i]が5回出てくるとすれば、最適化をろくにやらない >コンパイラなら、100回ループが回った時に「array + (i * 1要素のサイズ)」という計算は >500回行われます。それが100回で済むなら、*pの方が高速になるでしょう。 >コメントで「array[i]は、何度も登場する」と書いてあるのはそういう意図です。 > >これで回答になっていますでしょうか? > >
[この投稿を含むスレッドを表示] [この投稿を削除]
[2252] Re:ポインタ完全制覇(第2版) p75 *pのループ中の計算
投稿者:(ぱ)こと管理人
2021/06/12 20:36:48

はじめまして。読んでいただきありがとうございます。 >array[i]は、ループ中に出現するたびごとに「array + (i * 1要素のサイズ)」に相当する >アドレス計算を行うというのは理解できますが、*pでも「p + (p++ごとに1要素のサイズ)」 >に相当するアドレス計算を行っているように思えます。「掛け算と足し算はループの終わり >の1回だけ」という意味をご教示いただけるとありがたいです。 「ループの終わりの1回だけ」というのは、たとえばループが100回回ったとして、 各繰り返しの最後に1回、という意味です。つまり、100回ループが回れば、 「p + 1要素のサイズ」という計算は100回は行います。 ただし、ループの中に、array[i]が5回出てくるとすれば、最適化をろくにやらない コンパイラなら、100回ループが回った時に「array + (i * 1要素のサイズ)」という計算は 500回行われます。それが100回で済むなら、*pの方が高速になるでしょう。 コメントで「array[i]は、何度も登場する」と書いてあるのはそういう意図です。 これで回答になっていますでしょうか?
[この投稿を含むスレッドを表示] [この投稿を削除]
[2251] ポインタ完全制覇(第2版) p75 *pのループ中の計算
投稿者:Hiroyuki Naito
2021/06/12 17:25:08

本文p75の「*pがループの中に何度出現しても掛け算と足し算はループの終わりの1回だけで済む」で、引っかかっています。 array[i]は、ループ中に出現するたびごとに「array + (i * 1要素のサイズ)」に相当するアドレス計算を行うというのは理解できますが、*pでも「p + (p++ごとに1要素のサイズ)」に相当するアドレス計算を行っているように思えます。「掛け算と足し算はループの終わりの1回だけ」という意味をご教示いただけるとありがたいです。 よろしくお願いいたします。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2250] Re:テトリス風ゲームについて
投稿者:(ぱ)こと管理人
2021/05/10 23:03:04

はじめまして。反応が遅れましてすみません。 >http://kmaebashi.com/programmer/tetris/index.html >こちらのプログラムは、改造して配布しても良い物でしょうか? そういえばライセンス表記をしていなかったですが、以下のページの説明に 準じるということにします。ご自由にコピーしてください。 (なにしろテトリスなので、「名前を変える」必要もないと思います) http://kmaebashi.com/programmer/devlang/license.html よろしくお願いいたします。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2249] テトリス風ゲームについて
投稿者:SINch
2021/05/07 22:08:21

はじめまして http://kmaebashi.com/programmer/tetris/index.html こちらのプログラムは、改造して配布しても良い物でしょうか?
[この投稿を含むスレッドを表示] [この投稿を削除]
[2248] Re:オンラインブックについて
投稿者:bigen
2021/03/12 10:18:26

>おひさしぶりです。 > >>先日ご連絡したオンラインブックがいったんの完結ということになりました。 >>初めての書籍ということで書籍全体としてのバランスや文章、締めくくり方など拙い部分ばかりで恐縮ですが、ご報告させていただきます。 > >https://zenn.dev/bigen1925/books/introduction-to-web-application-with-python > >お疲れさまでした。これだけの量を書くのは大変だったと思います。 > >私も後ほどちょこちょこ読んでみます。 > ありがとうございます。 確かに本を書くというのは当初想像していたよりずっと大変で、改めて書籍を執筆される方の偉大さを身に沁みて理解いたしました・・・。 一方で、先人たちのこういった情報発信によって今の自分がありますので、これにめげず今後も情報発信を続けていこうと思います。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2247] Re:オンラインブックについて
投稿者:(ぱ)こと管理人
2021/03/10 01:00:21

おひさしぶりです。 >先日ご連絡したオンラインブックがいったんの完結ということになりました。 >初めての書籍ということで書籍全体としてのバランスや文章、締めくくり方など拙い部分ばかりで恐縮ですが、ご報告させていただきます。 https://zenn.dev/bigen1925/books/introduction-to-web-application-with-python お疲れさまでした。これだけの量を書くのは大変だったと思います。 私も後ほどちょこちょこ読んでみます。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2246] オンラインブックについて
投稿者:bigen
2021/03/07 18:14:34

前橋先生 ご無沙汰しております。 先日ご連絡したオンラインブックがいったんの完結ということになりました。 初めての書籍ということで書籍全体としてのバランスや文章、締めくくり方など拙い部分ばかりで恐縮ですが、ご報告させていただきます。 https://zenn.dev/bigen1925/books/introduction-to-web-application-with-python 改めてきっかけを与えていただいた前橋先生に感謝を申し上げます。 前橋先生の書籍のおかげでエンジニアとして一つの壁を超えられたという感覚もあり、僕自身がプログラミングを楽しめるようになりました。 また、心のどこかで先人から教えてもらうばかりでなく、どこかで自分からも情報発信をしなければならないという気持ちもあったため、こうして今回オンラインブックという一つの形にできたことを嬉しく思います。 繰り返しにはなりますが、改めて感謝とお礼を申し上げさせていただくとともに、前橋先生の今後のご健勝をお祈りいたします。 
[この投稿を含むスレッドを表示] [この投稿を削除]
[2245] Re:オンラインブック執筆について
投稿者:bigen
2020/10/25 07:22:59

お返事ありがとうございます。 >導入部分を拝読しました。 > >Webアプリケーションの挙動を理解するためにWebサーバを作るというのは >私の独創でもないですし、まったく問題ないと思います。 ありがとうございます! あまり早くないペースでの更新になると思いますが、執筆を進めさせていただきます。 >言語も違うとのことなので、私も読んでみたいです。楽しみにしております。 温かいお言葉ありがとうございます。 とても励みになります。 オンラインブックとはいえ、一冊の書籍のようなまとまった文章を公開するのは初めての経験ですので、拙い言葉にはなるとは思いますが精一杯取り組ませていただきます。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2244] Re:オンラインブック執筆について
投稿者:(ぱ)こと管理人
2020/10/24 14:44:21

はじめまして。 >内容として先生の書籍と似通う部分も多くなりますので、先生にご許諾をいただけた >場合のみ続編を執筆しようと思っております。 >お手数ではありますが、もしお時間が許すようでしたら、是非ご確認とお返事を >いただけると幸いです。 導入部分を拝読しました。 Webアプリケーションの挙動を理解するためにWebサーバを作るというのは 私の独創でもないですし、まったく問題ないと思います。 言語も違うとのことなので、私も読んでみたいです。楽しみにしております。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2243] Re:P.17:終了のマークとして0を送付について
投稿者:くまきち
2020/10/21 23:14:26

ありがとうございます。 とりあえず、HTTP1.0については理解することができました!
[この投稿を含むスレッドを表示] [この投稿を削除]
[2242] オンラインブック執筆について
投稿者:bigen
2020/10/21 18:31:49

はじめまして。 昨年、前橋先生の書籍 - Webサーバを作りながら学ぶ 基礎からのWebアプリケーション開発入門 を読み、本当に勉強になりました。 まずは感謝を述べさせてください。 あまりに勉強になったので、社内でこれを題材に勉強会等を行っていたのですが、 「この本もっと皆に紹介したい!」 という思いとともに、 - python/Djangoしか経験のないメンバーが多く、Javaやサーブレットを扱うことがハードル - 自分の使い慣れたフレームワーク(Django)のトピックをからめながらだと理解しやすい - 書籍ではなくZennなどのオンラインブックであれば今の若いエンジニアユーザーにリーチしやすいのではないか などのことを感じ、先生の書籍をベースにpython/Djangoを題材としたオンラインブックを書いてみたいと思うようになりました。 先立ちまして、先生の書籍から受けた影響、寄せる思いなどを書いた導入記事を公開しました。 https://zenn.dev/bigen1925/books/e6c9492a82f5e2e10fca/viewer/422445 まだ導入記事以外は執筆しておりません。 また執筆中は無料公開とし、執筆完了後に様子をみて有料化も検討していますが、まだはっきりとは決めていません。 内容として先生の書籍と似通う部分も多くなりますので、先生にご許諾をいただけた場合のみ続編を執筆しようと思っております。 お手数ではありますが、もしお時間が許すようでしたら、是非ご確認とお返事をいただけると幸いです。 もし許諾に関しまして別途お話させていただいく場があったほうが良いようでしたら、Linkに記載のメールアドレス(<at> -> @)までご連絡いただいても構いません。 よろしくお願いいたします。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2241] Re:P.17:終了のマークとして0を送付について
投稿者:(ぱ)こと管理人
2020/10/20 23:13:34

>大分時間が経ってしまいましたが、回答は理解できました。 おひさしぶりです。反応が遅くなりましてすみません。 >一方で、Server側をApacheに置き換えたとき、Clientからの送信終了を表す”0”は >不要になっています(P.27)。Apacheは何をもってClientがリクエストを送り終えたことを >判断しているのでしょうか? TcpServer.javaのような手抜きプログラムとは違い、ApacheはまともなWebサーバなので、 HTTPリクエストを解釈できます。HTTPリクエストは、p.24のリスト1-7にあるとおり、 GETの場合は(普通は)ボディはつかないので空行で終わります。よって、 空行でリクエストの終わりを判定することができます。この本で作っている 簡易WebサーバModoki01.java(リスト1-16)では、実際そのようにしてリクエストの 終わりを判定しています(59行目)。 POSTの場合はボディが付くので、Content-Lengthヘッダのサイズを使います。 この本ではリスト3-17の66行目でContent-Lengthを取得し、69行目のreadToSize()の 呼び出しでそのサイズだけ読み込んでいます。 ――というのは実はHTTP1.0相当の、簡易版の実装で、HTTP1.1では サーバはGETメソッドでもボディを受け取ることが可能でなければならず(そして 無視しなければならず)、POSTメソッドでもContent-Lengthは必須ではありません。 動的にデータを作りながら連続して送るとき、ヘッダの時点ではサイズを確定できない、 という事情があるわけですが、それを受け取るのは本書の(かつ私の能力の)範囲を 越えます。 興味があれば以下を参照ください(RFC2616なので微妙に古いですが問題ないでしょう)。 https://triple-underscore.github.io/rfc-others/RFC2616-ja.html#section-4.4
[この投稿を含むスレッドを表示] [この投稿を削除]
[2240] Re:P.17:終了のマークとして0を送付について
投稿者:くまきち
2020/10/16 12:03:28

大分時間が経ってしまいましたが、回答は理解できました。 ありがとうございました。 一方で、Server側をApacheに置き換えたとき、Clientからの送信終了を表す”0”は不要になっています(P.27)。Apacheは何をもってClientがリクエストを送り終えたことを判断しているのでしょうか? 良ければ教えてください。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2239] Re:eclipseでHenacatを作成したい
投稿者:こー
2020/08/18 11:06:21

解決しました。 ご教授いただきありがとうございました。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2238] Re:eclipseでHenacatを作成したい
投稿者:(ぱ)こと管理人
2020/08/18 00:58:03

>※ここが原因かもしれません。 >ShowBBS.java、PostBBS.java、Message.javaの3つは、"chapter3"というパッケージの中にあります。 であれば、.classファイルは >C:\Henacat_0_1\webapps\makeTcpServer\chapter3 の下に置いたうえで、Main.javaは以下のようにします。 WebApplication app = WebApplication.createInstance("makeTcpServer"); app.addServlet("/ShowBBS", "chapter3.ShowBBS"); app.addServlet("/PostBBS", "chapter3.PostBBS"); そのうえで、 http://localhost:8001/makeTcpServer/ShowBBS を叩けば表示できると思います。 前回書いたとおり、addServletの 第1引数の"/ShowBBS"がパス、つまり以下のURLの最後の部分、 http://localhost:8001/makeTcpServer/ShowBBS を指すので、第1引数を変えなければ、叩くURLはこのままで構いません。 第2引数がクラス名です。パッケージを使っているならパッケージ名が要ります。 つまり完全限定クラス名「chapter3.ShowBBS」にする必要があります。 >>④長くなっても構いませんので、修正したクラスのソースを丸ごとここに貼ってください。 あ、すみません。ここは、修正した掲示板のソースコード(ShowBBS.javaとかPostBBS.javaとか) のつもりでした。これで動くと思いますが、まだ動かないようであれば貼ってください。 なお、当然ですが、ShowBBS.javaの中の out.println("<form action='/testbbs/PostBBS' method='post'>"); とか、PostBBS.javaの中の response.sendRedirect("/testbbs/ShowBBS"); とかは、それぞれmakeTcpServerに直す必要があります。念のため。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2237] Re:eclipseでHenacatを作成したい
投稿者:こー
2020/08/17 14:01:09

ご回答いただきありがとうございます。 >①「当方が独自につけたアプリケーション名」を含む、クラスファイルを置いた > 正確な場所 > >C:\Henacat_0_1\webapps\makeTcpServer\ > >これで合っていますか? ※を参照願います >②そのフォルダに置いたクラスファイルのファイル名すべて ShowBBS.class Message.class PostBBS.class の3つです。 >③List3-13 Main.javaの8~10行目に相当する箇所のソースコード WebApplication app = WebApplication.createInstance("makeTcpServer"); app.addServlet("/ShowBBS", "ShowBBS"); app.addServlet("/PostBBS", "PostBBS"); となります。 >パッケージを使っているならパッケージ名が要りますし、 >その場合はクラスファイルの置き場所もパッケージに沿ったフォルダ構成に >なっていなければいけません。 ※ここが原因かもしれません。 ShowBBS.java、PostBBS.java、Message.javaの3つは、"chapter3"というパッケージの中にあります。 そのため、フォルダ構成を以下のように変更しました。 C:\Henacat_0_1\webapps\makeTcpServer\chapter3 そのうえで、http://localhost:8001/makeTcpServer/chapter3/ShowBBSをたたいたところ、 C:\webserver\error_documentに格納した404.htmlが表示されました。 (リスト3-14:ServerThread.javaの87行目でNoSuchFileExceptionがcatchされました。) >④長くなっても構いませんので、修正したクラスのソースを丸ごとここに貼ってください。 Main.java package com.kokun.henacat.webserver; import java.net.ServerSocket; import java.net.Socket; import com.kokun.henacat.servletimpl.WebApplication; public class Main { public static void main(String[] args) throws Exception{ WebApplication app = WebApplication.createInstance("makeTcpServer"); app.addServlet("/ShowBBS", "ShowBBS"); app.addServlet("/PostBBS", "PostBBS"); try(ServerSocket server = new ServerSocket(8001)){ for(;;) { Socket socket = server.accept(); ServerThread serverThread = new ServerThread(socket); Thread thread = new Thread(serverThread); thread.start(); } } } } 変更はMain.javaのみです。 よろしくお願いします。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2236] Re:eclipseでHenacatを作成したい
投稿者:(ぱ)こと管理人
2020/08/16 23:52:36

>いいえ、webapps\testbbs\に配置しております。 >(実際にはtestbbsでなく当方が独自につけたアプリケーション名) 了解しました。「独自につけたアプリケーション名」はmakeTcpServerであると 先の投稿にもありましたね。失礼しました。 本と変えたのであれば、変えたところを教えてください。 具体的には、 ①「当方が独自につけたアプリケーション名」を含む、クラスファイルを置いた  正確な場所 C:\Henacat_0_1\webapps\makeTcpServer\ これで合っていますか? ②そのフォルダに置いたクラスファイルのファイル名すべて ③List3-13 Main.javaの8~10行目に相当する箇所のソースコード 元は以下: > 8: WebApplication app = WebApplication.createInstance("testbbs"); > 9: app.addServlet("/ShowBBS", "ShowBBS"); >10: app.addServlet("/PostBBS", "PostBBS"); アプリケーション名やクラス名を変えたのなら、ここも変えないと動きません。 ただ、8行目のtestbbsをmakeTcpServerに変えていないのだとすれば、 そもそもサーブレットへのリクエストだと認識されずNot Foundが返るので、 8行目は変えてあるはずですね。 9行目と10行目は、リクエストのパスとクラス名の対応付けをしています。 第1引数の"/ShowBBS"がパス、つまり以下のURLの最後の部分、 http://localhost:8001/makeTcpServer/ShowBBS 第2引数がクラス名です。パッケージを使っているならパッケージ名が要りますし、 その場合はクラスファイルの置き場所もパッケージに沿ったフォルダ構成に なっていなければいけません。 ④長くなっても構いませんので、修正したクラスのソースを丸ごとここに貼ってください。 よろしくお願いいたします。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2235] Re:eclipseでHenacatを作成したい
投稿者:こー
2020/08/16 13:04:20

ご回答いただきありがとうございます。 >C:\Henacat_0_1\webapps\ >の直下にShowBBS.classがあるような配置でしょうか。そうだとすると間違っています。 いいえ、webapps\testbbs\に配置しております。 (実際にはtestbbsでなく当方が独自につけたアプリケーション名) >C:\Henacat_0_1\webapps\testbbs\ >の下にShowBBS.class, PostBBS.class, Message.classを配置するのが正解です。 >testbbsフォルダが必要なのは、WebApplication.javaで以下のようにWEBAPPS_DIRにdirを >くっつけたパスからクラスを検索しているからで、 > >20: Path pathObj = fs.getPath(WEBAPPS_DIR + File.separator + dir); >21: this.classLoader >22: = URLClassLoader.newInstance(new URL[]{pathObj.toUri().toURL()}); > >このdirの出処は、List3-13 Main.javaの8行目のこの呼び出しです。 > > 8: WebApplication app = WebApplication.createInstance("testbbs"); > 9: app.addServlet("/ShowBBS", "ShowBBS"); >10: app.addServlet("/PostBBS", "PostBBS"); > >これで回答になっていますでしょうか? ご教授いただいた部分、理解することができました。 しかし、その上で確認をしても誤っている箇所が見つかっておりません。 何かその他に考えうることはありますでしょうか。 お手数おかけしますが、よろしくお願いします。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2234] Re:eclipseでHenacatを作成したい
投稿者:(ぱ)こと管理人
2020/08/15 22:50:18

はじめまして。ご質問ありがとうございます。 >Mainを実行して、URL(http://localhost:8001/makeTcpServer/ShowBBS)をたたくと、 > >java.lang.ClassNotFoundException: ShowBBS > at java.base/java.net.URLClassLoader.findClass(URLClassLoader.java:471) > at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:588) > at java.base/java.net.FactoryURLClassLoader.loadClass(URLClassLoader.java:899) > at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:521) > at com.kokun.henacat.servletimpl.ServletService.createServlet(ServletService.java:17) > at com.kokun.henacat.servletimpl.ServletService.doService(ServletService.java:56) > at com.kokun.henacat.webserver.ServerThread.run(ServerThread.java:90) > at java.base/java.lang.Thread.run(Thread.java:834) このスタックトレースから分かることは、Hanecatから掲示板のクラス(ShowBBS)を 読み込もうとしてそれが見つからないのでエラーになっている、ということです。 Henacatでは、サーブレットのクラスファイルを置くパスをソース内にべた書きしているので、 Eclipseの設定とかが原因とも思えません。 >作成したクラスファイルは、WEBAPPS_DIR = "C:\\Henacat_0_1\\webapps"配下に >設置しているのですが、そのほかに原因があるのでしょうか。 ここですが、 C:\Henacat_0_1\webapps\ の直下にShowBBS.classがあるような配置でしょうか。そうだとすると間違っています。 >書籍132ページのクラスファイルの部分が正確に理解できていない気もしていますが、ご教授いただけるとありがたいです。 書籍132ページにはこうあります。 >作成したクラスファイルの配置場所ですが、リスト3-15のWebApplication.javaの8 行目の >WEBAPPS_DIRに設定されているディレクトリの下に、Webアプリケーション名(testbbs)の >ディレクトリを作成し、その直下に入れてください(WEB-INFとかclassesディレクトリは不要)。 つまり、 C:\Henacat_0_1\webapps\testbbs\ の下にShowBBS.class, PostBBS.class, Message.classを配置するのが正解です。 testbbsフォルダが必要なのは、WebApplication.javaで以下のようにWEBAPPS_DIRにdirを くっつけたパスからクラスを検索しているからで、 20: Path pathObj = fs.getPath(WEBAPPS_DIR + File.separator + dir); 21: this.classLoader 22: = URLClassLoader.newInstance(new URL[]{pathObj.toUri().toURL()}); このdirの出処は、List3-13 Main.javaの8行目のこの呼び出しです。 8: WebApplication app = WebApplication.createInstance("testbbs"); 9: app.addServlet("/ShowBBS", "ShowBBS"); 10: app.addServlet("/PostBBS", "PostBBS"); これで回答になっていますでしょうか?
[この投稿を含むスレッドを表示] [この投稿を削除]
[2233] eclipseでHenacatを作成したい
投稿者:こー
2020/08/15 18:05:40

書籍『基礎からのWebアプリケーション開発入門』をもとに、 eclipseを用いてHenacatを作成(第3章)していますが、以下のような状況です。 なお、Webアプリケーションの名前はmakeTcpServerとしています。 Mainを実行して、URL(http://localhost:8001/makeTcpServer/ShowBBS)をたたくと、 java.lang.ClassNotFoundException: ShowBBS at java.base/java.net.URLClassLoader.findClass(URLClassLoader.java:471) at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:588) at java.base/java.net.FactoryURLClassLoader.loadClass(URLClassLoader.java:899) at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:521) at com.kokun.henacat.servletimpl.ServletService.createServlet(ServletService.java:17) at com.kokun.henacat.servletimpl.ServletService.doService(ServletService.java:56) at com.kokun.henacat.webserver.ServerThread.run(ServerThread.java:90) at java.base/java.lang.Thread.run(Thread.java:834) とExceptionが発生してしまいます。 作成したクラスファイルは、WEBAPPS_DIR = "C:\\Henacat_0_1\\webapps"配下に 設置しているのですが、そのほかに原因があるのでしょうか。 書籍132ページのクラスファイルの部分が正確に理解できていない気もしていますが、ご教授いただけるとありがたいです。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2232] Re:間違い?
投稿者:(ぱ)こと管理人
2020/04/09 00:23:57

書いている間に他の方から投稿がありました。ありがとうございます。 >これが、(持っていないのでわからないが)あなたの持っている版で >int hoge[5][3]; >となっていれば、説明としてはインデックスに問題ある(j==3の方)と思います。 正誤表にある限り(ミスが多くて申し訳ありません)、ここを直した形跡はないですし、 オリジナルのLaTeX原稿(笑)を見ても \begin{verbatim} int hoge[3][5]; \end{verbatim} となっているので、ことここについては、誤植はないと思います。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2231] Re:間違い?
投稿者:(ぱ)こと管理人
2020/04/09 00:11:08

はじめまして。 >174ページ多次元配列の欄ですが配列が[5][3]ではじまって、 >175ページでi=2,j=3としますっていうのは整合性がとれていませんし、 >それによって多次元配列の説明が意味不明です。 まず、「C言語ポインタ完全制覇」の旧版(表紙に、「新・標準プログラマーズライブラリ」 ではなく、ただ「標準プログラマーズライブラリ」とあって、表紙がロボット型の コーヒーメーカーになっているもの)の話、ということでよいでしょうか? そして、 >174ページ多次元配列の欄ですが配列が[5][3]ではじまって、 これは、p.174の下から3行目の int hoge[3][5]; のことですか? ([5][3]ではなく[3][5]ですね?) そして、 >175ページでi=2,j=3としますっていうのは整合性がとれていませんし、 これはp.174で『hoge[i][j]という形でアクセスするとします』に続けての 図(Fig.3-15)の中で、『hoge[i][j]において、i == 2、j == 3の場合を考える』と 書いてあるところのことですよね? 2次元配列全体のサイズとして、int hoge[3][5];と宣言したうえで、その中の hoge[2][3]をアクセスするのは普通のことで、整合性がとれていないってことは ないと思うのですが、どうでしょうか。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2230] Re:間違い?
投稿者:ti
2020/04/08 23:31:56

>174ページ多次元配列の欄ですが配列が[5][3]ではじまって、175ページでi=2,j=3としますっていうのは整合性がとれていませんし、それによって多次元配列の説明が意味不明です。 175ページの i==2,j==3 が配列の添字(インデックス)という点はいいですよね。 hoge[2][3] 「配列が[5][3]ではじまって」が気になりますが、 私が持っている初版第2刷では 174ページの宣言は以下のようになっています。 int hoge[3][5]; /*これなら hoge[2][3] OK */ これが、(持っていないのでわからないが)あなたの持っている版で int hoge[5][3]; となっていれば、説明としてはインデックスに問題ある(j==3の方)と思います。 ということなのでしょうか。 ちなみに175ページ最初の「intの配列(要素数5)の配列(要素数3)」の説明は、 int hoge[3][5]; とあっています。 (「3-1-2 Cの宣言を解読する」参照) わかりにくいかもですが。 前橋先生に任せるべきだったかも。私の理解が間違ってるかもしれないし。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2229] 間違い?
投稿者:ta
2020/04/07 19:16:45

174ページ多次元配列の欄ですが配列が[5][3]ではじまって、175ページでi=2,j=3としますっていうのは整合性がとれていませんし、それによって多次元配列の説明が意味不明です。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2227] Re:ポインタ完全制覇(第2版) Fig2-10とデバッグライト
投稿者:(ぱ)こと管理人
2020/02/05 23:13:49

>printf() の実装は実際のところ 2222 の debug_write() と全く同じことが多くて、 >よって printf() のクロック数と debug_write() のクロック数は全く同じで、 まず、「ポインタ完全制覇」での記載は、 #ifdef DEBUG printf(表示したい内容); #endif という方法を 「こんなものをソース中に大量に埋め込んだら、読みにくくてしょうがありません。」 と書いたうえで、vfprintf()を使ったdebug_write()を紹介しています。 つまりdebug_write()の比較対象は、printf()ではなく、 #ifdefを使った完全に抹殺できるデバッグライトです。 >ついでに言うと printf() の処理中、文字化に要するクロック数と関数呼び出しクロック数では >後者は無視できるほど小さいっす。 >さらに追加すると標準出力へ出力する際の実処理のクロック数のほうがもっと多い。 >ボトルネックでないところのクロック数を頑張って減らしても全体の速度は大差ない。 で、vfprintf()を使ったdebug_write()にて、フラグか何かを参照し、 デバッグモードでないときは即座にreturnするようにしたとしても、 関数呼び出しそのもののオーバーヘッドは消せない、というのが趣旨なので、 「関数呼び出しのオーバーヘッド」と、「文字化や出力のオーバーヘッド」を 比べているわけではありません。 ただまあ、そのうえで、関数呼び出しのボトルネックだって無視できるほど小さい、 というのは、まあそうだろうなとは思います。ことがデバッグライトだけに、 「本番では死ぬほどループする処理に、1行おきにデバッグライトを入れた」という 状況はもちろん考えられますが。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2226] Re:ポインタ完全制覇(第2版) Fig2-10とデバッグライト
投稿者:774RR
2020/02/04 07:08:55

ああツッコミてー printf() の実装は実際のところ 2222 の debug_write() と全く同じことが多くて、 よって printf() のクロック数と debug_write() のクロック数は全く同じで、 ついでに言うと printf() の処理中、文字化に要するクロック数と関数呼び出しクロック数では 後者は無視できるほど小さいっす。 さらに追加すると標準出力へ出力する際の実処理のクロック数のほうがもっと多い。 ボトルネックでないところのクロック数を頑張って減らしても全体の速度は大差ない。 というわけで debug_write() を真に関数として実装して増えるのはプログラムバイト数だけ debug_write() の命令語数の分、せいぜい数十バイト、実行クロック数は同一 なのでこんなところに労力使うくらいなら、別のところでもっと有意義に使いたいっす。 C/C++ ユーザーは実行時クロックを1クロックでも減らしたがるけど、悪い癖っす。 まあ組み込み系だとその数クロック数バイトが重要だったりしますが・・・
[この投稿を含むスレッドを表示] [この投稿を削除]
[2225] Re:ポインタ完全制覇(第2版) Fig2-10とデバッグライト
投稿者:(ぱ)こと管理人
2020/02/01 23:26:52

あれっ、何か妙なことを書いていました。 >ただその下で、 >| C99ではマクロが可変長引数を取ることができるようになったので、 >| 以下のように書けるようになりました。 > >と書いておきながら、わざわざdebug_write()を呼んでいるのはちょっといただけないですね… C99なら可変長引数のマクロが使えるので、コンパイル時に完全に抹殺できます。 よって、fprintf()を呼んでももちろん良いですが、debug_write()を呼んでも 消えてなくなるので別段「ちょっといただけない」こともないですね。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2224] Re:ポインタ完全制覇(第2版) Fig2-10とデバッグライト
投稿者:(ぱ)こと管理人
2020/01/26 23:15:21

>細かいことで恐縮ですが、Fig2-10で「"&d, %s\n"へのポインタ」とありますが、 >「"%d, %s\n"へのポインタ」の誤植と思われます。 ご指摘ありがとうございます。ミスが多くて申し訳ありません。 この部分は旧版から変えていないところなので、旧版から20年間発覚しなかった ミスかと旧版の正誤表を確認したところ、どうも旧版は ・%dであるべきところが&dになっている ・\nが抜けている というふたつのミスがあり、前者に気づいていながら後者だけ直していたようです。 http://kmaebashi.com/seiha/seigo.html#p102 何が何だか……(後ほど直します) >#define DEBUG_WRITE(...) fprintf(stderr, __VA_ARGS__) >でもokでした。 >「debug_write()関数の呼び出しのオーバーヘッドは避けられない(p127)」という >ことでしたが、fprintf()関数でも同様でしょうか。 読み返すと確かにわかりにくいのですが、 「debug_write()関数の呼び出しのオーバーヘッドは避けることができません。」 という記述は、いわゆるANSI C(C90)についての記載と思ってください。 そのすぐ下に、「マクロなら、コンパイル時に完全に抹殺できるのですが、 ANSI Cまでは、マクロには、可変長引数を渡すことができませんでした。」 とあるとおりです。 ただその下で、 | C99ではマクロが可変長引数を取ることができるようになったので、 | 以下のように書けるようになりました。 と書いておきながら、わざわざdebug_write()を呼んでいるのはちょっといただけないですね… (わずかばかりのオーバーヘッドを考えるより、出力先をまとめて切り替えたり タイムスタンプを足したりする利便性を考えて、私なら、実際にはdebug_write()を 挟みそうな気がしますし、そういう思いだったのかと思いますが) 何かしら補足を考えます。ありがとうございました。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2223] Re:ポインタ完全制覇(第2版) Fig2-10とデバッグライト
投稿者:Hiroyuki Naito
2020/01/26 09:40:19

お世話になります。 3番目の質問については、本文の「原理はプリプロセッサのマニュアルを調べよ」にヒントを得て調べてみたら、自己解決しました。 >#define SNAP_INT(arg) fprintf(stderr, #arg "...%d", arg) >の中の#argは引数名そのものを指しているようですが、(他のC言語の解説書では)見たことのない使い方でした。できましたら、補足説明をお願いいたします。 「#演算子は、マクロ実引数を文字列化します」ということでした。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2222] ポインタ完全制覇(第2版) Fig2-10とデバッグライト
投稿者:Hiroyuki Naito
2020/01/26 08:29:45

お世話になります。 細かいことで恐縮ですが、Fig2-10で「"&d, %s\n"へのポインタ」とありますが、「"%d, %s\n"へのポインタ」の誤植と思われます。 私が使っているCコンパイラはgcc 5.4.1 c99でしたので、p128で紹介されている__VA_ARGS__を以下のように使ってみました。 void debug_write(char *fmt, ...) { va_list ap; va_start(ap, fmt); vfprintf(stderr, fmt, ap); va_end(ap); } #define DEBUG_WRITE(...) debug_write(__VA_ARGS__) でもちろん動作OKでしたが、 #define DEBUG_WRITE(...) fprintf(stderr, __VA_ARGS__) でもokでした。 「debug_write()関数の呼び出しのオーバーヘッドは避けられない(p127)」ということでしたが、fprintf()関数でも同様でしょうか。 〈使用例〉 int i = 300; char *p = "hoge"; DEBUG_WRITE("%s %d\n", p, i); また、 #define SNAP_INT(arg) fprintf(stderr, #arg "...%d", arg) の中の#argは引数名そのものを指しているようですが、(他のC言語の解説書では)見たことのない使い方でした。できましたら、補足説明をお願いいたします。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2219] Re:C言語ポインタ完全制覇(第2版) Fig2-8
投稿者:(ぱ)こと管理人
2020/01/25 00:22:40

正誤表に追加しました。ミスが多く申し訳ありません。 >onlineGDBというWeb上のCコンパイラで、コンパイルオプションをいろいろ試して >ist2-6と同じアセンブルリストが得られたので、本文に沿ってリストを追いかけてみて >気づいた疑問点でした。 おかげで他の方が混乱するのが避けられたと思います(正誤表を見に来た方に限りますが…)。 ありがとうございました。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2218] Re:C言語ポインタ完全制覇(第2版) Fig2-8
投稿者:Hiroyuki Naito
2020/01/24 17:39:26

ご回答ありがとうございました。 >①「ローカル変数result」と「退避したベースポインタ」を書く場所を1段間違え、 >②「ベースポインタ」の右の矢印「→」をつけ忘れる onlineGDBというWeb上のCコンパイラで、コンパイルオプションをいろいろ試してist2-6と同じアセンブルリストが得られたので、本文に沿ってリストを追いかけてみて気づいた疑問点でした。 2.5.3までのところで、目からうろこ状態になってしまったのは以下の通りですが、今後もいろいろな発見がありそうなので期待しながら読み進めていきたいと思います。 (1)宣言のときの*や[](区切り子) は、式の中に現れる演算子の*や[]とは、まったくの別物。 (2)式の中では、配列は「その先頭要素へのポインタ」に読み替えられる。 (3)関数は、式の中では「関数へのポインタ」に読み替えらえる。 (4)関数funcへのポインタを格納するポインタ変数は、以下のように宣言する。 int (*func)(double); (5)関数へのポインタを使用したサンプルプログラム:List2-3 (6)自動変数の領域は、関数を抜けたら解放される。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2217] Re:C:言語ポインタ完全制覇(第2版) Fig2-8
投稿者:(ぱ)こと管理人
2020/01/22 00:56:40

はじめまして。ご指摘ありがとうございます。 >ベースポインタ-24、-28と「仮引数a,b」の位置関係が正しいとすると、ベース >ポインタとベースポインタ-4に格納される「退避したベースポインタ」とローカル >変数:resultの位置は、-4バイトずれていないでしょうか。 > >ベースポインタ:-20とベースポインタ:-4の間に、12バイト分のスペースしかない >のも少し気になりました。 申し訳ありません。誤植です。 言い訳になりますが、私が編集さんに渡したFig2-8の原本は以下です。 http://kmaebashi.com/etc/basepointer.png これをデザイナさんが書き直した際に、 ①「ローカル変数result」と「退避したベースポインタ」を書く場所を1段間違え、 ②「ベースポインタ」の右の矢印「→」をつけ忘れる というミスをされたようです。 もちろんゲラをチェックするのは私の仕事ですので、見落として本になって しまったのは私の責任です。 元の図も、「退避したベースポインタ」が4バイトに見える、というのは ちょっと問題ですね…… 正誤表に上げさせていただきます。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2216] C:言語ポインタ完全制覇(第2版) Fig2-8
投稿者:Hiroyuki Naito
2020/01/20 21:05:36

お世話になります。 だいぶ前にpdf版を購入してからしばらくコンピュータの中で眠らせてしまって いましたが、一念発起して読み始めております。 さて、Fig2-8では、アセンブラが割り振るベースポインタとそこに格納される変数の 関係が示されています。 ベースポインタ-24、-28と「仮引数a,b」の位置関係が正しいとすると、ベース ポインタとベースポインタ-4に格納される「退避したベースポインタ」とローカル 変数:resultの位置は、-4バイトずれていないでしょうか。 ベースポインタ:-20とベースポインタ:-4の間に、12バイト分のスペースしかない のも少し気になりました。 以上、お手数ですがご回答をお願いいたします。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2215] Re:c言語ポインタ完全制覇 realloc
投稿者:774RR
2020/01/14 14:23:20

>結局、巨大配列から動的に切り出す仕組みを作りかけたのを思い出しました。 それなんてオレオレ malloc ? 数バイト単位の alloc/free が高頻度で必要 L1 キャッシュヒット率を落とさないよう free 直後領域の再利用を優先するべし みたいな案件でオレオレ malloc/free 相当の関数は組んだことが過去にありました。 でも苦労した割にはそこがボトルネックではなかったでした。 それ以後は実測せずに思い込みの最適化をするなと口酸っぱく言ってます。 まあとりあえず p=realloc(p, sz); は一応注意喚起対象ってことで。 書籍の著者の掲示板まで読んでいる人には周知の事実かもしれませんが。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2214] Re:c言語ポインタ完全制覇 realloc
投稿者:(ぱ)こと管理人
2020/01/12 17:02:50

>p=realloc(p, sz); のコードに対して静的解析ツールが警告出したりするので >QAC 絶対主義みたいな頭の固い上司がこのコードにウンと言わない場合が >あったりするとかなかったりするとか。 まあそれはそれで必然性がないわけでもないので、よろしいのではないでしょうか。 >組み込み系では RAM 8KiB をコード実装に入る前の設計段階で静的に割り振って >動的確保なんぞありえないってケースが大半なので、そういう点でオイラは楽できてます。 新人時代、ワークステーションなのに上司がmalloc()禁止と言い出して、 結局、巨大配列から動的に切り出す仕組みを作りかけたのを思い出しました。 (最終的には説得に成功した)
[この投稿を含むスレッドを表示] [この投稿を削除]
[2213] Re:c言語ポインタ完全制覇 realloc
投稿者:774RR
2020/01/08 06:54:29

お久しぶりです。1月に1回くらいは掲示板チェックしてましたよ。 > 「戻り値のチェックは省略しています」という言い訳を付けています。 それなら問題ないっす。この手の解説書き始めると数ページを要してしまうし、 紙面に制約がある状況で本筋からずれた詳細を記載してもねー、と思うわけっす。 # ページに余裕があるなら数行の「コラム」にするのはアリかもしれない。 p=realloc(p, sz); のコードに対して静的解析ツールが警告出したりするので QAC 絶対主義みたいな頭の固い上司がこのコードにウンと言わない場合が あったりするとかなかったりするとか。 組み込み系では RAM 8KiB をコード実装に入る前の設計段階で静的に割り振って 動的確保なんぞありえないってケースが大半なので、そういう点でオイラは楽できてます。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2212] Re:c言語ポインタ完全制覇 realloc
投稿者:(ぱ)こと管理人
2020/01/08 02:18:07

おや、ごぶさたしております。 >オイラは買っていませんが [2206] で >> variable_array = realloc(variable_array, sizeof(int) * size); >と引用されていますね。典型的やってはダメと巷で解説されている例でしょう。 この箇所、書籍では、地の分で | List4-4では,ユーザーがint型の値を入力するたびに,realloc()を使って | variable_arrayを拡張しています(ここでも,戻り値のチェックは省略しています). と書いておりまして、「戻り値のチェックは省略しています」という言い訳を付けています。 realloc()の挙動を知るためのサンプルプログラムとしてはありではないでしょうか? ではサンプルではない場合にどうするかといえば、 malloc()だろうとrealloc()だろうと直接呼ぶのはそれ自体NGで、 なんらかのラップをかぶせ、「死ぬしかないにしても、(Segmentation faultではなく) メモリ不足で死んだことがわかるようにする」というのが最低限の対策だと 思っています。 >でもまあ realloc() に失敗するような状況だとほかの処理も一切できなくて >終了するしかない、ってのが実情で、 20年近く前に http://kmaebashi.com/programmer/c_yota/malloc.html の「戻り値チェック」のところにいろいろ書いてて、書籍の方にも似たことを 書いています。 JavaでOutOfMemoryErrorをcatchもしないくせに、Cでmalloc()の戻り値だけ 気にしたってしょうがない。それを言うならRubyなんてかつてはmalloc()が NULLを返しただけで(適切なエラーメッセージも出さず)Segmentation faultで 落ちまくってたぞ、と言いたいですねえ。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2211] c言語ポインタ完全制覇 realloc
投稿者:774RR
2020/01/06 19:18:48

オイラは買っていませんが [2206] で > variable_array = realloc(variable_array, sizeof(int) * size); と引用されていますね。典型的やってはダメと巷で解説されている例でしょう。 realloc() に失敗したとき nullptr が返され、旧 variable_array の領域を指すポインタがなくなってしまうので free() できなくなり、リークする というのがよくある解説なわけです。 でもまあ realloc() に失敗するような状況だとほかの処理も一切できなくて終了するしかない、ってのが実情で、 どうせ終了するんだったら現コードでもまいっかと思うわけですが Maebashi さんはどう思います?
[この投稿を含むスレッドを表示] [この投稿を削除]
[2210] Re:c言語ポインタ完全制覇(改訂版)に関する質問
投稿者:Hello World
2020/01/05 12:09:19

回答ありがとうございます。 すぐに読ませていただきます。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2209] Re:c言語ポインタ完全制覇(改訂版)に関する質問
投稿者:(ぱ)こと管理人
2020/01/03 21:13:33

>もう一つ質問があります。 >ポインタ完全制覇を読んでみて、処理系がどのようにプログラマーの書いたコードを >解釈しているのかが理解できれば、より理解が深まるなと考えています。 >そこで処理系に関するおすすめの書籍などがあれば教えていただけると非常に嬉しいです。 処理系に関する本、というと私が答えるなら当然これになるわけですが プログラミング言語を作る https://amzn.to/2szojNN 10年前の本なので新刊入手は難しいでしょうし、「機械語を生成するCコンパイラ」を 作っているわけではないのでHello Worldさんの目的にはちょっと合わないかもしれません。 Web版なら無料なのでよろしければどうぞ。crowbarはともかくDiksamの方は、 バイトコードコンパイル型の言語なのでCにも通じるところはあるかと思います。 http://kmaebashi.com/programmer/devlang/index.html 機械語を生成するCコンパイラの本であれば、私が大昔に読んだのはこれですが、 yaccによるCコンパイラプログラミング https://amzn.to/2SP8bT1 こちらも入手困難かもしれません(昔はマーケットプレイスでとんでもない高値が ついていました……)。 今なら、Rui Ueyamaさんの、こちらのページとかどうでしょうか(完結していませんが)。 https://www.sigbus.info/compilerbook
[この投稿を含むスレッドを表示] [この投稿を削除]
[2208] Re:c言語ポインタ完全制覇(改訂版)に関する質問
投稿者:Hello World
2020/01/02 15:39:55

回答ありがとうございます。と共に返信遅くなり、申し訳ありません。 >はい。realloc()は引数で渡されたポインタとは異なるポインタを返すこともあります。 >2-6-6(p.147)にも書いたとおりです。 2-6-6 読み直しました。4章(List 4-4 realloc.c)で色々試したことにより深く理解することができました。 ありがとうございます。 >どこに疑問を持たれているのかいまひとつわかりませんが、 >確かにrealloc()は異なるアドレスを返すことがあります。 >たとえばrealloc()が6回目までは同じアドレスAを返し、7回目の呼び出しで >アドレスBを返したとして、Bを返すとき、realloc()は >A[0]~A[5]をB[0]~B[5]にコピーしてから返します。 >よって、このサンプルでは、17行目からのforループで値を表示することは >問題なくできます。 > >これで回答になっていますでしょうか? はい、的確な回答ありがとうございます。 17行目の部分も理解することができました。ありがとうございます。 >実験できる環境があるのでしたら、realloc()の下で実際にポインタの値を >表示してみると挙動がわかるかもしれません。 >具体的には13行目と14行目の間に以下の2行を挿入します。 > >printf("variable_array..%p\n", variable_array); >malloc(10); > >明らかに無駄に見える2行目のmalloc(10);は、realloc()で確保した領域の >続きを埋めることでrealloc()が別の領域を返すことを促すためのものです >(コンパイラが最適化で消してしまうかもしれませんが、私の環境(Linux上のgcc)では >最適化オプションを付けなければ大丈夫でした)。これを付けないと、 >何度呼んでもrealloc()は同じアドレスを返しました。後ろが空いているからでしょう >(p.147参照)。 > >上記2行を足すことで、私の環境では、realloc()は7回目で異なるアドレスを >返してきました。 アドレスを表示することは何度もやっていましたが、mallocにより別の領域を返すことを促す発想はありませんでした。 ちなみにわたしの環境では、realloc()は6回目で異なるアドレスを返してきました。 もう一つ質問があります。 ポインタ完全制覇を読んでみて、処理系がどのようにプログラマーの書いたコードを解釈しているのかが理解できれば、より理解が深まるなと考えています。そこで処理系に関する おすすめの書籍などがあれば教えていただけると非常に嬉しいです。 回答ありがとうございました。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2207] Re:c言語ポインタ完全制覇(改訂版)に関する質問
投稿者:(ぱ)こと管理人
2019/12/29 14:42:22

はじめまして。 >realloc関数について man command で調べたところ(準拠 C89 C99)、返り値の項で >>「realloc関数は新たに割り当てられたメモリーへのポインタを返す。これはあらゆる >>組み込み型に対応できるようにアラインメントされており、ptrとは異なることも >ある。」と説明されています。 はい。realloc()は引数で渡されたポインタとは異なるポインタを返すこともあります。 2-6-6(p.147)にも書いたとおりです。 >List 4-4 realloc.cの17~19行目のfor文のブロックでsscanf関数によって >ヒープ領域にストアした値をprintf関数により、variable_array[i]という形で >参照しています。これは実際には *(variable_array + i) という形に >読み替えられていると思います。 ただ、上記のmanコマンドの返り値の項で >記述されている「ptrとは異なることもある」が実際に起こった場合、 >List 4-4 におけるptrつまりvariable_arrayが指し示すメモリアドレスが >一定ではなくなると思うので、そのメモリアドレスを起点にしてアクセスする >*(variable_array + i)は上手く目的の値をとってくることが、 >できないのではないでしょうか。 どこに疑問を持たれているのかいまひとつわかりませんが、 確かにrealloc()は異なるアドレスを返すことがあります。 たとえばrealloc()が6回目までは同じアドレスAを返し、7回目の呼び出しで アドレスBを返したとして、Bを返すとき、realloc()は A[0]~A[5]をB[0]~B[5]にコピーしてから返します。 よって、このサンプルでは、17行目からのforループで値を表示することは 問題なくできます。 これで回答になっていますでしょうか? >今まだ4章の途中ですが、本当にたくさんのことも学ぶことができています。 >自身の環境で実験をしながら試行錯誤ができ、とてもおもしろいです。 >本を書いてくださりありがとうございました。 ありがとうございます。 実験できる環境があるのでしたら、realloc()の下で実際にポインタの値を 表示してみると挙動がわかるかもしれません。 具体的には13行目と14行目の間に以下の2行を挿入します。 printf("variable_array..%p\n", variable_array); malloc(10); 明らかに無駄に見える2行目のmalloc(10);は、realloc()で確保した領域の 続きを埋めることでrealloc()が別の領域を返すことを促すためのものです (コンパイラが最適化で消してしまうかもしれませんが、私の環境(Linux上のgcc)では 最適化オプションを付けなければ大丈夫でした)。これを付けないと、 何度呼んでもrealloc()は同じアドレスを返しました。後ろが空いているからでしょう (p.147参照)。 上記2行を足すことで、私の環境では、realloc()は7回目で異なるアドレスを 返してきました。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2206] c言語ポインタ完全制覇(改訂版)に関する質問
投稿者:Hello World
2019/12/27 19:06:55

・realloc関数についての質問(p238 List 4-4 realloc.c)  realloc関数の呼び出しは13行目 variable_array = realloc(variable_array, sizeof(int) * size); realloc関数について man command で調べたところ(準拠 C89 C99)、返り値の項で 「realloc関数は新たに割り当てられたメモリーへのポインタを返す。これはあらゆる組み込み型に対応できるようにアラインメントされており、ptrとは異なることもある。」と説明されています。 man command のrealloc関数の書式は以下の通り。 void *realloc(void *ptr, size_t size); List 4-4 realloc.cの17~19行目のfor文のブロックでsscanf関数によってヒープ領域にストアした値をprintf関数により、variable_array[i]という形で参照しています。これは実際には *(variable_array + i) という形に読み替えられていると思います。 ただ、上記のmanコマンドの返り値の項で記述されている「ptrとは異なることもある」が実際に起こった場合、List 4-4 におけるptrつまりvariable_arrayが指し示すメモリアドレスが一定ではなくなると思うので、そのメモリアドレスを起点にしてアクセスする *(variable_array + i)は上手く目的の値をとってくることが、できないのではないでしょうか。 拙い文ではありますが、何卒よろしくお願いします。 今まだ4章の途中ですが、本当にたくさんのことも学ぶことができています。 自身の環境で実験をしながら試行錯誤ができ、とてもおもしろいです。 本を書いてくださりありがとうございました。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2205] Re:c言語ポインタ完全制覇(改訂版)に関する質問
投稿者:nana
2019/12/21 19:03:55

回答ありがとうございます。 なんとなく分かった気がします。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2204] Re:c言語ポインタ完全制覇(改訂版)に関する質問
投稿者:(ぱ)こと管理人
2019/12/21 18:06:45

すみません、不明点がいまいちよくわかりません。 >37行目 : read_slogan(stdin, slogan); のように なぜslogan のみで良いのか >理解できずにいます。 … >例えば、 char slogan[7]; を渡す場合は、 >配列は渡せないため、 slogan として配列の先頭要素へのポインタを渡すということは >一応理解できています。 おなじことです。 char slogan[7]; においてsloganの型は「charの配列」です。これを関数に渡すなら、 (配列は渡せないため)sloganとして配列の先頭要素へのポインタを渡します。 式の中では配列はポインタに読み替えられるので、sloganの型は 「charへのポインタ」となります。 char *slogan[7]; においてsloganの型は「charへのポインタの配列」です。これを関数に渡すなら、 (配列は渡せないため)sloganとして配列の先頭要素へのポインタを渡します。 式の中では配列はポインタに読み替えられるので、sloganの型は 「charへのポインタのポインタ」となります。 これで回答になっていますでしょうか?
[この投稿を含むスレッドを表示] [この投稿を削除]
[2203] Re:c言語ポインタ完全制覇(改訂版)に関する質問
投稿者:nana
2019/12/20 16:27:08

回答ありがとうございます。 そのページも読んでいたはずなのですが、理解できていなかったようです。 追加で、もう一つ質問があります。 p.241 のList4-5に関してなのですが、 char *slogan[7]; を渡す際に、 37行目 : read_slogan(stdin, slogan); のように なぜslogan のみで良いのか理解できずにいます。 p.242 では read_slogan()関数には「charへのポインタの配列」を引数で渡していると 書いてありますが、なぜ slogan のみでcharへのポインタの配列を渡すことになるのかが 分かりません。 例えば、 char slogan[7]; を渡す場合は、 配列は渡せないため、 slogan として配列の先頭要素へのポインタを渡すということは 一応理解できています。 回答お願いいたします。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2202] Re:c言語ポインタ完全制覇(改訂版)に関する質問
投稿者:(ぱ)こと管理人
2019/12/20 00:24:07

こんにちは。 >スタックというのは、データ構造なのか、そういった領域があるのか、 >いまいちわかっていません。 >スタックに積むという表現がp.111あたりにありますが、自動変数の場合は >CPUに組み込みで備わっているスタックという機能(データ構造)を使ってくれる >ということなんでしょうか? スタックという言葉自体は広くはデータ構造を指すので、配列や連結リストで スタックを作ることもありますが、Cにおける自動変数の領域の確保は、 通常はCPUに組み込みで備わっているスタックの機能を使います。 p.114 List 2-6のアセンブリ言語を見ると、%rsp(スタックポインタ)という レジスタが登場しています。これにsp(stack pointer)という名前が付いている ことから、このスタックがCPU組み込みの機能であることがわかるでしょう。 もし、CPUに組み込みのスタック機能がないとしたら、別のレジスタやメモリを スタックポインタに使って同等の機能を実現することはできるでしょうが、 その場合、pushq(List2-6の4行目)やpopq(16行目)のように、1命令でスタックに 値を積んだり取り出したりはできなくなります。スタックは有用な機能なので、 昔から、たいていのCPUには組み込みのスタック機能が付いています。 スタックの領域は、p.100のFig.2-3にあるとおり、仮想アドレスのどこかに OSにより割り当てられています。 >ヒープというのはもともとそういった領域が用意されているのでしょうか? これもp.100のFig.2-3にあるとおり、仮想アドレスのどこかにOSにより 割り当てられています。 >また、 >p.141には「malloc()の要求に対して十分な大きさの空きブロックがない場合、 >OSにお願いして領域を拡張してもらいます」 >と書いてあります。 >これは、もともとあるヒープ領域を拡張するという意味なのでしょうか? そうです。Fig.2-3の「malloc()により確保された領域」が下に伸びるイメージです。 >また、くだらないことかもしれませんが、 >p.285のList 5-5 >1行目 include <stdio.h>で # が抜けているように思います。 本当ですね。ご指摘ありがとうございます。正誤表に載せます。 (プログラムリストは、ソースから自動処理で編集さんに渡すテキストに 組み込んでいたので、元原稿にはコンパイルが通らないようなソースは ないのですが…… 編集段階で#が抜けてしまったようです。著者としては ゲラのチェックの段階で気付かなければいけなかったのですが…… もうしわけありません)
[この投稿を含むスレッドを表示] [この投稿を削除]
[2201] c言語ポインタ完全制覇(改訂版)に関する質問
投稿者:nana
2019/12/16 11:08:26

・スタックに関する質問 スタックというのは、データ構造なのか、そういった領域があるのか、いまいちわかっていません。 スタックに積むという表現がp.111あたりにありますが、自動変数の場合はCPUに組み込みで備わっているスタックという機能(データ構造)を使ってくれるということなんでしょうか? ・ヒープに関する質問 p.135にmalloc()は、...「ヒープからメモリを取ってくる関数」ということになります。 と書いてありますが、 ヒープというのはもともとそういった領域が用意されているのでしょうか? また、 p.141には「malloc()の要求に対して十分な大きさの空きブロックがない場合、OSにお願いして領域を拡張してもらいます」 と書いてあります。 これは、もともとあるヒープ領域を拡張するという意味なのでしょうか? 初歩的な質問かと思いますが、お答えいただけると嬉しいです。 また、くだらないことかもしれませんが、 p.285のList 5-5 1行目 include <stdio.h>で # が抜けているように思います。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2200] X-Drawのページの画像について
投稿者:(ぱ)こと管理人
2019/12/05 23:30:02

ポインタ完全制覇新版のX-Drawのページについて、 http://kmaebashi.com/seiha2/xdraw/index.html 画像がすべて表示できない状態になっていました。 画像ファイルがサーバになくて、404状態でした。 原因はわかりませんし、いつからこの状態だったのかもわかりません (もしかして最初から?)。 ひとまず再アップロードしておきました。 ご迷惑をおかけしまして申し訳ありません。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2199] Re:ポインタ完全制覇 - read_slogan.c
投稿者:(ぱ)こと管理人
2019/11/16 02:04:54

はじめまして。ご指摘ありがとうございます。 >buf[slogan_len - 1] = '\0'; > >したあと、 > >slogan[i] = malloc(sizeof(char) * (slogan_len + 1)); > >していますが、bufの大きさは、slogan_len byteで十分なので、 通常、文字数がlenのとき、'\0'の分を含めてlen+1だけmalloc()するのが 定石ですが、このケースではslogan_lenは改行文字を含んでいて、 その改行文字を'\0'に置き換えるので、malloc()するのはslogan_lenの 分だけでよいですね。 改定前のものからのミスだと思います。正直、まだポカが残っているとは 思いませんでした…… 正誤表に入れさせていただきます。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2198] ポインタ完全制覇 - read_slogan.c
投稿者:Tom
2019/11/13 20:20:20

はじめまして、ポインタ完全制覇の四章の`read_slogan.c`での質問です。 buf[slogan_len - 1] = '\0'; したあと、 slogan[i] = malloc(sizeof(char) * (slogan_len + 1)); していますが、bufの大きさは、slogan_len byteで十分なので、mallocのときには、+1する必要はなくて、 slogan[i] = malloc(sizeof(char) * slogan_len); でよいのではないでしょうか?
[この投稿を含むスレッドを表示] [この投稿を削除]
[2197] Re:オブジェクト指向について
投稿者:(ぱ)こと管理人
2019/10/17 01:47:29

>Javaのメソッド呼び出しの文法が、C++におけるオブジェクトの実体へのアクセスと >同じであるため、混乱していました。 C++はオブジェクトの実体とポインタの両方を扱えるので obj.hoge(); と obj->hoge(); は別の意味ですが、 Javaはポインタしかないので、Javaにおける obj.hoge(); は、C++における obj->hoge(); と同値です。ポインタしかないJavaではわざわざ1文字多い「->」を使うより、 全部「.」を使う方が打鍵数が少なくてよいとは思いますが、紛らわしいのは 確かですね。 ただ、なんにせよ、オブジェクト指向においては「どのオブジェクトに仕事を 頼むのか」が重要なので、「ポインタ(参照)でオブジェクトを指す」のは 概念的にわかりやすく、C++のように実体を扱える言語より、なんでも参照 (ポインタ)の言語の方がとらえやすいかとは思います。どちらが実用的かとか、 そういう話は置いておくとして。 継承を考えればなおのこと、です。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2196] Re:オブジェクト指向について
投稿者:C××
2019/10/14 18:40:43

回答ありがとうございます。 Javaのメソッド呼び出しの文法が、C++におけるオブジェクトの実体へのアクセスと同じであるため、混乱していました。 C++からJavaを学ぶ場合(あるいはその逆) 文法が似ているから楽だと書いているサイトをよく見ますが、 かえって紛らわしいなと感じました。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2195] Re:オブジェクト指向について
投稿者:(ぱ)こと管理人
2019/10/13 01:47:58

はじめまして。 > ここの記事やほかのサイトを読んでるうちに、結局のところ >「オブジェクトというのはプログラム(ソフトウェア)を保持することができる変数」で >「小規模なソフトウェアの組み合わせで1つのソフトウェアを作るのがオブジェクト指向」 >という結論にたどり着いたのですが、実際のところこの解釈はどうなのでしょうか。 まず、C++を除くたいていのオブジェクト指向言語では、オブジェクトを変数に 格納することはできません。変数に格納できるのはオブジェクトへの参照だけです。 そのうえで、オブジェクトという「小規模なソフトウェア」の組み合わせで それなりの規模のプログラムを作る、というのはそれなりによさげな解釈かと 思います。単に「小規模なソフトウェアの組み合わせで1つのソフトウェアを作る」 だけだと、「モジュール化」と区別がつきませんし。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2194] オブジェクト指向について
投稿者:C××
2019/10/10 00:25:10

 初投稿です  オブジェクト指向についてわかったような気になったり、急にわからなくなったりという哲学じみた事を繰り返している内に、最近このサイトに行き着いた者です。  ここの記事やほかのサイトを読んでるうちに、結局のところ 「オブジェクトというのはプログラム(ソフトウェア)を保持することができる変数」で 「小規模なソフトウェアの組み合わせで1つのソフトウェアを作るのがオブジェクト指向」という結論にたどり着いたのですが、実際のところこの解釈はどうなのでしょうか。  犬猫や、レストランの例えよりは一番しっくり来た表現なのですが、厳密には違うような気がします。( operator=() などで定義しないと代入できない辺り)  はっきりとしない質問で恐縮ですが、意見を聞かせてくだされば幸いです。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2193] Re:Webアプリケーション開発入門のP132について
投稿者:(ぱ)こと管理人
2019/09/10 00:25:20

>② C:\Users\java\expand_downloads\src\p77\chap03\Henacat_0_1\com  > >にクラスパスを通してみようとしましたら、エラーが発生してしまいました。 >大変恐縮ですが、ご教授頂けましたら幸いです。よろしくお願い致します。 エラーを見ると、 >PostBBS.java:2: エラー: パッケージcom.kmaebashi.henacat.servlet.httpは存在しません このように、Henacatで作成したサーブレット関連のパッケージやクラスが見えていない ことがわかります。つまり、クラスパスが通っていません。 実行したコマンドラインは以下ですが、 >C:\Users\java\expand_downloads\src\p77\chap03\testbbs\WEB-INF\classes>javac -classpath C:\Users\java\expand_downloads\src\p77\chap03\Henacat_0_1\com *.java これを見ると、「C:\Users\java\expand_downloads\src\p77\chap03\Henacat_0_1\com」に クラスパスを通していますが、p.132冒頭の記載は、 | この修正を加えたうえで、Henacatのクラスファイルのルートであるcomディレクトリが | 存在するディレクトリ(「com\kmaebashi\henacat\……」というディレクトリ階層の | 根元)にclasspathを向けてコンパイルし、クラスファイルを作ります。 です。「comディレクトリが存在するディレクトリ」ですから、comディレクトリの ひとつ上です。 この場合なら、以下のようにすれば通るかと思います。 > javac -classpath C:\Users\java\expand_downloads\src\p77\chap03\Henacat_0_ *.java
[この投稿を含むスレッドを表示] [この投稿を削除]
[2192] Webアプリケーション開発入門のP132について
投稿者:javajava
2019/09/08 15:19:21

いつも大変お世話になっております。P132の文章を理解できていない為と思うのですが、私なりに、 ① chap03\testbbs\WEB-INF\classes の3ファイルのP131に該当する部分を修正し、 ② C:\Users\java\expand_downloads\src\p77\chap03\Henacat_0_1\com  にクラスパスを通してみようとしましたら、エラーが発生してしまいました。大変恐縮ですが、ご教授頂けましたら幸いです。よろしくお願い致します。 【以下エラー文】 C:\Users\java\expand_downloads\src\chap03\Henacat_0_1\com\kmaebashi\henacat\webserver>cd C:\Users\java\expand_downloads\src\p77\chap03\testbbs\WEB-INF\classes C:\Users\java\expand_downloads\src\p77\chap03\testbbs\WEB-INF\classes>javac -classpath C:\Users\java\expand_downloads\src\p77\chap03\Henacat_0_1\com *.java PostBBS.java:2: エラー: パッケージcom.kmaebashi.henacat.servlet.httpは存在しません import com.kmaebashi.henacat.servlet.http.*; //javax.servlet.http.*; ^ PostBBS.java:4: エラー: シンボルを見つけられません public class PostBBS extends HttpServlet { ^ シンボル: クラス HttpServlet PostBBS.java:6: エラー: シンボルを見つけられません public void doPost(HttpServletRequest request, HttpServletResponse response) ^ シンボル: クラス HttpServletRequest 場所: クラス PostBBS PostBBS.java:6: エラー: シンボルを見つけられません public void doPost(HttpServletRequest request, HttpServletResponse response) ^ シンボル: クラス HttpServletResponse 場所: クラス PostBBS ShowBBS.java:2: エラー: パッケージcom.kmaebashi.henacat.servlet.httpは存在しません import com.kmaebashi.henacat.servlet.http.*; //import javax.servlet.http.*; ^ ShowBBS.java:4: エラー: シンボルを見つけられません public class ShowBBS extends HttpServlet { ^ シンボル: クラス HttpServlet ShowBBS.java:13: エラー: シンボルを見つけられません public void doGet(HttpServletRequest request, HttpServletResponse response) ^ シンボル: クラス HttpServletRequest 場所: クラス ShowBBS ShowBBS.java:13: エラー: シンボルを見つけられません public void doGet(HttpServletRequest request, HttpServletResponse response) ^ シンボル: クラス HttpServletResponse 場所: クラス ShowBBS PostBBS.java:5: エラー: メソッドはスーパータイプのメソッドをオーバーライドまたは実装しません @Override ^ ShowBBS.java:12: エラー: メソッドはスーパータイプのメソッドをオーバーライドまたは実装しません @Override ^ エラー10個 C:\Users\java\expand_downloads\src\p77\chap03\testbbs\WEB-INF\classes>
[この投稿を含むスレッドを表示] [この投稿を削除]
[2191] Re:Webアプリケーション開発入門のP99について
投稿者:javajava
2019/09/08 15:06:31

>>早速ですが、ご指摘にしたがってP.97のようにコンパイルしてみましたが、 >>下記のようなエラーが出ます。Message.javaはできたようです。 >>しかし、PostBBS.javaで躓きます。 > >すみません、前回の例示は不正確でした。p.97のとおりにやるなら > >javac -classpath C:\Tomcat8\lib\servlet-api.jar *.java > >ですね。私の環境ではこれで通りました。 > >-classpathでクラスパスの指定をすると、カレントディレクトリがクラスパスから >抜けてしまうので、PostBBS.javaをコンパイルするときにMessage.classが参照できなくて >エラーになっているわけです。以下のようにカレントディレクトリ「./」を >-classpathに加えてもコンパイルできますが、この規模なら*.javaで十分でしょう。 > >javac -classpath ./;C:\Tomcat8\lib\servlet-api.jar PostBBS.java ご回答、ありがとうございます。ご指摘頂いたように「*.java」の方で実行したところ、うまくいきました!ありがとうございました。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2190] Re:Webアプリケーション開発入門のP99について
投稿者:javajava
2019/09/08 15:06:26

>>早速ですが、ご指摘にしたがってP.97のようにコンパイルしてみましたが、 >>下記のようなエラーが出ます。Message.javaはできたようです。 >>しかし、PostBBS.javaで躓きます。 > >すみません、前回の例示は不正確でした。p.97のとおりにやるなら > >javac -classpath C:\Tomcat8\lib\servlet-api.jar *.java > >ですね。私の環境ではこれで通りました。 > >-classpathでクラスパスの指定をすると、カレントディレクトリがクラスパスから >抜けてしまうので、PostBBS.javaをコンパイルするときにMessage.classが参照できなくて >エラーになっているわけです。以下のようにカレントディレクトリ「./」を >-classpathに加えてもコンパイルできますが、この規模なら*.javaで十分でしょう。 > >javac -classpath ./;C:\Tomcat8\lib\servlet-api.jar PostBBS.java ご回答、ありがとうございます。ご指摘頂いたように「*.java」の方で実行したところ、うまくいきました!ありがとうございました。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2189] Re:Webアプリケーション開発入門のP99について
投稿者:(ぱ)こと管理人
2019/09/03 01:08:02

>早速ですが、ご指摘にしたがってP.97のようにコンパイルしてみましたが、 >下記のようなエラーが出ます。Message.javaはできたようです。 >しかし、PostBBS.javaで躓きます。 すみません、前回の例示は不正確でした。p.97のとおりにやるなら javac -classpath C:\Tomcat8\lib\servlet-api.jar *.java ですね。私の環境ではこれで通りました。 -classpathでクラスパスの指定をすると、カレントディレクトリがクラスパスから 抜けてしまうので、PostBBS.javaをコンパイルするときにMessage.classが参照できなくて エラーになっているわけです。以下のようにカレントディレクトリ「./」を -classpathに加えてもコンパイルできますが、この規模なら*.javaで十分でしょう。 javac -classpath ./;C:\Tomcat8\lib\servlet-api.jar PostBBS.java
[この投稿を含むスレッドを表示] [この投稿を削除]
[2188] Re:Webアプリケーション開発入門のP99について
投稿者:javajava
2019/08/31 22:18:55

回答ありがとうございます! メッセージの件、申し訳ありませんでした。以後、注意します。 早速ですが、ご指摘にしたがってP.97のようにコンパイルしてみましたが、下記のようなエラーが出ます。Message.javaはできたようです。しかし、PostBBS.javaで躓きます。 C:\Users\java\expand_downloads\src\p77\chap03\testbbs_jsp\WEB-INF\classes\bbs>javac -classpath C:\Tomcat8\lib\servlet-api.jar Message.java C:\Users\java\expand_downloads\src\p77\chap03\testbbs_jsp\WEB-INF\classes\bbs>javac -classpath C:\Tomcat8\lib\servlet-api.jar PostBBS.java PostBBS.java:10: エラー: シンボルを見つけられません Message newMessage = new Message(request.getParameter("title"), ^ シンボル: クラス Message 場所: クラス PostBBS PostBBS.java:10: エラー: シンボルを見つけられません Message newMessage = new Message(request.getParameter("title"), ^ シンボル: クラス Message 場所: クラス PostBBS PostBBS.java:13: エラー: パッケージMessageは存在しません Message.messageList.add(0, newMessage); ^ エラー3個 C:\Users\java\expand_downloads\src\p77\chap03\testbbs_jsp\WEB-INF\classes\bbs> このようなエラーが出るのですが、何かお気づきの点等ございますでしょうか? ご教授の程、よろしくお願いします。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2187] Re:Webアプリケーション開発入門のP99について
投稿者:(ぱ)こと管理人
2019/08/27 01:01:19

>ただ、今度はP102のPostBBS.javaをコンパイルしようとするとエラーが。 エラーが出たというのであれば、せめてエラーメッセージは書いてください。 >普通に >javac PostBBS.java としてるのですが・・・。 p.102にPostBBS.javaはないので、どこのソースのことかわかりませんが、 Tomcatで動かすサーブレットをコンパイルするのであれば、 > javac PostBBS.java ではなくて、p.97にあるとおり、 >javac -classpath C:\Tomcat8\lib\servlet-api.jar PostBBS.java のように、servlet-api.jarをクラスパスに入れてコンパイルする必要があります。 (Tomcatのバージョンや配置先が違うなら、適宜読み替えてください)
[この投稿を含むスレッドを表示] [この投稿を削除]
[2186] Re:Webアプリケーション開発入門のP99について
投稿者:javajava
2019/08/25 19:14:00

ご回答ありがとうございます!素晴らしい書籍の執筆ありがとうございます! 時間がとれたので、早速回答に従ってやってみます・・・のような返信を入れたのですが、Upされてないのか、私が不慣れなのか・・・w とにもかくにも、本日もう一度最初からやり直してみましたら、ちゃんと動きました。 ありがとうございました。 ただ、今度はP102のPostBBS.javaをコンパイルしようとするとエラーが。 普通に >javac PostBBS.java としてるのですが・・・。 ご教授いただければ幸いでございます。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2185] Re:Webアプリケーション開発入門のP99について
投稿者:(ぱ)こと管理人
2019/08/17 16:12:02

>いつもお世話になっております。初めて投稿します。 はじめまして。 >書籍「Webアプリケーション開発入門」のP99で、「http://localhost:8080/ShowBBS」を >ブラウザで実行すると、書籍の中にあった、「ごめんねごめんねごめんねごめんねごめ >んね・・・」と続くページが表示されてしまい、掲示板が表示されません。 書籍の通りの順番でp.99だとすると、「3.3.3.Tomcat で掲示板を作る」のところです。 章タイトルの通り、ここでは、へなちょこサーブレットコンテナHenacatを作る前に、 Tomcatで掲示板を作ろうとしています。 そして、「ごめんなさいごめんなさいごめんなさいごめんなさいごめんなさい ごめんなさい…」と続くページは、p.74にあるWebサーバもどき「Modoki/0.2」の 404ページです。 Tomcatの設定をわざわざ変えたのでなければ、TomcatがModoki/0.2の404ページを 返すわけがないので、ここではTomcatではなくModoki/0.2を叩いているのでは ないでしょうか。 ただし、Modoki/0.2のポート番号は8001で、Tomcatのポート番号は8080です。 Modoki/0.2のポート番号をわざわざ変えたのでなければ、 「http://localhost:8080/ShowBBS」 であればTomcatが動くはずです。 考えられる可能性としては、 ①本当は「http://localhost:8001/ShowBBS」を叩いていた。 ②Modoki/0.2のポート番号を8080に変えて実行していて、  Tomcatはポートが塞がっているので起動に失敗している。 のどちらかですかねえ。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2184] Webアプリケーション開発入門のP99について
投稿者:javajava
2019/08/15 12:22:47

いつもお世話になっております。初めて投稿します。 書籍「Webアプリケーション開発入門」のP99で、「http://localhost:8080/ShowBBS」をブラウザで実行すると、書籍の中にあった、「ごめんねごめんねごめんねごめんねごめんね・・・」と続くページが表示されてしまい、掲示板が表示されません。 Tomcatも動いているようですし、書籍の通りやったつもりなのですが、どこが良くないのかがわかりません。同じようなところで躓いて、ピンときた方、いらっしゃいましたら、ご教授お願いします。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2183] Re:汎整数拡張について
投稿者:d_kuma
2019/08/12 21:46:36

お世話になっております。 細かい内容について答えていただき、ありがとうございます。 char,shortと、intでの処理速度やサイズの違いについて、よく分かりました。 現在の処理環境なら、あまり気にする必要は無いのかな、という気がしました。 スカラの変数ならintを使うということも理解できました。 お忙しいところ、ありがとうございました。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2182] Re:汎整数拡張について
投稿者:(ぱ)こと管理人
2019/08/11 01:20:26

『CプログラミングFAQ』は、持ってたはずなのですが、どこを探しても見当たらない…… >①汎整数拡張により、char型やshort型は、値を取り出す時に32ビットに変換されるので、 >int型より処理時間がかかったり、int型より実行ファイルが増大したりするのでしょうか? この手の性能問題は私は全然詳しくないのですが(アプリケーションプログラマですので…)、 今時のCPUを相手に、どちらが良いとか悪いとかそう一概に言えるものではないと思っています。 たとえば先のchar_test.sとint_test.sをそれぞれGAS(GNU assembler)にかけてみると、 movsblの命令長はmovlよりも確かに長いのですが、int int_var = 5; の「5」が 32ビット幅になるので、結局のところ実効形式のサイズとしてはint_test.sの方が 微増しているようです。 char_test.s 17 0008 C645FF05 movb $5, -1(%rbp) 18 000c 0FBE45FF movsbl -1(%rbp), %eax 19 0010 89C6 movl %eax, %esi int_test.s 17 0008 C745FC05 movl $5, -4(%rbp) 17 000000 18 000f 8B45FC movl -4(%rbp), %eax 19 0012 89C6 movl %eax, %esi 特に配列なら、主記憶は十分にあっても、今時キャッシュに乗らないと性能は出ないので、 小さな型を使った方が早いケースはあるかもしれません。 配列でないなら、どちらにしても、そう大差があるとは思えませんが。 >②汎整数拡張があるので、char型やshort型を使わずに、int型を使った方が良いのでしょうか? 配列でないスカラの変数であれば、たとえば1バイト文字しか入らないとわかっていても、 私ならintを使います。「ポインタ完全制覇」にも書きましたが、getchar()の 戻り値やputchar()の引数も、実際intですし。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2181] Re:汎整数拡張について
投稿者:d_kuma
2019/08/08 17:42:29

ご連絡遅くなりました。 アセンブラの解説をしていただき、ありがとうございます。 char型はアセンブラ上で変換が入るということで理解しました。 会社内で汎整数拡張について聞いてみたら、アセンブラ上で差異は無いと言われたので、間違って理解していました。 movsblというのが分からず、ネットで調べました。 movsはsign extension(符号拡張)によるコピー、blはfrom byte(8ビット) to long(32ビット)ということで理解しました。 これに付随して、さらに質問があります。 ①汎整数拡張により、char型やshort型は、値を取り出す時に32ビットに変換されるので、int型より処理時間がかかったり、int型より実行ファイルが増大したりするのでしょうか? ②汎整数拡張があるので、char型やshort型を使わずに、int型を使った方が良いのでしょうか? ①については、char型やshort型を使うと、アセンブラ上で余計な変換が入って実行ファイルが増大してしまう、ということが書かれた技術書を読んだことがあります(『CプログラミングFAQ』だったと思います)。 ②については、C言語ではint型が基準なので、できるだけint型を使うべきなのかなと思っています。 巨大な配列を扱う時にメモリのサイズを減らしたいのでchar型やshort型を使うのはいいと思うのですが、 そうでないなら、できるだけint型を使うべきではと思っています。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2180] Re:汎整数拡張について
投稿者:(ぱ)こと管理人
2019/08/07 01:01:42

こんにちは。 >汎整数拡張という機能は、char型やshort型は、アセンブラ上ではint型と同じように >扱われる、ということかなと思うのですが、この認識で合っているでしょうか? >Cのソースコードからアセンブラに変換されるときに、汎整数拡張によって何か >変換処理が行われるわけではないと思っています。 汎整数拡張という機能は、charやshortの変数でも、式の中ではintに変換される、 という機能です。変数に格納された値を使う時にはintでも、変数のサイズは、 charやshortならintより小さいわけですから、メモリから値を取り出して (intと同じビット幅の)レジスタに乗せるときには汎整数拡張による変換処理が 入りますし、逆に(int型の)式の値をcharとかshortの変数に格納するときには、 逆の変換が必要です。 試してみました。 char_test.c #include <stdio.h> int char_test(void) { char char_var = 5; printf("%d", char_var); } int_test.c #include <stdio.h> int int_test(void) { int int_var = 5; printf("%d", int_var); } アセンブラ上の差異は以下です(Linuxでgcc -S)。 char_test.s movb $5, -1(%rbp) ← char_var = 5のところ movsbl -1(%rbp), %eax ← char_varの値をeaxレジスタに移動 int_test.s movl $5, -4(%rbp) ←int_var = 5のところ movl -4(%rbp), %eax ← int_varの値をeaxレジスタに移動 int_test.sでは、単に32ビットを移動するmovl命令が使われていますが、 char_test.sでは、5をchar_varに代入する際にはバイトでの移動命令movbが、 char_varの値を取り出すときにはバイトを32ビットに変換しつつ移動する movsblが使われていることがわかります。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2179] 汎整数拡張について
投稿者:d_kuma
2019/08/05 17:43:35

お世話になっております。 汎整数拡張(又は整数拡張)について質問があります。 汎整数拡張という機能は、char型やshort型は、アセンブラ上ではint型と同じように扱われる、ということかなと思うのですが、この認識で合っているでしょうか? Cのソースコードからアセンブラに変換されるときに、汎整数拡張によって何か変換処理が行われるわけではないと思っています。 試しに、char型、short型、int型による演算を、アセンブラ上で比較してみたのですが、差異が出てしまいました。 全て同じような結果になると期待していたのですが、そうはならなかったです。 あまりアセンブラに詳しいわけではないので、自信を持って言えるわけではありませんが。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2177] Re:C言語ポインタ完全制覇
投稿者:(ぱ)こと管理人
2019/05/19 00:56:23

はじめまして。 >180ページのTable3-3でint *hoge[10]のサイズが8×10になっていますが >int型の配列へのポインタなので4×10ではないでしょうか? int *hoge[10]は、そのページの説明にもあるとおり、 「int型へのポインタの配列(要素数10)」です。 ポインタのサイズは処理系依存ですが、その前のページでポインタは8バイトと 仮定しているので、8×10で80バイトです。 なお、「int型の配列へのポインタ」であれば、(指す先は何であれポインタなので) 8バイトになりますね。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2176] C言語ポインタ完全制覇
投稿者:かずぼん
2019/05/18 08:55:14

最近貴書を購入しました。 一つ質問があります。 180ページのTable3-3でint *hoge[10]のサイズが8×10になっていますがint型の配列へのポインタなので4×10ではないでしょうか? よろしくお願いいたします。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2175] Re:Eclipseを使うとclassLoaderで例外が発生
投稿者:Radec
2019/05/12 09:33:25

すみません、自己解決しました。 Eclipseがコンパイル時にデフォルトで使用するバージョンがJavaSE11になっていたので、CokkieTestもreleaseオプションで指定で同バージョンにすることで解決致しました。 (というかそもそもスタックトレース見ろレベルの質問でした、大変失礼致しました。)
[この投稿を含むスレッドを表示] [この投稿を削除]
[2174] Re:Eclipseを使うとclassLoaderで例外が発生
投稿者:(ぱ)こと管理人
2019/05/08 23:34:30

はじめまして。 >URL(http://localhost:8001/testbbs/ShowBBS)を入力したところでclassLoaderが例外を発生させてしまいました。 具体的なスタックトレースがわからないので何ですが、 もし起きているのがClassNotFoundExceptionだったとすると、 ShowBBSのクラスが所定の場所にないのではないでしょうか。 Henacatの場合、Henacat自体のソースやクラスをどこに置くかに関係なく、 サーブレットのクラスは、WebApplication.javaの8行目、 private static String WEBAPPS_DIR = "C:\\Henacat_0_1\\webapps"; この場所に置いてあることを期待しています。 もっとも、ここに置いてないならEclipseでなくても動かないですし、 >ShowBBS等のクラスパス指定もElicpseのプロジェクト配下のクラスパスを >指定してコンパイルしています。 というのは、「3.4.3 Henacat ver.0.1 で掲示板を動かす」の | この修正を加えたうえで、Henacatのクラスファイルのルートである | com ディレクトリが存在するディレクトリ(「com\ kmaebashi\henacat\……」と | いうディレクトリ階層の根元)にclasspathを向けてコンパイルし、 | クラスファイルを作ります。 という記載に沿っていることを意味するのであれば、そのあたりも 当然分かったうえで実行されているように思います。 あとは、具体的な例外を見てみないと、ちょっとわかりません。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2173] 無題
投稿者:Radec
2019/05/07 21:33:35

こんばんは、本質的なところと全く違うので恐縮ですが、 「Webサーバを作りながら学ぶ 基礎からのWebアプリケーション開発入門」の第3章にて実装したHenacat0_1の挙動について質問となります。 Henacat0_1のソースコードをダウンロードし、 コマンドプロンプトにてコンパイルを通してMainを実行したところ、 特に問題なく掲示板が稼動しました。 ところが、同ソースコードをEclipseで作成したJavaプロジェクトにコピペしてMainを実行したところ、 URL(http://localhost:8001/testbbs/ShowBBS)を入力したところでclassLoaderが例外を発生させてしまいました。 (デバッグ実行させたところ、WebApplicationインスタンスやServletInfoインスタンスは値を渡せているように見えます) Eclipseはデフォルト文字コードがUTF-8ですが、本プロジェクトについては個別設定でsjisを設定しているので文字コードは問題ないかと思うのですが。。。 また、binフォルダを見ても無名クラス含めてクラアスファイルはしっかり作成されていますし、ShowBBS等のクラスパス指定もElicpseのプロジェクト配下のクラスパスを指定してコンパイルしています。 文字コードとコンパイルミス以外に考えられる原因等はありますでしょうか?
[この投稿を含むスレッドを表示] [この投稿を削除]
[2172] Re:c言語ポインタ完全制覇(改訂版)に関する質問
投稿者:(ぱ)こと管理人
2019/04/02 01:25:35

返信が遅れて申し訳ありません。 >書籍の中の補足でNULLマクロは処理系によって定義のされ方が違うと書かれていましたが、 >(void*)0であっても0であってもNULLは真偽値で言えば偽が返る値ということですね。 その通りです。これについてはC FAQに記載がありました。 http://www.kouno.jp/home/c_faq/c5.html#3 | 5.3: | ポインターがヌルポインターでないかどうかのテストの省略形 「if(p)」は有効なのか? | ヌルポインターの内部表現が0でない場合は どうなるのか。 | A: | C言語が式のブール値を必要とする場合(if、while、forやdo文において、 | また&&、||、!、?:演算子と共に使う場合)、0と比較して等しい場合は偽の値が | 産み出され、その他の場合は真が産み出される。すなわち | | if(expr) | | と書いたらいつも、「expr」がどんな式かにかかわらずコンパイラは必ず | | if((expr) != 0) | | と書かれたように基本的には動作する。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2171] Re:c言語ポインタ完全制覇(改訂版)に関する質問
投稿者:f_ki
2019/03/28 14:41:19

書籍の中の補足でNULLマクロは処理系によって定義のされ方が違うと書かれていましたが、(void*)0であっても0であってもNULLは真偽値で言えば偽が返る値ということですね。 本日読了しました。初心者だったので4章以降の実践的な部分は難しく感じる部分もありましたが、何度も読み返していくことでかなりの部分を理解できたと思います。 入門書を読んだだけで理解が曖昧だったポインタや配列、変数の分類や構造体などのC言語の文法についても改めて整理できました。本書のテーマはC言語のポインタですが、結果的にはC言語の文法全体に触れるような構成になっているのはそれだけC言語とポインタが深く広く結びついているということですね。 長くなりましたが技術書ながらとても読みやすく勉強になる本でした。質問にも丁寧に答えていただきありがとうございました。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2170] Re:C言語の標準入力とEOFの扱いについて
投稿者:f_ki
2019/03/28 14:24:48

stdinも含めてFILE構造体には、ファイルが終端に達したことを示すフラグがあって、そのフラグが立っている場合にはfgetc()で取り出される値はEOFになるということですね。 納得できました。ありがとうございます。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2169] Re:c言語ポインタ完全制覇(改訂版)に関する質問
投稿者:(ぱ)こと管理人
2019/03/28 00:12:29

>P.297 List 5-14 11行目で、for文の終了条件にposとあるのですが、 >これは pos != NULL ではないでしょうか。 Cでは0以外は全部真なので、条件式にposと書いてもpos != NULLと書いても 意味は同じです。 Cプログラマは使いがちな書き方ではありますが、p.57の「ポインタ演算なんか 使うのはやめてしまおう」のところで『「一見してわかりにくいように見える」なら、 やっぱり書くべきではないでしょう』とか書いてる本としては ちょっとダブルスタンダードっぽいかな、とは我ながら思わなくもないです (^^;
[この投稿を含むスレッドを表示] [この投稿を削除]
[2168] Re:C言語の標準入力とEOFの扱いについて
投稿者:(ぱ)こと管理人
2019/03/28 00:05:43

あれ、昨晩返信したつもりなのに投稿されていませんでした。 >それとも標準入力において一度EOFが入力されたら、以降標準入力から取り出される値は >EOFとなることが決まっているのでしょうか。 こちらです。 規格では(マクロであることを除き)getc()はfgetc()と等価とされていますが、 そのfgetc()の説明には以下のようにあります。 | 返却値 そのストリームのファイル終了表示子がセットされている場合, | 又はストリームがファイルの終わりに達している場合,そのストリームの | ファイル終了表示子をセットし,fgetc 関数は,EOF を返す。 つまり、FILE構造体には「ファイル終了表示子」というフラグがあり、 ファイルの最後に達するとそれがセットされて、以後はEOFを返します。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2167] Re:c言語ポインタ完全制覇(改訂版)に関する質問
投稿者:f_ki
2019/03/27 21:55:06

お忙しい中ご返信ありがとうございます。 度々申し訳ないのですが、確認させていただきたい所がございます。 P.297 List 5-14 11行目で、for文の終了条件にposとあるのですが、これは pos != NULL ではないでしょうか。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2166] Re:c言語ポインタ完全制覇(改訂版)に関する質問
投稿者:(ぱ)こと管理人
2019/03/27 01:20:56

>はじめまして。 はじめまして。読んでいただきありがとうございます。 >p.114 List2-6 12行目 >コメントとの対応を考えると、%edではなく%edxではないでしょうか。 そうですね。オリジナルのソースを見ると%edxになっているので、 編集段階で(矢印を入れたときに?)xが消えてしまったようです。 確認不足でした。申し訳ありません。 >p.226 10の後の英語的表現 >英文の2行目最後のfucntion(int)の後に閉じ括弧)がありますが、 >不要ではないでしょうか。 こちらもそのとおりです。申し訳ありません。 ご指摘ありがとうございました。後ほど正誤表に入れさせていただきます。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2165] C言語の標準入力とEOFの扱いについて
投稿者:f_ki
2019/03/26 20:40:41

重ねて質問させていただきます。 C言語ポインタ完全制覇 P.243-246 の、read_line()関数を、引数にstdinを渡して呼び出す部分について聞かせていただきたいです。 例えば標準入力から、 abcd[Enter] ef[EOF] というように入力すると、read_line()関数は、P.244 List4-6 の61-75行目の処理で、 まず"abcd\0"を返し、次にline_bufferが"ef"になったところでchがEOFとなるので61行目のwhileを抜けて69行目に進み、結果"ef\0"を返します。 この時点でまだNULLを返さないので、main()関数のwhileは次のループに入り、再びread_line()関数にstdinを渡して呼び出すこととなりますが、この時に61行目のgetc(fp)で取り出される値は何なのでしょうか。 実験してみると、どうもこの段階でEOF(だけ)を取り出していて72行目に進み、read_line()関数がNULLを返しているようなのですが、標準入力においてキーアクションのEOFの後に続けて入力を行うことが可能ならば、getc(fp)でその入力値を受け取ってしまうということはないのでしょうか。 それとも標準入力において一度EOFが入力されたら、以降標準入力から取り出される値はEOFとなることが決まっているのでしょうか。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2164] c言語ポインタ完全制覇(改訂版)に関する質問
投稿者:f_ki
2019/03/25 17:29:45

はじめまして。 C言語ポインタ完全制覇(初版 第一刷)の内容についていくつか確認させていただきたいです。 C言語勉強中、アセンブリ言語については全く知らない身なので、見当外れな質問でしたら申し訳ないです。 p.114 List2-6 12行目 コメントとの対応を考えると、%edではなく%edxではないでしょうか。 p.226 10の後の英語的表現 英文の2行目最後のfucntion(int)の後に閉じ括弧)がありますが、不要ではないでしょうか。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2163] Re:C言語ポインタ完全制覇について
投稿者:d_kuma
2019/03/22 17:33:36

ご連絡ありがとうございます。 正誤表を確認しました。 ご対応、ありがとうございました。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2162] Re:C言語ポインタ完全制覇について
投稿者:(ぱ)こと管理人
2019/03/21 15:18:41

はじめまして。遅くなりましてすみません。 >330ページにある、 >void (*draw_shape_func_table)(Shape *shape)[] >というのは、誤植ではないでしょうか? >正しくは、 >void (*draw_shape_func_table[])(Shape *shape) >だと思います。 確認しました。これはこの本のテーマにもろに重なっているという点で かなりまずいミスでした。申し訳ありません。 「わからない人は3章を読み返しましょう」って書いてあるのが 我ながら余計に痛いです。 正誤表に載せておきます。ご指摘ありがとうございました。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2161] C言語ポインタ完全制覇について
投稿者:d_kuma
2019/03/18 13:40:27

前橋和弥様 改訂版のC言語ポインタ完全制覇を読んだものです。 非常にためになる本で、常日頃参考にさせて頂いております。 今回は、この本に誤植らしきものがあるので、ご連絡致しました。 330ページにある、 void (*draw_shape_func_table)(Shape *shape)[] というのは、誤植ではないでしょうか? 正しくは、 void (*draw_shape_func_table[])(Shape *shape) だと思います。 前者だとコンパイルが通りませんでした。 以上、確認をお願い致します。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2160] Re:ちょっとした事
投稿者:(ぱ)こと管理人
2019/03/13 01:56:14

>ぱさんの本で自分がポインターの何が解っていないか初めて解り >大変良い物だとありがたい限りです はじめまして。読んでいただきありがとうございます。 >ところで次のような物を見つけたのでご存じなければつまみにでもどうぞ >https://cdecl.org/ 紹介ありがとうございます。初めて知りました。 ポインタ完全制覇でも取り上げた、K&Rに載っているdclのWeb版ですね。 Webで簡単に解析できるのは便利なので、あとはひっくり返して日本語に してくれれば…… と思うのですが、自分で作れと言われそう。 時間があれば、作ってみたい気はするのですが。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2159] ちょっとした事
投稿者:冷水
2019/03/11 03:34:50

こんばんは ぱさんの本で自分がポインターの何が解っていないか初めて解り 大変良い物だとありがたい限りです ところで次のような物を見つけたのでご存じなければつまみにでもどうぞ https://cdecl.org/
[この投稿を含むスレッドを表示] [この投稿を削除]
[2158] Re:Modoki/0.2のリダイレクトの処理について
投稿者:(ぱ)こと管理人
2019/02/24 20:00:11

>レスが付かないまま1週間以上たってしまったため、自己レスします。 すみません、最近どたばたしておりまして、ちょっと気力がたまりませんでした。 >で、パケット解析をするとすぐわかりますが、ブラウザから [ http://localhost:8001/日本語 ] でアクセスすると、 >サーバからレスポンスコード301が返ってきており、 >そこで指定されている移動先URLが文字化けしています。 なるほど…… これはさすがに気付いてしかるべきでしたね。 パケットキャプチャやFiddlerどころか、F12開発者ツールでわかるレベルの話です。 言い訳しますと、 >SenderThread.javaの24行目に、以下のようにSystem.out.println()を挟んで確認しました。 …という確認をしていたのにリクエストは1回ずつしか来なかったので、 リダイレクトは想定しませんでした。最初の1回はちゃんと飛んでたはずですが (過去投稿を見るとIEではそうだったとの記載もある)、今F12を入れて見てみると、 2回目以後はキャッシュされてますね。 「F12開発者ツール」とか、「変な動きがあればキャッシュを消せ」あたりは Webアプリ開発の基本ですが、どうもぼけてたようです。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2157] Re:Modoki/0.2のリダイレクトの処理について
投稿者:mano
2019/02/22 23:53:22

削除パスワードを設定していなかったため修正も削除もできないため返信します。 前回の発言、一部間違っていました。ダウンロードしたのは再現テストの前、一番最初です。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2156] Re:Modoki/0.2のリダイレクトの処理について
投稿者:mano
2019/02/22 23:30:27

レスが付かないまま1週間以上たってしまったため、自己レスします。 > さすがにどっかで化けているとしたらブラウザだと思うのですが 思い込みの罠にはまっています。というか傍から見ると自分でフラグ立てていますよ。 fidderをプロキシとしてブラウザとサーバの間に挟むと若干動きが変わりますが、パケット解析には問題ないです。 で、パケット解析をするとすぐわかりますが、ブラウザから[ http://localhost:8001/日本語 ]でアクセスすると、サーバからレスポンスコード301が返ってきており、そこで指定されている移動先URLが文字化けしています。 で、(サポートページから勝手にソースをダウンロードして)問題箇所を見ると、ServerThread.javaのpathの扱いが不注意なところがありました。 まず、25行目で、urldecodeプラスアルファ的なことをしていて、url文字列からPCで扱う文字列にしています。 その後、54行目で、移動先ページの組み立てで、PCで扱う文字列となっているpathを(url文字列形式にせずに)そのまま使っています。 urlデコードしてもしなくても変わらない文字列であれば問題が起きなかったのですが、今回はそのケースではないためエラーが見つかっちゃったんだと思います。 仮に56行目 [ + path + "/"; ]の部分を[ + "/%E6%97%A5%E6%9C%AC%E8%AA%9E/"; ]に書き換えれば意図通りにいっているように見えるんじゃないかな?
[この投稿を含むスレッドを表示] [この投稿を削除]
[2155] Re:Modoki/0.2のリダイレクトの処理について
投稿者:Radec
2019/02/14 23:47:50

なるほど。。。 確かに自分で実装したTcpClientなら余計な補正は働きませんね。 動作確認できました。ありがとうございました。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2154] Re:Modoki/0.2のリダイレクトの処理について
投稿者:mano
2019/02/13 20:17:34

最初からガッツリ調べなくても最初はfiddlerでいいんじゃない?appgoatの学習でも使っているツールだし。。。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2153] Re:Modoki/0.2のリダイレクトの処理について
投稿者:(ぱ)こと管理人
2019/02/13 02:39:34

ごぶさたしてます。 >なので、問題となった%E5,%9Eは、日本語をUnicode符合位置で求めた場合の >下位1バイト分に相当します。 あ、気付いていませんでしたが確かにそうですね。 だとしても、なぜ「日本語」の場合だけそうなるのは謎ですが…… 本件、Modoki/0.2はただソケットでデータを受け取るだけなので、 さすがにどっかで化けているとしたらブラウザだと思うのですが、 パケットフィルタリングもちょっと考えてみます。(今でもWiresharkで よかったんだっけ…?)
[この投稿を含むスレッドを表示] [この投稿を削除]
[2152] Re:Modoki/0.2のリダイレクトの処理について
投稿者:(ぱ)こと管理人
2019/02/13 02:26:13

>過去の例にあったような「http://localhost:8001/../conf/httpd.conf」 >をブラウザで入力してデバッグすると、NoSuchFileExceptionが先に発生するような >動きをしてしまいました。 ブラウザは、こんなあからさまにディレクトリトラバーサルを起こしそうなURLを 素直にサーバに送らなければいけない義理もないでしょうから、 >「GET /conf/httpd.conf HTTP/1.1」となっていましたので、 というように(勝手に)変換しているのでしょう。 ただ、攻撃者はブラウザを使うとは限らないわけで、TcpClient.javaを使って client_send.txtに GET /../conf/httpd.conf HTTP/1.1 と書くと、 if (!realPath.startsWith(DOCUMENT_ROOT)) { 側の処理に流れ込むことが確認できます。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2151] Re:Modoki/0.2のリダイレクトの処理について
投稿者:mano
2019/02/12 20:11:03

本を持っていないため、推測となってしまいますし、外しているかもしれませんが。。。 日本語のそれぞれの文字のUnicode符合位置は、[日]=U+65E5、[本]=U+672C、[語]=U+8A9Eです。 また、「,」は、Unicode符合位置がU+002Cです。 なので、問題となった%E5,%9Eは、日本語をUnicode符合位置で求めた場合の下位1バイト分に相当します。 この辺を手がかりに、パケットキャプチャすればどのタイミングまでは文字コードが意図通りとなっているかがのあたりがつくかもです。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2150] Re:Modoki/0.2のリダイレクトの処理について
投稿者:Radec
2019/02/11 23:20:50

こんばんは。 早々にご確認・ご回答頂きまして、まことにありがとうございます。 当方でも様々な文字で確認してみましたが、やはり上手くいくときといかないときがあり、よくわからない結果となってしまいました。 ブラウザ等の仕様に起因するところもあるかと思うので厳密には分からないかとは思いますが、もともとの目的である動き・仕様は理解できたので先に進もうかと思います。 ちなみに、また別の質問となってしまい恐縮ですが、 Modoki/0.2で、ディレクトリトラバーサル攻撃を検知 → 404.htmlをリターンする、 即ち (!realPath.startsWith(DOCUMENT_ROOT)) を true にするには、 どのようなGETリクエストを飛ばすと実現できるものでしょうか? 過去の例にあったような「http://localhost:8001/../conf/httpd.conf」 をブラウザで入力してデバッグすると、NoSuchFileExceptionが先に発生するような動きをしてしまいました。 TcpServerを動かして、ブラウザに「http://localhost:8001/../conf/httpd.conf」 を入力して、GETリクエストを取得してみると、 「GET /conf/httpd.conf HTTP/1.1」となっていましたので、 サーバがGETリクエストを受け取った時には、pathが/conf/httpd.confとなっているようです。 そうすると、realPathは「C:\Apache24\htdocs\conf\httpd.conf」になるので、 確かに、NoSuchFileExceptionが発生することが自然な動きのようにも思えます。 以上、よろしくお願いいたします。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2149] Re:Modoki/0.2のリダイレクトの処理について
投稿者:(ぱ)こと管理人
2019/02/11 19:53:57

はじめまして。ご質問いただきありがとうございます。 >入力URL 結果 >/test OK(test配下のindex.htmlが表示) >/test/  OK(test配下のindex.htmlが表示) >/日本語 NG(404.htmlも表示されずブラウザのエラー画面が表示) >/日本語/ OK(日本語配下のindex.htmlが表示) 私も試してみましたが、正直、わけがわからない結果となっています。 Firefox, Edgeでは、 /日本語 の場合だけ、リクエストラインが以下のようになっています。 GET /%E5,%9E/ HTTP/1.1 これをデコードしても該当のフォルダは存在しないので、私が試した範囲では、 404が返りました。 IEでは、1回だけ GET /%E6%97%A5%E6%9C%AC%E8%AA%9E HTTP/1.1 つまり正しくエンコードされた形でリクエストが投げられましたが、 以後何度試しても、そもそもリクエストが投げられず、ブラウザ側で 「このページを表示できません   Web アドレス http://localhost:8001 が正しいか確かめてください」 のエラーになっています。 奇妙なのは、Edge, Firefox, IEのどれにおいても、 http://localhost:8001/日本語/ http://localhost:8001/日本語.html http://localhost:8001/あいうえお http://localhost:8001/中国語 等はうまくいくのに、 http://localhost:8001/日本語 の場合だけ、 GET /%E5,%9E/ HTTP/1.1 になったり、リクエストが投げられなかったりしていることです。 SenderThread.javaの24行目に、以下のようにSystem.out.println()を挟んで確認しました。 while ((line = Util.readLine(input)) != null) { if (line.equals("")) break; System.out.println("line.." + line);
[この投稿を含むスレッドを表示] [この投稿を削除]
[2148] Modoki/0.2のリダイレクトの処理について
投稿者:Radec
2019/02/11 11:45:33

はじめまして。 「Webサーバを作りながら学ぶ 基礎からのWebアプリケーション開発入門」にて実装したModoki/0.2の挙動について質問となります。 Modoki/0.2では、'/'なしでディレクトリを指定するとリダイレクトさせる仕様となっております。 そのため、「C:\Apache24\htdocs\」の配下にテストディレクトリ「test」と「日本語」を作成し、それぞれのディレクトリ配下にindex.htmlを配置して動かしてみました。 実行結果は以下の通りです。(入力URLはhttp://~8001までは省略) 入力URL 結果 /test OK(test配下のindex.htmlが表示) /test/  OK(test配下のindex.htmlが表示) /日本語 NG(404.htmlも表示されずブラウザのエラー画面が表示) /日本語/ OK(日本語配下のindex.htmlが表示) ブラウザはIEでもFireFoxでも同じ結果でした。 デバッグモードで戻り値を確認してみましたが、MyURLDecoderは「/日本語」を返してくれていますし、realPathの取得時もNoSuchFileExceptionは発生していません。 このような差異が発生してしまう要因として考えられることはどのようなものでしょうか?
[この投稿を含むスレッドを表示] [この投稿を削除]
[2147] Re:サイト内のリンク切れ
投稿者:(ぱ)こと管理人
2019/01/01 20:21:16

>webサーバを作ってみようページの以下リンクが切れております。 ありえないほど遅くなりましたが、ご指摘ありがとうございます。 とはいえよそのページなので消えるときは消えますし、それについて私にできることは 特にないよなー、と思ったのですが、Wayback Machineの存在を思い出したので そちらに張りなおしておきました。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2146] サイト内のリンク切れ
投稿者:榊原
2018/12/13 10:16:34

webサーバを作ってみようページの以下リンクが切れております。 http://ascii.asciimw.jp/books/support/4-7561-1663-9/supplement/0001/shttpd
[この投稿を含むスレッドを表示] [この投稿を削除]
[2145] Re:『Web開発入門』 Henacat ver0.1で掲示板を動かすについて
投稿者:rhino
2018/09/28 23:00:12

>p.84のリスト3-3で、POSTのHTTPリクエストのサンプルを掲載していますが、 >ここでcheck_nameという同一のパラメタが複数回登場しています。 >つまり、チェックボックスを複数選択すると、この状況が発生します。 >p.85の脚注にも書いたとおり、この仕様は使いにくいとは私も思うのですが。 > > テスト掲示板だけでなく、前の入力フォームにも対応できるよう書かれていたのですね。 サーブレットコンテナを作っているのだから、こういう場合も想定しなければならないのに、 どうも頭が固かったみたいです。 お答えいただき、ありがとうございました。 また何かありましたら、よろしくお願いいたします。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2144] Re:『Web開発入門』 Henacat ver0.1で掲示板を動かすについて
投稿者:(ぱ)こと管理人
2018/09/28 00:51:13

>リスト3-17の21行目でif(paramterMap.containsKey(keyValue[0]))が >trueになるケースはどんな場合でしょうか?本文P119の中頃に、『同一のパラメタが >複数存在し得る』とあるのですが、このパラメタとはtittle, handle, messageのことですよね。 >1回のリクエストでこれらが複数になる場合というのがどうもよくわかりません。 p.84のリスト3-3で、POSTのHTTPリクエストのサンプルを掲載していますが、 ここでcheck_nameという同一のパラメタが複数回登場しています。 つまり、チェックボックスを複数選択すると、この状況が発生します。 p.85の脚注にも書いたとおり、この仕様は使いにくいとは私も思うのですが。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2143] Re:『Web開発入門』 Henacat ver0.1で掲示板を動かすについて
投稿者:rhino
2018/09/27 00:53:01

ご回答いただき、ありがとうございます。 >(試していませんが)param.split("=", -1) とすればよいかと思います。 > 試してみたところ、これでうまくいきました。 投稿内容の取得については、教えていただいた流れを追っていき、やっとわかりました。 stringToMapメソッドについて、まだ理解できていない点があるのですが、 リスト3-17の21行目でif(paramterMap.containsKey(keyValue[0]))が trueになるケースはどんな場合でしょうか?本文P119の中頃に、『同一のパラメタが 複数存在し得る』とあるのですが、このパラメタとはtittle, handle, messageのことですよね。 1回のリクエストでこれらが複数になる場合というのがどうもよくわかりません。 教えていただければ幸いです。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2142] Re:『Web開発入門』 Henacat ver0.1で掲示板を動かすについて
投稿者:(ぱ)こと管理人
2018/09/26 01:51:19

はじめまして。 >Henacat起動まではうまくできたのですが、掲示板のタイトル・ハンドル名 >・メッセージの内のどこかが >未入力のままで送信を押すと、リスト3-17のServletServiceの28行目で >java.lang.ArrayIndexOutOfBoundsExceptionが発生します。 >keyValue[0]に対するkeyValue[1]がない、ということだと思うんですが、 >これはどこかコードを写し間違えているでしょうか? このケースでは、ServletServiceの20行目の param.split("=") のところで、 split()メソッドの仕様上、「a=」という文字列をparam.split("=")のように split()すると、 ・戻り値の配列の要素数は2で、[0]には「a」が、[1]には空文字が入る のではなく、 ・戻り値の配列の要素数は1で、[0]にだけ「a」が入る という仕様になっているためですね。 https://docs.oracle.com/javase/jp/6/api/java/lang/String.html#split(java.lang.String) (試していませんが)param.split("=", -1) とすればよいかと思います。 Henacatはあくまでサンプル実装なので、こういうエラーケース的なものの 対処が甘いのはご容赦ください、と言いたいところですが、これはちょっと 実用上問題がありすぎるので、後ほど正誤表に上げさせていただきます。 ご指摘ありがとうございました。 >あと、このstringToMapメソッド内のparameterMapに過去の投稿内容も >保持しているという認識で合っているでしょうか? >しかし毎回メソッドが呼ばれるたびにnewしていては過去の内容は >保持できませんよね? parameterMapは毎回メソッドが呼ばれるたびにnewしていて、 1回のリクエストごとに使い捨てです。 リスト3-17 ServletService.javaの76行目で、 info.servlet.service(req, resp); としてサーブレットのservice()メソッドを呼んでいますが、 この呼び出しが、リスト3-26のHttpServlet.javaの13行目のservice()メソッドを 呼び出すことになり、この中で、メソッドがPOSTの場合は(サブクラスの)doPost() メソッドを呼んでいますから(19行目)、これはつまりリスト3-6のPostBBS.javaの doPost()メソッドを呼び出しています。 ここで、新たにMessageクラスのインスタンスをnewして、staticフィールドの messageListにメッセージをつないでいます。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2141] 『Web開発入門』 Henacat ver0.1で掲示板を動かすについて
投稿者:rhino
2018/09/23 19:43:53

Henacat起動まではうまくできたのですが、掲示板のタイトル・ハンドル名・メッセージの内のどこかが 未入力のままで送信を押すと、リスト3-17のServletServiceの28行目でjava.lang.ArrayIndexOutOfBoundsExceptionが発生します。 keyValue[0]に対するkeyValue[1]がない、ということだと思うんですが、これはどこかコードを写し間違えているでしょうか? あと、このstringToMapメソッド内のparameterMapに過去の投稿内容も保持しているという認識で 合っているでしょうか?しかし毎回メソッドが呼ばれるたびにnewしていては過去の内容は保持できませんよね? 基本的なところかもしれませんが、どなたかわかる方、教えていただけますでしょうか。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2140] Re:確かにJavaって嫌な言語だなぁ
投稿者:(ぱ)こと管理人
2018/09/20 02:14:51

>某社 F/W のレコードクラスは、Null値がセットされたメンバの値を get すると、 >長さ 0 の文字列を返す様にカスタマイズされています。その経緯は、過去の開発 >プロジェクトにおいて、ヌルポが氾濫していたのに対し、これを一気に黙らせる為 >の策が、そのまま生き残ったもの、と聞き及んでいます。 これは…… NullPointerExceptionは避けられるかもしれませんが、 アプリの要件として絶対に値を入れなければいけないところを空文字に してしまったら、バグの発覚が遅れるだけですよね。 (この手のことは、拙著「センス・オブ・プログラミング!」で 「バグのあるプログラムには生きる価値はない」として書かせていただきました) 要件として、デフォルト空文字列でよいところは、コンストラクタ等で 空文字列で初期化するのは正しいと思いますが。 >「レコードクラスの100倍肥大化」は、多分、若者の早合点と思っており、若者には >妙な言い訳をすることなく、真因を見極めるアプローチを怠って欲しくないと思い >ます(デバッグ鍛錬)。 早合点なら、それでよいのですけれど。実際にメモリをバカ食いしている以上、 どこかに何かの原因があるのかとは思いますが。 >「Java謎+落とし穴」から、Tiger となり、Java も随分進化したものと思いますが、 >貴殿がもし、同書の改定新版を上梓したとき、「謎+落とし穴」は果たして減って >いるのか増えているのかが、気になるところでございます、Hi。 JavaのGenericsはあれはあれで落とし穴が多いのですが、本1冊書くのは それはそれは大変なので、当面おとなしくしていたいと思います。Hi。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2139] Re:確かにJavaって嫌な言語だなぁ
投稿者:あら
2018/09/18 21:04:39

前橋様 お返事有難うございます。まさかお返事を頂けると思っておりませんでしたので、 ホントに嬉しい限りです。実にショボイ当方の職場のドキュメンタリーは二の次、 先ずは、熱心な貴殿の1ファンの応援メールと受けって頂ければ幸いです。 某社 F/W のレコードクラスは、Null値がセットされたメンバの値を get すると、 長さ 0 の文字列を返す様にカスタマイズされています。その経緯は、過去の開発 プロジェクトにおいて、ヌルポが氾濫していたのに対し、これを一気に黙らせる為 の策が、そのまま生き残ったもの、と聞き及んでいます。 つまり嫌なのは Javaの言語使用なのではなく、このアホダラ F/W で育ったプログ ラマーの資質の低下です。 穿った見方と思いますが、アセンブラや C言語で鍛えられたプログラマーは、設計、 仕様、要件をやらしても、モレや矛盾といったバグを仕込むことが少ないと思いま す。 「ユーザーをバカにするシステムは、良いシステム」という、妙な格言紛いよろし く、「プログラマーをバカにするプログラミング言語は、良い言語」では困りモノ です。考えなくて良くなる分、その代わりに、高品質、短納期、斬新なアイデアを O/P して欲しいものです。 「レコードクラスの100倍肥大化」は、多分、若者の早合点と思っており、若者には 妙な言い訳をすることなく、真因を見極めるアプローチを怠って欲しくないと思い ます(デバッグ鍛錬)。 「Java謎+落とし穴」から、Tiger となり、Java も随分進化したものと思いますが、 貴殿がもし、同書の改定新版を上梓したとき、「謎+落とし穴」は果たして減って いるのか増えているのかが、気になるところでございます、Hi。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2138] Re:確かにJavaって嫌な言語だなぁ
投稿者:(ぱ)こと管理人
2018/09/17 15:25:27

はじめまして。すっかり閑古鳥な掲示板ですが、投稿ありがとうございます。 >貴殿の「Java謎+落とし穴」は私の愛読書で、もう、10年以上も手許に置き、 >休日の午後など、思い出しては手に取って、ニヤニヤしている時間が好き >です。もう少し余裕ができたら、「 プログラミング言語を作る」を読み込 >んでみたいと思ってます(プログラミング工学の楽しい部分なのですが、 >私にはチとハードルが高い)。 ありがとうございます。「Java謎+落とし穴」は、さすがに今となっては 内容が古いのですが、Tiger以前の本としては良く書けた本であったと 自分でも自賛しております。 >このクラスのコンバート元である、いわゆるC言語の関数では、いわゆる >構造体のリストで、その構造体のサイズは80バイト、100万件でも 80MB、 >これにリスト形成に必要なオーバーヘッドを加えても、たかが知れてます。 100倍以上となると単に言語の違いとするには差が大きすぎますし、 Cだと1回のmalloc()で済むものがJavaだといくつものオブジェクトに なってしまうというのもありがちですが(たとえばCなら構造体に intの配列を埋め込んでいたところ、JavaだとArrayList<Integer>を 使ったりすると、あっさり100倍くらいにはなりそうな気がします)、 『某社標準の「フレームワーク」』が問題なのでしょうか。 ものを見ていないので何も言えませんけれども。 >これに対する、若者の回答が問題なのだ。 >  若者「Null Pointer Exceptionが怖くて、それはできません。」 NullPointerExceptionはバグがあるから起きるので、それ自体を避けたからといって 問題の解決にはなりませんよね(『某社標準の「フレームワーク」』を使うと、 どうNullPointerExceptionを避けられるのかはわかりませんが)。 >「メモリ馬鹿ばか食い」はともかく、「プログラマーの資質(≒誇り)」 >まで低下させる、嫌な言語だ、Java は。 とはいえ、それをJavaという言語のせいにするのもちょっと(Javaに対して)酷なような気が……
[この投稿を含むスレッドを表示] [この投稿を削除]
[2137] 確かにJavaって嫌な言語だなぁ
投稿者:あら
2018/09/15 15:57:37

貴殿の「Java謎+落とし穴」は私の愛読書で、もう、10年以上も手許に置き、 休日の午後など、思い出しては手に取って、ニヤニヤしている時間が好き です。もう少し余裕ができたら、「 プログラミング言語を作る」を読み込 んでみたいと思ってます(プログラミング工学の楽しい部分なのですが、 私にはチとハードルが高い)。 私は、Lattice C からの「C言語使い」です。K&Rにも随分お世話になりま した。現在、愛知県某社の某基幹システムのリニューアルで、これまで C言語で実装されていた UNIXサーバーの巨大システムを、Javaにコンバー トする仕事をしております。 仕事と言いましても、もはや定年までカウントダウンの身、第一線から引 き、「相談役」みたいな立場で食い繋がせて頂いております。 Javaプログラマとしての経験は浅いことを申し添えておきます。 昨日、若者から以下の様な相談をされました。   大量データ検証で、あるクラスのアウトプットが、List<データ型>   (ArrayList) で、100万件、消費メモリサイズが 10GB で、これでは   同時並行稼働すると、後続プロセスの JVMが起動することができなく   なる恐れがあります。 該当のサーバーは、今や当たり前の仮想モノで、JVM専用のヒープサイズ として約30GB割り当てられているのですが、これでは、多分2平行でも、 OutOfMemory となってしまうでしょう。何せ、解析ツールによると、 処理中に GC発生しまくりで、いわばメモリ確保とGCの追っかけっこ、 GCが追い付かない時の最大使用メモリが 20GBに達する、とのこと。 このクラスのコンバート元である、いわゆるC言語の関数では、いわゆる 構造体のリストで、その構造体のサイズは80バイト、100万件でも 80MB、 これにリスト形成に必要なオーバーヘッドを加えても、たかが知れてます。 このアウトプットの 10GB と 80MB の差という視点に絞ってサクッと考え ると、Java 側の <データ型> が、bean よりもさらに保安性、利便性?で ガチガチに固められた、某社標準の「フレームワーク」準拠のスーパーク ラスをスーパークラスに、このシステムオリジナルの利便性をプラスした もので、純粋なデータ部分のオーバーヘッドが酷いものと思われる。 これに対し、私は一言、「<データ型>を、せめて bean にしなさい。」と 伝えた。 これに対する、若者の回答が問題なのだ。   若者「Null Pointer Exceptionが怖くて、それはできません。」   私「…。」 「メモリ馬鹿ばか食い」はともかく、「プログラマーの資質(≒誇り)」 まで低下させる、嫌な言語だ、Java は。  「プログラマーの資質(≒誇り)」も、C言語と Java とは違う所に ある様なんですね。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2136] forget you!
投稿者:minmin
2018/09/13 09:28:24

ふぉげちゅうーてゃ? forget you!が語源かも。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2135] Re:プログラミング言語を作る読了報告
投稿者:(ぱ)こと管理人
2018/05/09 01:51:46

>P.280図8-4で、start_x,y,end_x,y,center_x,yと書いているのに、 >P.281図8-5や、P.282図8-6で、start..x,y,end..x,y,center..x,yと、書き変えて?いる。 ご指摘ありがとうございます。遅ればせながら確認しました。 確かに、アンダースコアであるべきところが「..」になっています。 執筆当時のオリジナル原稿を確認しましたがアンダースコアになっていたので (そりゃ間違えるにしてもこんな間違え方はしないでしょうし)、 書籍用に作図された方にうまく意図が通じなかった&私の確認不足、ということかと 思います。 後日、正誤表に載せさせていただきます。ありがとうございました。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2134] プログラミング言語を作る読了報告
投稿者:mano
2018/05/06 22:45:01

理解度はどうあれ、世間でいうGWが終わったので私も読了です。今後しばらくはこの書籍についてはコメント(というか愚痴)はしません。お付き合いいただき、ありがとうございました。 とりあえず、ほとんどどうでもいいことですが、正誤表に上がっていないので1つ。 P.280図8-4で、start_x,y,end_x,y,center_x,yと書いているのに、 P.281図8-5や、P.282図8-6で、start..x,y,end..x,y,center..x,yと、書き変えて?いる。 それでは。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2133] Re:404 Not Foundが返ってこない
投稿者:nacho
2018/05/06 11:07:45

自己解決しました。 client_send.txtの最後の空行がエディタAtomによって勝手に削除されていたことが原因でした。 お騒がせしました。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2132] 404 Not Foundが返ってこない
投稿者:nacho
2018/05/05 00:39:24

はじめまして。 現在「Webサーバを作りながら学ぶ 基礎からのWebアプリケーション開発入門」を勉強中です。 p.54ページのTcpClient.javaを使って存在しないファイルをリクエストするという部分で 404が返ってこず、408のタイムアウトが返ってきてしまいます。 存在するファイルをリクエストしても408が返ってきてしまいます。 これより前は全てうまくいっていたのですが、このタイムアウトはどのような原因が考えられるのでしょうか。 サーバはDocker上でApacheを使用しています。ブラウザだと想定どおりの動きです。 自分で解決することができず、投稿させて頂きました。 よろしくお願いいたします。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2130] Re:いろいろ愚痴りたい((プログラミング言語を作る3章~5章 )
投稿者:mano
2018/05/03 16:13:46

回答ありがとうございます。(1か月ぐらいした後に消そうと思っていて、正直回答を期待していなかったので少し驚きました。) >>p.153のダイナミックスコープの説明でnextから辿る場合、 >>仮に自身と呼び出し元に同じ変数名を定義し、自身内で変数を参照する場合、 >>先に呼び出し元の変数が検知されてしまうので、ダイナミックスコープの動きと >>違うのでは? > >最新のLocalEnvironmentを起点にnextをたどって変数を検索すると、 >先に検知されるのは呼び出し元ではなく自身の方なのでは……? >一応ver.0.2のeval.cのalloc_local_environmentを確認しましたが、 >新LocalEnvironmentのnextに、その時点でのトップのLocalEnvironmentを >連結していますし。 > >635: ret->next = inter->top_environment; >636: inter->top_environment = ret; > > うーん、コード読んでないのがバレました。(だって人が書いた長いコードをインタビューなしで読むのはしんどいもの。。。)で、nextの音の響きから、左から右、上から下、低層から高層(深層)の方向と想定してました。 だから、「最新のLocalEnvironmentのみから検索しますが、nextをたどって、呼び出し経路すべてのLocalEnvironmentから検索するようにすると、」の記述を、 「「最新のLocalEnvironmentのみから検索しますが、【トップレベルでの(グローバル変数に格納された)LocalEnviromnent型の変数を参照の後】nextをたどって、呼び出し経路すべてのLocalEnvironmentから検索するようにすると、」 と補って読んでいました。 なので、nextの本来の使い道はガベージ判定で、ダイナミックスコープ判定の用途でも使えることを言っているのかな?と類推していました。 ま、この部分の私の理解は大体間違っていましたね。 とりあえず、私の理解不足を棚上げしておいて、別の意味に捉えかねないnextの名前が悪い、っと愚痴っときます。(えぇ暴論ですとも。)
[この投稿を含むスレッドを表示] [この投稿を削除]
[2129] Re:いろいろ愚痴りたい((プログラミング言語を作る3章~5章 )
投稿者:(ぱ)こと管理人
2018/05/02 16:46:30

>win_sjisのtest.crbだと、改行にCR(0x0d),LF(0x0a)が入れられていて、 >今使っている処理系(Microsoft Windows Subsystem for Linux上のubuntu) >では、0x0dを無視してくれず、改行コード\n(=0x0a)に到達する前に不正な文字で >引っかかっている、 なるほど、crowbar.lでは「\n」だけを改行扱いにしていますから、 UNIX環境下では0x0dは不正な文字として扱われますね。 もともと、Windows(かつてはDOS)にてCでテキストファイルを扱う際、 改行を\r\nとして扱わなければならないのでは既存のUNIXベースの ソースが軒並み壊滅するので、Windows/DOS環境下では、fopen()とか fgetc()とかの標準入出力ライブラリのレベルで、\r\nを\nに変換するという 対策を取っています(バイナリファイルを扱いたいときにはfopen()に "r"の代わりに"rb"を渡す)。「Microsoft Windows Subsystem for Linux上のubuntu」 ではこの動きにならないのは、WindowsではなくLinuxであるためでしょう。 >今の時代趣味でやる分にはsjisもeucも地雷じゃないかなあ? まあそのあたりは、2009年の本ですので(その当時でもちと古かったのかも しれませんが)。 >電卓の場合yyparse()で無限ループしているのに、crowbarではyyparse()以降の >処理に進んでいることは誰も疑問に思わないのかな、 電卓では入力が終わりませんからね。 >p.121 2個目のelse if文の中の処理、 > left_val.u.double_value=left_val.u.int_value; > eval_binary_double(...) >の部分で、left_val.typeは変えずに(INTのまま)格納する共用体にはdouble値を入れている。 >その後left_valはそのまま使わず、left_val.u.double_valueのみ使っているので >問題にはならいけど、読んでて不安になる。なぜdouble(専用のというか普通)の >型のローカル変数を使わないのかな? ちょっと当時の意図は思い出せませんが、左辺をdoubleに型変換した 感じを出したかったのかもしれません。確かに今見ると、ちょっと意図の よくわからないコードになっているとは思います。 >p.141の網掛けの以下の記述 > a={1,2,3}; > a={2,3,4}; >のあとの図で、aから出ている矢印が{4,5,6}を指している。 >{4,5,6}というのはどこから出てて来た?というか{2,3,4}はどこいった? >とか、 p.146ですね。誤植のようです。正誤表に載せておきます。 ご指摘ありがとうございました。 >p.145のビットフィールド。別にCのプロフェッショナルを目指す本ではないので、 >ビットフィールドなんて説明が必要な機能なんて使わずにしれっとCRB_Boolean >使ったり、そのままズバリintを使えばいいじゃない。 これにはたぶん段階のようなものがあって、 (1)unsigned long flagsみたいは変数にフラグを押し込んで、  自力でビット演算 (2)ビットフィールド (3)しれっとなんでもCRB_Boolean 当時、実用に供されているCのコードだと、(1)が多かったと思います(ひょっとすると 今でも)。それに比べれば進歩(?)だと思っておいてください。 (本にも「まあ、富豪的プログラミングの感覚からすれば、1ビットのフラグでも、 CRB_Boolean型ひとつ割り当てるべきなのかもしれませんけど。」と書いていますが) >p.153のダイナミックスコープの説明でnextから辿る場合、 >仮に自身と呼び出し元に同じ変数名を定義し、自身内で変数を参照する場合、 >先に呼び出し元の変数が検知されてしまうので、ダイナミックスコープの動きと >違うのでは? 最新のLocalEnvironmentを起点にnextをたどって変数を検索すると、 先に検知されるのは呼び出し元ではなく自身の方なのでは……? 一応ver.0.2のeval.cのalloc_local_environmentを確認しましたが、 新LocalEnvironmentのnextに、その時点でのトップのLocalEnvironmentを 連結していますし。 635: ret->next = inter->top_environment; 636: inter->top_environment = ret; >p.178 >mbstate_をmemset()等でゼロクリアというmbstate_ってどこから出てきた? 文脈からすると「mbstate_t」の誤りのようです。正誤表に載せておきます。 >って感じです。あと、5章UNICODEについては、組み文字以外にデータ内に入っている >(文字送り方向や字形の変更など)制御コードをどう扱っているのかも書いてあれば >ななあとも思いました。この辺って、例えば1文字のはずなのにデータは >100byteとか作れそうで、セキュリティホールになりやすい感じがするので、 >なぜ問題にならないかを聞きたかったかも。 この本のプログラムでは、「mbrtowc()を信頼する」というスタンスですかね……
[この投稿を含むスレッドを表示] [この投稿を削除]
[2128] いろいろ愚痴りたい((プログラミング言語を作る3章~5章 )
投稿者:mano
2018/04/30 19:02:25

ゴールデンウィークで読み終えられるかなと思っていたけど全然そうじゃなかった。 やっと、5章まで読み終わった。で、いろいろ愚痴りたい。(今回は投稿にパスワードをつけたので消す準備はバッチリです。) まずは、環境依存の問題 今週末は一人で0x0d問題にぶち当たり全然読み進められなかった。 test.crbを食わせても以下のメッセージしか出ない。 5:(0x0d)@ win_sjisのtest.crbだと、改行にCR(0x0d),LF(0x0a)が入れられていて、 今使っている処理系(Microsoft Windows Subsystem for Linux上のubuntu) では、0x0dを無視してくれず、改行コード\n(=0x0a)に到達する前に不正な文字で引っかかっている、がubuntuのターミナルは、SJISを解釈してくれず文字化けを起こす。結局が悪いのかがわからない。 今の時代趣味でやる分にはsjisもeucも地雷じゃないかなあ? で、読む気力がそがれたので、重箱の隅を突っ込みながら(またしても)表面をなぞる程度の読み込みになっちゃった。ちゃんと読めるのはいつのことになるんだか。。。 で、突っ込みはこんな感じ。 電卓の場合yyparse()で無限ループしているのに、crowbarではyyparse()以降の処理に進んでいることは誰も疑問に思わないのかな、 とか p.121 2個目のelse if文の中の処理、  left_val.u.double_value=left_val.u.int_value; eval_binary_double(...) の部分で、left_val.typeは変えずに(INTのまま)格納する共用体にはdouble値を入れている。 その後left_valはそのまま使わず、left_val.u.double_valueのみ使っているので問題にはならいけど、読んでて不安になる。なぜdouble(専用のというか普通)の型のローカル変数を使わないのかな? とか、 p.141の網掛けの以下の記述  a={1,2,3}; a={2,3,4}; のあとの図で、aから出ている矢印が{4,5,6}を指している。 {4,5,6}というのはどこから出てて来た?というか{2,3,4}はどこいった? とか、 p.145のビットフィールド。別にCのプロフェッショナルを目指す本ではないので、ビットフィールドなんて説明が必要な機能なんて使わずにしれっとCRB_Boolean使ったり、そのままズバリintを使えばいいじゃない。 とか、 p.153のダイナミックスコープの説明でnextから辿る場合、 仮に自身と呼び出し元に同じ変数名を定義し、自身内で変数を参照する場合、先に呼び出し元の変数が検知されてしまうので、ダイナミックスコープの動きと違うのでは? とか、 p.178 mbstate_をmemset()等でゼロクリアというmbstate_ってどこから出てきた? って感じです。あと、5章UNICODEについては、組み文字以外にデータ内に入っている(文字送り方向や字形の変更など) 制御コードをどう扱っているのかも書いてあればななあとも思いました。この辺って、例えば1文字のはずなのにデータは100byteとか作れそうで、セキュリティホールになりやすい感じがするので、なぜ問題にならないかを聞きたかったかも。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2127] Re:【質問】lexのトークン判断優先方法(プログラミング言語を作る3章質問その1)
投稿者:mano
2018/04/28 03:42:24

なるほど、わかりました。回答ありがとうございました。 P.39は、正規表現の話だけかと思って(読み返した時に何度も何度も)読み飛ばしていました。この箇所の記述にlexの動きについて書かれていたのですね。失礼しました。 私が誤解していたのは、最初に現れたトークン定義にマッチした場合に、以降のトークン定義を無視するんだろうなぁと思っていたことです。 なので、P.39に記述について+と++のトークンについては、lexの記述では当然に最初に++の定義があってその後に+の定義があるものと思い込んでいました。実際には+と++はマッチする長さが違うのだからlexの記述では、どちらを先に定義しても動きは変わらないのですね。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2126] Re:【質問】lexのトークン判断優先方法(プログラミング言語を作る3章質問その1)
投稿者:(ぱ)こと管理人
2018/04/28 00:08:37

>疑問に思ったのは「123.456」を「123」を整数型トークン、「.」を例外トークン、 >「456」の整数型トークンと判断する方法や、「1」,「2」「3」「.」「4」「5」「6」を >全て例外トークンとして扱うこともできそうな気がするのですが、そうならない >理由がわからないためです。 これは、lexがなぜ「123.456」を実数トークンとして解釈するのかがわからない、 ということでしょうか? lexは、「最長一致」でトークンを切り出します。つまり「123」や「1」よりも 「123.456」のほうが長いので、「123.456」は実数トークンとして解釈されます。 それについては本の中ではp.39の一番下の段落で説明しています。 >また、整数トークンと実数トークン、"if"トークンと[ \t]トークンの関係から >推測すると、例えば"for while other if"みたいな命令語もトークンとして >定義できそうですが、その場合に.lファイルでの定義行(ルール順番)によっては >動きが変わるものなのでしょうか? 同じところに書いてある通り、lexはまず「最長一致」でトークンを切り出そうとし、 長さが同じなら、より前の規則、つまり.lファイルでの定義行が上のほうである 規則を優先します。 >整数型の場合「....|"0"」と0をダブルクォーテーションで括っていますが、 >電卓のケースでP.36では、「(....|0|([0-9]....)」と0をダブルクォーテーションで >括っていません。この違いが上の判断条件に影響しているのでしょうか? これはどちらでも同じですね。なぜ片方だけダブルクォートで囲んだのかは、 すみませんがさすがに思い出せません……
[この投稿を含むスレッドを表示] [この投稿を削除]
[2125] 【質問】lexのトークン判断優先方法(プログラミング言語を作る3章質問その1)
投稿者:mano
2018/04/24 07:02:35

たびたびお邪魔します。 3章途中まで読み進めたのですが、わからないところがあったので教えてください。 P.102のcrowbar.lのソースで、59行目で整数型「([1-9][0-9]*)|"0"」、65行目で実数型「0-9]+\.[0-9]+」、78行目で例外「.」のトークンを切り分けているように見えます。 入力が、「123.456」だった場合、なぜ実数型のトークンと判断されるのでしょうか? 疑問に思ったのは「123.456」を「123」を整数型トークン、「.」を例外トークン、「456」の整数型トークンと判断する方法や、「1」,「2」「3」「.」「4」「5」「6」を全て例外トークンとして扱うこともできそうな気がするのですが、そうならない理由がわからないためです。 (済みません。書籍に記述があるのに私が読み飛ばしてしまっているだけかもしれません。) また、整数トークンと実数トークン、"if"トークンと[ \t]トークンの関係から推測すると、例えば"for while other if"みたいな命令語もトークンとして定義できそうですが、その場合に.lファイルでの定義行(ルール順番)によっては動きが変わるものなのでしょうか? 整数型の場合「....|"0"」と0をダブルクォーテーションで括っていますが、電卓のケースでP.36では、「(....|0|([0-9]....)」と0をダブルクォーテーションで括っていません。この違いが上の判断条件に影響しているのでしょうか?
[この投稿を含むスレッドを表示] [この投稿を削除]
[2124] ほげは方言
投稿者:ほげ
2018/04/17 23:29:09

「ほげ」を探すとここにたどりつきました。 「ほげ」は大分の方言で、くだらないこと、でたらめなことの意味です。 (特に臼杵地区、若い人は言わなくなった) 【応用】 ほげほっぽ  本当にデタラメな ほげんじょう くだらないことばっかり なお、「熊本弁」と書いていた「ほげる」は、穴があいてしまうこと、「ほぐ」は 穴をあけること であり、別に熊本に限らず、九州全体の共通語です。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2123] Re:プログラミング言語を作る2章質問
投稿者:mano
2018/04/16 23:48:04

回答いただきありがとうございました。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2122] Re:プログラミング言語を作る2章質問
投稿者:(ぱ)こと管理人
2018/04/15 23:14:00

>はじめまして。 はじめまして。読んでいただきありがとうございます。 >1点目:P.56で、エラーリカバリの実現として、mycalc.yファイルの書き換えとして >lineのルールにerror CRの並びを追加しています。この通りにしてみたもののmycalcの >動きに変わりはありませんでした。で質問ですが、この修正で意図したエラーリカバリ >とは、本文直前の文の記述がある、「一度のコンパイルでできるだけ多くのエラーを >見つけることではないこと」を指しているのでしょうか?つまり何らかの作用により >yaccが出すメッセージを見やすくする対応のものでしょうか? この修正は、その直前の記述である「ただ、電卓の場合、対話的に使うものですから、 入力ミスで即座に死んでしまうのはユーザにとって不親切でしょう」という 問題に対する対応です。 >それとも、mycalc.lにもともと実装されている、エラー出力lexical error後の >exitを消しても、yyclearin;,yyerrok;の作用でError!Error!Error!の >エラー表示に陥らなくなることを指して、エラーリカバリと呼んでいるのでしょうか? よって、エラー時にexit()しなくなる、というのが目的です。 >2点目:P.74で、括弧対応の話で、私の環境ではmycalc.yの11行目、 >トークンの並びにLP,RPを追加しなくては動きませんでした。 >こちら11行目に追加することが、筆者の意図とした変更なのかよくわかっていません。 すみません、こちらはこれが私の意図した変更ですが、 p.74で「たったこれだけのことで~」と書いておきながら他の修正が要るというのは 問題ですね。正誤表に加えておきました。 ご指摘いただき、ありがとうございました。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2121] プログラミング言語を作る2章質問
投稿者:mano
2018/04/14 22:40:48

はじめまして。 「プログラミング言語を作る」の2章まで読んだのですがわからない点が2点ありましたので教えてください。 1点目:P.56で、エラーリカバリの実現として、mycalc.yファイルの書き換えとしてlineのルールにerror CRの並びを追加しています。この通りにしてみたもののmycalcの動きに変わりはありませんでした。で質問ですが、この修正で意図したエラーリカバリとは、本文直前の文の記述がある、「一度のコンパイルでできるだけ多くのエラーを見つけることではないこと」を指しているのでしょうか?つまり何らかの作用によりyaccが出すメッセージを見やすくする対応のものでしょうか? それとも、mycalc.lにもともと実装されている、エラー出力lexical error後のexitを消しても、yyclearin;,yyerrok;の作用でError!Error!Error!のエラー表示に陥らなくなることを指して、エラーリカバリと呼んでいるのでしょうか? つづいて、パーサ自作のプログラムは読み飛ばして(=理解を断念して) 2点目:P.74で、括弧対応の話で、私の環境ではmycalc.yの11行目、トークンの並びにLP,RPを追加しなくては動きませんでした。こちら11行目に追加することが、筆者の意図とした変更なのかよくわかっていません。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2120] Re:無題
投稿者:(ぱ)こと管理人
2018/04/14 15:36:56

>あっ、細かいツッコミに対応いただいてすみません...。 >...ついでにもう1つ。 >更新状況の2行目が「2013/3/13」になってます...。 「プログラミング言語を作る」へのリンクをコピペで流用しようとして 日付を直し忘れたようですね。修正しました。 こちらもご指摘ありがとうございました。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2119] Re:無題
投稿者:ほげぴよ
2018/04/13 02:24:49

>修正しました。ご指摘ありがとうございました。 あっ、細かいツッコミに対応いただいてすみません...。 ...ついでにもう1つ。 更新状況の2行目が「2013/3/13」になってます...。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2118] Re:無題
投稿者:(ぱ)こと管理人
2018/04/10 23:11:50

>「はてなダイアリーをK.Maebashi's はてなブログに移行しました(20017/09/11)」 > >西暦2万年まではてなブログは存続できるのかな... 私は昔はてなダイアリーにこんなの書いたこともあるのですが。 http://d.hatena.ne.jp/kmaebashi/20100110/p1 今回は自分でやらかしてしまったようです。 修正しました。ご指摘ありがとうございました。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2117] 無題
投稿者:ほげぴよ
2018/04/06 23:21:19

「はてなダイアリーをK.Maebashi's はてなブログに移行しました(20017/09/11)」 西暦2万年まではてなブログは存続できるのかな...
[この投稿を含むスレッドを表示] [この投稿を削除]
[2116] Re:無題
投稿者:(ぱ)こと管理人
2018/03/29 02:32:05

>if(line == NULL) は、if(*line == NULL) の間違えではないでしょうか? ご指摘ありがとうございます。確認しましたがその通りだと思います。申し訳ありません。 週末あたりに正誤表に入れておきます。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2115] 無題
投稿者:ポインタ完全制覇(第2版)の258ページ106行目if(line == NULL)
2018/03/27 22:15:49

ポインタ完全制覇(第2版)の258ページのread_line()の106行目 if(line == NULL) は、if(*line == NULL) の間違えではないでしょうか? *line = mallocでメモリ割り当てているので、*lineのチェックをするべきではないでしょうか?
[この投稿を含むスレッドを表示] [この投稿を削除]
[2114] Re:鬼車をダウンロードのURLはアクセスできない~
投稿者:(ぱ)こと管理人
2018/03/09 00:45:08

>掲題の件ですが、中国からアクセスすると、下記のエラーになりました。 ご指摘ありがとうございます。私のところからも同じエラーになるので、 中国関係なく、鬼車のWebページが消えていますね…… 今はGitHubに移転しているのでしょうか。後ほど(週末ぐらいに)注記を 入れておきます。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2113] 鬼車をダウンロードのURLはアクセスできない~
投稿者:土豆
2018/03/06 15:32:38

掲題の件ですが、中国からアクセスすると、下記のエラーになりました。 「ページを表示できません:申し訳ありませんが、アクセスされたページは現在ご利用いただけなくなっています。」
[この投稿を含むスレッドを表示] [この投稿を削除]
[2112] Re:P.124の補足について
投稿者:(ぱ)こと管理人
2018/03/06 01:02:25

>申し訳ありませんが、念のため確認させてください。 >下記の件の結論は、どうなったのでしたっけ? あれ、ここに書き忘れていたようです。 以下の通り正誤表に挙げてありました。 http://kmaebashi.com/webserver/seigo.html#p112
[この投稿を含むスレッドを表示] [この投稿を削除]
[2111] Re:P.124の補足について
投稿者:くまきち
2018/03/04 09:34:41

申し訳ありませんが、念のため確認させてください。 下記の件の結論は、どうなったのでしたっけ? スレッドに残っていないようだったので。 申し訳ありませんが、確認して頂けたらありがたいです。 >>P.124の補足に「GETのパラメタもPOSTのパラメタも、URLデコードしないまま・・・」とありますが、P112の52行目でGETのパラメタはURLデコードされているわけではないのでしょうか? > >すみません、もう記憶はあいまいなのですが、p.112の52行目におけるURLデコードは、 >UTF-8固定でデコードしているところからして、ディレクトリ名やファイル名を >デコードして正しくファイルを開くためのものです(Modoki/0.2で実装したものです)。 > >ここで、クエリストリング部分までデコードしてしまっていますが、 >クエリストリングはUTF-8でエンコードされているとは限らないので、 >これをこの時点でデコードしているのは単純に不具合のように思います。 >すみませんが確認しますので少しお時間をください。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2110] Re:serialVersionUID について
投稿者:(ぱ)こと管理人
2018/02/26 01:28:16

>「//拡張子とContent-Typeの対応表」の部分について、P.70にあるリスト2-11では49行目に > > private static final long serialVersionUID = 1L; > >という行がありますが、A-22にはありません。 >これは、どのような違いがあってのことでしょうか?可能であれば、そもそも >「serialVersionUID 」とは何かも教えて頂けるとありがたいです! serialVersionUIDは、シリアライズするクラスのバージョンを示すためのものです。 Javaだとシリアライズ機能でオブジェクトの内容をファイルに保存したりできますが、 プログラム側のバージョンが上がってクラスにメンバが増えたりした(かつ、そのメンバの 値がデフォルト値ではいけなくて、readObject()によるカスタマイズでも対応しないとか 細かい条件はありますが)場合は、バージョンアップ前のプログラムで保存したデータは バージョン違いで読み込めないということになります。 serialVersionUIDは、シリアライズするときに、そのクラスのバージョンを 示すためのものです(バージョンが違うと、デシリアライズ時にエラーになります)。 指定しなくても構いませんが、これを指定しないと、Eclipseでは警告が出たりします。 「private static final long serialVersionUID = 1L;」と書いておけば 警告は抑止できますが、シリアライズを扱っているわけでもない入門書で 余計なコードを入れるのもよろしくないかと思い、本書のサンプルコードでは 基本これは書いていない――はずなのですが、リスト2-11では、Eclipseに うっかり自動生成されたのが残ってしまったのかと思います。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2109] Re:リストA-19の ”if (ct == null)” について
投稿者:(ぱ)こと管理人
2018/02/26 01:09:23

>これは、”ct == null”の場合は、その値をparameterMapに含めないということでしょうか? >また、これはアップロードファイルなどが指定された場合に起こるものでしょうか? multipart/form-dataのPOSTメソッドでどのようなものが送られてくるのかについては、 p.87のリスト3-4に記載しています。 これを見ると、アップロードファイルが指定された場合に、Content-Typeが 付いていることがわかります。 そして、ファイルアップロードの場合、つまりContent-Typeがnullでない場合には、 その内容をgetParameter()で取得することはできないので、その値をparameterMapに 含めないようにしています。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2108] serialVersionUID について
投稿者:くまきち
2018/02/25 22:24:30

『基礎からのWebアプリケーション開発入門』のP.280にあるリストA-22について質問させてください。 「//拡張子とContent-Typeの対応表」の部分について、P.70にあるリスト2-11では49行目に  private static final long serialVersionUID = 1L; という行がありますが、A-22にはありません。 これは、どのような違いがあってのことでしょうか?可能であれば、そもそも「serialVersionUID 」とは何かも教えて頂けるとありがたいです! よろしくお願いいたします。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2107] リストA-19の ”if (ct == null)” について
投稿者:くまきち
2018/02/24 22:54:22

『基礎からのWebアプリケーション開発入門』のP.277にあるリストA-19について質問させてください。 38行目に”if (ct == null) {”という行があります。 これは、”ct == null”の場合は、その値をparameterMapに含めないということでしょうか? また、これはアップロードファイルなどが指定された場合に起こるものでしょうか? どこかに書いてあるかもしれないですが、探しきれず質問させて頂きました。。 申し訳ありませんが、よろしくお願いいたします。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2106] Re:リストA-13の ”~Impl” について
投稿者:(ぱ)こと管理人
2018/02/18 13:16:18

>せっかく抽象型を用意しているのであれば、ここは抽象型の変数定義にするのではと >思ったのですが、サブクラスの変数定義を使用している理由があれば、 >教えて頂きたいです。 これは私の流儀であって、Javaでの一般的な書き方かというとそうでもないかも しれませんが、私は、Javaでパッケージを分ける規模のプログラムを書くときは、 パッケージ単位でインタフェースと実装を分けるようにしています。 たとえばHttpServletRequestクラスであれば、インタフェースを com.kmaebashi.henacat.servletに、実装を com.kmaebashi.henacat.servletimplに置いています。 そして、HttpServletRequestの利用者(この場合はサーブレットのプログラムを書く人) にはインタフェース側だけをimportしてもらうようにします。Cookieのような 簡単なクラスを除き、インタフェース側のパッケージには実装は置きません。 こうすることで、利用者にとっては、インタフェース側のパッケージは ほぼAPIドキュメントのようなものになりますし、実装が「作りかけ」の 状態でも、利用者側のプログラムのコンパイルまではできるようになったりします。 公式のサーブレットAPI(javax.servlet)も、利用者には(Cookieのような 簡単なクラスを除き)ほぼインタフェースしか公開していないのは、 同じような考え方に基づくものだと私は思っています。 こういう観点でインタフェースと実装のパッケージを分けているわけですが、 そう考えたとき、実装側のパッケージ内でインタフェースの方の型で変数定義 することに、どれほどの意味があるでしょうか。 実装側のパッケージ内では、インタフェースとしては公開していないメソッドや、 publicではないフィールドを参照することもあり得ます。そのたびにダウンキャスト するぐらいなら、最初から実装側のクラスにしておくほうがマシではないかと思います。 servletimplという実装側のパッケージの内部で、むやみに実装隠蔽しようとしても あまり意味はないかと思います。Javaのアクセス制御が、publicもprivateも つけないデフォルト状態で、(C++やC#と違って)パッケージ内公開になっている、 というポリシーも、「パッケージ内での実装隠蔽はあまり意味がない」という 考えに基づくものではないでしょうか。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2105] リストA-13の ”~Impl” について
投稿者:くまきち
2018/02/18 09:44:47

『基礎からのWebアプリケーション開発入門』のP.267にあるリストA-13について質問させてください。 17行目や19行目の変数定義で”HttpSessionImpl”や”HttpServletResponseImpl”などスーパークラスではなくサブクラスの変数定義をしています。 せっかく抽象型を用意しているのであれば、ここは抽象型の変数定義にするのではと思ったのですが、サブクラスの変数定義を使用している理由があれば、教えて頂きたいです。 よろしくお願いいたします。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2104] Re:リストA-13について
投稿者:(ぱ)こと管理人
2018/02/03 22:12:52

>61行目について >誤:data[0] >正:data[i] ご指摘ありがとうございます。 確認しましたが、ご指摘の通りのバグですね。複数件のケースのテストを 怠っていたようです。 正誤表に載せておきます。ありがとうございました。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2103] リストA-13について
投稿者:くまきち
2018/02/02 07:30:59

『基礎からのWebアプリケーション開発入門』のP.267にあるリストA-13について質問させてください。 ちゃんと理解できていないかもしれないですが、もしかすると下記の誤りではないでしょうか? 61行目について 誤:data[0] 正:data[i] ご確認、よろしくお願いいたします。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2102] Re:第7章のTIPSについて
投稿者:くまきち
2018/01/23 23:36:21

確かに。。 >http://localhost:8080/generatecsv/test.html のように指定すればダウンロードできました。 お騒がせしました! >>ただ、CSVダウンロードだけは、まさに >>>C:\Tomcat8\webapps\generatecsv\test.html >>に置いていたのですがダウンロードできませんでした。。 >>HTTPから指定するのが正式だと思うので、とりあえず気にしないことにしました! > >念のため確認ですが、test.htmlをそこに置いたというのはよいとして、 >参照はどのようにしましたか? > >http://localhost:8080/generatecsv/test.html > >として参照すればダウンロードできると思うのですが、 >もし、HTMLファイルをダブルクリックして開いていたらできませんので、 >一応確認です…… >
[この投稿を含むスレッドを表示] [この投稿を削除]
[2101] Re:第7章のTIPSについて
投稿者:(ぱ)こと管理人
2018/01/18 00:41:05

>ただ、CSVダウンロードだけは、まさに >>C:\Tomcat8\webapps\generatecsv\test.html >に置いていたのですがダウンロードできませんでした。。 >HTTPから指定するのが正式だと思うので、とりあえず気にしないことにしました! 念のため確認ですが、test.htmlをそこに置いたというのはよいとして、 参照はどのようにしましたか? http://localhost:8080/generatecsv/test.html として参照すればダウンロードできると思うのですが、 もし、HTMLファイルをダブルクリックして開いていたらできませんので、 一応確認です……
[この投稿を含むスレッドを表示] [この投稿を削除]
[2100] Re:第7章のTIPSについて
投稿者:くまきち
2018/01/14 06:38:59

ご回答頂き、ありがとうございました。 ただ、CSVダウンロードだけは、まさに >C:\Tomcat8\webapps\generatecsv\test.html に置いていたのですがダウンロードできませんでした。。 HTTPから指定するのが正式だと思うので、とりあえず気にしないことにしました! >>>out.print((char)(ch & 0xffff)); >> >>"& 0xffff"は何をしているのでしょうか?不要な制御情報を削除するなどの >>用途があるのでしょうか? > >ここではint型のchをcharにキャストしているので、結果がcharの >範囲に収まるよう、0xffffとの&を取っています。 >まあ、この場合、直前のif文で負でない保証がされていますし、 >InputStreamReader#read()の戻り値なので、あまり気にする必要は >ないのかもしれませんが。 > >>P.241 リスト7-3 36行目 >>dataOutを多次元配列として定義している理由がよく分かりませんでした。 >>一次元配列でも参照型変数となるので、呼び出され側で値を詰めることができるように >>思います。 > >1次元配列を上位でnewして渡し、呼び出され側で値を詰めてもらう、 >ということはできますが、その場合、newするには呼び出し側でサイズが >わかっている必要があります。ここでは、呼び出し側ではサイズがわからないので、 >呼び出され側でnewした配列を参照型変数に格納して返すには、 >配列の配列(2次元配列)が必要になります。 > >>とありますが、例えばP.226の補足に記載されているような最新投稿を表示する >>ようなパーツが、 >>仮にテキストなどでは無く画像で最新記事を返す形式だったら、 >>XMLHttpRequestとか同一オリジンポリシーなど >>考えなくても良いということでしょうか? > >そうなりますね。(JSONPだってその意味では抜け穴ですが) >現状、例えば怪しいサイトのHTMLが社内イントラの画像をimgタグで抜き取ったとして、 >それを怪しいサーバに送ろうとするとHTML5のCanvasを使わなければならず(たぶん)、 >そちらでは別のオリジンから持ってきた画像はデータ化したりできないようにする等 >対策はされていると思いますけれども。 > >>P.248 注3 >>csvダウンロードできませんでした。リンクを、 >> >>><a href="/generatecsv/GenerateCSV">CSVダウンロード</a> > >HTMLファイルはどこに置きましたか? >ここでは、 >C:\Tomcat8\webapps\generatecsv\test.html >のような場所に置いてあることを想定しています。 > >実際にアプリケーションを開発する際も、HTMLなりJSPなりを >GenerateCSVと同じTomcatでホストしていれば、/generatecsv/GenerateCSVで >見えると思います。 > >>P.249 リスト7-8 5行目 >>下記が誤りのように思います。 >> 誤:"http://localhost/downloadtest/file.mp4; >> 正:"http://localhost/downloadtest/file.mp4"; > >申し訳ありません。これは間違いですね。 >正誤表に載せておきます。 >
[この投稿を含むスレッドを表示] [この投稿を削除]
[2099] Re:第7章のTIPSについて
投稿者:(ぱ)こと管理人
2018/01/11 00:14:06

>>out.print((char)(ch & 0xffff)); > >"& 0xffff"は何をしているのでしょうか?不要な制御情報を削除するなどの >用途があるのでしょうか? ここではint型のchをcharにキャストしているので、結果がcharの 範囲に収まるよう、0xffffとの&を取っています。 まあ、この場合、直前のif文で負でない保証がされていますし、 InputStreamReader#read()の戻り値なので、あまり気にする必要は ないのかもしれませんが。 >P.241 リスト7-3 36行目 >dataOutを多次元配列として定義している理由がよく分かりませんでした。 >一次元配列でも参照型変数となるので、呼び出され側で値を詰めることができるように >思います。 1次元配列を上位でnewして渡し、呼び出され側で値を詰めてもらう、 ということはできますが、その場合、newするには呼び出し側でサイズが わかっている必要があります。ここでは、呼び出し側ではサイズがわからないので、 呼び出され側でnewした配列を参照型変数に格納して返すには、 配列の配列(2次元配列)が必要になります。 >とありますが、例えばP.226の補足に記載されているような最新投稿を表示する >ようなパーツが、 >仮にテキストなどでは無く画像で最新記事を返す形式だったら、 >XMLHttpRequestとか同一オリジンポリシーなど >考えなくても良いということでしょうか? そうなりますね。(JSONPだってその意味では抜け穴ですが) 現状、例えば怪しいサイトのHTMLが社内イントラの画像をimgタグで抜き取ったとして、 それを怪しいサーバに送ろうとするとHTML5のCanvasを使わなければならず(たぶん)、 そちらでは別のオリジンから持ってきた画像はデータ化したりできないようにする等 対策はされていると思いますけれども。 >P.248 注3 >csvダウンロードできませんでした。リンクを、 > >><a href="/generatecsv/GenerateCSV">CSVダウンロード</a> HTMLファイルはどこに置きましたか? ここでは、 C:\Tomcat8\webapps\generatecsv\test.html のような場所に置いてあることを想定しています。 実際にアプリケーションを開発する際も、HTMLなりJSPなりを GenerateCSVと同じTomcatでホストしていれば、/generatecsv/GenerateCSVで 見えると思います。 >P.249 リスト7-8 5行目 >下記が誤りのように思います。 > 誤:"http://localhost/downloadtest/file.mp4; > 正:"http://localhost/downloadtest/file.mp4"; 申し訳ありません。これは間違いですね。 正誤表に載せておきます。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2098] 第7章のTIPSについて
投稿者:くまきち
2018/01/10 22:11:30

『基礎からのWebアプリケーション開発入門』のP.235からのTipsについて質問させてください。 P.238 リスト7-1 25行目 >out.print((char)(ch & 0xffff)); "& 0xffff"は何をしているのでしょうか?不要な制御情報を削除するなどの用途があるのでしょうか? P.241 リスト7-3 36行目 dataOutを多次元配列として定義している理由がよく分かりませんでした。 一次元配列でも参照型変数となるので、呼び出され側で値を詰めることができるように思います。 P.245 7.3 画像を動的に生成する ><img src="http://localhost:8080/generateimage/GenerateImage"/> ><image>タグは、それが記載されているHTMLとはまったく無関係のドメインからでも・・・」 とありますが、例えばP.226の補足に記載されているような最新投稿を表示するようなパーツが、 仮にテキストなどでは無く画像で最新記事を返す形式だったら、XMLHttpRequestとか同一オリジンポリシーなど 考えなくても良いということでしょうか? なんとなく、いろいろセキュリティ対策しているけど、抜け道はいろいろありそうな気がしてしまいます。 P.248 注3 csvダウンロードできませんでした。リンクを、 ><a href="/generatecsv/GenerateCSV">CSVダウンロード</a> とすると失敗しましたが、下記のようにすると成功しました(IE、Crome、Firefoxで実施)。 ><a href="http://localhost:8080/generatecsv/GenerateCSV">CSVダウンロード</a> P.249 リスト7-8 5行目 下記が誤りのように思います。  誤:"http://localhost/downloadtest/file.mp4;  正:"http://localhost/downloadtest/file.mp4";
[この投稿を含むスレッドを表示] [この投稿を削除]
[2097] Re:JSONPについて
投稿者:(ぱ)こと管理人
2018/01/06 21:26:56

>・P.226 補足 JSONP① >「JSONPの基本的な原理は ~ <script>タグによるJavaScriptの取得は >同一オリジンポリシーに縛られない」という記載があります。 >ここの意図は、「”外部ファイルからのJavaScript取得”は同一オリジンポリシーに >縛られない」で合っていますか? 合っています。外部ファイルからのJavaScript取得には<script>タグを 使うので、そのように書いています。(確かに、HTML中にJavaScriptを 書く時も<script>タグは使いますけれども) >・P.227 補足 JSONP② >「このようにして関数呼び出しを含むJavaScriptを取り込めば、その関数 >(上記で言えばcallbackFunc)が呼び出されます。」という部分で、 >具体的にcallbackFuncが実行されるタイミングがよく分かりませんでした。 JavaScriptの実行タイミングについてはp.218に書きましたが、 <script>タグで外部のJavaScriptを読み込んだ場合、その<script>タグのある 位置で実行されます。 JSONPの場合、その外部JavaScriptからcallbackFuncを呼び出すわけですから、 callbackFuncもそのタイミングで実行されます。 そのため、HTML上では、外部JavaScriptを読み込む<script>タグは、 callbackFuncの定義より後ろにある必要があります。 >網掛け部分にある「callbackFunc」には、なぜコールバック関数という >名前が付いているのでしょうか。webで調べたコールバック関数は >「他の関数に引数として渡す関数」というイメージなので、ここでこの名前 >(callbackFunc)を使う意図がシックリ来ませんでした。 コールバック関数というのは、その名の通り「呼び返される」関数です。 電話をかけて相手がいないときに「コールバックお願いします」と留守電に 残しておくのと同じように、後で別の人から「呼び返してもらう」関数のことを コールバック関数と呼びます。その手段のひとつして、関数を、 他の関数に引数として渡しておいて後で呼び返してもらう、という方法もあるわけです。 JSONPの場合、<script>タグで取り込んだ外部スクリプトから「呼び返してもらう」 関数なので、コールバック関数と呼んでいます。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2096] JSONPについて
投稿者:くまきち
2018/01/05 21:33:49

立て続けに申し訳ございません。 『基礎からのWebアプリケーション開発入門』のP.226「補足 JSONP」について、3点質問させて頂きたいです。 ・P.226 補足 JSONP① 「JSONPの基本的な原理は ~ <script>タグによるJavaScriptの取得は同一オリジンポリシーに縛られない」という記載があります。 ここの意図は、「”外部ファイルからのJavaScript取得”は同一オリジンポリシーに縛られない」で合っていますか? 「<script>タグによるJavaScriptの取得」という言い方の理解が不安だった為、質問しました。 ・P.227 補足 JSONP② 「このようにして関数呼び出しを含むJavaScriptを取り込めば、その関数(上記で言えばcallbackFunc)が呼び出されます。」という部分で、 具体的にcallbackFuncが実行されるタイミングがよく分かりませんでした。 下記のように考えておけば良いのでしょうか? HTML────────────────────────┐ │ : │ │ <script src="外部サーバのURL"> │ │ : │ └─────────────────────────┘           + 外部サーバのURL(読み込まれる) ──────────┐ │JSONPの編集と下記のJavaScript生成 │  │・callbackFuncの定義(具体的な表示の編集) │ │・callbackFuncの実行(P.226の網掛け部分) │ └─────────────────────────┘           ↓ HTML────────────────────────┐ │ : │ │┌─────────────────────┐ │ ││・callbackFuncの定義(具体的な表示の編集)│ │ ││★callbackFuncの実行(P.226の網掛け部分) │ │ │└─────────────────────┘ │ │ : │ └─────────────────────────┘ ★が読み込まれたときにcallBackFuncが実行される。 ・P.226 補足 JSONP③ 網掛け部分にある「callbackFunc」には、なぜコールバック関数という名前が付いているのでしょうか。webで調べたコールバック関数は「他の関数に引数として渡す関数」というイメージなので、ここでこの名前(callbackFunc)を使う意図がシックリ来ませんでした。 以上、よろしくお願いいたします。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2095] Re:同一オリジンポリシーについて
投稿者:くまきち
2018/01/05 21:19:47

なるほど、そういうことですね。 私は勝手に「社内イントラネットのPC=社内イントラネットのサーバ」と考えてしまっていました! 理解することが出来ました。いつも、ありがとうございます。 >>ご指摘のあった続き部分にある「JavaScriptでXMLHttpRequestを使って >>イントラネットの情報にアクセスし・・・」ですが、このときJavaScriptは >>社内イントラネットのPCにダウンロードされてきているものと思います。 > >そうです。 > >>XMLHttpRequestはサーバとの通信を行うものだと思うので、この場合には >>当てはまらないのではないかと思いました(通信の必要は無いのではないか)。 >>確かにJavaScriptのダウンロード元(怪しいページ)と通信先(イントラ)は >>同一オリジンポリシーに反するので、アクセスできないということは分かりましたが、 >>わざわざそのようなことをする事があるのかな?という所に疑問が残ります。 > >その、怪しいサイトからダウンロードしたJavaScriptが、 >XMLHttpRequestを使って社内イントラネットにアクセスして >情報を盗み出す、という危険があるわけです。 > >①昼休みに社員がPCから怪しいサイトにアクセス >②怪しいサイトから、社員のPCに、悪意を持ったJavaScriptがダウンロードされる >③悪意を持ったJavaScriptが、XMLHttpRequest等を使って社内イントラの > 情報にアクセスする。 >④悪意を持ったJavaScriptは、盗んだ情報を、XMLHttpRequestなりPOSTなりで > 怪しいサイトに送信する。 > >もちろんそのためには社内イントラネットの情報源のURLが >わからないといけませんが、それは普通機密情報とみなされないでしょうから >わかっているかもしれませんし、ありがちなグループウェアのURLを >しらみつぶしにするとかも考えられるのではないでしょうか。 > >
[この投稿を含むスレッドを表示] [この投稿を削除]
[2094] ファイル名のみで実行できました!
投稿者:huieders
2018/01/05 20:29:05

早速のご返答ありがとうございます。 Eclipseで作っていたのですが、WebAppというプロジェクトの中にjp.sampleパッケージを作り、そのパッケージの中に各javaとテキストを入れていました。 /WebApp/src/jp/sample/TcpClient.java という格好です。 >たとえばTcpServer.javaのプログラムをTcpServerという名前のプロジェクトで >作ったのだとすると、server_send.txtは > >C:\…\<ワークスペース>\TcpServer\server_send.txt > >という位置に配置する必要があります。 ご指摘のようにプロジェクト直下にテキストファイルを移動したところ、 ファイル名のみで実行でき、recvテキスト二つも作成できました。 パス省略時はどこを探すのかも知らず、お手数おかけし申し訳ございません。 丁寧に説明くださり、大変助かりました。 続きに取り組んでまいります。どうもありがとうございました。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2093] Re:リスト1-1,1-2の各txtのパスについて
投稿者:(ぱ)こと管理人
2018/01/05 15:59:13

はじめまして。 >書籍のとおりソースを書いて実行したところ FileNotFoundException となりました。 クラスファイルはどこにあって、どのように実行していますか? JavaのFileInputStreamでは、フルパスでなくファイル名だけ指定した時、 実行時のカレントディレクトリからファイルを探します。なので、 >TcpServer.java、TcpClient.java、server_send.text、client_send.txt >ファイルはすべて同じフォルダ内に作っています。 という状態で、コマンドプロンプトから C:\Users\誰それ\…\該当フォルダ> javac *.java のようにコンパイルして(するとその場に.classファイルができるはず) C:\Users\誰それ\…\該当フォルダ> java TcpServer と実行すれば、「C:\Users\誰それ\…\該当フォルダ」内のserver_send.txtを 開くことができるはずです。 コマンドプロンプトでコンパイル/実行しているのではなく、 たとえばEclipseで開発しているのだとすると、Eclipseで実行した際の カレントディレクトリはプロジェクトのディレクトリになるので、 たとえばTcpServer.javaのプログラムをTcpServerという名前のプロジェクトで 作ったのだとすると、server_send.txtは C:\…\<ワークスペース>\TcpServer\server_send.txt という位置に配置する必要があります。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2092] リスト1-1,1-2の各txtのパスについて
投稿者:huieders
2018/01/04 22:23:56

はじめまして。初版 第1刷のp.15、p.16にあるTcpServer.javaとTcpClient.javaについて質問です。 FileOutputStream、FileInputStreamの引数を書籍のとおりファイル名のみにすると FileNotFoundException になってしまうのですが、なにか手順を飛ばしてしまっているのでしょうか? 【状況】 TcpServer.javaの7・8行目およびTcpClient.javaの7・8行目において、 引数が("server_send.txt")などになっている箇所がございますが、 書籍のとおりソースを書いて実行したところ FileNotFoundException となりました。 TcpServer.java、TcpClient.java、server_send.text、client_send.txtファイルはすべて同じフォルダ内に作っています。 【対処】 ソースの("○○.txt")の部分を、ファイル名だけではなく("C:\\Users\\(省略)\\client_send.txt")という風にパスまで含めたものに記述しなおしたところ、書籍の記載どおり   クライアントからの接続を待ちます。[ここで一旦停止]   クライアント接続   通信を終了しました の手順まで進めることができ、resvファイルもそれぞれ生成できました。 【質問】 書籍p.17の「サーバ側とクライアント側にそれぞれserver_send.txtとclient_send.txtを用意したうえで」とは具体的にどうすればよいのでしょうか? 「対処」で自分がやったようにソースコード上で毎回パスまですべて記述するというのは違和感があるのですが、書籍のようにファイル名のみの指定でうまく動作させる方法が分かりません。 どうかご教示いただけますと幸いですが、 本書で想定している対象読者のレベル以前の質問でしたら申し訳ございません。勉強しなおしてまいります。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2091] Re:同一オリジンポリシーについて
投稿者:(ぱ)こと管理人
2018/01/04 15:47:13

>ご指摘のあった続き部分にある「JavaScriptでXMLHttpRequestを使って >イントラネットの情報にアクセスし・・・」ですが、このときJavaScriptは >社内イントラネットのPCにダウンロードされてきているものと思います。 そうです。 >XMLHttpRequestはサーバとの通信を行うものだと思うので、この場合には >当てはまらないのではないかと思いました(通信の必要は無いのではないか)。 >確かにJavaScriptのダウンロード元(怪しいページ)と通信先(イントラ)は >同一オリジンポリシーに反するので、アクセスできないということは分かりましたが、 >わざわざそのようなことをする事があるのかな?という所に疑問が残ります。 その、怪しいサイトからダウンロードしたJavaScriptが、 XMLHttpRequestを使って社内イントラネットにアクセスして 情報を盗み出す、という危険があるわけです。 ①昼休みに社員がPCから怪しいサイトにアクセス ②怪しいサイトから、社員のPCに、悪意を持ったJavaScriptがダウンロードされる ③悪意を持ったJavaScriptが、XMLHttpRequest等を使って社内イントラの  情報にアクセスする。 ④悪意を持ったJavaScriptは、盗んだ情報を、XMLHttpRequestなりPOSTなりで  怪しいサイトに送信する。 もちろんそのためには社内イントラネットの情報源のURLが わからないといけませんが、それは普通機密情報とみなされないでしょうから わかっているかもしれませんし、ありがちなグループウェアのURLを しらみつぶしにするとかも考えられるのではないでしょうか。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2090] Re:同一オリジンポリシーについて
投稿者:くまきち
2018/01/03 21:17:15

回答ありがとうございます。ですが、もう少しだけ分からないため、再質問させて下さい。 ご指摘のあった続き部分にある「JavaScriptでXMLHttpRequestを使ってイントラネットの情報にアクセスし・・・」ですが、このときJavaScriptは社内イントラネットのPCにダウンロードされてきているものと思います。XMLHttpRequestはサーバとの通信を行うものだと思うので、この場合には当てはまらないのではないかと思いました(通信の必要は無いのではないか)。 確かにJavaScriptのダウンロード元(怪しいページ)と通信先(イントラ)は同一オリジンポリシーに反するので、アクセスできないということは分かりましたが、わざわざそのようなことをする事があるのかな?という所に疑問が残ります。 正月早々、申し訳ありませんが、お時間があるときに回答頂けると助かりますww >>「会社で昼休みに・・・」という例が挙がっていますが、この場合、自分から >>怪しいwebページにアクセスしているので、javascriptのダウンロード元と >>通信先が同一になってしまうように思います。つまり、同一オリジンポリシーは >>満たしていると思われるため、この例の意図が分からず質問させて頂いたものです。 > >怪しいページについてはその通りですが、続きに以下のように書いています。 > >>怪しいページにて、JavaScriptでXMLHttpRequestを使ってイントラネットの >>情報にアクセスし、それをXMLHttpRequestなりフォームのPOSTなりで >>外部サーバに送信すれば情報が盗めてしまう、というのでは困ります。 > >つまり、この文脈で、同一オリジンポリシーにひっかかってアクセスできないのは、 >社内イントラネットの情報の方です。 >
[この投稿を含むスレッドを表示] [この投稿を削除]
[2089] Re:同一オリジンポリシーについて
投稿者:(ぱ)こと管理人
2018/01/03 10:13:49

>「会社で昼休みに・・・」という例が挙がっていますが、この場合、自分から >怪しいwebページにアクセスしているので、javascriptのダウンロード元と >通信先が同一になってしまうように思います。つまり、同一オリジンポリシーは >満たしていると思われるため、この例の意図が分からず質問させて頂いたものです。 怪しいページについてはその通りですが、続きに以下のように書いています。 >怪しいページにて、JavaScriptでXMLHttpRequestを使ってイントラネットの >情報にアクセスし、それをXMLHttpRequestなりフォームのPOSTなりで >外部サーバに送信すれば情報が盗めてしまう、というのでは困ります。 つまり、この文脈で、同一オリジンポリシーにひっかかってアクセスできないのは、 社内イントラネットの情報の方です。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2088] 同一オリジンポリシーについて
投稿者:くまきち
2018/01/03 01:34:01

『基礎からのWebアプリケーション開発入門』のP.225にある同一オリジンポリシーについて、解説にある例が分からず質問させてください。 「会社で昼休みに・・・」という例が挙がっていますが、この場合、自分から怪しいwebページにアクセスしているので、javascriptのダウンロード元と通信先が同一になってしまうように思います。つまり、同一オリジンポリシーは満たしていると思われるため、この例の意図が分からず質問させて頂いたものです。 初歩的な質問かも知れませんが、よろしくお願いいたします。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2087] Re:リスト6-11について
投稿者:(ぱ)こと管理人
2017/12/31 16:25:14

>51行目 >誤:<thead> >正:</thead> ご指摘ありがとうございます。ポカが多く申し訳ありません。 正誤表に追加しました。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2086] リスト6-11について
投稿者:くまきち
2017/12/31 00:45:55

『基礎からのWebアプリケーション開発入門』のP.219にあるリスト6-11について、非常にささいではありますが誤植かなと思ったところがあったので、念の為、連絡しておきます。 51行目 誤:<thead> 正:</thead>
[この投稿を含むスレッドを表示] [この投稿を削除]
[2085] Re:6.5 認証 について
投稿者:(ぱ)こと管理人
2017/12/30 17:59:56

>P.199 >6.5節の認証はクライアント側の認証、6.4.1節②の認証はサーバ側の認証の話、 >という理解で合っていますでしょうか? まあそうですが、クライアント側、サーバ側というと意味が不明確かと。 ・6.5節の認証は、ログインしているユーザが正しいユーザであることを  確認するための認証 ・6.4.1節②の認証は、通信相手のサーバが正しいサーバであることを  確認するための認証 です。 >P.204 >レルムはパスワードファイル作成時(htdigest)にも指定し、「.htaccess」にも >指定しています。これらの整合性は、どのように扱われるのでしょうか? 同じものを2か所に書いているから整合性が心配だということだと思いますが、 p.204に「これはつまり、複数のレルムのユーザを、1つのパスワードファイルで 管理できることを意味しています」とあるように、レルムをキーに どの領域のユーザかを識別しているわけです(いかにも表示用の文字列を キーにするのが気持ち悪いというのは同意します)。 >P.205 >ncは何をカウントしているのでしょうか?同じノンスに対するレスポンスの >送信回数が2回以上という状況が想像できませんでした。 リプレイ攻撃の防止用です。通信経路が盗聴されている時、正当な利用者が 投げた認証情報とまったく同じ情報を攻撃者が投げると認証が通ってしまう、 という事態を防止するためのものです。 >P.208 >「フォーム認証では~SSL(TLS)を使用しなければ~」とありますが、 >tomcatのフォーム認証は暗号化されているのでしょうか?それとも別途、 >暗号化が必要なものなのでしょうか? リスト6-5のlogin.htmlを見ればわかるようにただのform要素なので、 暗号化はされません。別途TLSを使用する必要があります。 >P.211 >④の後のShowBBSを表示するリクエストとレスポンスで、JSESSIONIDの値が違いました。 >これは、なぜでしょうか?セッションIDの固定化(Session Fixation)攻撃と >関係あるのでしょうか。 関係あります。このページの説明がわかりやすいかと思います。 http://bakera.jp/glossary/%E3%82%BB%E3%83%83%E3%82%B7%E3%83%A7%E3%83%B3%E5%9B%BA%E5%AE%9A%E6%94%BB%E6%92%83
[この投稿を含むスレッドを表示] [この投稿を削除]
[2084] 6.5 認証 について
投稿者:くまきち
2017/12/29 23:49:01

『基礎からのWebアプリケーション開発入門』のP.199からの認証について何点か質問させてください。 P.199 6.5節の認証はクライアント側の認証、6.4.1節②の認証はサーバ側の認証の話、という理解で合っていますでしょうか? P.204 レルムはパスワードファイル作成時(htdigest)にも指定し、「.htaccess」にも指定しています。これらの整合性は、どのように扱われるのでしょうか? P.205 ncは何をカウントしているのでしょうか?同じノンスに対するレスポンスの送信回数が2回以上という状況が想像できませんでした。 P.208 「フォーム認証では~SSL(TLS)を使用しなければ~」とありますが、tomcatのフォーム認証は暗号化されているのでしょうか?それとも別途、暗号化が必要なものなのでしょうか? P.211 ④の後のShowBBSを表示するリクエストとレスポンスで、JSESSIONIDの値が違いました。これは、なぜでしょうか?セッションIDの固定化(Session Fixation)攻撃と関係あるのでしょうか。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2083] Re:セッションの補足について
投稿者:(ぱ)こと管理人
2017/12/26 00:07:18

>①Webサーバがたくさんある場合 >「アプリケーションサーバソフトウェア(Tomcatなど)が再起動した場合には、 >セッションが失われてしまいます」とありますが、それはなぜでしょうか? >アプリケーションサーバソフトウェアを再起動すると、その上で動くサーブレットも >再起動となりセッションもクリアされるからでしょうか。その意味では、 >Webサーバがたくさんある場合とは直接関係ないものでしょうか? 確かに、Webサーバが1台でも「Webサーバが壊れたとか、アプリケーションサーバ ソフトウェア(Tomcatなど)が再起動した場合には、セッションが失われてしま」う ことに変わりはないですね。 意図としては、Webサーバがたくさんある場合、普通は「1台くらい壊れても 問題なく動作する」ことを期待して「冗長化」するのであって、にもかかわらず (そのサーバに接続していたユーザだけとはいえ)セッションが失われてしまうのでは Webサーバをたくさんにした意味がない、という趣旨で書いています。 >②セッションをCookie以外で実現する方法 >「URL Writing」の説明に「RefererなどでセッションIDが漏洩しやすい」とありますが、 >それはなぜでしょうか?CookieならばJavascriptから見えないようにすることが >できるからでしょうか? CookieならJavaScriptから見えないようにできるというのもありますが、 この文章での意図としては、書いてある通り「RefererなどでセッションIDが漏洩」すると いうことです。SNSなどで、悪意を持ったユーザが自サーバのURLを貼ったら、 そのサーバのアクセスログのRefererのところに、うっかりリンクを踏んだ人の セッションIDが普通に現れます。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2082] セッションの補足について
投稿者:くまきち
2017/12/25 01:02:42

『基礎からのWebアプリケーション開発入門』のP.163、164の補足について質問させてください。 ①Webサーバがたくさんある場合 「アプリケーションサーバソフトウェア(Tomcatなど)が再起動した場合には、セッションが失われてしまいます」とありますが、それはなぜでしょうか? アプリケーションサーバソフトウェアを再起動すると、その上で動くサーブレットも再起動となりセッションもクリアされるからでしょうか。その意味では、Webサーバがたくさんある場合とは直接関係ないものでしょうか? ②セッションをCookie以外で実現する方法 「URL Writing」の説明に「RefererなどでセッションIDが漏洩しやすい」とありますが、それはなぜでしょうか?CookieならばJavascriptから見えないようにすることができるからでしょうか?
[この投稿を含むスレッドを表示] [この投稿を削除]
[2081] Re:【C言語ポインタ完全制覇】3-1-2 Cの宣言を解読する
投稿者:(ぱ)こと管理人
2017/12/23 23:26:00

>というわけで、プログラム出力は兎も角として、解説の文章では(第2版でも仰っている >ように)必要な冠詞を抜かさず英語としてまともな文章になさるほうが良いと、僕は >思います。 本来の英語としてはそうだろうと思います(intの前とかは微妙な気もしますが)。 本書内のは、まあ、説明用の英語もどきということでご理解ください。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2080] Re:【C言語ポインタ完全制覇】3-1-2 Cの宣言を解読する
投稿者:knwifuru
2017/12/22 09:15:25

>># あ、本の中の英語の文章ですが、可算名詞に冠詞が抜けているものが少なからず >>ありました… > >これはK&Rのdclもそうなっているからいいだろう、ということで付けていません。 >第2版では、p.163に注の形で言い訳を入れました。 >(韓国語版では、訳者の方が足してくれたりしたようですが) ># この注で、「declでも付けていませんし」とあるのはdclの間違いですね… ># 後ほど正誤表に挙げます。 あ、本当だ! この件に関しては、第2版を確認せずに投稿しちゃってました… (^^; 確かに、K&$第二版日本語版のp149の、dcl『の実行結果』も、冠詞が抜けています。 原著第二版(1988)のp122ページの『実行出力』でも、ありませんね。 また、"Pointers on C" (Kenneth A. Reek, Addison Wesley(1988))のp355で 紹介されている、cdeclというプログラム https://cdecl.org/ https://github.com/ridiculousfish/cdecl-blocks 『の出力』でも、冠詞は省略しているみたいですね。 $ cdecl Type `help' or `?' for help cdecl> explain int(*f)(void); declare f as pointer to function (void) returning int しかし、これは、あくまでプログラム出力を簡潔にするためだと思います。 実際、"C - A Reference Manual (5ed.)"(Harbison & Steel, Prentice Hall (2002))の 4 Declarationsという章の最初のページ(p73)にも Declarations in C are difficult to describe for several reasons. First, they involve some unusual syntax that may be confusing to the novice. For example, the declaration int (*f) (volid); declares a pointer to a function taking no arguments and returning an integer. と、文章ではきちんと冠詞をつけていることからも、英語としては冠詞が必要である ことが明らかですし、K&R原著第二版で配列が最初に説明される 1.6 Arrays (p22)で でだって、本文文章では The declaration int ndigit[10]; declares ndigit to be an array of 10 integers. と書かれています。 というわけで、プログラム出力は兎も角として、解説の文章では(第2版でも仰っている ように)必要な冠詞を抜かさず英語としてまともな文章になさるほうが良いと、僕は 思います。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2079] Re:【C言語ポインタ完全制覇】3-1-2 Cの宣言を解読する
投稿者:(ぱ)こと管理人
2017/12/22 01:20:10

>結局、Cの宣言は、日本語的に考えるとダメで(識別子から遠い側の配列宣言[3]を先に解釈 >しないと正しくない)、英語で表現して考えないとダメだ、ということなんでしょうかね… そうです。 まあ、Cの宣言は英語圏でも「酷評を受ける」そうですが、 日本人にとってはさらにひとつハードルが増えますね。 ># あ、本の中の英語の文章ですが、可算名詞に冠詞が抜けているものが少なからず >ありました… これはK&Rのdclもそうなっているからいいだろう、ということで付けていません。 第2版では、p.163に注の形で言い訳を入れました。 (韓国語版では、訳者の方が足してくれたりしたようですが) # この注で、「declでも付けていませんし」とあるのはdclの間違いですね… # 後ほど正誤表に挙げます。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2078] Re:【C言語ポインタ完全制覇】ポインタはどれだけ進む?
投稿者:(ぱ)こと管理人
2017/12/22 01:07:55

>コンパイラが密かに(いえ、きちんと被参照型のサイズを考えて)計算して正しい >値(アドレス)に置き換えてくれてる、ということなのですかね(でしょうね)? そういうことですね。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2077] 【C言語ポインタ完全制覇】3-1-2 Cの宣言を解読する
投稿者:knwifuru
2017/12/21 10:26:47

バカな質問ばかりして恐縮です。 第1版のp144に『②識別子に近い方から、優先順位に従って派生型(ポインタ、配列、関数)を解釈する。』とあります。 これでいくと、Table 3-1の3番目、 int hoge[10][3]; は、  「識別子"hoge"に一番近いのは、配列[10]。その次が配列[3]。最後に、int」 なので、  「要素数10個の配列が、3つ並んで(また配列を作って)いる。(基本型はint)」 となると思えるのですが、“日本語的表現”では  hoge は、intの配列(要素数3) の配列(要素数10) と、「要素数3の配列が10個並んでいる」という意味とされています。(Fig. 3-15でも同様) 結局、Cの宣言は、日本語的に考えるとダメで(識別子から遠い側の配列宣言[3]を先に解釈しないと正しくない)、英語で表現して考えないとダメだ、ということなんでしょうかね… (質問というか、ぼやき?) "'hoge' is an array (with 10 elements) of an array (with 3 elements) of int." # あ、本の中の英語の文章ですが、可算名詞に冠詞が抜けているものが少なからずありました…
[この投稿を含むスレッドを表示] [この投稿を削除]
[2076] Re:【C言語ポインタ完全制覇】ポインタはどれだけ進む?
投稿者:knwifuru
2017/12/21 09:00:12

>>この時、ip はポインタ(型の変数)ですよね? ですから、ip+2、すなわち、 >>ポインタ(型の変数の値)に2加算したポインタ『値』は、あくまで2しか増えて >>いないじゃない!、と僕は思ったわけです。 > >うーん、『「ポインタ型の値」は、実際にはメモリのアドレスのことです』と >p.43には書いてあるわけで、その意味では一貫していると思うのですが…… > >ip+1としたとき、それはもちろん配列の添字として考えれば1しか増えてないですし、 >引き算すれば1になりますが、図を描いて矢印が動く距離を見てみれば、 >「そのポインタが指す型のサイズ分だけ」動いている、と思うのですが。 僕の混乱の原因は、ここにありまして… List 1-4array2.c を、ちょっとだけ変更した次のもの #include <stdio.h> int main(void) { int array[5]; int *p; int *p0=&array[0], *p1=&array[1]; int i; /* 配列arrayに値を設定 */ for (i = 0; i < 5; i++) { array[i] = i; } /* その内容を表示 */ for (p = &array[0]; p != &array[5]; p++) { printf("%d %p\n", *p, p); } printf("p1-p0: %d, %p\n", p1-p0, p1-p0); return 0; } を走らせた結果は 0 0x7ffc25766960 1 0x7ffc25766964 2 0x7ffc25766968 3 0x7ffc2576696c 4 0x7ffc25766970 p1-p0: 1, 0x1 となり、『pには1しか足していないのに(p+=1としても当然同じ)、それを表示 させるとなぜ4ずつ増えている? どこにマジックがある?』という当惑です。 (1足した筈なのに、4増えちゃった? でも、p1とp0の差は、あくまで、1!) コンパイラが密かに(いえ、きちんと被参照型のサイズを考えて)計算して正しい 値(アドレス)に置き換えてくれてる、ということなのですかね(でしょうね)?
[この投稿を含むスレッドを表示] [この投稿を削除]
[2075] Re:【C言語ポインタ完全制覇】ポインタはどれだけ進む?
投稿者:(ぱ)こと管理人
2017/12/21 00:59:23

>この時、ip はポインタ(型の変数)ですよね? ですから、ip+2、すなわち、 >ポインタ(型の変数の値)に2加算したポインタ『値』は、あくまで2しか増えて >いないじゃない!、と僕は思ったわけです。 うーん、『「ポインタ型の値」は、実際にはメモリのアドレスのことです』と p.43には書いてあるわけで、その意味では一貫していると思うのですが…… ip+1としたとき、それはもちろん配列の添字として考えれば1しか増えてないですし、 引き算すれば1になりますが、図を描いて矢印が動く距離を見てみれば、 「そのポインタが指す型のサイズ分だけ」動いている、と思うのですが。 >…というわけで、『ポインタ「の指し示すアドレス」が〇〇だけ進む』などという 『ポインタ「の指し示すアドレス」』だと、ポインタの指す先にあるアドレスが 増えるという意味にとられそうな気もしますけど、 まあ、「ポインタが〇〇だけ進む」と書くよりは、「ポインタが〇〇バイトだけ進む」と 単位を明示した方が、誤解を招かなかったかもしれませんね。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2074] Re:WebApplicationクラス
投稿者:(ぱ)こと管理人
2017/12/21 00:51:27

>しかし、自然に考えると「WebAppCollection」クラスを分離して、「WebAppCollection」が >「WebApplication」のコレクションを保有する構造の方が分かりやすいのではないか、と >思ってしまいました。 この構造は、確かにわかりやすくてこれでもよいと思いますが、 >そこで、現在の「WebApplication」の構造にした背景みたいなものがあれば、 >聞いてみたいと思ったわけです。 現状こうなっているのは、「すべてのWebApplicaionのインスタンスが、 必ずwebAppCollectionに格納されていることを保証する」ためです。 コンストラクタがprivateにしてあるので、WebApplicationのインスタンスは WebApplication.createInstance()を呼ぶ以外に生成の方法がなく、 必ずwebAppCollectionに格納されていることが保証されます。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2073] WebApplicationクラス
投稿者:くまきち
2017/12/20 23:40:08

『基礎からのWebアプリケーション開発入門』のP.114のリスト3-15にある「WebApplication」クラスについて、少し疑問があります。 書籍の本論とはズレた疑問ですが。。 「WebApplication」は自分自身のコレクション「WebAppCollection」を内部に持っています。 しかし、自然に考えると「WebAppCollection」クラスを分離して、「WebAppCollection」が「WebApplication」のコレクションを保有する構造の方が分かりやすいのではないか、と思ってしまいました。 (「Main」は「WebAppCollection」に「addWebApplication」を依頼する、みたいな) そこで、現在の「WebApplication」の構造にした背景みたいなものがあれば、聞いてみたいと思ったわけです。 このようなことを聞く理由は、次のような感じです。 書籍でHenacatを勉強していて、いろいろなクラスが登場し、それぞれの関係性を理解して、という作業を行ったのですが、なかなか難しいという感想を持ちました。 そう感じる理由はクラス間の関連(全体感)をつかめないからで、もしかするとUMLとかで整理したら分かりやすくなるのかな?と思って試してみました。 しかし、なかなか上手く表現できず「WebApplication」の構造が気になり始めた、という事が理由です。 いつもご迷惑をおかけしますが、よろしくお願いいたします!
[この投稿を含むスレッドを表示] [この投稿を削除]
[2072] Re:【C言語ポインタ完全制覇】ポインタはどれだけ進む?
投稿者:knwifuru
2017/12/20 08:08:58

>>2-3-2ポインタ型派生で(第1版p151、第2版p172)、「くどいようですが繰り返して >>おきます。ポインタに対して加算を行うと、そのポインタの指す型のサイズだけ、 >>ポインタが進むのでした。」とありますが、ポインタの指す型のサイズだけ進むのは、 >>(通常のポインタの実装では)【アドレス】であって、ポインタが進む大きさは、 >>ポインタに加算した量だけ、ではないでしょうか? > >この「ポインタが〇〇だけ進む」という表現は、第2版p.56の > >>ポインタって、要するにアドレスのことなんだろ? >>だったら、1足したら1進むに決まってるじゃないか! > >のところから一貫して「バイト数」を指しているつもりです。 (略) >そして、こういう説明が必要だと思ったからこそ、私はこの本を書いたわけです。 有難うございます。感謝しながら読ませて頂いております。 混乱してきました。あ、勿論、ポインタの指す先がどれだけ進むか?は、理解しているつもりです。 int i, iarray[10]; int *ip; ip = iarray で int が 4bytes である場合に、 *(ip+2); が、iarray の先頭アドレスから 4*2=8bytes を参照していることはわかっているつもりです。 この時、ip はポインタ(型の変数)ですよね? ですから、ip+2、すなわち、ポインタ(型の変数の値)に2加算したポインタ『値』は、あくまで2しか増えていないじゃない!、と僕は思ったわけです。そして、「ポインタが〇〇だけ進む」という表現は、『ポインタ「の値」が〇〇だけ進む』と読めました。その指す先は、勿論、8bytes 進んだ場所ですが… (ipとip+2の差はあくまで2ですが、ip+2がdereferenceする先とipがdereferenceする先の番地の差は、2*sizeof(int)、で、バイト数で考えて意味をもつのは、あくまでdereferenceする先では?) …というわけで、『ポインタ「の指し示すアドレス」が〇〇だけ進む』などという表現の方が、くどい文章になるけれど、誤解する僕のようなバカチンは減るのでは?と申したわけです。 細かくてすみません…
[この投稿を含むスレッドを表示] [この投稿を削除]
[2071] Re:【C言語ポインタ完全制覇】ポインタはどれだけ進む?
投稿者:knwifuru
2017/12/20 07:51:18

>>ついでに申せば、第1版のFig.3-3の「1加算するとここを指す」という説明も、 >>よくわかりません。どういう意味でしょうか?何に1加算すると? > >この図中にある「Tへのポインタ」に1加算すると、です。 あ、配列へのポインタの説明のFig.3-6と見比べて、わかりました。 これ、あるオブジェクトがぽつんとある図ではなく、メモリ空間内で図の上から下にアドレスが大きくなっていっていて、「Tへのポインタ」が「派生元の型T」のとある変数?の場所の手前を指していて、「Tへのポインタ」に「1加算するとここ(「派生元の型T」のとある変数?の場所の次)を指す」、という意味なのですね! 理解しました。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2070] Re:【C言語ポインタ完全制覇】バイトオーダー、向き?
投稿者:knwifuru
2017/12/20 07:43:34

返信ありがとうございます。 endianについては、VAX/VMSやらPC98やらをいじっているその昔から(トシがばれる(^^;)苦労させられてきていて、中身はわかっているつもりですので、「何と逆なのか」を明示して頂ければ、僕はそれだけで充分です。(僕が細かすぎですかね?(笑)) >>第1版p135, 第2版p156の、byteorder.cの実行直後の文、『私の環境では「0x12345678」と >>いう値は、メモリ上に、逆向きに配置されているようですね。』とあるのですが、 >>何とは「逆向き」に、なのかがわかりません。何と逆向きなのでしょうか? > >「0x12345678」という16進の表記と逆向き、という意味で書いています。 (略) >「想定読者は過去の自分自身」という視点から逃れられないものなのかもしれません。 繰り返しになりますが、「何と逆か」が明確に示していただければ、「あぁ、それと逆なのね」と、読者の一人としては納得できます。「下位から上位に読んでいったら、全然逆じゃないじゃん!何と逆? うぅーん、わからん!」と考える、ひねくれた読者もおりますので(笑)
[この投稿を含むスレッドを表示] [この投稿を削除]
[2069] Re:【C言語ポインタ完全制覇】ポインタはどれだけ進む?
投稿者:(ぱ)こと管理人
2017/12/20 00:26:09

>ついでに申せば、第1版のFig.3-3の「1加算するとここを指す」という説明も、 >よくわかりません。どういう意味でしょうか?何に1加算すると? この図中にある「Tへのポインタ」に1加算すると、です。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2068] Re:【C言語ポインタ完全制覇】ポインタはどれだけ進む?
投稿者:(ぱ)こと管理人
2017/12/20 00:23:07

>2-3-2ポインタ型派生で(第1版p151、第2版p172)、「くどいようですが繰り返して >おきます。ポインタに対して加算を行うと、そのポインタの指す型のサイズだけ、 >ポインタが進むのでした。」とありますが、ポインタの指す型のサイズだけ進むのは、 >(通常のポインタの実装では)【アドレス】であって、ポインタが進む大きさは、 >ポインタに加算した量だけ、ではないでしょうか? この「ポインタが〇〇だけ進む」という表現は、第2版p.56の >ポインタって、要するにアドレスのことなんだろ? >だったら、1足したら1進むに決まってるじゃないか! のところから一貫して「バイト数」を指しているつもりです。 私だって普通にポインタ演算(まあめったに使いませんが)でintの配列の 次の要素を指す時には、「4バイト先」なんてことを意識したりはしませんが、 この本では、「そのポインタの指す型のサイズだけ、ポインタが進む」ということを 強く意識しないと、たとえばp.195の 「ポインタにi加算することは、そのポインタが指す型のサイズ×iだけ、 ポインタを進めることを意味する。hogeの指す先の型は「intの配列(要 素数5)」であるから、hoge + iでは、sizeof(int[5]) * iだけ進む。」 という説明が意味不明になってしまうのではないでしょうか。 そして、こういう説明が必要だと思ったからこそ、私はこの本を書いたわけです。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2067] Re:【C言語ポインタ完全制覇】バイトオーダー、向き?
投稿者:(ぱ)こと管理人
2017/12/20 00:13:05

>第1版p135, 第2版p156の、byteorder.cの実行直後の文、『私の環境では「0x12345678」と >いう値は、メモリ上に、逆向きに配置されているようですね。』とあるのですが、 >何とは「逆向き」に、なのかがわかりません。何と逆向きなのでしょうか? 「0x12345678」という16進の表記と逆向き、という意味で書いています。 >(ぱ)さんの環境(little endian)で、78->56->34->12と表示されている、 >というのは、下の位から上の位にメモリアドレスが増えていっているので、 >僕には、逆ではなく【順に】に思えるのです。 うーん、主観の問題とは思いますが、どうなんでしょう。 「下の位を先にメモリに格納する」というのは、コンピュータの事情としては わかるケースもありますが、通常、人間は、数字を印刷・表示した状態の順序で 意識しているのではないでしょうか。過去、この話を新人君やお客様にしたことは 何度かありますが、私の経験した範囲では、「へー、逆なんだ」という反応でした。 ポインタ完全制覇の初版が出てから17年、この点で違和感を表明したのは knwifuruさんが最初です(もちろん、表明しなかっただけで、違和感を感じていた人は いたのかもしれません)。 >しかし、もともと、endianというのは、「卵の尖った側(小さい側)から(先に)食べるか、 >丸い側(大きい側)から食べるか」=「bit/byte列のlower bits側が先に(lower addressに) >置かれるか、higher bitsが先に置かれるか」という事のようなので、 >数字を印刷・表示した時・読んだ時に先に・早く出てくるかどうか?で議論をすると、 >混乱すると思うのですが、いかがでしょうか? まあこれはendianを知らない人向けの説明なので、「もともとendianというのは~」で 説明してもあまり意味はなく、「数字を印刷・表示した時・読んだ時」の順と 逆になっていることから、「そんなこともあるんだ、へー」と思ってもらえば よいかと思っています。 「へー、逆なんだ」と思わない人は、knwifuruさんの他にもいるのかもしれませんし、 実のところどっちが多数派なのかもわかりませんが、本の書き手としては、 「想定読者は過去の自分自身」という視点から逃れられないものなのかもしれません。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2066] Re:info.servlet.serviceについて
投稿者:くまきち
2017/12/19 23:31:05

ありがとうございます、納得しました! >>HenacatでRunnableをimplementsしているのはServerThreadだけだと思いますが、 >>もしかしてマルチスレッドの各スレッドから呼び出されるクラスは、ルールの適用無しでも >>(結果として)マルチスレッドで動くという事なのでしょうか? > >もちろん、マルチスレッドの各スレッドから呼び出されるメソッドは >呼び出し元のスレッドで動きますから、マルチスレッドで動きます。 >(クラスとかインスタンスは、この際関係ないですね) >
[この投稿を含むスレッドを表示] [この投稿を削除]
[2065] Re:info.servlet.serviceについて
投稿者:(ぱ)こと管理人
2017/12/19 23:08:47

>HenacatでRunnableをimplementsしているのはServerThreadだけだと思いますが、 >もしかしてマルチスレッドの各スレッドから呼び出されるクラスは、ルールの適用無しでも >(結果として)マルチスレッドで動くという事なのでしょうか? もちろん、マルチスレッドの各スレッドから呼び出されるメソッドは 呼び出し元のスレッドで動きますから、マルチスレッドで動きます。 (クラスとかインスタンスは、この際関係ないですね)
[この投稿を含むスレッドを表示] [この投稿を削除]
[2064] Re:【C言語ポインタ完全制覇】ポインタはどれだけ進む?
投稿者:knwifuru
2017/12/19 23:07:31

ついでに申せば、第1版のFig.3-3の「1加算するとここを指す」という説明も、よくわかりません。どういう意味でしょうか?何に1加算すると? >2-3-2ポインタ型派生で(第1版p151、第2版p172)、「くどいようですが繰り返しておきます。ポインタに対して加算を行うと、そのポインタの指す型のサイズだけ、ポインタが進むのでした。」とありますが、ポインタの指す型のサイズだけ進むのは、(通常のポインタの実装では)【アドレス】であって、ポインタが進む大きさは、ポインタに加算した量だけ、ではないでしょうか?
[この投稿を含むスレッドを表示] [この投稿を削除]
[2063] Re:info.servlet.serviceについて
投稿者:くまきち
2017/12/19 21:37:28

なるほど、了解です!ありがとうございます。 ですが、もう少し分からないことがあります。 マルチスレッドで動くとなると、クラスがRunnableをimplementsして...のような ルールが必要なのかと思っていたのですが、HttpServletは、そのようになっていません。 HenacatでRunnableをimplementsしているのはServerThreadだけだと思いますが、 もしかしてマルチスレッドの各スレッドから呼び出されるクラスは、ルールの適用無しでも (結果として)マルチスレッドで動くという事なのでしょうか? 入門書を読め!という話なのかも知れませんが、どうぞ宜しくお願いします。 >>分からないのは「info.servlet」がnullでなければ、同じインスタンスが >>使いまわされるのに、並行して複数個所から使いまわされていいんだっけ? >>ということです。 > >p.92の補足にも書きましたが、サーブレットのインスタンスはひとつだけ生成され、 >すべてのリクエストで共有されます。 >よって、インスタンスフィールドを使えば、複数のスレッド間で競合が起きる >可能性がありますし、(補足にも書いたように)リクエスト単位やユーザ単位で >持つべき情報をサーブレットのインスタンスフィールドで保持してはいけません。 > >ただし、ローカル変数はスレッドごとに存在するので、ローカル変数(メソッドの >引数含む)だけを使っている限り、同じインスタンスのメソッドを複数のスレッドで >呼び出すことは問題ありません。 >
[この投稿を含むスレッドを表示] [この投稿を削除]
[2062] 【C言語ポインタ完全制覇】ポインタはどれだけ進む?
投稿者:knwifuru
2017/12/19 08:28:55

2-3-2ポインタ型派生で(第1版p151、第2版p172)、「くどいようですが繰り返しておきます。ポインタに対して加算を行うと、そのポインタの指す型のサイズだけ、ポインタが進むのでした。」とありますが、ポインタの指す型のサイズだけ進むのは、(通常のポインタの実装では)【アドレス】であって、ポインタが進む大きさは、ポインタに加算した量だけ、ではないでしょうか?
[この投稿を含むスレッドを表示] [この投稿を削除]
[2061] 【C言語ポインタ完全制覇】バイトオーダー、向き?
投稿者:knwifuru
2017/12/19 08:23:16

第1版p135, 第2版p156の、byteorder.cの実行直後の文、『私の環境では「0x12345678」という値は、メモリ上に、逆向きに配置されているようですね。』とあるのですが、何とは「逆向き」に、なのかがわかりません。何と逆向きなのでしょうか? (ぱ)さんの環境(little endian)で、78->56->34->12と表示されている、というのは、下の位から上の位にメモリアドレスが増えていっているので、僕には、逆ではなく【順に】に思えるのです。 数字の左から右(読む向き)とは【逆】という事でしょうか? 確かに、それとは逆ではありますが… しかし、もともと、endianというのは、「卵の尖った側(小さい側)から(先に)食べるか、丸い側(大きい側)から食べるか」=「bit/byte列のlower bits側が先に(lower addressに)置かれるか、higher bitsが先に置かれるか」という事のようなので、数字を印刷・表示した時・読んだ時に先に・早く出てくるかどうか?で議論をすると、混乱すると思うのですが、いかがでしょうか?
[この投稿を含むスレッドを表示] [この投稿を削除]
[2060] Re:info.servlet.serviceについて
投稿者:(ぱ)こと管理人
2017/12/18 23:55:58

>分からないのは「info.servlet」がnullでなければ、同じインスタンスが >使いまわされるのに、並行して複数個所から使いまわされていいんだっけ? >ということです。 p.92の補足にも書きましたが、サーブレットのインスタンスはひとつだけ生成され、 すべてのリクエストで共有されます。 よって、インスタンスフィールドを使えば、複数のスレッド間で競合が起きる 可能性がありますし、(補足にも書いたように)リクエスト単位やユーザ単位で 持つべき情報をサーブレットのインスタンスフィールドで保持してはいけません。 ただし、ローカル変数はスレッドごとに存在するので、ローカル変数(メソッドの 引数含む)だけを使っている限り、同じインスタンスのメソッドを複数のスレッドで 呼び出すことは問題ありません。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2059] info.servlet.serviceについて
投稿者:くまきち
2017/12/18 22:54:13

いつもお世話になっております。おかげさまで安心して読み進めることが出来ます。 『基礎からのWebアプリケーション開発入門』のP.116のリスト3-17の76行目に info.servlet.service(req,resp); という行があります。 この「info.servlet」はnullであれば53行目でインスタンスを作っています。 また「info.servlet」はWebapplicationのメンバーなので、当然、複数箇所から並行して呼ばれることがあるのではないかと思います。 分からないのは「info.servlet」がnullでなければ、同じインスタンスが使いまわされるのに、並行して複数個所から使いまわされていいんだっけ?ということです。 これは、マルチスレッド的な何か仕掛けがあって、このような作りになっているのでしょうか? 初心者で分からないことが多く、ご迷惑をおかけします。もしかして、ものすごく曖昧な質問なのかも知れませんが、よろしければお教えください。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2058] Re:C言語ポインタ完全制覇 第1版 4-2-1 可変長配列の配列についての質問
投稿者:884
2017/12/18 14:23:31

ご回答ありがとうございました。理解できました。 こんなにレスポンスが早く、直接、著者より回答がいただけるのは、非常にありがたいです。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2057] Re:ポインタ制覇誤植2-3-2冒頭(still in the 2nd ed.)
投稿者:knwifuru
2017/12/17 22:22:15

>>「C言語ポインタ制覇」2-3-2冒頭、『式の中では「関数へのポインタ」に読み替えられる』は >>『読み替えられる』ではないでしょうか? > >間違っている方の記述は「読み替えらえる」ですね。正誤表に入れさせていただきました。 指摘も間違えていて恥かきました(^^; すみません。 また気づいた点がありましたらお知らせいたします。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2056] Re:セッションCookie
投稿者:くまきち
2017/12/17 22:05:21

自己解決しました。 P.166の最終段落「さて、」以降に記載されている部分のことですね。 お騒がせしました。 >『基礎からのWebアプリケーション開発入門』のP.171のリスト5-4の後に、 >「セッションCookieにPath属性が...」との記載があります。 >これは、「CookieにPath属性が...」と見ればいいでしょうか? >それとも、どこかで「セッションCookie」が定義されていたでしょうか? > >誤植のような気もするし、私が失念しただけのような気もするし、曖昧で申し訳ないですが、 >質問させて頂きました。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2055] Re:セッションCookie
投稿者:(ぱ)こと管理人
2017/12/17 21:59:06

>『基礎からのWebアプリケーション開発入門』のP.171のリスト5-4の後に、 >「セッションCookieにPath属性が...」との記載があります。 ちょっと遠くてわかりにくかったかもしれませんが、 ここの「セッションCookieにPath 属性が付いていたことからもわかるように、」 という文章は、p.167冒頭のTomcatのセッションCookieにPath属性が付いていたことを 意味しています。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2054] Re:ポインタ制覇誤植2-3-2冒頭(still in the 2nd ed.)
投稿者:(ぱ)こと管理人
2017/12/17 15:34:04

>「C言語ポインタ制覇」2-3-2冒頭、『式の中では「関数へのポインタ」に読み替えられる』は >『読み替えられる』ではないでしょうか? 間違っている方の記述は「読み替えらえる」ですね。正誤表に入れさせていただきました。 >第一版で前々から気付いていたのですが、お知らせせずに置いたところ、先日出版された >ことに気づいて慌てて?購入した第二版でもそのままになっているようです。 第1版の方の正誤表にも後ほど記載いたします(第1版では、第2版を書いているうちに 気付いたり査読者にご指摘いただいた箇所がミスがやはり何か所かありまして、 そのうち正誤表に載せようと思ったまま延び延びになってしまっておりました)。 >こういう連絡は、こちらにするので良いのでしょうか? 「密かに別のところに >知らせてくれ」ということであれば、そちらに連絡差し上げますが… こちらでお願いします。また何かありましたらよろしくお願いいたします。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2053] ポインタ制覇誤植2-3-2冒頭(still in the 2nd ed.)
投稿者:knwifuru
2017/12/17 11:58:12

「C言語ポインタ制覇」2-3-2冒頭、『式の中では「関数へのポインタ」に読み替えられる』は『読み替えられる』ではないでしょうか? 第一版で前々から気付いていたのですが、お知らせせずに置いたところ、先日出版されたことに気づいて慌てて?購入した第二版でもそのままになっているようです。 こういう連絡は、こちらにするので良いのでしょうか? 「密かに別のところに知らせてくれ」ということであれば、そちらに連絡差し上げますが…
[この投稿を含むスレッドを表示] [この投稿を削除]
[2052] セッションCookie
投稿者:くまきち
2017/12/16 16:32:15

『基礎からのWebアプリケーション開発入門』のP.171のリスト5-4の後に、 「セッションCookieにPath属性が...」との記載があります。 これは、「CookieにPath属性が...」と見ればいいでしょうか? それとも、どこかで「セッションCookie」が定義されていたでしょうか? 誤植のような気もするし、私が失念しただけのような気もするし、曖昧で申し訳ないですが、 質問させて頂きました。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2051] Re:synchronizedについて
投稿者:(ぱ)こと管理人
2017/12/16 00:12:38

>これはラストアクセス時刻を設定するだけのメソッドだと思いますが、 >なぜsynchronizedにする必要があるのでしょうか? ここで設定するthis.lastAccessedTimeはlong型ですが、 Javaではlong型については、代入自体、atomicであることが保証されていません。 https://www.jpcert.or.jp/java-rules/vna05-j.html (intとかは良さそうなのですが、あまりそれに依存したコードは私は 書きたくないところです) >正直、多少ズレても誰にも迷惑をかけないように思ったので質問してみました。 atomicでないということは、時刻が多少ずれるということだけでなく、 「結果がどうなるかわからない」ということだと思います。 (上記ページで引用されているJLSの記述を読むと、32ビット単位で 異なる値が混じる、ということしか起こらないようにも読めますが……)
[この投稿を含むスレッドを表示] [この投稿を削除]
[2050] synchronizedについて
投稿者:くまきち
2017/12/14 23:47:43

『基礎からのWebアプリケーション開発入門』のP.168のリスト5-3の40行目に synchronized void access() という行があります。 これはラストアクセス時刻を設定するだけのメソッドだと思いますが、なぜsynchronizedにする必要があるのでしょうか? 正直、多少ズレても誰にも迷惑をかけないように思ったので質問してみました。 よろしかったら回答頂けると、ありがたいです。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2049] Re:『センス・オブ・プログラミング!』の正誤について
投稿者:藤四郎
2017/12/13 19:42:15

お手数おかけしました。ご対応ありがとうございました。 これでこの本も一読者として安心して意味内容に集中して読み返すことができます。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2048] Re:C言語ポインタ完全制覇 第1版 4-2-1 可変長配列の配列についての質問
投稿者:(ぱ)こと管理人
2017/12/13 01:51:10

>標準入出力は、テキストファイルと同じように、ファイルポインタで指定して、 >ファイルのように扱ことができる。という理解でよいでしょうか。 そういうことですね。 キーボードのような入力デバイスも、画面のような出力デバイスも、 なんでもファイルとして扱えるようにしてしまえ、というのは もともとUNIXのアイディアで、たとえばWikipediaでUNIXを引くと 「概説」の項に以下のように書いてあります。 >各種の周辺装置やある種のプロセス間通信 (IPC) をファイルとして扱う事 ここで、「各種の周辺装置」はキーボードを含みます。 このUNIXのアイディアをMS-DOSが模倣し、Windowsでもそのまま使えるように なっているわけです。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2047] Re:addCookieについて
投稿者:(ぱ)こと管理人
2017/12/13 01:47:40

>name=COUNTERのCookieが増えないように、どこで制御しているのでしょうか? >単純に見落としているだけかも知れないのですが、宜しかったら教えて頂きたいです! 結論から言えば、制御していません。Tomcatも同じです。 https://twitter.com/kmaebashi/status/549803263734718464 このTweetにも書いたように、何の役に立つのかはさっぱりわかりませんが、 Tomcatもそうなっているならまあいいかとそうしています。 もちろん、HttpServletResponseはリクエストの度に作り直されますし、 CookieTest.javaは1回のリクエストで1回しかaddCookie()を呼んでいないので、 同じ名前のCookieが増えることはありません。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2046] Re:flush()について
投稿者:(ぱ)こと管理人
2017/12/13 01:39:52

>すごく基本的な質問かもしれないですが、たとえば「メモリ上にだけ持っていて >ディスクに書き出していないデータがあるかもしれないのでflush」という >イメージは分かるのですが、このサンプルの場合はメモリ上のデータの >やり取りだけなので、flushを何のために行っているのか分かりませんでした。 このサンプルの場合はメモリ上のデータのやり取りだけですが、 それは、Henacatが手抜きのためにレスポンスボディをいったんすべて メモリに乗せているからであり、これでは、巨大なレスポンスを返す際には メモリが無駄になります。場合によっては、レスポンスデータを作りながら どんどんクライアントに返してしまいたいケースもあるでしょう。 その場合、クライアントへのデータの返却を始めてしまったら、 もうレスポンスヘッダの変更はできませんから、途中でエラーが起きても ステータスとして500とかを返すことはできず、200 OKを返すことになって しまいますが、それでもいいからクライアントへのデータ返却を始めてしまいたい、 というニーズはあり得ます。それに対応するために、サーブレットAPIでは 「コミット」という概念を導入しています(p.119)。 http://mergedoc.osdn.jp/tomcat-servletapi-5-ja/javax/servlet/ServletResponse.html#getWriter() その場合、HttpServletResponseのgetWriter()で得られるPrintWriterは、 バッファリングする方がよいでしょう。相手はネットワークだからです。 このように、このPrintWriterはバッファリングする(ようになる)可能性もあるため、 ここではflush()しています。 いずれにしても、バッファリングするしないはPrintWriterの実装詳細に 属することでしょうから、flush()する方が堅実なコーディングではないかと 思います。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2045] Re:『センス・オブ・プログラミング!』の正誤について
投稿者:(ぱ)こと管理人
2017/12/13 00:19:10

>さて、またご面倒をおかけしますが、以下についてそちらの正誤表への追加を >ご検討お願いいたします。年末のお忙しい時期におそれいりますが、またご都 >合のよろしいときにでもご対応いただければ幸いです。 またまたたくさんご指摘ありがとうございます。 ポカが多く申し訳ありません。 遅くなりましたが、対応させていただきました。 >後入れ先出し Last In First Out >先入れ後出し First In Last Out これはまあ、日本語と英語で順序を合わせなければならないというわけでも ないでしょうから、このままとさせてください。 >> 27人集れば、誕生日が衝突する確率は50%を超えます。 私は、どういうわけか27人だと思い込んでいたようですが、 どこからその数字をおぼえたのか、まったく思い出せません… >p.192 l.2 >> O(1/2N^2) > >これは誤りとまではいえないとは思いますが、一応、より細かいことをいえば >(N-1) + (N-2) + ... + 1 = N(N-1)/2 >かと。 (つまり、無視するのは定数の係数だけでなく第二項以降も。) 正しくは1/2 N^2(つまり(N^2)/2)ではなくN(N-1)/2ですが、 さすがにN^2とN(N-1)は丸めてしまって問題ない差だと思います。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2044] addCookieについて
投稿者:くまきち
2017/12/11 22:04:17

『基礎からのWebアプリケーション開発入門』のP.144のリスト4-4の33行目に response.addCookie(newCookie); という行があります。 この分は配列の最後に要素を追加するということなので、nameがCOUNTERの要素(Cookie)が既にある場合も最後に追加するように見えてしまいます。 Tomcatがうまい具合にやっているのかも知れませんが、Henacat版を見ても、やはりCOUNTER要素が増えていくように見えます。 name=COUNTERのCookieが増えないように、どこで制御しているのでしょうか?単純に見落としているだけかも知れないのですが、宜しかったら教えて頂きたいです!
[この投稿を含むスレッドを表示] [この投稿を削除]
[2043] Re:C言語ポインタ完全制覇 第1版 4-2-1 可変長配列の配列についての質問
投稿者:884
2017/12/11 17:14:06

>これで回答になっておりますでしょうか?  おかしな質問をしてすみません。 標準入出力とファイルの関係が理解できていませんでした。 そもそも、stdinは、FILEへのポインタ型なんですね。 標準入出力は、テキストファイルと同じように、ファイルポインタで指定して、 ファイルのように扱ことができる。という理解でよいでしょうか。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2042] flush()について
投稿者:くまきち
2017/12/10 11:29:01

『基礎からのWebアプリケーション開発入門』のP.116のリスト3-17の80行目に resp.printWriter.flush() という行があります。 すごく基本的な質問かもしれないですが、たとえば「メモリ上にだけ持っていてディスクに書き出していないデータがあるかもしれないのでflush」というイメージは分かるのですが、このサンプルの場合はメモリ上のデータのやり取りだけなので、flushを何のために行っているのか分かりませんでした。 宜しければ、ここでflush()を使用している意図を教えて頂きたいです。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2041] Re:C言語ポインタ完全制覇 第1版 4-2-1 可変長配列の配列についての質問
投稿者:(ぱ)こと管理人
2017/12/09 22:06:21

>ここで、このプログラムにおいて、キーボードからの入力(stdin)は、 >void read_slogan(FILE *fp, char **slogan)側で、ファイル(FILE *fp)として、 >認識されるのでしょうか。 すみません、何が質問なのかよくわかりませんが、 リダイレクトでファイルが読み込める、という挙動についてであれば、 read_slogan < slogan.txt というのは、read_sloganの標準入力をslogan.txtというファイルからの入力に 切り替えるという意味です。 標準入力(stdin: standard input)は、デフォルトでキーボードなのですが、 それをファイルからの入力に切り替えているので、 void read_slogan(FILE *fp, char **slogan)側では、fpからslogan.txtの 内容を読むことができます。 これで回答になっておりますでしょうか?
[この投稿を含むスレッドを表示] [この投稿を削除]
[2040] Re:setCookieについて
投稿者:(ぱ)こと管理人
2017/12/09 21:37:53

>『基礎からのWebアプリケーション開発入門』のP.142の1行目に >「もし、Cookieを複数送りたかったら...」とあります。 >しかし、リスト4-3の29行目からのsetCookieは値を上書きしているように見えます。 >掲示板の動作には影響無いと思いますが、誤植ではないでしょうか? この掲示板の投稿画面のHTMLソースを開いてJavaScriptを見ていただくと、 以下のようになっています。 function set_cookie(key, val) { document.cookie = key + "=" + escape(val) + "; expires=Wed, 01-Jan-2031 00:00:00 GMT;"; } function set_cookies() { set_cookie("name", document.mainForm.name.value); set_cookie("url", document.mainForm.url.value); set_cookie("password", document.mainForm.password.value); } 同様のset_cookieの実装で、複数のCookieを設定することができています。 確かに、代入文を見るとどう見ても上書きに見えるので、妙な仕様だと思いますが、 たとえば以下のMozillaのサンプルでも https://developer.mozilla.org/ja/docs/Web/API/Document/cookie 以下のようにあります。 document.cookie = "name=oeschger"; document.cookie = "favorite_food=tripe"; alert(document.cookie); // displays: name=oeschger;favorite_food=tripe
[この投稿を含むスレッドを表示] [この投稿を削除]
[2039] 『センス・オブ・プログラミング!』の正誤について
投稿者:藤四郎
2017/12/07 22:52:50

『センス・オブ・プログラミング!―抽象的に考えること・データ構造を理解す ること』(第1刷) こちらも大変興味深く楽しく拝読しました。コンパクトな本に「低レベル」か ら「高レベル」までのしくみの解説やノウハウで盛りだくさんで、これらの内 容を血肉化できれば自分にもアプリ開発は夢ではないと思いましたので、これ からも何度も読み返すでしょう。 さて、またご面倒をおかけしますが、以下についてそちらの正誤表への追加を ご検討お願いいたします。年末のお忙しい時期におそれいりますが、またご都 合のよろしいときにでもご対応いただければ幸いです。 p.94 本文 l.4 > 逆行していています p.109 l.1 > 脳内になる p.142 l.17 > Congraturations Congratulations p.149 l.4 > なけばならなくなってしまう。 p.177 4-3-9 スタック > 先入れ後出し方式(LIFO--Last In First Out) 後入れ先出し Last In First Out 先入れ後出し First In Last Out どちらも同じ事柄をさしているとは思いますが、念のためエラッタの候補としてあげます。 p.180 下から 9 行目 > 追加すべき要素 「検索すべき要素」だと思います。 p.183 > 27人集れば、誕生日が衝突する確率は50%を超えます。 https://ja.wikipedia.org/wiki/%E8%AA%95%E7%94%9F%E6%97%A5%E3%81%AE%E3%83%91%E3%83%A9%E3%83%89%E3%83%83%E3%82%AF%E3%82%B9 によれば 23 人とのことです。ちなみに、手元の計算でも $ awk 'BEGIN { p1 = 1; p2 = 0; n = 1; > while (p2 <= 0.5) { ++n; p1 *= (365 - n + 1) / 365; p2 = 1 - p1 } > print n, p2 }' 23 0.507297 となりました。 p.192 l.2 > O(1/2N^2) これは誤りとまではいえないとは思いますが、一応、より細かいことをいえば (N-1) + (N-2) + ... + 1 = N(N-1)/2 かと。 (つまり、無視するのは定数の係数だけでなく第二項以降も。) p.226 注 l.4 > sturct p.250 リスト6-1 l.5 > 多重度が0..* p.246 の記述からして「多重度が1..*」が適切と思います。 p.272 図6-16 > 行かページを 「行がページを」だと思います。 同図 > 表示対象範囲に部分的に含まれる段落 「ページをまたがる段落」だと思います。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2038] Re:『Java 謎』3.3 寄り道 - Cで継承を実現してみる
投稿者:藤四郎
2017/12/07 22:30:08

ご返信ありがとうございます。 >確かに動きますが、ポインタのキャストはやはり荒業なので、 >可能であれば避けるべきかとは思います。 一歩間違えると、領域破壊や原因究明困難なバグにつながるのでしょうね。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2037] setCookieについて
投稿者:くまきち
2017/12/07 22:26:27

『基礎からのWebアプリケーション開発入門』のP.142の1行目に「もし、Cookieを複数送りたかったら...」とあります。しかし、リスト4-3の29行目からのsetCookieは値を上書きしているように見えます。掲示板の動作には影響無いと思いますが、誤植ではないでしょうか?
[この投稿を含むスレッドを表示] [この投稿を削除]
[2036] Re:C言語ポインタ完全制覇 第1版 4-2-1 可変長配列の配列についての質問
投稿者:884
2017/12/07 14:08:14

早速の&ご丁寧なご回答ありがとうございます。 サンプルプログラムの内容が理解できました。 OSは、Windows7です。 統合開発環境 VS 2015のVisualC++ Win32コンソールアプリケーションでプロジェクトを作成し、サンプルプログラムの動作確認をしています。 >stdinはキーボードからの入力なので、たとえばコマンドプロンプトで動かしているのならそのままそこでキーボードから打ち込んでも入力できますし、 キーボードからの入力を、7回行ったら、入力した文字が画面に表示されました。 VS 2015のコンソール画面で、slogan.txt(標語ファイル名)をキーボード入力するとファイルが読込まれると勘違いして、ファイル名を入力をしていました。 >たとえば実行形式名がread_slogan.exeで標語ファイルがslogan.txtなら >read_slogan < slogan.txt >のようにリダイレクトで読み込ませる方法もあります。 コマンドプロンプト上で、VS 2015で生成されたread_slogan.exeに、slogan.txt(標語ファイル名)をリダイレクトで読み込ませて、表示することができました。 ここで、このプログラムにおいて、キーボードからの入力(stdin)は、void read_slogan(FILE *fp, char **slogan)側で、ファイル(FILE *fp)として、認識されるのでしょうか。 度々、申し訳ありませんが、ご教示お願いいたします。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2035] Re:C言語ポインタ完全制覇 第1版 4-2-1 可変長配列の配列についての質問
投稿者:(ぱ)こと管理人
2017/12/07 01:22:42

はじめまして。 >read_slogan(stdin, slogan); > >のstdinは、キーボードの入力と考えていますが、何を入力すればよいでしょうか。 >1週間分の標語ファイル(.txt)を読み込ませたいのですが、うまくいきません。 stdinはキーボードからの入力なので、たとえばコマンドプロンプトで動かしているのなら そのままそこでキーボードから打ち込んでも入力できますし、 たとえば実行形式名がread_slogan.exeで標語ファイルがslogan.txtなら read_slogan < slogan.txt のようにリダイレクトで読み込ませる方法もあります。 実行しているOSが何かわかりませんが、リダイレクトはWindowsでもMacOSでも Linuxでも使えるので、ぐぐってみてはいかがでしょうか。 たとえばWindowsなら、今探しましたが、以下のようなページがあります。 https://www.adminweb.jp/command/redirect/index4.html
[この投稿を含むスレッドを表示] [この投稿を削除]
[2034] Re:</form>について
投稿者:(ぱ)こと管理人
2017/12/07 01:16:56

>『基礎からのWebアプリケーション開発入門』のP.140にあるリスト4-3について。 >59行目にある</form>は誤植でしょうか? >些細な内容かと思いますが、念の為。 > >仮に誤植だとすると、P.100にあるリスト3-9の37行目も同様かも知れません。 ご指摘ありがとうございます。 formを二重に閉じてしまっていますね。正誤表に上げさせていただきます。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2033] Re:『Java 謎』3.3 寄り道 - Cで継承を実現してみる
投稿者:(ぱ)こと管理人
2017/12/07 01:11:57

>また、『C 言語ポインタ完全制覇』改訂版の発売おめでとうございます。 ありがとうございます。 >>MethodTableIndexは利用者に晒す必要はないので、Shape.hに移動するのは >>よろしくないかと思います。 > >そうしますと、自分自身とサブクラスに公開する "ShapeP.h" にではいかがで >しょう。 サブクラスは各メソッドのインデックスを知る必要はあるでしょうから、 ShapeP.hに置くことになるかと思います。本にあるPolyine.cとかでは、 配列の初期化子にしれっと書くことで、DRAW_INDEXを見ずに済んでいますが…… >ひとつ、またまぬけかもしれない質問を―― >p.179 List 3.16 l.19 などで super.super.…を回避するのに > ((Object *)p)->classDescriptor = &polylineClassDescriptor; >とかやるのはやっばりまずいですか。 (一応、動いてる模様ですが…。) 確かに動きますが、ポインタのキャストはやはり荒業なので、 可能であれば避けるべきかとは思います。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2032] C言語ポインタ完全制覇 第1版 4-2-1 可変長配列の配列についての質問
投稿者:884
2017/12/06 13:57:34

はじめまして。 現在、C言語ポインタ完全制覇 第1版で学習しています。 4-2-1 可変長配列の配列で疑問があり、質問させていただきます。 List4-5 read_slogan.cで、 read_slogan(stdin, slogan); のstdinは、キーボードの入力と考えていますが、何を入力すればよいでしょうか。 1週間分の標語ファイル(.txt)を読み込ませたいのですが、うまくいきません。 ご教示お願いいたします。 --------------------------------- #include <stdio.h> #include <stdlib.h> #include <string.h> void read_slogan(FILE *fp, char **slogan) { char buf[1024]; int i; for (i = 0; i < 7; i++) { fgets(buf, 1024, fp); /* 改行文字を削除 */ buf[strlen(buf)-1] = '\0'; /* 標語ひとつ分の領域を確保 */ slogan[i] = malloc(sizeof(char) * (strlen(buf) + 1)); /* 標語の内容をコピー */ strcpy(slogan[i], buf); } } int main(void) { char *slogan[7]; int i; read_slogan(stdin, slogan); /* 読み込んだ標語を表示する */ for (i = 0; i < 7; i++) { printf("%s\n", slogan[i]); } return 0; } ---------------------------------
[この投稿を含むスレッドを表示] [この投稿を削除]
[2031] </form>について
投稿者:くまきち
2017/12/05 21:14:35

『基礎からのWebアプリケーション開発入門』のP.140にあるリスト4-3について。 59行目にある</form>は誤植でしょうか? 些細な内容かと思いますが、念の為。 仮に誤植だとすると、P.100にあるリスト3-9の37行目も同様かも知れません。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2030] Re:『Java 謎』3.3 寄り道 - Cで継承を実現してみる
投稿者:藤四郎
2017/12/04 19:57:15

今回も懇切なご説明ありがとうございます。 また、『C 言語ポインタ完全制覇』改訂版の発売おめでとうございます。わた しも、 Java の学習曲線がそれなりにゆるやかに感じられるようになったら、 ぜひ拝読して C もちゃんと理解できるようになりたいと思います。 >趣旨としては、複数階層の継承を実現するにはどうすればよいか、ということで >よいでしょうか。 はい。 >MethodTableIndexは利用者に晒す必要はないので、Shape.hに移動するのは >よろしくないかと思います。 そうしますと、自分自身とサブクラスに公開する "ShapeP.h" にではいかがで しょう。 >ただ、上記mtの型は、宣言にあるとおり「voidを返す関数へのポインタへのポインタ」 >なので、sizeof(mt)ではポインタのサイズしか取れません。 初心者らしくやっぱりやらかしてしまいました。 じつは、いただいたご説明をコードに落とすべくそれなりに格闘したのですが、 お恥ずかしいことにとりあえず挫折します。『C 言語ポインタ完全制覇』改訂 版の拝読後に捲土重来を期して…。 ひとつ、またまぬけかもしれない質問を―― p.179 List 3.16 l.19 などで super.super.…を回避するのに ((Object *)p)->classDescriptor = &polylineClassDescriptor; とかやるのはやっばりまずいですか。 (一応、動いてる模様ですが…。) # わたしの理解吸収力がたんにしょぼいだけといえばそれまでではありますが、 # 『Java 謎+落とし穴』は読み返すたびに新たな発見があります。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2029] Re:『Java 謎』3.3 寄り道 - Cで継承を実現してみる
投稿者:(ぱ)こと管理人
2017/12/02 00:40:59

>『Java 謎+落とし穴 徹底解明』 3.3 寄り道 - Cで継承を実現してみる >p.177 - List 3.11 - 3.22 について、 たとえば ExtendedPolyline を追加す >るとしたらどうするのか、つたないながら考えてみました。 趣旨としては、複数階層の継承を実現するにはどうすればよいか、ということで よいでしょうか。 >まず、 Shape.c の MethodTableIndex を Shape.h に移動するのはまずいでしょ >うか。しかし、そうしたとして、あとは以下のファイルを改変または追加しました。 >(なお、 Shape は abstract 相当と理解しております。) Shape.hは利用者側(たとえばmain.c)でも#includeするヘッダファイルですが、 MethodTableIndexは利用者に晒す必要はないので、Shape.hに移動するのは よろしくないかと思います。 >/* このへんがとりわけリアリティにかけるのかも…… */ >void initExtendedPolyline(void) { > ClassDescriptor *cd = getPolylineClassDescriptor(); > void (**mt)() = cd->methodTable; > memcpy(methodTable, mt, sizeof(mt)); > methodTable[(int)DRAW_INDEX] = drawExtendedPolylineImpl; >} まず、このmemcpy()は、ExtendedPolyline独自のmethodTableについて、 いったんそのスーパークラスであるPolylineのmethodTableをコピーしておいて、 その中で特定のメソッドだけをオーバーライドするためのものかと思います。 ただ、上記mtの型は、宣言にあるとおり「voidを返す関数へのポインタへのポインタ」 なので、sizeof(mt)ではポインタのサイズしか取れません。 この形で複数階層の継承を実現するには、スーパークラスのメソッドテーブルに 何個のメソッドがあるのかを、できればコンパイル時に知りたい(メソッドテーブルを malloc()で確保するなら別ですが、静的に決まる数の要素をmalloc()で確保するのは 避けたい)わけで、そうなると、各クラスのヘッダファイルを、 アプリケーションに公開するもの、自分自身のサブクラスのみに公開するものに 分ける必要があるかと思います。実際、Xt Intrinsicsや http://kmaebashi.com/programmer/c_yota/inherit.html こちらのサンプルでは、Polyline.hとPolylineP.hを分けています。 また、クラスディスクリプタを初期化する関数を用意するのは良いとして、 それを、利用者側(main.c)から呼び出させるのは美しくないですよね。 この場合、Objectクラスのクラスディスクリプタに、 ・クラスディスクリプタが初期化されているかどうかのフラグ ・スーパークラスのクラスディスクリプタへのポインタ ・クラスディスクリプタを初期化する関数へのポインタ を持たせてやって、 PolylineやRectangleのような各クラスで、それぞれのクラスディスクリプタへの ポインタをグローバル変数として公開し、 /* PolylineClassがPolylineのクラスディスクリプタへのポインタ */ Polyline *polyline = new_instance(PolylineClass); このnew_instanceの中で、 渡されたポインタの指す先のクラスディスクリプタが初期化されていなければ、 そのクラスディスクリプタを初期化する関数を呼び出す。ただしそれを、 親クラスへ遡りながら親クラスから順に行う。 という処理を行えば、クラスディスクリプタの初期化処理を フレームワーク内で行えるのではないでしょうか。 また、new_instanceの中では、各クラスの「コンストラクタ」を 呼ぶこともできます。 こちらのサンプルでは、 http://kmaebashi.com/programmer/c_yota/inherit.html クラスディスクリプタを初期化する関数へのポインタclass_initializerを Coreのクラスディスクリプタに持たせているにもかかわらず、 それを呼び出す処理がどこにも書いてないですね…… orz
[この投稿を含むスレッドを表示] [この投稿を削除]
[2028] 『Java 謎』3.3 寄り道 - Cで継承を実現してみる
投稿者:藤四郎
2017/11/29 00:44:18

『Java 謎+落とし穴 徹底解明』 3.3 寄り道 - Cで継承を実現してみる p.177 - List 3.11 - 3.22 について、 たとえば ExtendedPolyline を追加す るとしたらどうするのか、つたないながら考えてみました。 ここのところいろいろご面倒をおかけしておりますが、またよろしければご叱 正いただけると幸いです。 (なお、 http://kmaebashi.com/programmer/c_yota/inherit.html も拝見しましたが、申し訳ないことにいまのわたしには難解でした。) まず、 Shape.c の MethodTableIndex を Shape.h に移動するのはまずいでしょ うか。しかし、そうしたとして、あとは以下のファイルを改変または追加しました。 (なお、 Shape は abstract 相当と理解しております。) ---- Polyline.h ----------------------------------------- #ifndef POLYLINE_H_INCLUDED #define POLYLINE_H_INCLUDED #include "Shape.h" #include "Point2D.h" typedef struct { Shape super; int nPoints; Point2D *point; } Polyline; Polyline *createPolyline(void); void drawPolyline(Polyline *polyline); ClassDescriptor *getPolylineClassDescriptor(void); #endif /* POLYLINE_H_INCLUDED */ ---- Polyline.c ----------------------------------------- #include <stdio.h> #include <stdlib.h> #include "Polyline.h" static void drawPolylineImpl(void); static void (*methodTable[])() = { drawPolylineImpl }; static ClassDescriptor polylineClassDescriptor = { methodTable }; ClassDescriptor *getPolylineClassDescriptor(void) { return &polylineClassDescriptor; } Polyline *createPolyline(void) { Polyline *p = malloc(sizeof(Polyline)); p->super.super.classDescriptor = &polylineClassDescriptor; p->nPoints = 0; p->point = NULL; return p; } void drawPolyline(Polyline *polyline) { polyline->super.super.classDescriptor->methodTable[(int)DRAW_INDEX](); } static void drawPolylineImpl(void) { fprintf(stderr, "Polylineを描画\n"); } ---- ExtendedPolyline.h --------------------------------- #ifndef EXTENDED_POLYLINE_H_INCLUDED #define EXTENDED_POLYLINE_H_INCLUDED #include "Polyline.h" #include "Point2D.h" typedef struct { Polyline super; int nPoints; Point2D *point; } ExtendedPolyline; ExtendedPolyline *createExtendedPolyline(void); void drawExtendedPolyline(ExtendedPolyline *extendedPolyline); #endif /* EXTENDED_POLYLINE_H_INCLUDED */ ---- ExtendedPolyline.c --------------------------------- #include <stdio.h> #include <stdlib.h> #include <memory.h> #include "ExtendedPolyline.h" static void drawExtendedPolylineImpl(void); static void (*methodTable[])() = {}; static ClassDescriptor extendedPolylineClassDescriptor = { methodTable }; /* このへんがとりわけリアリティにかけるのかも…… */ void initExtendedPolyline(void) { ClassDescriptor *cd = getPolylineClassDescriptor(); void (**mt)() = cd->methodTable; memcpy(methodTable, mt, sizeof(mt)); methodTable[(int)DRAW_INDEX] = drawExtendedPolylineImpl; } ExtendedPolyline *createExtendedPolyline(void) { ExtendedPolyline *ep = malloc(sizeof(ExtendedPolyline)); /* http://kmaebashi.com/programmer/c_yota/inherit.html には super.super.super.... を回避する裏技が紹介されていますが…… */ ep->super.super.super.classDescriptor = &extendedPolylineClassDescriptor; ep->nPoints = 0; ep->point = NULL; return ep; } void drawExtendedPolyline(ExtendedPolyline *extendedPolyline) { extendedPolyline->super.super.super.classDescriptor->methodTable[(int)DRAW_INDEX](); } static void drawExtendedPolylineImpl(void) { fprintf(stderr, "ExtendedPolylineを描画\n"); } ---- draw.h --------------------------------------------- #include "Shape.h" void draw(Shape **shapes); ---- draw.c --------------------------------------------- /* http://kmaebashi.com/bbs/thread.php?boardid=kmaebashibbs&from=1906&range=1 */ #include <stdio.h> #include "Shape.h" void draw(Shape **shapes) { int i; for (i = 0; i < 4; i++) { drawShape(shapes[i]); } } ---- main.c --------------------------------------------- #include <stdio.h> #include "Shape.h" #include "Polyline.h" #include "Circle.h" #include "Rectangle.h" #include "ExtendedPolyline.h" #include "draw.h" int main(void) { Shape *shapes[4]; int i; initExtendedPolyline(); shapes[0] = (Shape*)createPolyline(); shapes[1] = (Shape*)createCircle(); shapes[2] = (Shape*)createRectangle(); shapes[3] = (Shape*)createExtendedPolyline(); draw(shapes); printf("\n"); drawPolyline(createPolyline()); drawPolyline((Polyline*)createExtendedPolyline()); drawExtendedPolyline(createExtendedPolyline()); return 0; } ---------------------------------------------------------
[この投稿を含むスレッドを表示] [この投稿を削除]
[2027] Re:『Java謎+落とし穴徹底解明』の正誤について
投稿者:(ぱ)こと管理人
2017/11/27 23:50:41

>は p.74 のあやまりと思われますので、またもやこまかすぎる指摘になってしまい恐縮ですが、念のためよろしくお願いいたします。 修正しました。 何度もご指摘ありがとうございます。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2026] Re:『Java謎+落とし穴徹底解明』の正誤について
投稿者:藤四郎
2017/11/26 09:27:24

正誤表の追加、ありがとうございました。 ただ、その正誤表に関して、ただし今回とは別件で、 http://kmaebashi.com/nazojava/seigo.html#p74 >p.68 8行目 >誤 > >ことにになり > >正 > >ことになり は p.74 のあやまりと思われますので、またもやこまかすぎる指摘になってしまい恐縮ですが、念のためよろしくお願いいたします。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2025] Re:『Java謎+落とし穴徹底解明』の正誤について
投稿者:藤四郎
2017/11/19 12:54:41

今回もわたしの読みの浅かったところをくわしく解説してくださってありがと うございます。 Visitor パターンだと >「クリックした座標との距離を算出するメソッド」や >「図形を移動させるメソッド」、「図形を囲む最小の矩形を算出するメソッド」等も XXXVisitor として散らばってかくことになるところ……ということですね。 >私の想定したShapeRuntimeは、Shapeとセットになっており、Shapeを >使うあらゆるプログラムで使用するものです。 Shape と draw() を分離することだけかんがえてて、そこまで頭がまわりませ んでした。納得です。 おかげさまで (まだまだ真にふかい理解にはほどとおいですが) Java のしく みがかなりわかってきたような気がします。『センス・オブ・プログラミング!』 等々も参考にさせていただきつつ、小規模なアプリケーションを自作できるよ うになるのが目標です。 今後も質問等をさせていただくこともあると思いますが、その折にもよろしく お願いいたします。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2024] Re:『Java謎+落とし穴徹底解明』の正誤について
投稿者:(ぱ)こと管理人
2017/11/19 00:13:43

>としか思いつけませんでした。しかし、こうだと Visitor 同様「 if else を >ずらずら」になるように思います。 AbstractFactoryとその実装クラスにcreateXXXRuntime()がずらずら並ぶ、 というのは確かにそうですが、draw()だけでなく、 「クリックした座標との距離を算出するメソッド」や 「図形を移動させるメソッド」、「図形を囲む最小の矩形を算出するメソッド」等も DrawShapeRuntimeに入れておけば、それを呼び出すところでは、図形の種類分だけの 何かをずらずら書く必要はなくなりますよね。 (DrawShapeRuntimeというのは、draw()メソッドだけ持っていそうな名前なので、 この名前はよくなかったかもしれません…… 付けるならDrawToolShapeRuntimeでしょうか) >また、各 Shape のコンストラクターに >AbstractFactory の分の引数を追加することになるのでしょうか。 それでもよいですし、ShapeRuntimeは、ドローツールならドローツール、 図形ファイルを読み込んで解析するプログラムならそのプログラム、 というように、プログラムの種類ごとに作ることになるのでしょうから、 どこかにstaticに持ってしまってもよいような気もします。 Javaだと、「図形ファイルを読み込んで解析するプログラム」では デシリアライザを使って図形ファイルを読み込むのでしょうから、 その場合、ShapeRuntimeはreadObject()でくっつけることになりますから、 AbstractFactoryはそこから手が届くところにある必要がありますし。 >ちなみに、つぎのようにするのではだめでしょうか。 … >abstract class ShapeRuntime { > protected DrawShapeRuntime drawShapeRuntime; > > abstract DrawShapeRuntime getDrawShapeRuntime(); >} もともとの趣旨として、 「Shapeクラスは、ドローツールだけでなく、たとえばドローツールで作った ファイルを解析する別のプログラムでも使う」 というものがありました。 その点で、このShapeRuntimeは、「ドローツール」と、 「ドローツールで作ったファイルを解析する別のプログラム」で 共用するものなのでしょうか。 私の想定したShapeRuntimeは、Shapeとセットになっており、Shapeを 使うあらゆるプログラムで使用するものです。そして、ドローツールだけで 使うShapeRuntimeのサブクラスがDrawShapeRuntimeです。 同じ趣旨なのであれば、ShapeRuntimeのメソッドの戻り値の型として、 DrawShapeRuntimeが出てきてしまっては、ShapeRuntimeがドローツール 専用品に依存してしまうので、よろしくないのではないでしょうか。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2023] Re:『Java謎+落とし穴徹底解明』の正誤について
投稿者:藤四郎
2017/11/16 19:37:20

詳しく解説くださり、ありがとうございます。 adjustBoundary() に引数をわ たすとなると、ワールド座標系版とデバイス座標系版にわけるのがすじという ようなはなしになってしまうので、引数なしの adjustBoundary() を採用され たというわけですね。疑問がすっきり解消しました。 さて、 p. 228 「別の方法」について、そもそも Abstract Factory パターン をよくわかってないのでとんだ見当はずれだったらもうしわけありませんが、 「各 Shape のオブジェクトに……くっつける」ときに使い、「いざ描画すると きには…… DrawShapeRuntime にダウンキャスト」するとなると、 abstract class AbstractFactory { abstract PolylineRuntime createPolylineRuntime(Polyline polyline); abstract CircleRuntime createCircleRuntime(Circle circle); abstract RectangleRuntime createRectangleRuntime(Rectangle rectangle); } class DrawFactory extends AbstractFactory { PolylineRuntime createPolylineRuntime(Polyline polyline) { return new DrawPolylineRuntime(polyline); } // ... } としか思いつけませんでした。しかし、こうだと Visitor 同様「 if else を ずらずら」になるように思います。また、各 Shape のコンストラクターに AbstractFactory の分の引数を追加することになるのでしょうか。 ちなみに、つぎのようにするのではだめでしょうか。 abstract class Shape { ShapeRuntime shapeRuntime; } abstract class ShapeRuntime { protected DrawShapeRuntime drawShapeRuntime; abstract DrawShapeRuntime getDrawShapeRuntime(); } class PolylineRuntime extends ShapeRuntime { PolylineRuntime(Polyline polyline) { this.drawShapeRuntime = new DrawPolylineRuntime(polyline); } DrawShapeRuntime getDrawShapeRuntime() { return this.drawShapeRuntime; } } interface DrawShapeRuntime { void draw(Drawable d); } class DrawPolylineRuntime implements DrawShapeRuntime { // 「 PolylineRuntime を継承」無用 private Polyline polyline; DrawPolylineRuntime(Polyline polyline) { this.polyline = polyline; } public void draw(Drawable d) { Point2D[] points = this.polyline.getPoints(); for (int i = 0; i < points.length - 1; i++) { d.drawLine(points[i].getX(), points[i].getY(), points[i+1].getX(), points[i+1].getY()); } } } class Polyline extends Shape { private Point2D[] points; public Polyline(Point2D[] points) { this.points = points; this.shapeRuntime = new PolylineRuntime(this); } public Point2D[] getPoints() { return this.points; } } // Circle, Rectangle の対応分は略 /* XDrawCanvas の paint() の shape.draw(this.drawWindow); を shape.shapeRuntime.getDrawShapeRuntime().draw(this.drawWindow); // 「DrawShapeRuntime にダウンキャスト」不要 に変更。 */
[この投稿を含むスレッドを表示] [この投稿を削除]
[2022] Re:『Java謎+落とし穴徹底解明』の正誤について
投稿者:(ぱ)こと管理人
2017/11/16 01:05:52

>と (あるいは、いっそ adjustBoundary() の中身を resize() に移動) されなかったのは >どうしてかと思いまして。 adjustBoundary() は意味的に引数をとるような処理ではないし、 > resize() では今後の拡張次第で別の処理もありうるがこのバージョンでは >adjustBoundary() だけ、ということなのでしょうか……。 resize()はリサイズですし、adjustBoundary()は範囲合わせなので別の名前で 別のメソッドにするのが自然なように思います。 確かにこのケースでは、resize()の時しかadjustBoundary()は呼びませんが、 たとえば私が大昔に作ったこちらのプログラム http://kmaebashi.com/programmer/serializer/draw.html では、ZoomやPanの機能があります。このプログラムでは、Zoom時は 別ウインドウが開くのでちょっと特殊ですが、 ・マウスで長方形を指定すると、その範囲がウインドウ全体になるように  拡大されるZoom機能。 ・マウスで座標を指定するとその位置が中心になるように移動するPan機能。 といったものを考えると、 「ワールド座標系で範囲を設定し、adjustBoundary()を呼び出せばけりがつく」 というのは、悪くない方針のように思います。 ただ、そういう意味だと、むしろ「ワールド座標系で範囲を設定し…」の部分が 「事前に変数に値を設定しておく」というグローバル変数渡しまがいで 気持ちが悪いので、むしろadjustBoundary()にはxmin, ymin, xmax, ymaxを 引数として渡すべきだったかな、と思わなくはないですが、 それはそれでウインドウサイズを変えた時にはデバイス座標系での領域変更が 起点になるわけで、では入口のメソッドとしてデバイス座標系起点のadjustBoundaryByDc()とワールド座標系起点のadjustBoundaryByWc()を作って 前者にはwidth, heightを、後者にはxmin, ymin, xmax, ymaxを渡そうか、 とか考え始めるときりがないですね。 まあ、このあたりは、何が正解とも言えない話なのではないかと思います。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2021] Re:『Java謎+落とし穴徹底解明』の正誤について
投稿者:藤四郎
2017/11/13 19:04:42

貴重なお時間を割いていただき、改めてありがとうございます。 >JLSから引用するのに勝手に変えるわけにもいかずにこうしたのではないかと >思います(記憶の彼方ですが…)。 >ここはこのままとさせてください。 了解しました。 >>X-Draw のソースで DrawWindow.java の l. 110 - >> public void mouseDown(int x, int y) {} >> public void mouseUp(int x, int y) {} >> public void mouseDrag(int x, int y) {} >>は不要と思われます。 > >本当ですね。この手の空メソッドはインタフェースにあるシグネチャのうち >不要なものについて書くのが普通ですが、それにしてもメソッド名から違うので、 >なぜあるのか不明です。正誤表に載せておきます。 僭越ながら、 java.awt.Component に public boolean mouseDown(Event evt, int x, int y) Deprecated. As of JDK version 1.1, replaced by processMouseEvent(MouseEvent). というのはあるので、古い版の X-Draw のがまぎれこんでいたのかもしれません。 >>あと、 l. 164 - >> public void resize(int width, int height) { >> this.adjustBoundary(); >> } >>ですが、今後の拡張を見込んでこのようにされたのでしょうか。 > >このメソッドは普通に呼ばれていますし、試しに処理を抜いてみたら、 >倍率の計算がされずに何も描かれないので、必要なのではないでしょうか。 すみません、言葉足らずすぎでした。 XDrawCanvas.java の l. 39 - で Dimension d = getSize(); drawWindow.resize(d.width, d.height); また、 DrawWindow.java の l. 96 - で private void adjustBoundary() { Dimension canvasSize = canvas.getSize(); double xScale = canvasSize.width / (this.xMax - this.xMin); double yScale = canvasSize.height / (this.yMax - this.yMin); となっているのは、一見 getSize() の二度手間に思えます。つまり、 private void adjustBoundary(int width, int height) { double xScale = width / (this.xMax - this.xMin); double yScale = height / (this.yMax - this.yMin); // ... } public void resize(int width, int height) { this.adjustBoundary(width, height); } と (あるいは、いっそ adjustBoundary() の中身を resize() に移動) されなかったのはどうしてかと思いまして。 adjustBoundary() は意味的に引数をとるような処理ではないし、 resize() では今後の拡張次第で別の処理もありうるがこのバージョンでは adjustBoundary() だけ、ということなのでしょうか……。 ところで、 p. 228 「別の方法」についてもお伺いしたいことがありますけれども、長くなるので別稿にて。 あと、自分の投稿 http://kmaebashi.com/bbs/list.php?boardid=kmaebashibbs&from=2017&range=1 につっこみですが shape.accept(new DrawVisitor(this.drawWindow)); ここは while ループ内なのでここで new するのは効率的にまずいですね。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2020] Re:『Java謎+落とし穴徹底解明』の正誤について
投稿者:(ぱ)こと管理人
2017/11/13 01:15:51

週末に返信と言っておきながら日付が変わってしまいました。 遅くなりまして申し訳ありません。 >p. 147 の英文で [emphasis is in the original text] とあるのが反映されていません。 英語版の方で強調部分が太字になっていないということですね。 正誤表に載せておきます。 >また、和訳の方で「どのオブジェクトも参照しない特殊なnull参照」に相当する英文がないです。 この「どのオブジェクトも参照しない特殊なnull参照」という文言は、 JLSには含まれていて、日本語部分はそこから持ってきています。 このFAQのオリジナルの文章をWayback Machineから発掘したところ 「are pointers to these objects."」までで止まっていますが、 JLSから引用するのに勝手に変えるわけにもいかずにこうしたのではないかと 思います(記憶の彼方ですが…)。 ここはこのままとさせてください。 >X-Draw のソースで DrawWindow.java の l. 110 - > public void mouseDown(int x, int y) {} > public void mouseUp(int x, int y) {} > public void mouseDrag(int x, int y) {} >は不要と思われます。 本当ですね。この手の空メソッドはインタフェースにあるシグネチャのうち 不要なものについて書くのが普通ですが、それにしてもメソッド名から違うので、 なぜあるのか不明です。正誤表に載せておきます。 >あと、 l. 164 - > public void resize(int width, int height) { > this.adjustBoundary(); > } >ですが、今後の拡張を見込んでこのようにされたのでしょうか。 このメソッドは普通に呼ばれていますし、試しに処理を抜いてみたら、 倍率の計算がされずに何も描かれないので、必要なのではないでしょうか。 > p.227 の interface Visitor の三つのシグネチャーの頭に void がいるかと。 その通りです。正誤表に載せておきます。 また、 p.228 の > v.visitPolyline(polyline); >は実際には > v.visitPolyline(this); >になるかと。 こちらもその通りです。正誤表に載せておきます。 >ただ、またいまごろきづいてしまいましたが、 p. 228 l. 7 > visitPolyline(), visitCircle, visitRectangle こちらもその通りです。正誤表に載せておきます。 いろいろご指摘ありがとうございました。 >ちなみに、つぎのようにかきましたが、これで適当でしょうか。 >(Polyline たちから draw() を排除するかわりに getter を >いれなければならなくなったのがどうも……。) 描画をPolyline等ではなくDrawVisitorで行うようにしたのですから、 DrawVisitorに対し中身を開示しなければ描画できないというのは、 まあ、しょうがないですよね。 実際問題として、PolylineのようなCでいうところの構造体的なクラスが 外部に中身を開示しないというのは無理があるのではないかなあ、と、 この例を見ても思います。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2019] Re:『Java謎+落とし穴徹底解明』の正誤について
投稿者:藤四郎
2017/11/08 20:53:59

大変お忙しい中、おそれいります。こちらはまったく急ぎませんので、ご都合のよろしいときにご対応いただければ幸いです。 ただ、またいまごろきづいてしまいましたが、 p. 228 l. 7 visitPolyline(), visitCircle, visitRectangle 後二者に "()" がないので、こちらもよろしくお願いします。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2018] Re:『Java謎+落とし穴徹底解明』の正誤について
投稿者:(ぱ)こと管理人
2017/11/08 08:27:48

ご指摘ありがとうございます。ちょっとどたばたしておりまして対応が遅れておりまして申し訳ありません。 週末にはご回答いたします。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2017] Re:『Java謎+落とし穴徹底解明』の正誤について
投稿者:藤四郎
2017/11/05 20:16:43

おくればせながら、正誤表の追加とソースの訂正、ありがとうございました。おそれいりますが、またいくつかきづいてしまいましたので、ふたたびご面倒をおかけします。今回も当方の勘違いがありましたらお許しください。 (才能に乏しいようでなかなか理解がすすみませんが、趣味としてこつこつやっております。) まずは、またもや細かいことですみませんが……。 p. 147 の英文で [emphasis is in the original text] とあるのが反映されていません。和訳の方はされています。また、和訳の方で「どのオブジェクトも参照しない特殊なnull参照」に相当する英文がないです。 X-Draw のソースで DrawWindow.java の l. 110 - public void mouseDown(int x, int y) {} public void mouseUp(int x, int y) {} public void mouseDrag(int x, int y) {} は不要と思われます。 あと、 l. 164 - public void resize(int width, int height) { this.adjustBoundary(); } ですが、今後の拡張を見込んでこのようにされたのでしょうか。 3.6.7 「本当にdraw()をShapeに入れてよいのか?」が、コードを実地にかいてみることでようやくわかってきました。それできづいたのですが、 p.227 の interface Visitor の三つのシグネチャーの頭に void がいるかと。また、 p.228 の v.visitPolyline(polyline); は実際には v.visitPolyline(this); になるかと。 ちなみに、つぎのようにかきましたが、これで適当でしょうか。(Polyline たちから draw() を排除するかわりに getter をいれなければならなくなったのがどうも……。) class Polyline extends Shape { private Point2D[] points; Polyline(Point2D[] points) { this.points = points; } public Point2D[] getPoints() { return this.points; } void accept(Visitor v) { v.visitPolyline(this); } } // Circle, Rectangle は略 class DrawVisitor implements Visitor { Drawable drawable; DrawVisitor(Drawable drawable) { this.drawable = drawable; } public void visitPolyline(Polyline polyline) { Point2D[] points = polyline.getPoints(); for (int i = 0; i < points.length - 1; i++) { drawable.drawLine(points[i].getX(), points[i].getY(), points[i + 1].getX(), points[i + 1].getY()); } } // visitCircle(), visitRectangle() は略 } XDrawCanvas の paint() の shape.draw(this.drawWindow); を shape.accept(new DrawVisitor(this.drawWindow)); に変更。 その他、まだ消化しきれていないこともありますので、今後もご面倒をおかけしてしまうかもしれませんが、どうぞよろしくお願いします。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2016] Re:P.124の補足について
投稿者:くまきち
2017/10/14 22:48:49

毎回、ご回答ありがとうございます。 引き続き熟読させて頂きます。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2015] Re:P.124の補足について
投稿者:くまきち
2017/10/14 22:47:04

了解いたしました。 よろしくお願い致します。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2014] Re:testbbs_jsp2について
投稿者:(ぱ)こと管理人
2017/10/11 01:30:35

>ソースファイルを見ると、16行目の”<!--”に対応した”//-->”が見当たりません。 >これは省略可能ということでしょうか? 「//-->」がないのは、単純に付け忘れです。申し訳ありません。 ただ、これがなくても動くのは、「<!--」「//-->」の趣旨が、 ・もともと<script>タグの中に「<!--」「-->」を書くのは、<script>タグに  対応していない古いブラウザで、JavaScriptが表示されてしまうことを  防ぐためのものである(古い対策なので、今こんなのを書く必要はないと思いますが)。 ・このため、<script>タグ内の冒頭の「<!--」から改行までは無視されることになっている。  http://www.asahi-net.or.jp/~sd5a-ucd/rec-html401j/interact/scripts.html#h-18.2.1  | JavaScriptエンジンは、SCRIPT要素の始めに文字列「<!--」が存在することを  | 許容し、この場合当該行の末尾までの文字を無視する。 ・このコメントを閉じる「-->」は、JavaScriptとして解釈されないように  「//-->」としてコメントアウトする。 というものであるためで、<script>タグに対応していない古いブラウザなら 「<!--」に対応する「-->」がないとコメントが閉じなくて困るでしょうが、 <script>タグに対応したブラウザなら、最初から「<!--」自体無視するので、 閉じてなくても問題にはなりません。 とはいえミスはミスなので、先ほどの件と併せ、正誤表に入れさせていただきます。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2013] Re:P.124の補足について
投稿者:(ぱ)こと管理人
2017/10/11 01:21:15

>P.124の補足に「GETのパラメタもPOSTのパラメタも、URLデコードしないまま・・・」とありますが、P112の52行目でGETのパラメタはURLデコードされているわけではないのでしょうか? すみません、もう記憶はあいまいなのですが、p.112の52行目におけるURLデコードは、 UTF-8固定でデコードしているところからして、ディレクトリ名やファイル名を デコードして正しくファイルを開くためのものです(Modoki/0.2で実装したものです)。 ここで、クエリストリング部分までデコードしてしまっていますが、 クエリストリングはUTF-8でエンコードされているとは限らないので、 これをこの時点でデコードしているのは単純に不具合のように思います。 すみませんが確認しますので少しお時間をください。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2012] testbbs_jsp2について
投稿者:くまきち
2017/10/10 00:21:18

お世話になっております。 たびたび質問させて頂いています。 今回は「testbbs_jsp2」について質問させてください。 ソースファイルを見ると、16行目の”<!--”に対応した”//-->”が見当たりません。 これは省略可能ということでしょうか? 本論とは関係ない初歩的な質問かも知れませんが、よろしければ回答頂ければと思います。 よろしくお願い致します。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2011] 全く初歩の初歩
投稿者:kawashima
2017/10/09 11:40:19

サーバーを作るのとクライアントは同じパソコンだと思うのですが、どうも設定が上手くいきません。よろしくお願いします。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2010] P.124の補足について
投稿者:くまきち
2017/10/08 23:49:22

お世話になってます。 質問があり、投稿させて頂きました。 P.124の補足に「GETのパラメタもPOSTのパラメタも、URLデコードしないまま・・・」とありますが、P112の52行目でGETのパラメタはURLデコードされているわけではないのでしょうか? ひょっとして基本的な事が分かっていないのかもしれませんが、よろしければ回答頂けたらと思います。 よろしくお願いいたします。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2009] Re:Javaの実装の隠ぺいに関して
投稿者:beginner
2017/10/05 11:36:34

ご回答ありがとうございます。 非常に参考になりました。 DIについては軽い知識のみで深く考えたことなかったため、改めて勉強し直すきっかけになりそうです。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2008] Re:Javaの実装の隠ぺいに関して
投稿者:(ぱ)こと管理人
2017/10/05 08:33:28

はじめまして。拙著を読んでいただきありがとうございます。 >しかし、Factory.java内で"import com.sample.libimpl.*"を記載せざるを得ません。 >何を気にしているかというと、Cで言えば、パブリックなヘッダに、プライベートなヘッダを書いているようなコードに見える点です。 >利用者から完全に~impl部分を隠ぺいする一般的な手法はあるのでしょうか。 これは確かにその通りなのですが、私はこれについては 「まあ、Factoryだけはしょうがない」 と考えています。 どこかで実装クラスが何であるかを明示しなければいけない以上、 そこでは実装側のパッケージをimportせざるを得ません。 # 「Java謎+落とし穴~」にどう書いたかと思って見返したら、 # 「実はここが頭の痛いところなのですが~」と書いてますね…… 利用者からさらに実装を隠蔽し、状況によって実装クラスを 差し替える手法として、Dependency Injectionという考え方もあります。 ただ、実装をあまり分離しすぎると、それはそれでわかりにくくなったりもします。 https://twitter.com/kudzu/status/862906043591925762 >DI使ってコード書いてるわし「こんな簡潔にモジュラーでテスタブルなコードが書ける!すごい!天才!」 > DI使った他人のコード読んでるわし「おい、これどこから呼ばれてんだよ。わかんねぇぞ。○すぞ。」
[この投稿を含むスレッドを表示] [この投稿を削除]
[2007] Javaの実装の隠ぺいに関して
投稿者:beginner
2017/10/04 09:56:29

はじめまして、前橋さんの各種書籍で一からからプログラミングの基礎体力づけをさせていただいています。 Javaを使った一般的なコードの書き方で疑問を抱いたことがございます。 下に適当な4つのサンプルプログラムを書きました。 mainを呼び出す利用者にimplの実装を隠ぺいすることを目的としています。 Factoryクラスを経由してインターフェースを返すようにしています。 しかし、Factory.java内で"import com.sample.libimpl.*"を記載せざるを得ません。 何を気にしているかというと、Cで言えば、パブリックなヘッダに、プライベートなヘッダを書いているようなコードに見える点です。 利用者から完全に~impl部分を隠ぺいする一般的な手法はあるのでしょうか。 もしよろしければ教えていただけますと大変助かります。 プログラミング初心者のため勘違い含んでいたりした場合大変恐縮です。 ================================== $ vi com/sample/Main.java package com.sample; import com.sample.lib.*; class Main{ public static void main(String[] args){ Another another = Factory.create(); another.hello(); } } ================================== $ vi com/sample/lib/Factory.java package com.sample.lib; import com.sample.libimpl.*; public class Factory{ public static Another create() { return new AnotherImpl(); } } ================================== $ vi com/sample/lib/Another.java package com.sample.lib; public interface Another { void hello(); } ================================== $ vi com/sample/libimpl/AnotherImpl.java package com.sample.libimpl; import com.sample.lib.*; public class AnotherImpl implements Another { public void hello(){ System.out.println("hello another class"); } } ==================================
[この投稿を含むスレッドを表示] [この投稿を削除]
[2006] 【業務連絡】しばらくドメインが停止していました
投稿者:(ぱ)こと管理人
2017/10/02 23:38:12

9/27の夜あたりから、kmaebashi.comにアクセスできない状態になっておりました。 ご迷惑をおかけしまして申し訳ありませんでした。 <原因> kmaebashi.comは、2004年2月頃に、TwodotsNetなる業者でレンタルサーバを 借りて、その際ドメインも取ったのですが、この業者は2005年4月に 倒産してしまいました。 http://kmaebashi.com/zakki/zakki0039.html#rentalserver その際、ドメインの連絡先メールアドレス(Tech Email)の更新を 怠っていたため、無効なメールアドレスだとしてレジストラが停止措置を 取ったとのことです。修正して復旧していただきました。 当方のミスにてご迷惑をおかけいたしました。 今後ともよろしくお願いいたします。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2005] Re:『Java謎+落とし穴徹底解明』の正誤について
投稿者:(ぱ)こと管理人
2017/09/24 23:53:24

ご指摘の点、正誤表に記載しました。 >>7.3.1の直列化を使った「深いコピー」はある種裏技的なものなので、 >>ここでの「深いコピー」は、あくまで6.5のものを意味しています。 > >お言葉を返すようで恐縮ですが、直列化を使った「深いコピー」は7.3.2で説明され、7.3.1ではその前振りとしてclone()での「深いコピー」の具体的コーディング例が載っています。そして、6.5にはclone()での「深いコピー」の具体的方法の記述は見当たらないようです――というのが私の理解なのですが…。それこそこちらの勘違いでしたら、本当にすみません。 > おっしゃるとおりです。確かに、6.5.ではclone()の実装方法について説明はしていますが、 それは「深いコピー」ではありませんでした。 7.3自体が裏技の説明なので、そこを参照というのも妙な気がしますが、 7.3.1にしか深いコピーの具体的実装はないですね…… 正誤表にはそのように記載しました。ご指摘ありがとうございました。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2004] Re:『Java謎+落とし穴徹底解明』の正誤について
投稿者:藤四郎
2017/09/22 21:34:17

ご返信ありがとうございます。 >15年も前の本ですが、色々ご指摘ありがとうございます。 >次の週末に正誤表に掲載いたします。 私は誤解やら勘違いやらをしょっちゅうやらかす人間なので、ほとんどをご確認いただけて安堵しました。お忙しい中お手数おかけして恐縮ですが、いまなお精読するに値する本だと思うので、よろしくお願いします。 >7.3.1の直列化を使った「深いコピー」はある種裏技的なものなので、 >ここでの「深いコピー」は、あくまで6.5のものを意味しています。 お言葉を返すようで恐縮ですが、直列化を使った「深いコピー」は7.3.2で説明され、7.3.1ではその前振りとしてclone()での「深いコピー」の具体的コーディング例が載っています。そして、6.5にはclone()での「深いコピー」の具体的方法の記述は見当たらないようです――というのが私の理解なのですが…。それこそこちらの勘違いでしたら、本当にすみません。 こちらこそ、ありがとうございます。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2003] Re:『Java謎+落とし穴徹底解明』の正誤について
投稿者:(ぱ)こと管理人
2017/09/21 00:56:22

はじめまして。反応が遅くなりまして申し訳ありません。 15年も前の本ですが、色々ご指摘ありがとうございます。 次の週末に正誤表に掲載いたします。 1点だけ。 >p.99 4行目 >その方法については「6.5 clone()とCloneable」で説明します. >→ 「その」が「深いコピー」を指すのなら、それは7.3.1で説明されているような…。 7.3.1の直列化を使った「深いコピー」はある種裏技的なものなので、 ここでの「深いコピー」は、あくまで6.5のものを意味しています。 >p.340 33行目(下から3行目) >FactoryTestImpl >→ あるいは私の理解が足りないだけかもしれません。しかし、これを直前の段落にあるWindowTestImplに置換すれば理解したつもりになれるのですが…。 ここはWindowsTestImplが正しいです。これが理解の妨げになっておりましたら 申し訳ありません。 ありがとうございました。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2002] 『Java謎+落とし穴徹底解明』の正誤について
投稿者:藤四郎
2017/09/16 21:07:59

はじめまして。 『Java謎+落とし穴徹底解明』は改訂も増刷もされていないのがとても残念です。現行のJavaでは本書で指摘されていた問題点の多くは改善されているらしいですが、本質的な理解を得るのに本書はまだまだ「現役」ではないかと素人ながら思います。(ただ、3.6.7や7.1は、相応の開発経験のない私には、まだしっくり理解できません。) さて、まだそちらの正誤表に載っていない事項を見つけたと思いました。重箱の隅的なものばかりで単に煩わしいかもしれませんが、報告させていただきます。(第4刷) p.37 3行目 fillPatternCodeで指定される色 → fillPatternCodeで指定される中塗りパターン p.74 8行目 ことにになり, p.90 12行目 p2 = new Point(); → Point2D() p.99 4行目 その方法については「6.5 clone()とCloneable」で説明します. → 「その」が「深いコピー」を指すのなら、それは7.3.1で説明されているような…。 p.104 Fig.2.14 1 2 3 4 → 0 1 2 3 p.166 下から2行目 elseif p.203 NOTE IntStackがIntArrayの一部であり → 「IntStackはIntArrayを持っている」ので「IntArrayがIntStackの一部であり」かと思います。 p.212 Fig.3.16 Polyine p.213 List 3.24 XDrawApplet.java l.25 "Polyine" p.214 List 3.30 ShapeIterator.java → 誤りではないですが、 4.2.4 (p.246) との整合性からpublicはないほうがよいのでは? Drawableなどの他のinterfaceではpublicされてないですし…。 p.217 List 3.34 DrawWindow.java l.24, 27 scale → 誤りではないですが、他の箇所ではthis.scaleとされています。 p.217 List 3.34 DrawWindow.java l.126, 143, 151, 158 dcToWcX(e.getX()), dcToWcX(e.getY())); → dcToWcX(e.getX()), dcToWcY(e.getY())); // こちらも、 xMin, yMinを 0にしているため発現しませんが。 p.225 1行目 finish() → finishCommand() p.240 Fig4.3 CLASSPAHT p.340 33行目(下から3行目) FactoryTestImpl → あるいは私の理解が足りないだけかもしれません。しかし、これを直前の段落にあるWindowTestImplに置換すれば理解したつもりになれるのですが…。 p.350 } catch (Exception ex) { err.printStackTrace(); p.354 List 7.1 l.1 import java.security.*; → 不要と思われます。 p.355 1行目 SecurityManagerのgetStackTrace()メソッドは → SecurityManagerのgetClassContext()メソッドは p.357 22行目 兼ね合いもなどある p.365 1行目 Colorというフィールド
[この投稿を含むスレッドを表示] [この投稿を削除]
[2001] Re:P.17:終了のマークとして0を送付について
投稿者:(ぱ)こと管理人
2017/08/23 19:06:08

>一方、TcpServerがserver_send.txtを送る際は、終了のマークとして0を送っていませんし、さらに‐1も送っていませんが、TcpClient側は‐1の受信で受信の終了を認識しています。 TcpClient.javaは、InputStremのread()メソッドで入力を1バイトずつ 読み込んでいますが、read()メソッドは、正常に1バイト読み込んだ時、 0~255の値を返します。つまり、TcpClientが-1を受信するということは あり得ません。-1が返るのは、「ストリームの終わりに達した場合」です。 https://docs.oracle.com/javase/jp/6/api/java/io/InputStream.html#read() なぜクライアントから見てストリームが終わるのかといえば、それは サーバ側でソケットをclose()したからです。 TcpClient.javaにて、終了のマーク0を送信しているのは、このソケットは まだサーバからデータを返すのに使うので、このタイミングでclose()するわけには いかないからです。 これで回答になっておりますでしょうか?
[この投稿を含むスレッドを表示] [この投稿を削除]
[2000] P.17:終了のマークとして0を送付について
投稿者:くまきち
2017/08/21 00:29:24

お世話になっております。 疑問に思った点があり、また質問させて頂きます。 P.16のTcpClient(リスト1-2)では、client_send.txtを送る際、終了のマークとして0を送付することで、P.15のTcpServer(リスト1-1)側は、受信の終了を認識しています。 一方、TcpServerがserver_send.txtを送る際は、終了のマークとして0を送っていませんし、さらに‐1も送っていませんが、TcpClient側は‐1の受信で受信の終了を認識しています。 この違いは、どこから来るものでしょうか? server側とClient側の仕組みの違いからくるものでしょうか?それとも、受信と送信の順番の違いからくるものでしょうか? またまた初歩的な質問なのかも知れませんが、よろしくお願いいたします。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1999] Re:TestBBS.javaについて
投稿者:(ぱ)こと管理人
2017/08/17 23:11:10

>お世話になっております。 >P.108の最終行に「このメソッドはTestBBS.javaでは使用していません。」と記載がありますが、この”TestBBS.java”が、どのソースコードを意味するものなのか分からず、質問させて頂きました。 申し訳ありません。誤植(というか修正ミス)のようです。 元になったWeb記事 http://kmaebashi.com/programmer/webserver/henacat.html では、ShowBBS.javaとPosBBS.javaをまとめてTestBBS.javaというソースに 含めていました。 ただし、Javaでは1クラス1ファイルが普通なので、書籍化する際に分離したのですが、 この部分について修正が漏れておりました。 よってこの部分は、「このメソッドはサンプル掲示板では使用していません」に 読み替えてください。 正誤表に載せておきます。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1998] TestBBS.javaについて
投稿者:くまきち
2017/08/15 22:52:03

お世話になっております。 P.108の最終行に「このメソッドはTestBBS.javaでは使用していません。」と記載がありますが、この”TestBBS.java”が、どのソースコードを意味するものなのか分からず、質問させて頂きました。 よろしくお願いいたします。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1997] Re:URLエンコードについて
投稿者:くまきち
2017/08/05 23:06:10

回答、ありがとうございます。 下記の回答内容を見ながらP.76まで読み進めてみて理解することができました! また、質問させていただくかも知れませんが、よろしくお願いいたします。 >>P.63からの「URLエンコードに対応する」の説明で理解できない部分があり、投稿させて頂きました。 >>P.64の上から2行目に、元の文字列の文字コードによって(例えば、Shift-Jisか、UTF-8か、EUCかによって)、エンコード結果が異なると書いてあります。 >>一方で、同じページのもう少し下の部分には「IEやFireFoxともにUTF-8でエンコードしたものを…」と記載があります。 >>これは「元の文字列の文字コードによって」という部分と矛盾するように感じ、よく分からなくなりました。 >>また、P.65の補足(下)でも、Shift-Jisとしてエンコードする例があり、ますます混乱しています。 > >返信が遅くなりまして申し訳ありません。 > >p.64冒頭にあるように、URLエンコードは、『元の文字列をバイト単位で解釈し、 >「%」の後ろにその16進表記をつなげたもの』です。よって、元の文字列を >どのエンコーディング(文字コード)で解釈するかにより結果は変わります。 >JavaのURLEncoderやURLDecoderのようなクラスライブラリで、エンコードするときも >デコードするときもエンコーディングを指定しなければいけないのは、そのためです。 >WebサイトでURLエンコード/デコードの機能を提供しているページもよくありますが、 >そういうページでも、たいては文字コードが選べるようになっていると思います。 > >その上で、各ブラウザがどのエンコーディング(文字コード)でURLエンコードするかに >ついては、W3Cで定められており、それがUTF-8である、ということです。 > >これで回答になっていますでしょうか? >
[この投稿を含むスレッドを表示] [この投稿を削除]
[1996] Re:URLエンコードについて
投稿者:(ぱ)こと管理人
2017/08/04 20:54:02

>P.63からの「URLエンコードに対応する」の説明で理解できない部分があり、投稿させて頂きました。 >P.64の上から2行目に、元の文字列の文字コードによって(例えば、Shift-Jisか、UTF-8か、EUCかによって)、エンコード結果が異なると書いてあります。 >一方で、同じページのもう少し下の部分には「IEやFireFoxともにUTF-8でエンコードしたものを…」と記載があります。 >これは「元の文字列の文字コードによって」という部分と矛盾するように感じ、よく分からなくなりました。 >また、P.65の補足(下)でも、Shift-Jisとしてエンコードする例があり、ますます混乱しています。 返信が遅くなりまして申し訳ありません。 p.64冒頭にあるように、URLエンコードは、『元の文字列をバイト単位で解釈し、 「%」の後ろにその16進表記をつなげたもの』です。よって、元の文字列を どのエンコーディング(文字コード)で解釈するかにより結果は変わります。 JavaのURLEncoderやURLDecoderのようなクラスライブラリで、エンコードするときも デコードするときもエンコーディングを指定しなければいけないのは、そのためです。 WebサイトでURLエンコード/デコードの機能を提供しているページもよくありますが、 そういうページでも、たいては文字コードが選べるようになっていると思います。 その上で、各ブラウザがどのエンコーディング(文字コード)でURLエンコードするかに ついては、W3Cで定められており、それがUTF-8である、ということです。 これで回答になっていますでしょうか?
[この投稿を含むスレッドを表示] [この投稿を削除]
[1995] URLエンコードについて
投稿者:くまきち
2017/07/30 16:59:05

P.63からの「URLエンコードに対応する」の説明で理解できない部分があり、投稿させて頂きました。 P.64の上から2行目に、元の文字列の文字コードによって(例えば、Shift-Jisか、UTF-8か、EUCかによって)、エンコード結果が異なると書いてあります。 一方で、同じページのもう少し下の部分には「IEやFireFoxともにUTF-8でエンコードしたものを…」と記載があります。 これは「元の文字列の文字コードによって」という部分と矛盾するように感じ、よく分からなくなりました。 また、P.65の補足(下)でも、Shift-Jisとしてエンコードする例があり、ますます混乱しています。 もしかしたら初歩的な質問なのかもしれませんが、詳しい方いましたら、教えてください。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1994] Re:HenacatのC#版を作りました
投稿者:nendo_code
2017/07/12 22:57:45

下記に公開しました。 https://github.com/nendo-code/Henacat_sharp ありがとうございました。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1993] Re:HenacatのC#版を作りました
投稿者:nendo_code
2017/07/12 19:34:43

>まったく問題ありません。どのようなものになっているか私も楽しみです。 > >よろしくお願いいたします。 ありがとうございます! 公開しましたらこちらの掲示板で報告させていただきますね。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1992] Re:HenacatのC#版を作りました
投稿者:(ぱ)こと管理人
2017/07/11 07:57:32

はじめまして。 >その結果HenacatのC#移植版のコードが出来たので、もしよろしければGitHubで公開させていただければと考えておりますが、いかがでしょうか。 まったく問題ありません。どのようなものになっているか私も楽しみです。 よろしくお願いいたします。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1991] HenacatのC#版を作りました
投稿者:nendo_code
2017/07/09 17:53:38

はじめまして。nendo_codeと申します。 「基礎からのWebアプリケーション開発入門」読ませていただきました。今までなんとなくぼんやりとしか知らなかったWebの知識を整理する事ができ、非常に勉強になりました。 私はC#プログラマなので、学習にあたり細かい動きを理解するために、C#にHenacatのコードを移植して動かしてみたりしました。 その結果HenacatのC#移植版のコードが出来たので、もしよろしければGitHubで公開させていただければと考えておりますが、いかがでしょうか。 こちらとしては、「なんとなく作っちゃったから公開しよう」くらいのノリですので、ダメであればダメでよいです。(書籍として販売されている以上、ご都合などあるかもしれませんし。) よろしくお願いいたします。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1990] テスト
投稿者:みっきー
2017/06/16 14:08:39

ウェブサイトから飛んできました。 掲示板ってどうやって作るのかなあという初心者です。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1988] Re:26p~27p
投稿者:kokonotu
2017/04/27 16:29:13

>追加情報ありがとうございます。 >80番に修正はしてあったわけですね。失礼しました。 >その上で、今も以下のエラーが出ている、ということでよいでしょうか。 > >>java.net.ConnectException: Connection refused: connect >> at java.net.DualStackPlainSocketImpl.connect0(Native Method) >> at java.net.DualStackPlainSocketImpl.socketConnect(Unknown Source) >> at java.net.AbstractPlainSocketImpl.doConnect(Unknown Source) >> at java.net.AbstractPlainSocketImpl.connectToAddress(Unknown Source) >> at java.net.AbstractPlainSocketImpl.connect(Unknown Source) >> at java.net.PlainSocketImpl.connect(Unknown Source) >> at java.net.SocksSocketImpl.connect(Unknown Source) >> at java.net.Socket.connect(Unknown Source) >> at java.net.Socket.connect(Unknown Source) >> at java.net.Socket.<init>(Unknown Source) >> at java.net.Socket.<init>(Unknown Source) >> at TcpClient.main(TcpClient.java:6) > >だとすれば、TcpClient.javaの6行目でWebサーバへの接続に失敗しているわけで、 >client_send.txtの内容については(まだ送っていないので)ひとまず無関係ですよね。 > >また、貼っていただいたTcpClient.javaにも不審な点はありません。 >当方で、貼っていただいたTcpClient.javaとclient_send.txtにて >実験してみましたが、正しくclient_recv.txtが生成されました。 >私の環境もWindows 10です。Apacheは2.4.23なので、ほぼ同じといってよさそうです。 > >It works!を表示したまま、とのことなので、Apacheはちゃんと起動していて、 >ブラウザからはアクセスできている状態ですよね。 >この状態で、TcpClient.javaから接続できない原因は、正直、ちょっと >思いつきません。 > >念のため確認ですが、Apacheを起動した方のコマンドプロンプトには、 >何かメッセージは出ていませんか? >私の環境では以下のメッセージが出ています。 > >C:\Apache24\bin>httpd >AH00558: httpd: Could not reliably determine the server's fully qualified domain name, using fe80::4cd9:c88:9a45:70bc. Set the 'ServerName' directive globally to suppress this message > >これは、本来httpd.confでServerNameを指定すべきところ、やってないことに >起因するもので、この実験では問題ありません(本の中で説明していないのは >ちょっと手抜きかもしれませんが)。他に何か出ていたりしないでしょうか。 > >あるいは、ファイアウォールとかアンチウィルスソフトとかで接続が >遮断されていないでしょうか。 > >すみません、これぐらいしか思いつきません。 > > ご返信ありがとうございます。 apacheには AH00558: httpd.exe: Could not reliably determine the server's fully qualified domain name, using fe80::b097:7385:e0c9:544f. Set the 'ServerName' directive globally to suppress this message と出ております。 セキュリティソフトはNortonを入れているのでこれが原因なのかもしれません汗
[この投稿を含むスレッドを表示] [この投稿を削除]
[1987] Re:26p~27p
投稿者:(ぱ)こと管理人
2017/04/27 02:01:20

追加情報ありがとうございます。 80番に修正はしてあったわけですね。失礼しました。 その上で、今も以下のエラーが出ている、ということでよいでしょうか。 >java.net.ConnectException: Connection refused: connect > at java.net.DualStackPlainSocketImpl.connect0(Native Method) > at java.net.DualStackPlainSocketImpl.socketConnect(Unknown Source) > at java.net.AbstractPlainSocketImpl.doConnect(Unknown Source) > at java.net.AbstractPlainSocketImpl.connectToAddress(Unknown Source) > at java.net.AbstractPlainSocketImpl.connect(Unknown Source) > at java.net.PlainSocketImpl.connect(Unknown Source) > at java.net.SocksSocketImpl.connect(Unknown Source) > at java.net.Socket.connect(Unknown Source) > at java.net.Socket.connect(Unknown Source) > at java.net.Socket.<init>(Unknown Source) > at java.net.Socket.<init>(Unknown Source) > at TcpClient.main(TcpClient.java:6) だとすれば、TcpClient.javaの6行目でWebサーバへの接続に失敗しているわけで、 client_send.txtの内容については(まだ送っていないので)ひとまず無関係ですよね。 また、貼っていただいたTcpClient.javaにも不審な点はありません。 当方で、貼っていただいたTcpClient.javaとclient_send.txtにて 実験してみましたが、正しくclient_recv.txtが生成されました。 私の環境もWindows 10です。Apacheは2.4.23なので、ほぼ同じといってよさそうです。 It works!を表示したまま、とのことなので、Apacheはちゃんと起動していて、 ブラウザからはアクセスできている状態ですよね。 この状態で、TcpClient.javaから接続できない原因は、正直、ちょっと 思いつきません。 念のため確認ですが、Apacheを起動した方のコマンドプロンプトには、 何かメッセージは出ていませんか? 私の環境では以下のメッセージが出ています。 C:\Apache24\bin>httpd AH00558: httpd: Could not reliably determine the server's fully qualified domain name, using fe80::4cd9:c88:9a45:70bc. Set the 'ServerName' directive globally to suppress this message これは、本来httpd.confでServerNameを指定すべきところ、やってないことに 起因するもので、この実験では問題ありません(本の中で説明していないのは ちょっと手抜きかもしれませんが)。他に何か出ていたりしないでしょうか。 あるいは、ファイアウォールとかアンチウィルスソフトとかで接続が 遮断されていないでしょうか。 すみません、これぐらいしか思いつきません。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1986] Re:26p~27p
投稿者:kokonotu
2017/04/26 15:12:51

>こんにちは。読んでいただきありがとうございます。 > >>>【結果】 >>java.net.ConnectException: Connection refused: connect > >エラーメッセージがこうなので、Webサーバへの接続に失敗しています。 > >TcpClient.javaは、最初は自前のサーバTcpServer.javaに接続し、 >p.26でApacheに接続しようとしていますが、 >TcpServer.javaはポート番号8001で待ち受けるのに対し、 >Apacheは(設定を変えなければ)80番で待ちます。 > >推測ですが、p.26の一番下のポート番号の変更を忘れている、 >ということはないでしょうか? >当方でやってみたら、同じエラーが再現しました。 > >違っていましたらすみません。 ご返信ありがとうございます。 現在TcpClient.javaに関しては import java.io.*; import java.net.*; public class TcpClient { public static void main(String[] args) throws Exception { try (Socket socket = new Socket("localhost",80); //localにsocketを生成 //下記のtxtに対して出力用のストリームを開く FileInputStream fis = new FileInputStream("client_send.txt"); FileOutputStream fos = new FileOutputStream("client_recv.txt")) { int ch; // client_send.txtの内容をサーバに送信 OutputStream output = socket.getOutputStream(); //ストリームの終わりに達した場合は-1が返る while ((ch = fis.read()) != -1) { output.write(ch); //読み込んだ内容をOutputStreamに } // 終了を示すため、ゼロを送信 //output.write(0); //ここではサーバーからの返信がいるためソケットは閉じない // サーバからの返信をclient_recv.txtに出力 InputStream input = socket.getInputStream(); while ((ch = input.read()) != -1) { fos.write(ch); } } catch (Exception ex) { ex.printStackTrace(); } } } と記述してあります。 client_send.txtには元々 GET /index.html HTTP/1.1 Host: localhost:8001 Connection: keep-alive Upgrade-Insecure-Requests: 1 User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/57.0.2987.133 Safari/537.36 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8 Accept-Encoding: gzip, deflate, sdch, br Accept-Language: ja,en-US;q=0.8,en;q=0.6 Cookie: _ga=GA1.1.1220433733.1486961623; PHPSESSID=dl5oi2iab8460ino9qrupnqnr3 だったのを GET /index.html HTTP/1.1 Host: localhost:80 Connection: keep-alive Upgrade-Insecure-Requests: 1 User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/57.0.2987.133 Safari/537.36 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8 Accept-Encoding: gzip, deflate, sdch, br Accept-Language: ja,en-US;q=0.8,en;q=0.6 Cookie: _ga=GA1.1.1220433733.1486961623; PHPSESSID=dl5oi2iab8460ino9qrupnqnr3 にしたのですがうまくいきません
[この投稿を含むスレッドを表示] [この投稿を削除]
[1985] Re:26p~27p
投稿者:(ぱ)こと管理人
2017/04/22 01:41:06

こんにちは。読んでいただきありがとうございます。 >>【結果】 >java.net.ConnectException: Connection refused: connect エラーメッセージがこうなので、Webサーバへの接続に失敗しています。 TcpClient.javaは、最初は自前のサーバTcpServer.javaに接続し、 p.26でApacheに接続しようとしていますが、 TcpServer.javaはポート番号8001で待ち受けるのに対し、 Apacheは(設定を変えなければ)80番で待ちます。 推測ですが、p.26の一番下のポート番号の変更を忘れている、 ということはないでしょうか? 当方でやってみたら、同じエラーが再現しました。 違っていましたらすみません。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1984] 26p~27p
投稿者:kokonotu
2017/04/20 16:58:55

初めてkokonotuといいます。 ポインタ完全制覇をとても楽しく読ませていただきました。 今回も勉強させて頂きます。 お聞きしたい事は、apacheを起動して[It works]が表記された事が確認後、ブラウザに表示したままTcpClient.javaを起動したのですがコマンドプロンプトにエラーが出てしまいます。何卒宜しくお願い致します。 >【結果】 java.net.ConnectException: Connection refused: connect at java.net.DualStackPlainSocketImpl.connect0(Native Method) at java.net.DualStackPlainSocketImpl.socketConnect(Unknown Source) at java.net.AbstractPlainSocketImpl.doConnect(Unknown Source) at java.net.AbstractPlainSocketImpl.connectToAddress(Unknown Source) at java.net.AbstractPlainSocketImpl.connect(Unknown Source) at java.net.PlainSocketImpl.connect(Unknown Source) at java.net.SocksSocketImpl.connect(Unknown Source) at java.net.Socket.connect(Unknown Source) at java.net.Socket.connect(Unknown Source) at java.net.Socket.<init>(Unknown Source) at java.net.Socket.<init>(Unknown Source) at TcpClient.main(TcpClient.java:6) 【補足】 client_sendには以下のように記載しています GET /index.html HTTP/1.1 Host: localhost:80 Connection: keep-alive Upgrade-Insecure-Requests: 1 User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/57.0.2987.133 Safari/537.36 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8 Accept-Encoding: gzip, deflate, sdch, br Accept-Language: ja,en-US;q=0.8,en;q=0.6 Cookie: _ga=GA1.1.1220433733.1486961623 【環境】 OS: windows10 apache:2.4.25 ご教授よろしくお願いいたします
[この投稿を含むスレッドを表示] [この投稿を削除]
[1983] Re:書籍「Webサーバを…」の1.3.4について
投稿者:(ぱ)こと管理人
2017/04/03 12:19:39

>GET /index.html HTTP/1.1 >Host: localhost:80 >Connection: keep-alive >Cache-Control: max-age=0 >Upgrade-Insecure-Requests: 1 >User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/57.0.2987.98 Safari/537.36 >Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8 >Accept-Encoding: gzip, deflate, sdch, br >Accept-Language: ja,en-US;q=0.8,en;q=0.6 昼休みなので取り急ぎですが、このclient_send.txtの末尾の空行が抜けてませんでしょうか。 リクエストは飛んでいて、ステータスが408(タイムアウト)になっていますので。 以前も同様の質問があり、その時はレスポンスは返っていたのですが… >3. サポートサイトよりDLした"TcpClient.java(Apache向け)"のファイル名を修正しコンパイル >4. "java TcpClient"で実行 > >【結果】 >25秒ほどたつと実行が終了 >client_recv.txtは生成されるが空 > >【access_log】 >127.0.0.1 - - [01/Apr/2017:16:11:02 -0700] "-" 408 - > >【補足】 >ブラウザからアクセスすると問題なく接続され、access_logにも以下のログが残ります >::1 - - [01/Apr/2017:16:15:12 -0700] "GET / HTTP/1.1" 304 - > > >【環境】 >OS: macOS Sierra 10.12.4 >Server version: Apache/2.4.25 (Unix) >javac 1.8.0_111 > > >何かわかることがございましたらご教授よろしくお願いいたします。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1982] 書籍「Webサーバを…」の1.3.4について
投稿者:けんと
2017/04/02 08:18:48

先日「Webサーバを作りながら学ぶ 基礎からのWebアプリケーション開発入門」を購入し読み進めています。 「1.3.4 TCPクライアントでWebサーバを叩く」の箇所で想定通りのHTTPレスポンスが得られなかったので質問させてください。 最後に詳細な環境をお伝えいたしますが、当方はMacで実行しています。 【手順】 1. Apacheを起動 2. 1.3.3で取得したserver_recv.txtをclient_send.txtにコピー(Hostのポートだけ80に修正してます) GET /index.html HTTP/1.1 Host: localhost:80 Connection: keep-alive Cache-Control: max-age=0 Upgrade-Insecure-Requests: 1 User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/57.0.2987.98 Safari/537.36 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8 Accept-Encoding: gzip, deflate, sdch, br Accept-Language: ja,en-US;q=0.8,en;q=0.6 3. サポートサイトよりDLした"TcpClient.java(Apache向け)"のファイル名を修正しコンパイル 4. "java TcpClient"で実行 【結果】 25秒ほどたつと実行が終了 client_recv.txtは生成されるが空 【access_log】 127.0.0.1 - - [01/Apr/2017:16:11:02 -0700] "-" 408 - 【補足】 ブラウザからアクセスすると問題なく接続され、access_logにも以下のログが残ります ::1 - - [01/Apr/2017:16:15:12 -0700] "GET / HTTP/1.1" 304 - 【環境】 OS: macOS Sierra 10.12.4 Server version: Apache/2.4.25 (Unix) javac 1.8.0_111 何かわかることがございましたらご教授よろしくお願いいたします。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1980] Re:ubuntuのgccで出来てvisualstudioで出来ない
投稿者:k
2017/02/07 23:57:09

1章読み終わりました。 HTTPのことが理解できてとても勉強になりました。 2章以降でも質問させてください。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1979] Re:ubuntuのgccで出来てvisualstudioで出来ない
投稿者:(ぱ)こと管理人
2017/02/05 17:31:56

>基礎からのWEBアプリケーション開発入門 >購入し読んでおります。 ありがとうございます。 >一番初めの tcp_server.c と tcp_client.cの中に sys/socket.h >が見つからずwin+visualstudioではコンパイルできません。 (紙の本なら)p.18の補足「C, C#の場合」に掲載している tcp_server.cおよびtcp_client.cですね。 説明不足だったかもしれませんが、その補足の冒頭にもあるように 「もともとTCPやソケットはUNIX上で、C言語で使用されてきたもの」なので、 Linuxではそのまま使えても、Visual StudioではWindows版のソケットライブラリ であるWinsockを使うことになります。 >sys/socket.hの中身を見てみたいのですが見当たらないのですが。。 #includeするのはsocket.hではなくwinsock2.hになりますし、 リンク時には ws2_32.libが必要です。今ぐぐったのですが、 たとえば以下のページを参考にしてください。 http://www.geekpage.jp/programming/winsock/
[この投稿を含むスレッドを表示] [この投稿を削除]
[1978] ubuntuのgccで出来てvisualstudioで出来ない
投稿者:k
2017/02/03 09:48:00

基礎からのWEBアプリケーション開発入門 購入し読んでおります。 一番初めの tcp_server.c と tcp_client.cの中に sys/socket.h が見つからずwin+visualstudioではコンパイルできません。 ubuntu 14でgccでコンパイルしたら動きました。 この違いはなんでしょうか? sys/socket.hの中身を見てみたいのですが見当たらないのですが。。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1968] Re:疑りぶかいあなたのためのオブジェクト指向再入門
投稿者:(ぱ)こと管理人
2016/09/06 23:32:31

>そこで、出来ましたら、Java の良い本をご紹介願えますと幸いです。 >何卒、宜しくお願い致します。 すみません、最近の本は知らないのですが…… 手前味噌でよければ、 「Java謎+落とし穴徹底解明」 https://www.amazon.co.jp/Java-%E8%AC%8E-%E8%90%BD%E3%81%A8%E3%81%97%E7%A9%B4-%E5%BE%B9%E5%BA%95%E8%A7%A3%E6%98%8E-%E6%A8%99%E6%BA%96%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9E%E3%83%BC%E3%82%BA%E3%83%A9%E3%82%A4%E3%83%96%E3%83%A9%E3%83%AA/dp/4774113611 amazonマーケットプレイスで1円とかで買えるようです。 3章の「継承をどう使うか? どこまで使えるか?」あたりは、ある意味「疑り深い~」の 続きと言えるかと思います。 ただ、かなり古い本ですので(JDK1.3の頃)、今となっては古くなってしまっている ところもあります。Genericsや列挙がないことに不満を述べていますが、それらは Java5で実装されましたので。 あとは定番で、Effective Javaとかでしょうか…… https://www.amazon.co.jp/EFFECTIVE-JAVA-Java-Joshua-Bloch/dp/4621066056
[この投稿を含むスレッドを表示] [この投稿を削除]
[1967] Re:疑りぶかいあなたのためのオブジェクト指向再入門
投稿者:晶夫(あきお)
2016/09/05 11:13:19

前橋 殿 返信ありがとうございます。 私は小企業のIT派遣会社で働いています。 現在、常駐先が見つからず、本社にて「待機」の状況です。 そのため、この様な掲示板にカキコできる時間が取れています。 >私自身割と大手のSIerにいる身ですので、私より年上の方がコード書きの勉強を >されているとなると尊敬しますし励みになります。 私の24年間は大手の製造メーカーで従業員は2万人規模の大会社でした。 そこで、「生産管理システム・MES」の 要件定義~概要設計~基本設計~詳細設計~(開発・単体テスト)~結合テスト~ システムテスト~本番化~保全 という流れで、プログラムは保全でしか見ていませんでした。 しかし、24年間務めた会社を辞め、転職して今の小企業に居ます。 小企業なので、上述の 要件定義~以下すべて~保全 まで出来る人が派遣先が見つけやすいのです。 年齢も高いので、派遣先の年齢制限に引っかかる場合も多く贅沢は言えないのです。 そのため、保全でしかやっていなかったコーディングをやらざるを得ない状況で、 コードの勉強をしています。 「疑りぶかいあなたのためのオブジェクト指向再入門」は継続しない、との事、 残念ですが、忙しい前橋殿に置いては致し方ないと思います。 そこで、出来ましたら、Java の良い本をご紹介願えますと幸いです。 何卒、宜しくお願い致します。 晶夫
[この投稿を含むスレッドを表示] [この投稿を削除]
[1966] Re:疑りぶかいあなたのためのオブジェクト指向再入門
投稿者:(ぱ)こと管理人
2016/09/05 02:39:55

はじめまして。 >SE歴は24年になります。前橋殿より5歳上になります。 私自身割と大手のSIerにいる身ですので、私より年上の方がコード書きの勉強を されているとなると尊敬しますし励みになります。 >それが、昨日、「疑りぶかいあんたのためのオブジェクト指向再入門」 >を読ませて頂き、目からウロコが落ちました。 ありがとうございます。 >この連載は、まだ、続くと書いてありました。 >本当に期待しています。 すみません、「これから随時書き足していくつもりです」と書いたのが かれこれ10年以上前の話ですので、今から続きを書くかというとちょっとお約束 できかねるところではあります。 続きを書くとすると次のネタは「継承」ですが、よくある「Shapeを継承して PolylineやRectangleやCircleを作る」という例は、Pascalの可変レコード型や Cでそれを共用体と列挙型で真似する例のような「データメンバを拡張する例」としては なかなか便利でわかりやすいのですが、 メソッドのオーバーライドの例として、図形を描画するdraw()メソッドを作ろう、 となったあたりでかなりうさんくさくなります。よく入門書では出てくる例ですが、 実のところこの使い方は「間違い」だと私は思っています(本にも何度か書いていますが)。 その辺でうんうんうなっているうちに、10年過ぎた感じです……
[この投稿を含むスレッドを表示] [この投稿を削除]
[1965] 疑りぶかいあなたのためのオブジェクト指向再入門
投稿者:晶夫(あきお)
2016/09/02 15:39:38

前橋和弥 殿 晶夫と申します。 学生時代からPascal やC などを個人的に勉強してきて、就職と同時にSEになった 者です。 SE歴は24年になります。前橋殿より5歳上になります。 その私でも、オブジェクト指向に入れていませんでした。 正直、オブジェクト指向のメリットが分からず、Java や VB.Net や C# の勉強をしていて、 とにかく、全然、自分の物になっていませんでした。 それが、昨日、「疑りぶかいあんたのためのオブジェクト指向再入門」 を読ませて頂き、目からウロコが落ちました。 これから、本格的にオブジェクト指向を学ぶ自信になりました。 思わず、お礼が言いたくて、この投稿を致しました。 この連載は、まだ、続くと書いてありました。 本当に期待しています。 オブジェクト指向のメリットが分からず、先へ進めずにいたのが、 進めます。 とにかく、続きをお願いいたします。 ありがとうございました。 晶夫
[この投稿を含むスレッドを表示] [この投稿を削除]
[1964] Re:Apacheへのリクエストがタイムアウト
投稿者:stonehand
2016/08/03 08:01:20

ありがとうございました。 >一応、client_send.txtの末尾の、HTTPリクエストヘッダの終わりを示す >空行を抜いたら、同様のタイムアウトが返りました。 >念のための確認ですが、同様になっていないでしょうか。 client_send.txtに改行を加えて試したところ、正しく動作しました。 今後とも、よろしくお願いいたします。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1963] Re:Apacheへのリクエストがタイムアウト
投稿者:(ぱ)こと管理人
2016/08/03 00:22:11

>>(2)client_send.txtをここに貼ってください。 >GET /index.html HTTP/1.1 >Accept: text/html, application/xhtml+xml, */* >Accept-Language: ja-JP >User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; rv:11.0) like Gecko >Accept-Encoding: gzip, deflate >Host: localhost:8001 >DNT: 1 >Connection: Keep-Alive 見たところ不審なところはないですし、これをコピーして作った client_send.txtで、当方では正常動作しました。 症状からして、 ・タイムアウトとはいえレスポンスが返ってきているので、  Apacheと通信すること自体はできている。 ・しかし、Apacheは、HTTPリクエストを最後まで受け取れず、  タイムアウトを返している。 という状況です。 一応、client_send.txtの末尾の、HTTPリクエストヘッダの終わりを示す 空行を抜いたら、同様のタイムアウトが返りました。 念のための確認ですが、同様になっていないでしょうか。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1962] Re:Apacheへのリクエストがタイムアウト
投稿者:stonehand
2016/08/02 08:29:53

お手数をおかけしております。 >(1)TcpClient.javaの修正ですが、修正版のソースが「TcpClient.java(Apache版)」という > ファイル名で同梱されています。これを使ったのでないのなら、一度こちらで > 試していただけますか。 こちらでも同様にタイムアウトしました。 >(2)client_send.txtをここに貼ってください。 GET /index.html HTTP/1.1 Accept: text/html, application/xhtml+xml, */* Accept-Language: ja-JP User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; rv:11.0) like Gecko Accept-Encoding: gzip, deflate Host: localhost:8001 DNT: 1 Connection: Keep-Alive 以上ですが、よろしくお願いいたします。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1961] Re:Apacheへのリクエストがタイムアウト
投稿者:(ぱ)こと管理人
2016/08/02 01:52:28

>書籍26-27ページの、client_send.txt、TcpClient.javaの内容を変更して実行すると >タイムアウトとなり、client_recv.txtの内容は以下のようになります。 >何が原因なのでしょうか。 情報ありがとうございます。 ただ、当方でも試しましたが再現しません。 念のためApacheのバージョンを2.4.23に上げてみましたが同じでした。 (1)TcpClient.javaの修正ですが、修正版のソースが「TcpClient.java(Apache版)」という  ファイル名で同梱されています。これを使ったのでないのなら、一度こちらで  試していただけますか。 (2)client_send.txtをここに貼ってください。 よろしくお願いいたします。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1960] Apacheへのリクエストがタイムアウト
投稿者:stonehand
2016/08/01 22:10:47

またまた、お世話になります。 書籍26-27ページの、client_send.txt、TcpClient.javaの内容を変更して実行すると タイムアウトとなり、client_recv.txtの内容は以下のようになります。 何が原因なのでしょうか。 よろしくお願いいたします。 HTTP/1.1 408 Request Timeout Date: Mon, 01 Aug 2016 12:49:29 GMT Server: Apache/2.4.23 (Win64) Content-Length: 221 Connection: close Content-Type: text/html; charset=iso-8859-1 <!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN"> <html><head> <title>408 Request Timeout</title> </head><body> <h1>Request Timeout</h1> <p>Server timeout waiting for the HTTP request from the client.</p> </body></html>
[この投稿を含むスレッドを表示] [この投稿を削除]
[1959] Re:書籍「Webサーバを…」の1.3.3について
投稿者:(ぱ)こと管理人
2016/08/01 01:02:12

>実際に先にブラウザを閉じてしまうと、TcpServerは「java.net.SocketException: Connection reset」の例外をcatchしてスタックトレースを吐いた後に終了します。 確認しました。 確かにIEで試すと、例外を吐いて終了しました。 ただ、Firefoxで試すと、やはり-1を返して無限ループに入りました。 本書は対象をIEとうたっているので何らかのフォローはしようと思いますが、 FirefoxとIEで動きがどう違うのか、現時点ではわかっていません。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1958] 書籍「Webサーバを…」の1.3.3について
投稿者:E2E4E9E4
2016/07/30 00:31:48

お世話になります。 以前に1.5.4について質問させていただいたものです。 その節はありがとうございました。(お礼が遅れてすみません) 今回もまた質問させてください。 p24では、「( 先にブラウザを閉じてしまうと、ソケットが閉じられて、ソケット切断後はInputStream.read()は-1を返すのですが、TcpServerはそれに対するチェックを入れていないので無限ループに入ります……)」とあります。 これは、 「(TcpServerは、17行目でクライアントから終了マークである0を受け取るまで処理を継続するようになっていますが、本物のWebブラウザはこのような終了マークを送らないからです)」 とすべきではないでしょうか。 実際に先にブラウザを閉じてしまうと、TcpServerは「java.net.SocketException: Connection reset」の例外をcatchしてスタックトレースを吐いた後に終了します。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1957] 最新版を導入、解決しました
投稿者:stonehand
2016/07/29 09:11:04

お手数をおかけしました。 ご指摘の通り、最新版を導入し正しく動作いたしました。 C:\>javac -version javac 1.8.0_101 C:\oza\src\chap01>javac TcpServer.java C:\oza\src\chap01>java TcpServer クライアントからの接続を待ちます。 今後とも、よろしくお願いいたします。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1956] Re:コンパイルできない
投稿者:stonehand
2016/07/29 08:22:06

お世話になります。 >お使いのJavaが、Java6以前のものなのではないでしょうか。 >javac -versionで何が表示されますか? C:\>java -version java version "1.8.0_91" Java(TM) SE Runtime Environment (build 1.8.0_91-b15) Java HotSpot(TM) 64-Bit Server VM (build 25.91-b15, mixed mode) C:\>javac -version javac 1.6.0_21 となっています。 よろしく、お願いいたします。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1955] Re:コンパイルできない
投稿者:(ぱ)こと管理人
2016/07/28 22:16:22

>例えば >C:\oza\src\chap01>javac TcpServer.java >TcpServer.java:6: '{' がありません。 > try (ServerSocket server = new ServerSocket(8001); これで見当が付きました。このtryの構文は、Java7から導入された try-with-resource文です。 http://docs.oracle.com/javase/jp/7/technotes/guides/language/try-with-resources.html お使いのJavaが、Java6以前のものなのではないでしょうか。 javac -versionで何が表示されますか? なお、この本の対象はJava8です。本の中に明記した個所があったのでは、 と思い探してみたのですが、あれ? 見当たらない……
[この投稿を含むスレッドを表示] [この投稿を削除]
[1954] Re:コンパイルできない
投稿者:stonehand
2016/07/28 14:30:44

お手数をおかけしております。 >・そもそもOSは何ですか? この本はWindowsを想定しているので、 Windows7Pro 64 bit > ソースの文字コードはShift-JIS, 改行はCR LFになっています。 >・どこからダウンロードしたファイルですか? ページのURLと > ファイル名を教えてください。 書籍8ページにあります http://kmaebashi.com/webserver/index.html より、ダウンロードはこちらから。 ./src_20160619.zip >・javacを実行したディレクトリに入っているファイルの一覧を教えてください。 Chap01ディレクトリの内容 C:\oza\src\chap01>dir /b C CSharp Modoki01 server_send.txt TcpClient.java TcpClient.java(Apache向け) TcpServer.java TcpServer.txt >・エラーメッセージをコピペして、ここに貼ってください。 例えば C:\oza\src\chap01>javac TcpServer.java TcpServer.java:6: '{' がありません。 try (ServerSocket server = new ServerSocket(8001); ^ TcpServer.java:6: ')' がありません。 try (ServerSocket server = new ServerSocket(8001); ^ TcpServer.java:8: ';' がありません。 FileInputStream fis = new FileInputStream("server_send.txt")) { ^ TcpServer.java:27: 'catch' への 'try' がありません。 } catch (Exception ex) { ^ TcpServer.java:27: ')' がありません。 } catch (Exception ex) { ^ TcpServer.java:27: 文ではありません。 } catch (Exception ex) { ^ TcpServer.java:27: ';' がありません。 } catch (Exception ex) { ^ TcpServer.java:6: 'try' への 'catch' または 'finally' がありません。 try (ServerSocket server = new ServerSocket(8001); ^ TcpServer.java:31: 構文解析中にファイルの終わりに移りました } ^ エラー 9 個 以上のようですが、よろしくお願いいたします。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1953] Re:コンパイルできない
投稿者:(ぱ)こと管理人
2016/07/28 00:32:19

>「Webサーバを作りながら学ぶ 基礎からのWebアプリケーション開発入門」を購入し >悪戦苦闘しております。 こんにちは。お買い上げいただきありがとうございます。 > 始めの一歩、ソースをダウンロードし、TcpServer.javaおよびTcpClient.java等をコンパイルしようとし、 > >>javac *.java > >などとしましたが、エラーが出てしまい先に進めません。 >エラーの内容は、(がありませんとか、{がありませんとか等です。 本を見ながら手で打ち込んだのならともかく、ダウンロードしたソースで、 「(がありませんとか、{がありませんとか」レベルのコンパイルエラーが出るのは 考えにくいのですが… ・そもそもOSは何ですか? この本はWindowsを想定しているので、  ソースの文字コードはShift-JIS, 改行はCR LFになっています。 ・どこからダウンロードしたファイルですか? ページのURLと  ファイル名を教えてください。 ・javacを実行したディレクトリに入っているファイルの一覧を教えてください。 ・エラーメッセージをコピペして、ここに貼ってください。 よろしくお願いいたします。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1952] Re:PHPで掲示板を作りたい
投稿者:(ぱ)こと管理人
2016/07/28 00:13:08

>そんな私がこれからPHPを学ぶために掲示板を一から作っていきたいのですが、 >どのようにして始めればいいでしょうか? まず、私のサイトにある「PHPとMySQLで掲示板を作る」は、PHP ver.4の頃に 書いたものなので内容が古くなっておりお勧めできません。 Google等で検索のうえ、新しめの記事を探してみてはいかがでしょうか。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1951] コンパイルできない
投稿者:stonehand
2016/07/27 17:22:42

 ばじめまして、よろしくお願いします。  このような質問をすると、対象読者ではないのではとお叱りを受けそうですが、 「Webサーバを作りながら学ぶ 基礎からのWebアプリケーション開発入門」を購入し 悪戦苦闘しております。  始めの一歩、ソースをダウンロードし、TcpServer.javaおよびTcpClient.java等をコンパイルしようとし、 >javac *.java などとしましたが、エラーが出てしまい先に進めません。 エラーの内容は、(がありませんとか、{がありませんとか等です。  初歩の初歩、基本的な質問で申し訳ありませんが、コンパイルの手順について詳しく教えていただけますか。よろしくお願い申し上げます。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1950] PHPで掲示板を作りたい
投稿者:nikuudon
2016/07/26 16:43:44

はじめまして PHPは超がつくほどの初心者です。 if文やらfor文やらは内容は理解できたのですが、どう使っていけばいいのかが わかりません。 そんな私がこれからPHPを学ぶために掲示板を一から作っていきたいのですが、 どのようにして始めればいいでしょうか? すいません、お教え下さい。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1949] Re:書籍「Webサーバを…」の1.5.4について
投稿者:(ぱ)こと管理人
2016/07/17 17:06:07

はじめまして。ご意見ありがとうございます。 >この2点を実装するためにやるべきことして「マルチスレッド」を挙げていますが、マルチスレッドは必須ではないはずです。実際にマルチスレッド化しなくても(単純な永久ループ化)それなりに動きました。 >この点についてWeb版の記述を見たのですが、そこでは「たくさんの接続先からの接続を並行して受け付けられなければなりません。 」とありマルチスレッドの必要性を説明していました。 >書籍版よりもWeb版の方が親切な説明だと思うのですが、なぜ書籍版のような説明にしたのでしょうか。 書籍版はWeb版を元にしていますから、この記述については「意図して抜いた」のだと思います。 記憶はだいぶあいまいですが、おっしゃるように、単純な永久ループでもそれなりに動く以上、「たくさんの接続先からの接続を『並行して受け付けられなければなりません』」と書いてしまうと、それはそれで不正確というか、ツッコミを受けてしまうかなあ、と腰が引けて抜いたように思います。 もちろん複数スレッドで応答した方がパフォーマンスがよいのは確かですから、陽にそう書くべきだったかも、とは思います。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1948] 書籍「Webサーバを…」の1.5.4について
投稿者:E2E4E9E4
2016/07/17 15:46:09

はじめまして。 Webサーバの勉強をしようと思い、書籍「Webサーバを作りながら学ぶ 基礎からのWebアプリケーション開発入門」を読んでおります。 少し疑問に思うことがあり、質問させていただきます。 "1.5.4 普通にWebページを表示できるようにする"では、以下の機能を実装しようとしています。 ・tcp接続を繰り返し受け付けるようにする ・ファイル種別に応じたContent-typeの設定 この2点を実装するためにやるべきことして「マルチスレッド」を挙げていますが、マルチスレッドは必須ではないはずです。実際にマルチスレッド化しなくても(単純な永久ループ化)それなりに動きました。 この点についてWeb版の記述を見たのですが、そこでは「たくさんの接続先からの接続を並行して受け付けられなければなりません。 」とありマルチスレッドの必要性を説明していました。 書籍版よりもWeb版の方が親切な説明だと思うのですが、なぜ書籍版のような説明にしたのでしょうか。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1944] Re:magic_quotes_gpc
投稿者:(ぱ)こと管理人
2016/07/06 08:01:57

……。 これは、何を言いたいのでしょうか……。 「PHPとMySQLで掲示板を作る」 http://kmaebashi.com/programmer/bbs_dev/index.html の内容が古いので、注意書き付けるなり削除するなりしろよってこと?
[この投稿を含むスレッドを表示] [この投稿を削除]
[1943] magic_quotes_gpc
投稿者:Naohiro19
2016/07/05 08:57:46

PHPにおいて 「magic_quotes_gpc」は5.4.0以降は、デフォルトでOFFに設定されています。 また、mysql_connectなどの巻数がPHP5.5.0以降は非推奨となり、PHP7.0.0で拡張ライブラリが削除されています。 PHPからMySQLに接続するには PDO(PHP Data Object)を使わなければなりません。 PDOの prepare(プリペア)メソッドを使うと名前付きパラメータ(:nameなど)や疑問符パラメータ(?)を利用できます。 例えば ホスト:localhost ユーザー名:root パスワード:なし データベース名:bbs_phpとしてutf-8で接続する場合はこのように書けばOKです。 PDOクラスはPDOExceptionという例外を投げてくるので try-catchで囲む必要があります。 try { $dbh = new PDO('mysql:host=localhost;dbname=bbs_php;charset=utf8','root',''); $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); }catch(PDOException $e){ echo $e->getMessage(); exit; } で接続が完了します。 PDOでのデータベースを操作する場合は「ドットインストール」というサイトの「PHPデータベース入門」という動画を視聴してください。 フォームにおいてユーザー入力を$_POST/$_GETで入力を受け取ってはいけないらしいので代わりとなるのが filter_input関数です。 たとえば <input type="text" name="message"> とフォームを入力する欄があるとします。 受け取る場合は $message = isset($_POST['message'] ? $_POST['message'] : null; とするのではなく $message = (string)filter_input(INPUT_POST, 'message'); とするべきでしょう。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1942] Re:変数とは何か
投稿者:var
2016/06/16 23:47:13

ご回答ありがとうございました。 なるほど。 >コンパイル後の オブジェクトファイルに残ってすらいません。 このあたりでピンときました。 スタックマシンタイプであれば、スタックポインタからの位置で参照できるため、 処理系が紐付けてくれているんですね。 変数という文字列なのかシンボルみたいなものがどこかで管理され、 それが参照する先が、例えば数字の5の格納位置を見ている、のようなイメージを持ってしまい混乱していまいました。 大変ありがとうございました。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1941] Re:変数とは何か
投稿者:(ぱ)こと管理人
2016/06/16 04:05:24

はじめまして。 >変数hogeのアドレス(&hoge)は"0xbfbfd9e4"。 >そこに数値5をint型で配置する。 >これは分かるのですが、変数hoge自体は、誰がどこで管理しているのでしょうか。 > >図表では、0xbfbfd9e4アドレスからの始まりに5が格納されており、これは分かります。 >しかし、同時に、"hoge"もあります。この辺りで混乱しております。 誤解を招いたなら申し訳ないですが、p.034のFig.1-1において、 図の中に「hoge」が書いてあるのは、読者にとってわかりやすくするためで、 プログラムの実行時に「hoge」という名前がどこかに保持されているわけではありません。 Cの場合、コンパイル時にデバッグオプションを付けたりしない限り、 たいていは、ローカル変数の変数名(この場合hoge)は、コンパイル後の オブジェクトファイルに残ってすらいません。 ではどのように変数hogeを参照しているのかといえば、素朴な実装では、スタック内の、 現在実行中の関数の使用領域(p.095のFig.2-5において、「func()から見える領域」と 書いてある範囲。スタックフレームと言います)内の位置が、コンパイル後の 機械語コードに埋め込まれていて、それを使用して参照します。 こちらの図↓で言えば、BPからの相対位置でアクセスします。 http://www.c-tipsref.com/words/stackframe.html グローバル変数やstatic変数は、リンクの時点でアドレスが決まります。 「2-4-2 分割コンパイルとリンク」を参照してください。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1940] 変数とは何か
投稿者:var
2016/06/14 23:48:25

変数とは何か?という議論がWEBでされているのを見かけ自分の一抹の理解の不足を感じ、"C言語ポインタ完全制覇"を開きました。 非常に分かりやすい説明で、変数の理解が得られた、と思ったと同時に、新しい疑問が湧きました。 先の本の序盤で以下の例があります。 int hoge = 5; 変数hogeのアドレス(&hoge)は"0xbfbfd9e4"。 そこに数値5をint型で配置する。 これは分かるのですが、変数hoge自体は、誰がどこで管理しているのでしょうか。 図表では、0xbfbfd9e4アドレスからの始まりに5が格納されており、これは分かります。 しかし、同時に、"hoge"もあります。この辺りで混乱しております。 0xbfbfd9efアドレスからintの大きさまで == hogeという変数 というその紐付けはまたどこかでやっている?ということでしょうか。 恐らく基礎中の基礎のような気もしますが、調べる限り解答にたどり着けず、 理路整然とした解説で好感持っている前橋様に質問させていただいた次第です。 ※ご迷惑おかけします。誤字あったため同内容で再投稿。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1937] Re:単語の出現頻度を数えるプログラムについて
投稿者:(ぱ)こと管理人
2016/05/21 01:18:36

>単語の出現頻度を数えるプログラムがリンカできません。_mainが未解決とエラーが >表示されます。解決方法を教えてください。 はじめまして。 「ポインタ完全制覇」の5章を読んでのことかと思います。読んでいただきありがとうございます。 「_mainが未解決」ということは、つまりmain関数がリンクされていないということです。 単語の出現頻度のプログラムは、List5.3 main.cが、配列版、連結リスト版両方の 共通のメインルーチンとなりますので、これもリンクしてください。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1936] 単語の出現頻度を数えるプログラムについて
投稿者:くま
2016/05/20 15:33:22

単語の出現頻度を数えるプログラムがリンカできません。_mainが未解決とエラーが表示されます。解決方法を教えてください。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1935] Re:プログラムを頂きます。
投稿者:みうら
2016/05/14 17:10:37

>>とても綺麗な掲示板ですね! > >ありがとうございます。 > >>これはフリーで使わせて頂いて宜しいのですか? > >Webで公開しているものはご自由に使っていただいて構いませんが、 >だんだん拡張したもののソースを順次貼っているのでそっくりそのままでは >動かないかもしれませんし、PHPのver.4の頃に作ったものなので今となっては >古いコードでもあります。 > >そのあたりを了解の上自己責任で使われるのであれば、ご自由にしてください。 > いいですね。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1934] Re:プログラムを頂きます。
投稿者:(ぱ)こと管理人
2016/05/12 00:44:36

>とても綺麗な掲示板ですね! ありがとうございます。 >これはフリーで使わせて頂いて宜しいのですか? Webで公開しているものはご自由に使っていただいて構いませんが、 だんだん拡張したもののソースを順次貼っているのでそっくりそのままでは 動かないかもしれませんし、PHPのver.4の頃に作ったものなので今となっては 古いコードでもあります。 そのあたりを了解の上自己責任で使われるのであれば、ご自由にしてください。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1933] プログラムを頂きます。
投稿者:ブラブラボール
2016/05/10 03:20:04

とても綺麗な掲示板ですね! これはフリーで使わせて頂いて宜しいのですか?
[この投稿を含むスレッドを表示] [この投稿を削除]
[1930] kmaebashi.comが停止していました
投稿者:(ぱ)こと管理人
2016/03/03 02:35:36

すみません、私がkmaebashi.comのサーバ料金の振り込みを忘れていたため、 kmaebashi.comが2/29~3/1にかけて停止していたようです。 現在は振り込みましたので復旧しています。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1929] Re:訂正
投稿者:(ぱ)こと管理人
2016/02/21 20:53:08

>【文】の elseif、elsifになっていました ちょっとどう対応すればよいのかわからなくて1ヵ月以上放置してしまいました。 今さら書いても投稿者の「けろ」さんは読んでおられないとは思うのですが。 これが、crowbarやらDiksamやらにおいて、else ifがelseifではなくて elsifになっている、というご指摘であれば、それは意図したものです。 こちらを参照してください。 http://kmaebashi.com/zakki/lang0001.html
[この投稿を含むスレッドを表示] [この投稿を削除]
[1928] 訂正
投稿者:けろ
2016/01/12 17:53:25

【文】の elseif、elsifになっていました
[この投稿を含むスレッドを表示] [この投稿を削除]
[1921] おすすめの本はありますか?
投稿者:hello
2015/10/29 01:33:14

はじめまして!前橋さんのCでプログラミング言語を描く方法ガイドを今見つけたのですが、学校でパスカルのコンパイラをJavaで書く勉強をしていますがあまりよくわかりません。なにかおすすめの勉強法かウェブサイトか本はありますか?前橋さんのCのガイドに従ったらある程度わかるようになりますか?
[この投稿を含むスレッドを表示] [この投稿を削除]
[1920] Re:C言語ポインタ完全制覇について質問
投稿者:(ぱ)こと管理人
2015/10/22 01:18:10

>222pのlist4-8 read_file.cをコンパイルすると >$ gcc -o read_file read_file.c >C:/DOCUME~1/中村多~1/LOCALS~1/Temp/cc8001MB.o:read_file.c:(.text+0xa9): undefined reference to `read_line' >collect2: ld returned 1 exit status というエラーがでます。 >read_file.cの中に extern char *read_line(FILE* fp);と定義して実行していますが、 >コンパイルできません。どこが間違っているか教えてください。 >`read_line'はread_line.cに定義されている関数です。 単純に、そのread_line.cをリンクしていないからではないでしょうか。 $ gcc -o read_file read_file.c read_line.c
[この投稿を含むスレッドを表示] [この投稿を削除]
[1919] C言語ポインタ完全制覇について質問
投稿者:sanchu
2015/10/21 17:43:49

222pのlist4-8 read_file.cをコンパイルすると $ gcc -o read_file read_file.c C:/DOCUME~1/中村多~1/LOCALS~1/Temp/cc8001MB.o:read_file.c:(.text+0xa9): undefined reference to `read_line' collect2: ld returned 1 exit status というエラーがでます。 read_file.cの中に extern char *read_line(FILE* fp);と定義して実行していますが、 コンパイルできません。どこが間違っているか教えてください。 `read_line'はread_line.cに定義されている関数です。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1918] Re:C言語ポインタ完全制覇について質問
投稿者:774RR
2015/10/20 06:50:02

だいたいいい感じだと思います。細かいところで間違っているようですけど... int a[7]; に対して、使える要素は a[0]..a[6] の7個です。 a[7] を使ってはいけません。 read_line を使ってないようですけど・・・ お勉強ならこういうコメントを入れてみるのはとてもお勧めです。 実用に供するソースコードにこんなコメントが入っていたらそいつの実力を疑います。 (ってか以後、コード系の仕事回しませんけど)
[この投稿を含むスレッドを表示] [この投稿を削除]
[1916] キャップ付きハンドサイズスクレーパー
投稿者:キャップ付きハンドサイズスクレーパー
2015/10/10 11:07:47

カーフィルム施工ツール巾着は分厚い材料に使いやすい設計で、フィルム施工の時にツールの取りに大変便利を与えました。施工道具補助ツールを買いたければ、カーライトフィルムツールhttp://www.caright.net/をぜひおすすめします。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1913] 蟻力神
投稿者:蟻力神
2015/09/21 12:45:07

蟻力神(イーリーシン)を「勃起不全に効果的!」という口コミを信じて購入しました!確か に効果はありましたが、飲んだ感想としては副作用もあるのでオススメはできないですね 。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1912] Re:Flex
投稿者:(ぱ)こと管理人
2015/08/24 01:59:14

>どうやら、flexの方はGNUじゃないようです。 ご指摘ありがとうございます。 正直、無料公開しているWeb記事はさておき、書籍の方で嘘を書いていたら大変だ、 と思い確認したところ書籍の方にはflexがGNUであるという記述はありませんでした… Web記事の方の更新を怠っていたようです。 後ほど修正いたします。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1911] Flex
投稿者:flex
2015/08/19 23:54:31

http://kmaebashi.com/programmer/c_yota/calc.html の記事を読ませて頂きました。 flexがlexのgnu版と書いてありますが、WIkipediaには Unlike Bison, flex is not part of the GNU Project.[4] と書いてありました。 どうやら、flexの方はGNUじゃないようです。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1910] Re:単語の出現頻度を表示するプログラムについて
投稿者:マロン
2015/08/09 00:19:32

>管理人様 > >C言語ポインタ完全制覇を熟読しています。単語の出現頻度を表示するプログラムについて、osはwindows7,visualStudio2015でビルドしようとしたところ以下のエラーが出てしまい、解決方法がわかりません。つきましては、解決の仕方をお教え頂きたく思います。よろしくお願いいたします。未解決の外部参照となってしまいます。 > >LNK1120 1 件の未解決の外部参照 word_count2 > >\Documents\Visual Studio 2015\Projects\CPlus\word_count2\Debug\word_count2.exe 1 > >LNK2019 未解決の外部シンボル "int __cdecl get_word(char *,int,struct _iobuf *)" (?get_word@@YAHPADHPAU_iobuf@@@Z) が関数 _main で参照されました。 > >Documents\Visual Studio 2015\Projects\CPlus\word_count2\word_count2\main.obj 1 > 解決しました。つまらんこと聴いてごめんなさい。削除してもらって構いません。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1909] 単語の出現頻度を表示するプログラムについて
投稿者:マロン
2015/08/08 22:22:36

管理人様 C言語ポインタ完全制覇を熟読しています。単語の出現頻度を表示するプログラムについて、osはwindows7,visualStudio2015でビルドしようとしたところ以下のエラーが出てしまい、解決方法がわかりません。つきましては、解決の仕方をお教え頂きたく思います。よろしくお願いいたします。未解決の外部参照となってしまいます。 LNK1120 1 件の未解決の外部参照 word_count2 \Documents\Visual Studio 2015\Projects\CPlus\word_count2\Debug\word_count2.exe 1 LNK2019 未解決の外部シンボル "int __cdecl get_word(char *,int,struct _iobuf *)" (?get_word@@YAHPADHPAU_iobuf@@@Z) が関数 _main で参照されました。 Documents\Visual Studio 2015\Projects\CPlus\word_count2\word_count2\main.obj 1
[この投稿を含むスレッドを表示] [この投稿を削除]
[1908] Re:Java謎+落とし穴について
投稿者:
2015/08/02 22:36:50

早々にありがとうございます。すっきり理解できました。 10年(ドッグイヤーなら70年)以上前の本への疑問に、「そこまで面倒見られないよ」と言わず答えて下さり、感謝です。 久野禎子・靖さんの著書など、良い本もあるのですが、これでさえ索引に「参照」がないことに、首を傾げています。 そういうわけで『Java謎+落とし穴』は、メモリモデルで考えるためには、現在も唯一無二の拠り所となっています。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1907] Re:Java謎+落とし穴について
投稿者:(ぱ)こと管理人
2015/08/02 13:11:34

>暑中お見舞い申し上げます。 こんにちは。 >『Java謎+落とし穴』で、二つ質問があります。 >見方によっては、各オブジェクトが、間接的にではありますが、それぞれ実行コードへのポインタを持つように思えるのですが、いかがでしょう。 「間接的に」実行コードへのポインタを持つのはその通りですね。 ここは、メソッドが10個あった時、各オブジェクトが10のポインタを持つ必要はないですし、 オブジェクトごとに実行コードへのポインタが書き換わることはない、という意味で 書きました。 (プロトタイプベースのオブジェクト指向だと、実際オブジェクトごとに持っていたり しますし) >・177ページ「draw()メソッドを呼び出す部分はPolylineやCircleにまったく依存しません(その構造体を宣言しているヘッダファイルを#includeする必要がない)」について。 >このdraw()メソッドは、183ページのdrawShape(shapes[i])メソッドと同じでしょうか。ここではmain.cに、各ヘッダファイルをincludeしているように見えます。 ここはわかりにくかったですね。 createPolyline()等は各図形の.hで宣言されているわけで、 各図形をnewするところでは各ヘッダファイルが必要です。 ただ、描画するところ(「draw()メソッドを呼び出す部分」)は、 Polyline.hやCircle.hにまったく依存しません。 (これはJavaにおいても同じことで、newするところは各クラスに依存します)。 この例では、main.cでnewと描画を両方やってしまっているので、 おっしゃるとおり、「main.cでincludeしているではないか」と疑問を持たれるのは わかります。 main.cの描画部分(17~20行目)を、draw.cとか、別ソースに分けておくべきだったかも しれません。 10年以上前の本ですが、ご指摘感謝いたします。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1906] Java謎+落とし穴について
投稿者:
2015/08/02 00:11:09

暑中お見舞い申し上げます。 『Java謎+落とし穴』で、二つ質問があります。 ・46ページ「メソッドの実行コードへのポインタは、オブジェクトごとではなくクラスごとに持てばよい」について。 他方、175ページでは、「各オブジェクトにクラスディスクリプタへのポインタを持たせる」こととされています。 見方によっては、各オブジェクトが、間接的にではありますが、それぞれ実行コードへのポインタを持つように思えるのですが、いかがでしょう。 「①オブジェクトの持つポインタ→②クラスディスクリプタの持つポインタ→③メソッドテーブルの持つポインタ」となっていて、確かに②と③(リフレクションを考えない限り、実質区別なし)は、オブジェクトごとではなく、クラスごとなのかもしれませんが… ・177ページ「draw()メソッドを呼び出す部分はPolylineやCircleにまったく依存しません(その構造体を宣言しているヘッダファイルを#includeする必要がない)」について。 このdraw()メソッドは、183ページのdrawShape(shapes[i])メソッドと同じでしょうか。ここではmain.cに、各ヘッダファイルをincludeしているように見えます。 (これは、たぶん私の誤解、誤読だと思いますが) ご教示をお願いできましたら幸いです。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1905] Re:「PHPとMySQLで掲示板を作る」拝見しました。
投稿者:(ぱ)こと管理人
2015/03/10 02:25:38

>本題に入りますが、投稿内容を<PRE>タグで囲むということ(仕様を考えるのページ)ですが、それでは ><br /> >タグが使用できず改行ができなくなる、ということになります。 まず、この掲示板は、用途的にプログラムソースを貼ることが多いので、 基本等幅フォントで表示する必要がある、というのが<PRE>で囲むようにした 理由です。ただし、等幅フォントにするだけなら<TT>で囲めばよいので、 現状ではそうしています。 http://kmaebashi.com/bbs/list.php?boardid=kmaebashibbs&thread=25 <PRE>で囲むと、投稿者が改行を入れなかった場合、画面が際限なく 右に伸びて崩れてしまうので改善したわけです。 というわけで、<PRE>タグ云々の話はすでに現状の実装とはずれているわけですが、 >そこで思ったのですが、そもそも<PRE>タグを使用せずに<や>の記号を無効にすればいいのでは、ということです。 <PRE>タグの中であっても、<や>の記号は普通に特殊文字としての 意味を持ちます。たとえば以下のページに載せているサンプルソースでは、 ソース全体を<PRE>で囲んでいますが、行番号は<FONT>タグで青字にしていますし、 ソース内で<やら>やら"やらを使うときには&lt;とか&gt;とか&quot;とかに しています。 http://kmaebashi.com/programmer/bbs_dev/newbbs.html >そして思ったのが、phpのhtmlspecialchars()関数です。HTMLにとって特別な意味の<>をすべて単なる文字に変換してくれるという非常に便利な関数です。詳しいことは検索などお願いします。 よって、この手のエスケープは、どちらにせよ必要であり、 htmlspecialchars()もすでに随所で使っています。 例) http://kmaebashi.com/programmer/bbs_dev/list.html >要するに、 >$test = $_GET["test"]; >を、 >$test = htmlspecialchars($_GET["test"]); >のようにしてしまおう、という考えです。こうすれば、<PRE>を使わずに済むため、改行が実現できると思います。 ところで、この例だと、入力の時点でhtmlspecialchars()をかけていますが、 これはそもそも考え方が間違っている、ということをこちらで書いています。 http://kmaebashi.com/zakki/zakki0042.html htmlspecialchars()をかけるのは入力時ではなく出力時にすべきです。 で、上記の記事でも言い訳を書いていますが、そして「PHPとMySQLで掲示板を作る」 内にも注釈を足していますが、 http://kmaebashi.com/programmer/bbs_dev/index.html 現状の「PHPとMySQLで掲示板を作る」のプログラムは(実際にここで動いている 掲示板もそうなのですが)、PHP4の時代のデフォルトであるmagic quoteを使って いるので、今となってはよくないプログラムなんですよねえ。 本記事、注釈を付けつつ公開を続けてきましたが、初心者を惑わせるのも よろしくないので、そろそろ消すべきかもしれません。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1904] 「PHPとMySQLで掲示板を作る」拝見しました。
投稿者:html21315
2015/03/08 10:20:38

突然失礼します。 ホームページ拝見いたしました。phpで掲示板を作るという発想はありませんでした。 本題に入りますが、投稿内容を<PRE>タグで囲むということ(仕様を考えるのページ)ですが、それでは <br /> タグが使用できず改行ができなくなる、ということになります。 そこで思ったのですが、そもそも<PRE>タグを使用せずに<や>の記号を無効にすればいいのでは、ということです。 そして思ったのが、phpのhtmlspecialchars()関数です。HTMLにとって特別な意味の<>をすべて単なる文字に変換してくれるという非常に便利な関数です。詳しいことは検索などお願いします。 要するに、 $test = $_GET["test"]; を、 $test = htmlspecialchars($_GET["test"]); のようにしてしまおう、という考えです。こうすれば、<PRE>を使わずに済むため、改行が実現できると思います。 -追伸- ほとんどのユーザーは、改行を投稿の中でしたいとき<BR>ではなく単にEnterキーを使って改行をします。これを掲示板上で再現するためには<BR>を使わなければいけないので、そこが私が掲示板作りをしたときの悩みどころでした。 そこで、便利なPHPの関数を見つけましたので紹介します。 nl2br() 改行記号の前に<br />を挿入してくれるというありがたいものです。 $test = nl2br( htmlspecialchars( $_GET["test"] ) ); 一行にするとこうなりますが、わかりやすく書くと $test = $_GET["test"]; //取得 $test = htmlspecialchars($test); //<>の無効化 $test = nl2br($test); //<br />挿入 長文失礼しました。 ※先日誤ってメールで送信してしまいましたが、やはり掲示板に書き込むべきだと、掲示板の方に再投稿しました。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1903] Re:オーバーライド時の共変、反変について
投稿者:(ぱ)こと管理人
2015/02/25 03:35:46

>Javaだとこの場合ははオーバライドにはならないで、オーバーロード、 >引数型が違う同名の別メソッドが増えただけと見なすことでガードするという実装なんですね。 こう言っては何なのですが、たぶんこれはJavaを「買いかぶりすぎ」だと思うのです。 引数については、反変はOK、共変はNG、 戻り値については、共変はNG、反変はOK なのですが、 JDK1.4までのJavaでは、 引数については、型が違えばオーバーロード、 戻り値については、型が違えばコンパイルエラー でした。戻り値については共変は許されるべきなのに、古いJavaではコンパイルエラーに してしまっていたのです。 Javaでは、JDK1.5(Tiger)において、「共変戻り値」が許されるようになりました。 後になってこれを許すようになったということは、 当初は、共変とか反変とかそんなことはJavaの作者はあんまりまじめに考えていなくて、 後になって、共変戻り値はOKにすることができたけれど、反変引数は、既にそれを オーバーロードという機能で使ってしまっていたためにOKにできなかったのではないか、 と思います。 メソッドオーバーロードがすごく便利だから反変引数を捨ててでもそちらを取った、 というのは言語設計者の選択肢として理解できますが(私はオーバーロードが便利だと 思わないのでその選択肢は取りませんが)、 本来使えるべき共変戻り値を当初エラーにしてしまっていた(しかも1.5でそれを 撤回した)というのは、あまりこう、ちゃんと考えた結果には見えないんですよねえ。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1902] Re:diksamの実装に関して
投稿者:lang
2015/02/24 22:31:49

本質問に関してもご回答ありがとうございます。 8-4-9章に記載あるAとBがクラスの場合の条件の意図をつかめず、 少し混乱しておりましたが、 実行時にチェックする価値があるという視点で読み直すと理解できました。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1901] Re:オーバーライド時の共変、反変について
投稿者:lang
2015/02/24 22:31:14

ご丁寧にご回答ありがとうございました。 理解できました。 確かに、引数時はダウンキャストになりますね。 Javaだとこの場合ははオーバライドにはならないで、オーバーロード、 引数型が違う同名の別メソッドが増えただけと見なすことでガードするという実装なんですね。 前橋さんの書籍で共変、反変という言葉を知ったのですが、 非常に一般的な概念のようでした。 直接Diksamとはご関係のない質問になってしまい大変恐縮です。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1900] Re:diksamの実装に関して
投稿者:(ぱ)こと管理人
2015/02/24 02:58:14

>"プログラミング言語を作る"の8-4-9章の >A instance of B >の記載に関してです。 > >A、Bがクラスの場合、 >AとBが同じクラスか、AがBのスーパークラスの場合のみ、 >真になる可能性がある、 >とあります。 こちらは説明が不適切な気がしてきました…… たとえばShapeクラスのオブジェクトshapeがあったとき、 shape instanceof Circle という式は、「真になる可能性がある」と言えます。 instanceofは、こうしてクラスをチェックするために使うものでしょう。 全然違う、circle instanceof Windowなら、そもそもコンパイルエラーです。 ここで「真になる可能性がある」と書いているのはそういう意味です。 逆に circle instanceof Shape は、常に真です。常に真ならそれもやっぱり真になるのではないか、 というところですが、その下の説明にあるように、そもそもDiksamは こういうコードは無駄なのでコンパイルエラーにしています。 そういう意味で、実行時にチェックする価値がある、ということで 「真になる可能性がある」と書いたのかもしれませんが、それにしては 「AとBが同じクラスか」部分が余計です。クラスが同じならやっぱり 無駄だからです。 今は時間が時間なので、後日(週末をめどに)正誤表に載せるなり対応を考えます。 ご指摘ありがとうございました。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1899] Re:オーバーライド時の共変、反変について
投稿者:(ぱ)こと管理人
2015/02/24 02:39:59

はじめまして。最近この掲示板もすっかり閑散としてしまっていて、 投稿に気付くのが遅れてしまいました。すみません。 ご質問いただきありがとうございます。 引用の順番を変更しますが、結論から言えば、 >戻りの値の型が共変、引数の型が共変、 >ともにダウンキャストとなる、という認識ですが、 >なぜ、問題の有無の判断が変わってくるのでしょうか。 引数の型が共変なのはダウンキャストですが、 戻り値の型が共変なのはアップキャストだからです。 >”プログラミング言語を作る”内の8-3-5章にて >下の解説を読みました。 p.289のコードですね。 >class ShapeArray{ > Shape get(int index); > void set(int index, Shape shape); >}; > >class CircleArray extends ShapeArray{ > Circle get(int index); ・・・① > void set(int index, Circle circle); ・・・② >}; まず、このコードは、 p.249の補足で、JavaのArrayStoreExceptionの説明をしていますが、 JavaがArrayStoreExceptionを発生させるという実行時チェックを しなければならなくなった、ということについて、共変の考え方からも 説明できる、ということを示すためのコードです。 ここまではよいでしょうか。 p.249の補足のサンプルコードで、 1: Line[] lines = new Line[10]; 2: Shape[] shapes = lines; 3: shapes[3] = new Circle(); というコードがあったとき、Javaでは3行目でArrayStoreExceptionが 発生します。shapesはあくまでLineの配列であり、Circleの配列では ないからです。 これはJavaにおける配列の話ですが、Javaの配列をShapeArrayとか CircleArrayといったクラスで表現すると、p.289のコードのようになります。 ここで、CircleArrayのインスタンスcircleArrayがあったとして、 Shape shape = circleArray.get(i); というコードは、アップキャストなので合法ですが、 circleArray.set(i, shape); というコードは、ダウンキャストになります。CircleArray.set()の第2引数の 型はCircleなので、もしShapeを渡したければダウンキャストが必要になります。 Javaでは、このダウンキャストに相当する実行時例外が、ArrayStoreExceptionに なっている、と言えるでしょう。 この例ではCircleArrayがShapeArrayを継承しているので、もし引数の共変を 許せば、 ShapeArray shapes = circleArray; shapes.set(i, shape); と書けてしまいます。このshapes.set(i, shape);が、 まさにp.249のコードの shapes[i] = new Circle(); に相当するわけです。 これで回答になっているでしょうか?
[この投稿を含むスレッドを表示] [この投稿を削除]
[1898] diksamの実装に関して
投稿者:lang
2015/02/22 19:08:07

立て続けに質問して申し訳ございません。 "プログラミング言語を作る"の8-4-9章の A instance of B の記載に関してです。 A、Bがクラスの場合、 AとBが同じクラスか、AがBのスーパークラスの場合のみ、 真になる可能性がある、 とあります。 A instance of B のAというのはオブジェクトという理解で良いでしょうか。 AがBのスーパークラスの場合に真という点に疑問を持ちました。 Aが右辺のBのクラスのサブクラスのオブジェクトであれば 真だという理解ですが、 AがBのスーパークラスの場合に真というのはなぜでしょうか?
[この投稿を含むスレッドを表示] [この投稿を削除]
[1897] オーバーライド時の共変、反変について
投稿者:lang
2015/02/21 14:30:58

”プログラミング言語を作る”内の8-3-5章にて 下の解説を読みました。 class ShapeArray{ Shape get(int index); void set(int index, Shape shape); }; class CircleArray extends ShapeArray{ Circle get(int index); ・・・① void set(int index, Circle circle); ・・・② }; ①は戻りの値の型が共変なので問題無し。 ②は引数の方が共変であるため実行時チェックが必要。 アップキャストは常に可能ですが、 ダウンキャスト時は実行時チェックが必要だと理解しています。 戻りの値の型が共変、引数の型が共変、 ともにダウンキャストとなる、という認識ですが、 なぜ、問題の有無の判断が変わってくるのでしょうか。 一般的な言語のオーバーライドの動作に関することで 本掲示板への質問が適切かどうか分かりませんが、 もしよろしければ細くいただけると助かります。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1895] Re:質問です
投稿者:
2014/09/13 13:34:55

ご返信ありがとうございました。 著者の方に質問できる場所があるって素晴らしいです。 アルゴリズムへの興味を深めることができました。 (個人的にはこの対話で十分満足です) 掲示板やWebサーバーの作り方も書籍化していただければと思います。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1894] Re:質問です
投稿者:(ぱ)こと管理人
2014/09/09 02:00:02

こんにちは。 >sorted_count < score_count-1 > >の間だけ(score_count-2の要素まで)ループを回せば、最後の要素score_count-1は >整列された状態になっているのではないでしょうか。 最後の2要素残ったところでその2要素で交換するわけですから、 確かにループ1回無駄ではありますね。 「全部ソートされた」ことを示すのに while (sorted_count < score_count) { という条件式はそれはそれでわかりやすいとは思うのですが、 境界値がらみの説明を延々としているところですので、なんらかの 説明はいるように思います。 今日はちょっと無理ですが、次の週末にはWebにてフォローします。 ご指摘ありがとうございました。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1893] 質問です
投稿者:
2014/09/07 12:14:22

こんにちは。 『C言語体当たり学習 徹底入門』103ページについての質問です。 終了条件は、「すべてがソートされたとき」 すなわちsorted_countとscore_countが等しくなったとき sorted_count < score_countの間だけ、ループを回せばよい とありますが、 sorted_count < score_count-1 の間だけ(score_count-2の要素まで)ループを回せば、最後の要素score_count-1は整列された状態になっているのではないでしょうか。 単純選択ソートと単純交換ソートでは、ソート済範囲は絶対に動かない。 単純挿入ソートでは、ソート済範囲も動く可能性がある。 という理解です。 よろしくお願い致します。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1892] 「C言語 ポインタ完全制覇」補足目次を作成しました
投稿者:(ぱ)こと管理人
2014/03/30 15:40:57

><補足> supplement を目次へ追加願います。 大変いまさらではありますが、「C言語 ポインタ完全制覇」の補足目次を作成しました。 http://kmaebashi.com/seiha/hosoku_index.html (他の本については、まあ、おいおいと) 元ネタは元原稿のLaTeXファイルから抽出したので、抜けはないはず…… と思ったのですが、 結構最後の最後まで補足の追加とかしていたようで、元原稿になくて本にはある補足が いくつか。補足を書き足してるヒマにちゃんと校正やっとけという話なのですが…… 編集さんご迷惑をおかけしました。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1891] Re:「C言語 ポインタ完全制覇」について気がついた事、要望
投稿者:(ぱ)こと管理人
2014/03/24 00:51:35

ご意見ありがとうございます。 >p.149 3-2 Cの型モデル について >この章は、大変重要な事が説明されていると思いますが、それが読者にきちんと >伝わっていない可能性があると思います。 読み返してみました。ここはかなり重要な章だと思いますので、 ここが読者に伝わっていないとなると問題です。 ご指摘の件、改訂版の機会があれば検討させていただきます。 # このレベルの修正だと、第16刷とかで手直しできるレベルを # 超えていると思いますので。 ><補足> supplement を目次へ追加願います。 これは、正直、私もちょっと心に引っかかっていました。 (と言いつつ、その後の本でも直っていないわけですが……) いまさらではありますが、こちらについてはWebで補足目次を作るくらいの ことはできそうです。すぐにやるとは言えませんが、検討します。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1890] 「C言語 ポインタ完全制覇」について気がついた事、要望
投稿者:jcv
2014/03/23 19:41:55

今更と思われるかもしれませんが、技術評論社「 C言語 ポインタ完全制覇」について、 気がついた事をお知らせ致します。 参照しているのは、2013年10月10日 初版第15刷です。 p.149 3-2 Cの型モデル について この章は、大変重要な事が説明されていると思いますが、それが読者にきちんと 伝わっていない可能性があると思います。この本を順番に読んで行くと、いきなり Fig.3-1 の表が出て来たという印象を受けました。とまどわれた方も多いのでは ないかと思います。私も何を説明しているのかが理解出来ませんでした。また、 その後の派生型の話も全く記憶に残っていませんでした。最近、読み返して、やっ とこの表や、この章全体が 「Cの型」がどの様に決められているかについての説明 である事がわかりました。改めて章のタイトルを見ると、「Cの型モデル」とあり、 わかった後で読み返すと、Fig.3-1 には、『「型」を図で表現すると…』とあり、 確かに説明がされているのがわかりました。 「Cの型モデル」というこの章のタイトルは、この章の内容を端的に まとめられていて、極めて妥当なタイトルであるとは思います。 後日リファレンスマニュアルとしてこの本を利用する場合には、目次 ですぐに見つかりますので良いと思います。 p.149 の上部には、挿絵があり、その中に「3-2 Cの型モデル」とタイトルが入っ ていはいますが、このタイトル部分が挿絵の中で、色も異なり、絵の内容も本の 内容とは関連も薄く、しかもすべての章節の絵が同じなので、このタイトルに気 がつかずに読み進める読者も多いのではないかと思います。また、このタイトル を読んだとしても、はじめて読む読者が内容を知らずにこのタイトルだけを見て、 すぐに内容が思い浮ぶタイトルではないと思います。 その様な、このタイトルの内容が頭に入っていない状態でこの章を読み始めると、 その後の「3-2-1 基本型と派生型」を見ますが、この用語はこの章の中で解説が されているので、何のことかもわかりません。その状態で、本文を読んでも、 これが、Cの型の説明をしているという事が理解出来ないと思います。 せめて、直前の章の終りで、つぎの章予告等があれば話しは違いますが、直前の 章は、型の話ではありますが、間に約2ページの「補足」が入っているので、リフ レッシュされて前の内容は記憶に残っていないかもしれません。やはりこの章に ついては、最初に何の説明を行うかを記載するのが良いのではないかと思います。 <補足> supplement を目次へ追加願います。 補足には、重要な内容が多く記載されています。そして、他の人への説明に利用 させて頂きたい事や、後から読み返したい事が多いのも、補足の部分に書かれて いる内容についてです。ところが、この補足には、目次がなくアクセスが出来ま せん。更に、索引にも出て来ない事がありました。例えば、p.168 「式」に対す るsizeof は、索引で sizeof を見ても、p. 158 が出て来るだけでした。しかも この補足は違う章に入っていましたので、全ページを探す必要がありました。 (sizeof がたまたま漏れていたのかもしれませんが)是非、補足の目次の追加を お願いします。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1888] Re:コンパイルが通りません.
投稿者:(ぱ)こと管理人
2014/01/05 14:49:53

>例として掲載されているServer01,javaのサンプルコードですが,そのままではコンパイルが通りませんでした. はじめまして。 今手元にjavacがないので貼ったコードを再コンパイル等はしていませんが、 ぱっと見おかしいようには見えません。 コンパイルが通らないとのことですが、 ・コンパイルが通らない際のエラーメッセージ ・ご使用のjavacのバージョン といった情報を教えてもらえないでしょうか。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1887] コンパイルが通りません.
投稿者:新参者
2014/01/03 21:50:28

お世話になっております. 今回,クライアントサーバを1から作ってみようと思い,貴サイトを活用させていただきました. 例として掲載されているServer01,javaのサンプルコードですが,そのままではコンパイルが通りませんでした. ソースコードをここに記載します. import java.io.*; import java.net.*; public class Server01 { public static void main(String[] argv) throws Exception { try (ServerSocket server = new ServerSocket(8001); FileOutputStream fos = new FileOutputStream("server_recv.txt"); FileInputStream fis = new FileInputStream("server_send.txt")) { System.out.println("クライアントからの接続を待ちます。"); Socket socket = server.accept(); System.out.println("クライアント接続。"); int ch; // クライアントから受け取った内容をserver_recv.txtに出力 InputStream input = socket.getInputStream(); // クライアントは、終了のマークとして0を送付してくる while ((ch = input.read()) != 0) { fos.write(ch); } // server_send.txtの内容をクライアントに送付 OutputStream output = socket.getOutputStream(); while ((ch = fis.read()) != -1) { output.write(ch); } socket.close(); } catch (Exception ex) { ex.printStackTrace(); } } }
[この投稿を含むスレッドを表示] [この投稿を削除]
[1884] Re:crowbar_book_ver4について
投稿者:(ぱ)こと管理人
2013/12/02 21:13:12

>たぶんですけど、直すのに影響があんまり出ないやり方があります。crowbarスタックを >一つの配列ではなく、複数の配列をリンクするによりスタックの拡張ができます。 >スタック拡張する場合には新たな配列をmalloc()して、それをもとにあったスタックと >リンクして、それでrealloc()を回避できますますね。これが「chunked stack」とも >言います。 全体を確認していませんが、ざっと見てみると、現状のcrowbarの実装だと スタック操作がpush_value()とかpeek_stack()にカプセル化されているので、push_value()のところで新たにmalloc()してリンクリスト等で管理し、 peek_stack()にて、もし配列の下端より下の領域を参照されたらひとつ前の 領域から算出して返す、ということはできそうですね…… 実のところ同じ現象はDiksamにもあるはずで、こちらはVMの中で直接参照して います。ただし、Diksamは関数呼び出し時にスタックの拡張があるかどうかを 判定していますし、ひとつの関数の実行中だけ連続したスタック領域が見えれば 十分でしょうから、なんとかなるように思います。 (すみません、ちょっとすぐには直せませんが) ご意見ありがとうございました。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1883] Re:crowbar_book_ver4について
投稿者:RednaxelaFX
2013/11/30 23:34:37

>どたばたしておりまして対応が遅れました。すみません。 いえ、大丈夫です。返事を頂いてありがとうございます。 >>realloc()が対象データを移動しかねないので、移動した場合、もしスタックのなかでネイティブ関数に渡す引数があれば、それを指すポインタ(arg_p)が無効化される恐れがありますね。 > >本当ですね……初歩的なミスでした。ご指摘ありがとうございます。 >直すなら、ポインタでなく添字を渡して関数経由でアクセスするようにするのかと思いますが、ネイティブ関数全体に影響が出ます。少し考えさせてください。 >ご指摘ありがとうございました。 たぶんですけど、直すのに影響があんまり出ないやり方があります。crowbarスタックを一つの配列ではなく、複数の配列をリンクするによりスタックの拡張ができます。スタック拡張する場合には新たな配列をmalloc()して、それをもとにあったスタックとリンクして、それでrealloc()を回避できますますね。これが「chunked stack」とも言います。 >>ついでに、CRB_create_interpreter()で、interpreter->stack.stack_alloc_sizeの初期値が0になってますが、それがSTACK_ALLOC_SIZEになったほうがいいではないでしょうか。 > >NULLを第一引数とするreallocはmallocと同じなので、どちらでもよいのではないでしょうか。 はい、どちらでも良いですね。 - Kris
[この投稿を含むスレッドを表示] [この投稿を削除]
[1882] Re:crowbar_book_ver4について
投稿者:(ぱ)こと管理人
2013/11/30 12:42:30

どたばたしておりまして対応が遅れました。すみません。 >realloc()が対象データを移動しかねないので、移動した場合、もしスタックのなかでネイティブ関数に渡す引数があれば、それを指すポインタ(arg_p)が無効化される恐れがありますね。 本当ですね……初歩的なミスでした。ご指摘ありがとうございます。 直すなら、ポインタでなく添字を渡して関数経由でアクセスするようにするのかと思いますが、ネイティブ関数全体に影響が出ます。少し考えさせてください。 ご指摘ありがとうございました。 >ついでに、CRB_create_interpreter()で、interpreter->stack.stack_alloc_sizeの初期値が0になってますが、それがSTACK_ALLOC_SIZEになったほうがいいではないでしょうか。 NULLを第一引数とするreallocはmallocと同じなので、どちらでもよいのではないでしょうか。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1881] Re:crowbar_book_ver4について
投稿者:RednaxelaFX
2013/11/27 02:02:07

前橋様、 もう一つ、crowbarスタックとネーティブ仮引数について聞きたいことがあります。 crowbar_book_0_4では、crowbarスタックはrealloc()を使って拡張します。そしてネイティブ関数に渡す引数の配列がはcrowbarスタックに積んでいます。realloc()が対象データを移動しかねないので、移動した場合、もしスタックのなかでネイティブ関数に渡す引数があれば、それを指すポインタ(arg_p)が無効化される恐れがありますね。 ついでに、CRB_create_interpreter()で、interpreter->stack.stack_alloc_sizeの初期値が0になってますが、それがSTACK_ALLOC_SIZEになったほうがいいではないでしょうか。stack_alloc_sizeの初期値が0なら、最初にpush_value()を呼び出すと、stack_pointer == stack_alloc_sizeので無駄にMEM_realloc()でcrowbarスタック拡張をします。 - Kris
[この投稿を含むスレッドを表示] [この投稿を削除]
[1880] Re:crowbar_book_ver4について
投稿者:RednaxelaFX
2013/11/25 00:44:46

はるほど、納得いたしました。 お忙しい中、丁寧なご返事、ありがとうございました。 - Kris >確認しました。確かに無駄なことをしているように見えます。 >そもそも関数名がrelease_global_stringsなのに、文字列に対して >何かしているように見えません。 > >どうしてこうなったのかと思い、調べたのですが、どうも >ver.0.1のこのコードが原因なのかと思います。 > >http://kmaebashi.com/programmer/devlang/crowbar_src_0_1_01/S/15.html#76 >static void >release_global_strings(CRB_Interpreter *interpreter) { > while (interpreter->variable) { > Variable *temp = interpreter->variable; > interpreter->variable = temp->next; > if (temp->value.type == CRB_STRING_VALUE) { > crb_release_string(temp->value.u.string_value); > } > } >} > >ver.0.1時点では、参照カウンタのGCしかなかったので、インタプリタを >破棄するときには文字列の領域はfreeする必要がありました。その処理が >上記のコードです。 > >ver.0.2でGCを組み込んだので、interpreter->variableをNULLにしておけば、 >文字列の領域もcrb_garbage_collect()の呼び出しで解放されます。 >ただ、ver.0.2を作ったとき、ヘッダファイルを直してコンパイルエラーを取って、 >という作業をしているときに、コンパイルエラーの原因のところだけ削って >関数そのものが不要であることに気付かなかったのではないかと思います。 >すみませんでした。再確認のうえ、正誤表に載せる等対応します。 > >細かいところまでソースを読み込んでいただき、作者冥利に尽きます。 >ありがとうございました。 >
[この投稿を含むスレッドを表示] [この投稿を削除]
[1879] Re:crowbar_book_ver4について
投稿者:(ぱ)こと管理人
2013/11/24 23:19:43

>こんにちは、@rednaxelafxことKrisと申します。 中国からありがとうございます。 (中国語版がもう出版されているということを私も今知りました) >このたびはcrowbarについてちょっと聞きたいことがあります。 … >その中のcrowbar_book_0_4ですが、interface.cでのrelease_global_strings()が >こうなっています: >static void >release_global_strings(CRB_Interpreter *interpreter) { > while (interpreter->variable) { > Variable *temp = interpreter->variable; > interpreter->variable = temp->next; > } >} 確認しました。確かに無駄なことをしているように見えます。 そもそも関数名がrelease_global_stringsなのに、文字列に対して 何かしているように見えません。 どうしてこうなったのかと思い、調べたのですが、どうも ver.0.1のこのコードが原因なのかと思います。 http://kmaebashi.com/programmer/devlang/crowbar_src_0_1_01/S/15.html#76 static void release_global_strings(CRB_Interpreter *interpreter) { while (interpreter->variable) { Variable *temp = interpreter->variable; interpreter->variable = temp->next; if (temp->value.type == CRB_STRING_VALUE) { crb_release_string(temp->value.u.string_value); } } } ver.0.1時点では、参照カウンタのGCしかなかったので、インタプリタを 破棄するときには文字列の領域はfreeする必要がありました。その処理が 上記のコードです。 ver.0.2でGCを組み込んだので、interpreter->variableをNULLにしておけば、 文字列の領域もcrb_garbage_collect()の呼び出しで解放されます。 ただ、ver.0.2を作ったとき、ヘッダファイルを直してコンパイルエラーを取って、 という作業をしているときに、コンパイルエラーの原因のところだけ削って 関数そのものが不要であることに気付かなかったのではないかと思います。 すみませんでした。再確認のうえ、正誤表に載せる等対応します。 細かいところまでソースを読み込んでいただき、作者冥利に尽きます。 ありがとうございました。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1878] crowbar_book_ver4について
投稿者:RednaxelaFX
2013/11/24 03:34:37

こんにちは、@rednaxelafxことKrisと申します。 たぶん「はじめまして」ではないかと、Twitterで検索したところ、たしかにもっと前から挨拶をしました(笑) https://twitter.com/rednaxelafx/status/14597568550 Web連載も結構前から読みましたが、「プログラミング言語を作る」が本になって本当に嬉しかったです。 去年中国の編集さんにこの本を強く薦めました。いまはやっとその中国語翻訳版が買えるようになりまして、自分のブログでこの本を押したいと思います。 このたびはcrowbarについてちょっと聞きたいことがあります。 本のサンプルコードをこちらからダウンロードしました: http://kmaebashi.com/programmer/devlang/book/unix_utf8_20091228.tgz その中のcrowbar_book_0_4ですが、interface.cでのrelease_global_strings()がこうなっています: static void release_global_strings(CRB_Interpreter *interpreter) { while (interpreter->variable) { Variable *temp = interpreter->variable; interpreter->variable = temp->next; } } この関数がもともと何をしようとしてますか?このままだと、ループしなくても、直接に interpreter->variable = NULL でも同じではないですか? もしかしたらこうしたかったとか: static void release_global_strings(CRB_Interpreter *interpreter) { while (interpreter->variable) { Variable *temp = interpreter->variable; Variable *temp_next = temp->next; temp->next = NULL; interpreter->variable = temp_next; } }
[この投稿を含むスレッドを表示] [この投稿を削除]
[1877] Re:C言語ポインタ完全制覇の質問
投稿者:April
2013/11/22 04:35:57

>>>DEBUG_WRITE(("hoge..%d\n", hoge)); >>を >>DEBUG_WRITE("hoge..%d\n", hoge); >>と書きたい場合は、 >>>>#define DEBUG_WRITE(arg) debug_write(arg) >>と書くことで同じになりますか? > >なりません。引数をひとつしか取らないマクロにふたつの引数を渡しているので >エラーになります。 >というか、そもそもこれでうまくいくのであれば誰も苦労はしないわけで、 >わざわざ二重括弧をつけたりしようとは思いません。 > >ISO C99では新機能により可変長引数を持つマクロが定義できるようになりましたが。 >http://seclan.dll.jp/c99d/c99d02.htm > >処理系をお持ちであれば、実際に試してみて、プリプロセッサの出力を >見てみるのが一番わかりやすいと思いますが、手元に実行できる環境は >ないのでしょうか? > >まあ、私も子どもの頃は、パソコン買ってもらえなくてペーパープログラマー >だったので、だとすればその苦労はわかります。 > 理解できました ありがとうございます。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1876] Re:本当の基礎からのWebアプリケーション入門 typo
投稿者:(ぱ)こと管理人
2013/09/25 02:48:18

>「u行目で定数DOCUMENT_ROOTを設定しています」の「u行目」は、 >7行目の事のはずなので、typo と思われます。 ご指摘ありがとうございます。修正しました。 誤解が起きようがないtypo場所の指摘方法がさすがといいますか、 いろんな人に読まれてますね (^^;
[この投稿を含むスレッドを表示] [この投稿を削除]
[1875] 本当の基礎からのWebアプリケーション入門 typo
投稿者:jcv
2013/09/23 08:56:09

本当の基礎からのWebアプリケーション入門 ――Webサーバを作ってみよう―― Webサーバを作る ひとつのHTMLファイルを返す webserver.html の225行目 「u行目で定数DOCUMENT_ROOTを設定しています」の「u行目」は、 7行目の事のはずなので、typo と思われます。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1873] Re:C言語ポインタ完全制覇の質問
投稿者:(ぱ)こと管理人
2013/08/10 11:41:06

>単純にカンマ演算子が評価されて debug_write(hoge); と同値になるだけでしょう。 うひ。その通りです。カンマ演算子をすっかり忘れていました。 ご指摘ありがとうございました。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1872] Re:C言語ポインタ完全制覇の質問
投稿者:774RR
2013/08/08 18:11:39

一通り質疑応答はきれいに終わったようなので、要らぬ一言を >debug_write(("hoge..%d\n", hoge)); >これは構文エラーです。 単純にカンマ演算子が評価されて debug_write(hoge); と同値になるだけでしょう。 hoge が整数型なら引数の型不一致エラーになるものと思われます。 hoge が char* ならエラーなく通ってしまうはず。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1871] Re:C言語ポインタ完全制覇の質問
投稿者:あり
2013/08/07 08:02:56

ありがとうございます。 理解できました。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1870] Re:C言語ポインタ完全制覇の質問
投稿者:(ぱ)こと管理人
2013/08/06 22:45:11

>>DEBUG_WRITE(("hoge..%d\n", hoge)); >を >DEBUG_WRITE("hoge..%d\n", hoge); >と書きたい場合は、 >>>#define DEBUG_WRITE(arg) debug_write(arg) >と書くことで同じになりますか? なりません。引数をひとつしか取らないマクロにふたつの引数を渡しているので エラーになります。 というか、そもそもこれでうまくいくのであれば誰も苦労はしないわけで、 わざわざ二重括弧をつけたりしようとは思いません。 ISO C99では新機能により可変長引数を持つマクロが定義できるようになりましたが。 http://seclan.dll.jp/c99d/c99d02.htm 処理系をお持ちであれば、実際に試してみて、プリプロセッサの出力を 見てみるのが一番わかりやすいと思いますが、手元に実行できる環境は ないのでしょうか? まあ、私も子どもの頃は、パソコン買ってもらえなくてペーパープログラマー だったので、だとすればその苦労はわかります。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1869] Re:C言語ポインタ完全制覇の質問
投稿者:あり
2013/08/06 07:59:33

>DEBUG_WRITE(("hoge..%d\n", hoge)); を DEBUG_WRITE("hoge..%d\n", hoge); と書きたい場合は、 >>#define DEBUG_WRITE(arg) debug_write(arg) と書くことで同じになりますか?
[この投稿を含むスレッドを表示] [この投稿を削除]
[1868] Re:C言語ポインタ完全制覇の質問
投稿者:(ぱ)こと管理人
2013/08/05 21:39:59

>>>#define DEBUG_WRITE(arg) debug_write arg  >の書き方は、 >#define DEBUG_WRITE(arg) debug_write(arg) >と書くのと同じことになりますか?  なりません。 下の書き方で以下のように呼び出すと、 DEBUG_WRITE(("hoge..%d\n", hoge)); マクロが展開された時点でこうなります。 debug_write(("hoge..%d\n", hoge)); これは構文エラーです。 DEBUG_WRITEの括弧内、つまり DEBUG_WRITE(ココ) にあるものがargの場所に配置されるのですから、当然そうなります。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1867] Re:C言語ポインタ完全制覇の質問
投稿者:あり
2013/08/05 08:11:42

返信ありがとうございます。 追加でもう一点お願いします。 >>P108の上半分の >>#ifdef DEBUG >>#define DEBUG_WRITE(arg) debug_write arg  >… の書き方は、 #define DEBUG_WRITE(arg) debug_write(arg) と書くのと同じことになりますか? 
[この投稿を含むスレッドを表示] [この投稿を削除]
[1866] Re:C言語ポインタ完全制覇の質問
投稿者:(ぱ)こと管理人
2013/08/03 16:09:15

>P108の上半分の >#ifdef DEBUG >#define DEBUG_WRITE(arg) debug_write arg  … >でdebug_writeのうしろに空白があって、argがあるのがどういうことか理解できません。 このDEBUG_WRITEの使い方についてはその続きで説明しており、以下のように書いています。 DEBUG_WRITE(("hoge..%d\n", hoge)) これをプリプロセッサにかけたときにどうなるかは、やってみれば一番わかると思いますが、 この2重の括弧の内側が、括弧ごと展開されますので、こうなります。 debug_write ("hoge..%d\n", hoge) これで可変長引数を取るデバッグライト用関数debug_write()を 呼び出すことができるわけです。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1865] C言語ポインタ完全制覇の質問
投稿者:あり
2013/08/02 08:15:58

P108 デバッグライト用の関数を作ってみよう に関して質問があります。 P108の上半分の #ifdef DEBUG #define DEBUG_WRITE(arg) debug_write arg  #else ・・・・ でdebug_writeのうしろに空白があって、argがあるのがどういうことか理解できません。 説明いただけないでしょうか。 よろしくお願いします。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1863] 管理者により削除されました
2013/05/15 01:35:25

テストはテスト用掲示板にてお願いします。
[この投稿を含むスレッドを表示]
[1862] Re:フローチャートについて
投稿者:(ぱ)こと管理人
2013/05/09 02:47:21

>アルゴリズムについてろくに知らないくせに軽視するという傾向がありました。 あう。すみません。 勉強はなんであっても重要ですよね。それこそフロチャートだって、記号の 意味くらいは知っていたほうがよいかと思いますし。 >それと、「インタプリタは翻訳しない」(インタプリタ自身が命令セットを持っている) >ことを他書がどう書いているか、一時期、気になってました。「翻訳する」などとなって >いても、表面上は誤りとも言い切れない表現の本が多いようです(そもそもあまり意識 >していないような)。その点、村瀬康治さんは、さすがに正確に書かれています。 とりあえず手元にある本では、 パソコンプログラミング入門以前 伊藤華子著 初版(1998年) 第10刷(2001年) | 中には、オブジェクトプログラムを生成しない「インタープリタ方式」で、 | ソースプログラムを一括変換しないで、一部分ずつを翻訳し直接実行する | スタイルもあります。 この本ではこの後、通訳に原稿をまるごと翻訳してもらう方法(コンパイル方式)と 比較して、同時通訳をインタプリタにたとえています。これはさすがに言い訳 できないと思います。 プログラムはなぜ動くのか 知っておきたいプログラミングの基礎知識 矢沢久雄著 1版7刷 (1刷ともに2001年) | Q.:コンパイラとインタプリタの違いは何ですか? | A.:コンパイラは、実行前にソースコードをネイティブ・コードに一括して | 翻訳します。インタプリタは、実行時にソースコードの内容を1行ずつ | ネイティブ・コードに逐次変換します。 「これが驚異のべすとせらあ?」とセンス・オブ・プログラミングに書いた本は 実はこれです。 改訂版が出ているので立ち読みしましたが、該当の記述はなくなっているようです。 どちらも増刷を繰り返している、かなり売れている本なんですよねえ。 >「Java謎+落とし穴」、第二版を期待しつつ。 残念ながらその予定はないのですが、この本は、amazonのレビューとかでも 書かれているとおり、今となっては古い本になってしまっていると自分でも思います。 でもなー、あの時点で、Genericsや列挙の不在はもちろん、引数と戻り値の 共変、反変まで書いたってのは、手前味噌ながらなかなかのものだと思うんですよ。 Web上で書評を見ても、2章のポインタ議論あたりまでしか言及されてないのが 多くてですね(愚痴)
[この投稿を含むスレッドを表示] [この投稿を削除]
[1861] Re:フローチャートについて
投稿者:動坂亭
2013/05/07 22:40:31

前橋様 お忙しい中、丁寧にご回答いただき、ありがとうございました。 お答えを自分なりに咀嚼し、今後に活かしたいと思います。もちろん、フロチャートは書かない(こだわらない、忘れる)ようにします。 ちなみに、柴田芳樹さんという方も、「人月の神話」でフローチャートが否定されていることについて「当然のこと」と書かれていました(「ソフトウェア開発の名著を読む」P46)。 「センス・オブ・プログラミング」の感想をあと少し書きますと、これも、影響を受けやすい(読者たる)私自身の責任ですが、アルゴリズムについてろくに知らないくせに軽視するという傾向がありました。最近それを自覚するに至り、まずは人並みにマスターしてから、と思っています。 それと、「インタプリタは翻訳しない」(インタプリタ自身が命令セットを持っている)ことを他書がどう書いているか、一時期、気になってました。「翻訳する」などとなっていても、表面上は誤りとも言い切れない表現の本が多いようです(そもそもあまり意識していないような)。その点、村瀬康治さんは、さすがに正確に書かれています。 「Java謎+落とし穴」、第二版を期待しつつ。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1860] Re:フローチャートについて
投稿者:(ぱ)こと管理人
2013/05/05 15:38:27

こんにちは。本を購入いただきありがとうございます。 >一方で、大滝みや子さんの「かんたんアルゴリズム解法」では、副題に「流れ図」と >あるように、フローチャートを扱っています。この本は、基本情報技術者試験の >テキストであるわけですが、国家試験である(らしい)同試験で、初心者に >フローチャートを学ばせていることと、先の常識との関係を、どのように整理すれば >よいでしょうか。 国家試験だからといって必ずしも適切な問題を出しているとは限りませんし、 ひとまず「基本情報 フロチャート」で検索したらまず出たのが以下の過去問でしたが、 http://www.k4.dion.ne.jp/~type_f/FE_18S_AM/FE_18S_AM_42.html この問題は、何についての理解を試しているのでしょう…… フロチャートの書式? それとも、アルゴリズムの基本的な考え方? フロチャートの書式を問う問題には見えないですよね。記号の意味自体は、 それこそ初めて見る人でも、だいたい見当がつきそうです。 この問題はアルゴリズムの考え方を問う問題で、たまたまそこでフロチャートを 使っていると見るべきであるように思います。それが適切かどうかはさておき。 (「Pascal風擬似言語」でもよいと思うのですが、言語非依存にしておかないと 都合が悪い事情はあるかも) >「センス・オブ・プログラミング」でも、基本情報技術者試験の試験範囲と >重なる入門的話題(基数、加算器など)も多く取り上げられていますことから、 >フローチャートはそのレベル以前、とも考えられず、フローチャートには >どういう態度で接すべきか、分かっていません。基本中の基本としては、 >必要なのでしょうか? 実のところフロチャートの記号なんて数種しかありませんし、記号の意味を 覚えておいて無駄になるということはないと思います。 ただ、入門者がおもちゃプログラムを作るときを含め、設計の役にはまったく 立たないと思います。理由は、「センス・オブ・プログラミング」にも書きましたが、 フロチャートは、いまどきの普通のプログラミング言語と比べても「機械語寄り」の 低レベルな記法であるからです。こんなものを書くくらいなら、対象の言語で 直接書くほうがよっぽどマシですし、その方が、コンパイラに怒られたり 動かしてバグを出したり等、勉強にもなります。 ただし、私もフロチャートを書くことはたまにはあって、それは、たとえば システムの運用担当者さん向けに、「エラーが発生したときにどうすべきか」といった 説明資料を作るような時です。これは、フロチャートにしたがって運用担当者さんが それこそCPUのように機械的に動けるように指示するものなので、より「低レベル」な 記法の方が好ましいわけです。 そのようなケース以外で、設計のためにフロチャートを書くことは、もちろん 実務ではありませんし、入門時にどうだったかといえば、私自身はBASIC時代に 入門しているわけでフロチャートも書きましたが、会社に入ったとき同期の連中は まるっきり初心者の人もいましたが、フロチャートなしで入門していました。 動坂亭さんが今までどんなプログラムを作ってこられたかわかりませんが、 何らかのテーマを決めてコードをガリガリ書いていけば100行くらいすぐですし、 100行のコードは、既にフロチャートで表現するのは難しいのではないでしょうか。 フロチャートを書くかどうか迷っている暇にどんどんコードを書いたほうが有益だと 思います。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1859] フローチャートについて
投稿者:動坂亭
2013/05/03 23:02:01

はじめまして。 私はプログラミング初心者ですが、前橋様のご著書は、「プログラミング言語を作る」を含め、全て所有しています(読めてはいません)。つまりファンということになり、影響も受けていると思います。 さて、「センス・オブ・プログラミング」でフローチャートを書いてはいけない、とされています。他の著者の本でも、このことは常識とされているものも見かけますし、素人たる私としても、疑問の余地がない事実なのであろうと推測します。(ごくごく単純な、構造化プログラミングぐらいの世界で、実務の役に立たないという趣旨なのかなと思ってます) 一方で、大滝みや子さんの「かんたんアルゴリズム解法」では、副題に「流れ図」とあるように、フローチャートを扱っています。この本は、基本情報技術者試験のテキストであるわけですが、国家試験である(らしい)同試験で、初心者にフローチャートを学ばせていることと、先の常識との関係を、どのように整理すればよいでしょうか。 「センス・オブ・プログラミング」でも、基本情報技術者試験の試験範囲と重なる入門的話題(基数、加算器など)も多く取り上げられていますことから、フローチャートはそのレベル以前、とも考えられず、フローチャートにはどういう態度で接すべきか、分かっていません。基本中の基本としては、必要なのでしょうか? ご教示いただけましたら幸いです。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1858] kmaebashi.com停止のお詫び(1年ぶり2回目)
投稿者:(ぱ)こと管理人
2013/03/26 03:09:41

おそらく3/22~3/25にかけて、本Webサイトkmaebashi.comが停止しておりました。 管理人である私が、忙しさにかまけてレンタルサーバの利用料金の振込みを失念していたのが原因です。3/23(土曜)に振り込み、月曜に復旧していただきました。 利用者の皆様にはご迷惑をおかけしまして申しわけありませんでした。 1年前… orz http://kmaebashi.com/bbs/list.php?boardid=kmaebashibbs&from=1812&range=1
[この投稿を含むスレッドを表示] [この投稿を削除]
[1856] Re:スタイルシートに関して
投稿者:misamisa
2013/01/14 17:31:26

管理人様、ご回答ありがとうございます。 ようやく実現できました!
[この投稿を含むスレッドを表示] [この投稿を削除]
[1855] Re:crowbar ver2のnative pointerについて
投稿者:hiro
2013/01/11 16:30:22

774RR様 ご回答ありがとうございます. 納得です.そういえば,昔そういう話を授業で聞いたことを思い出しました. ありがとうございました. >>char *str >>switch(type) { >> case XXX_EXPRESSION: >> str = "文字列" >>} >> >>return str; >>これだと,リターンされる文字列は自動変数なので,関数を抜けたらメモリが開放されるため,バグになる可能性があるのではないでしょうか? > >この例では、実は リターンされる文字列は自動変数 ではないのです。 >消滅するのは、自動変数 str というポインタ変数のためのメモリ領域 >return の前後で str に入っていた値 が複写される >ポインタ変数の値、すなわち str が指す先は "文字列" という [ストリングリテラル] である >ストリングリテラルはプログラム終了まで消滅しない >ので、この例は100%合法です。 > >以下の例だと 文字列 str が真に自動変数であるためバグります。 >const char* buggy_sample_func() { > char str[100]; > strcpy(str, "文字列"); > return str; >} >
[この投稿を含むスレッドを表示] [この投稿を削除]
[1854] Re:crowbar ver2のnative pointerについて
投稿者:774RR
2013/01/11 11:58:28

>char *str >switch(type) { > case XXX_EXPRESSION: > str = "文字列" >} > >return str; >これだと,リターンされる文字列は自動変数なので,関数を抜けたらメモリが開放されるため,バグになる可能性があるのではないでしょうか? この例では、実は リターンされる文字列は自動変数 ではないのです。 消滅するのは、自動変数 str というポインタ変数のためのメモリ領域 return の前後で str に入っていた値 が複写される ポインタ変数の値、すなわち str が指す先は "文字列" という [ストリングリテラル] である ストリングリテラルはプログラム終了まで消滅しない ので、この例は100%合法です。 以下の例だと 文字列 str が真に自動変数であるためバグります。 const char* buggy_sample_func() {  char str[100];  strcpy(str, "文字列");  return str; }
[この投稿を含むスレッドを表示] [この投稿を削除]
[1853] Re:crowbar ver2のnative pointerについて
投稿者:hiro
2013/01/11 08:12:26

管理人様 ご回答ありがとうございます.下記了解いたしました. >ちょっとありえないミスです。申しわけございませんでした。 >該当の実装は、以下で正しいです。 > >>気になって探してみたところ,ver.4のソースコードに >> >>struct CRB_Object_tag { >> ObjectType type; >> unsigned int marked:1; >> union { >> CRB_Array array; >> CRB_String string; >> CRB_Assoc assoc; >> ScopeChain scope_chain; >> NativePointer native_pointer; >> } u; >> struct CRB_Object_tag *prev; >> struct CRB_Object_tag *next; >>}; > >ご報告いただきありがとうございました。週末あたりに正誤表に入れさせて >いただきます。 ありがとうございます.ミスを全部潰すのは大変ですよね... 私もまだver.2までしか進んでいませんが,大変勉強になっています.ありがとうございます. また,もう一点気がついたことがあるので報告させて頂きます. util.cに,crb_get_operator_string関数があるかと思います. 以下のようなコードになっているのですが, --------------------------------------------- char *str switch(type) { case XXX_EXPRESSION: str = "文字列" } return str; --------------------------------------------- これだと,リターンされる文字列は自動変数なので,関数を抜けたらメモリが開放されるため,バグになる可能性があるのではないでしょうか? char *op_str = crb_get_operator_string(operator); こんな風に使っているので... ちなみに,実際にバグが起こっているわけではありません(エラー処理に使っているので,実際には実行されない).
[この投稿を含むスレッドを表示] [この投稿を削除]
[1852] Re:スタイルシートに関して
投稿者:(ぱ)こと管理人
2013/01/11 04:41:29

774RRさんが答えてくださっていますが(いつもありがとうございます) >というのも、掲載されているソースでは、どうしても左よりとなってしまう為、 >なんとかして見栄え良く、この掲示板のような形にしたいと考えています。 この掲示板のCSSは、ソースを見ればわかるように、以下にありますので よければ参考にしてください。 http://kmaebashi.com/bbs/bbs.css
[この投稿を含むスレッドを表示] [この投稿を削除]
[1851] Re:crowbar ver2のnative pointerについて
投稿者:(ぱ)こと管理人
2013/01/11 04:38:38

>「プログラミング言語を作る」を購入し,勉強させていただいております. ありがとうございます。はじめまして。 >著書の4-4-5において,以下のようにネイティブポインタ型の改修を記載されて >おりますが,ご提供されているソースコードのcrowber_book_0_2では,実際の >実装はされていないように思われます. まさかと思ってcrowbar_book_0_2をダウンロードして確認しましたが、 確かに、このバージョンでは、ネイティブポインタ型が値型になっています。 以下のようになっているのは、おっしゃるとおり、ver.0.4からのようです。 >ネイティブポインタ -> CRB_Object->FILE型などの構造体 「プログラミング言語を作る」は、もともとWeb上の連載で、 いろいろ試行錯誤しながら作っておりました。 書籍化にあたり、後になって失敗したと思い改修した箇所を、 前のバージョンに取り込む作業をしており、この件も、ver.0.4から ver.0.2に移動させたつもりだったのですが…… ちょっとありえないミスです。申しわけございませんでした。 該当の実装は、以下で正しいです。 >気になって探してみたところ,ver.4のソースコードに > >struct CRB_Object_tag { > ObjectType type; > unsigned int marked:1; > union { > CRB_Array array; > CRB_String string; > CRB_Assoc assoc; > ScopeChain scope_chain; > NativePointer native_pointer; > } u; > struct CRB_Object_tag *prev; > struct CRB_Object_tag *next; >}; ご報告いただきありがとうございました。週末あたりに正誤表に入れさせて いただきます。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1850] crowbar ver2のnative pointerについて
投稿者:hiro
2013/01/10 06:18:57

はじめまして. 「プログラミング言語を作る」を購入し,勉強させていただいております. 著書の4-4-5において,以下のようにネイティブポインタ型の改修を記載されておりますが,ご提供されているソースコードのcrowber_book_0_2では,実際の実装はされていないように思われます. ネイティブポインタ -> CRB_Object->FILE型などの構造体 気になって探してみたところ,ver.4のソースコードに struct CRB_Object_tag { ObjectType type; unsigned int marked:1; union { CRB_Array array; CRB_String string; CRB_Assoc assoc; ScopeChain scope_chain; NativePointer native_pointer; } u; struct CRB_Object_tag *prev; struct CRB_Object_tag *next; }; このような記述を見つけました.こちらが正しい定義でしょうか? お手数おかけしますが,ご確認よろしくお願いいたします.
[この投稿を含むスレッドを表示] [この投稿を削除]
[1849] Re:スタイルシートに関して
投稿者:774RR
2013/01/09 16:53:32

掲示板ソフトがどうこう、という話ではない、と思うが。 1.最終的に閲覧者の手元に届く HTML ファイルの中にて CSS を使う指定がなされていて 2.同じく閲覧者(の使っている UA)が CSS にアクセスできる ようになっていればいい。 インライン要素で CSS を指定しても良いし ここの掲示板みたいに、掲示板ソフトの出力が別ファイルの CSS にアクセスしてもいい HTML 自体の話であるとか Web server 上の htdocs に CSS ファイルを置くとか そういう問題だと思う。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1848] スタイルシートに関して
投稿者:misamisa
2013/01/08 10:17:41

管理人様、いつも大変参考にさせて頂いております。 現在、管理人様が掲載しているプログラムをベースに掲示板を作成しており、 おおよそ完成しておりますが、管理人様のこの掲示板のようにどうしてもスタイル シートを使用したいと考えています。 というのも、掲載されているソースでは、どうしても左よりとなってしまう為、 なんとかして見栄え良く、この掲示板のような形にしたいと考えています。 どのようにしたら良いのでしょうか??? 教えて下さい。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1847] Re:最新データの表示に関して
投稿者:misamisa
2013/01/08 10:09:44

管理人様、ご回答ありがとうございます。 返事が遅くなり大変申し訳ありませんでした。 ご指摘頂いた内容で問題なくやりたい事が実現しました! ありがとうございました。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1846] あけましておめでとうございます
投稿者:(ぱ)こと管理人
2013/01/01 04:01:19

すっかり閑散とした掲示板ですが、本年もよろしくお願いいたします。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1845] Re:最新データの表示に関して
投稿者:(ぱ)こと管理人
2012/12/07 03:20:40

>ただ、その他、例えば新規投稿があったもに関しては、"NEW"を >横に付けるというような事は可能でしょうか? > 先に私が書いたように、「スレッドごとの最終更新時刻」をスレッドトップの 投稿に持たせるのであれば、ふつうに、「3日以内ならNEWと表示する」といったコードを 書けばよいのでは?
[この投稿を含むスレッドを表示] [この投稿を削除]
[1843] Re:最新データの表示に関して
投稿者:misamisa
2012/11/30 17:08:20

管理人様、ご回答ありがとうございます。 ソートの件、参考になります。 ただ、その他、例えば新規投稿があったもに関しては、"NEW"を 横に付けるというような事は可能でしょうか? そのような例がありましたら教えて下さい
[この投稿を含むスレッドを表示] [この投稿を削除]
[1842] Re:最新データの表示に関して
投稿者:(ぱ)こと管理人
2012/11/28 03:52:18

>その中で1点、スレッド形式をトップ画面とした場合、最新の投稿があった場合でも >どこに投稿があったのかが番号では判断が難しく、何か別の方法で最新という事を >表示できないかと考えています。 最新の投稿があったスレッドは上位に表示したい、ということですよね。 以下で紹介しているソースにおいて、 http://kmaebashi.com/programmer/bbs_dev/thread.html 58: $sql_str = sprintf("select * from message where boardid='%s' and parent is null ", 59: $board_id); このSQLが、スレッドのルートを生成しています。 その続きで、order byをかける際に、(スレッドのルートの投稿の)serialidでorder by しているのが現状の仕様です。 63: $sql_str .= sprintf("order by serialid desc limit 0, %d", 64: $range); なので、messageテーブルに1列足して、スレッドごとの最終更新時刻を持てるようにして (parent is nullのレコードだけでよいので)、 それでorder byすればよいかと思います。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1841] 最新データの表示に関して
投稿者:misamisa
2012/11/26 10:32:29

掲示板を作成するにあたり、大変参考にさせて頂いております。 その中で1点、スレッド形式をトップ画面とした場合、最新の投稿があった場合でも どこに投稿があったのかが番号では判断が難しく、何か別の方法で最新という事を 表示できないかと考えています。 <?php while ($row = mysql_fetch_assoc($result)) { if (!isset($firstid)) { $firstid = $row["serialid"]; } $lastid = $row["serialid"]; ?> <li> <a href="./list.php?boardid=<?php echo $board_id ?>&thread=<?php echo $row["serialid"] ?>"> ▼</a> <?php include 'threaditem.php'; show_child($board_id, $row["serialid"]); ?> </li> この部分を改造して、上記のような1発で最新の投稿だ!とわかるような事はできない でしょうか、、、 教えて下さい。 よろしくお願いします。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1840] 秋冬ファッション最新品
投稿者:秋冬ファッション最新品
2012/11/22 11:20:34

秋冬ファッション最新品 2012年秋冬ファッション人気商品は当店で売買する中です。 靴&ブーツ:http://orosiuri.com/baqgushu-zuakusesati.html レディース(服):http://orosiuri.com/ladies.html コスプレ衣装:orosiuri.com/kosupureishou.html バッグ&財布:orosiuri.com/baggu-saifu.html 弊社では、海外のメーカから本物直輸入販売!高品質の商品を超格安価格で、安心、迅速、確実、にお客様の 手元にお届け致します。 http://orosiuri.com/ 「卸売」ようこそ!
[この投稿を含むスレッドを表示] [この投稿を削除]
[1839] Re:PHP、MYSQLのBBSで質問です
投稿者:(ぱ)こと管理人
2012/11/21 01:59:57

すみません、これはおそらくバグっています。 記憶が曖昧ですが、ずいぶん前に、新しい掲示板を立ち上げるとき、 「ホームページ上の説明のコード」のとおり、 54: $sql_str = sprintf("select count(*)" 55: . " from message where boardid='%s'", 56: $board_id); 57: $result = mysql_query_or_die($sql_str); 58: $row = mysql_fetch_row($result); 59: if ($row[0] == 0) { 60: $serial_id = 0; 61: } else { 62: $serial_id = $row[0]; 63: } count(*)でレコード数をとった値、とすると、レコードの物理削除を行った場合に おかしくなるため修正したような気がします(現在は、あまりのspamの多さに 辟易したため管理者権限で物理削除ができるようになっていますが、当初はその 機能はありませんでした)。 それを考慮して、現状では以下のようにmax()を取るようにしたのですが、 $sql_str = sprintf("select max(serialid)" . " from message where boardid='%s'", $board_id); $result = mysql_query_or_die($sql_str); $row = mysql_fetch_row($result); if ($row[0] == 0) { $serial_id = 0; } else { $serial_id = $row[0] + 1; } その新しい掲示板を立ててからしばらく経ってからのことだったので、 「2回目の投稿」については試していなかったのかと思います。 すみませんが現状こちらではそれを直してテストまでする余裕はありません。 そちらで回避してください。よろしくお願いします。 (serial_idの最小値を1とする、あたりが簡単な気はします)
[この投稿を含むスレッドを表示] [この投稿を削除]
[1838] PHP、MYSQLのBBSで質問です
投稿者:inak2
2012/11/18 19:07:49

Maebashi様 お世話になります。BBSのソースをサーバーにアップして、動作確認しております。 しかし、最初の投稿はできるのですが、2回目からの投稿でエラーが発生します。 エラーの内容を見ると、 SQLエラーinsert into message (boardid, serialid, name, subject, url, message, password, salt, parent, top, ipaddress, remotehost, useragent) values ('1117no2', 0, '以下省略・・・・・・ となっており、serialidが2回目の投稿にもかかわらず0を入れようとしてエラーになっていると考えられます。 テーブルをみると最初の投稿のserialidのフィールドには0が入っています。 そこでinsert.phpのソースコードを見ると、if($row[0]==0) {$serial_id=0;} else {$serial_id=$row[0]+1;} となっております。 ホームページ上の説明のコードでは$serial_id=$row[0];と書かれています。 オートインクリメントを設定してもうまきいきません。 よろしくお願いいたします。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1837] Re:PHP、MySQL掲示板で質問です
投稿者:(ぱ)こと管理人
2012/11/09 03:35:11

こんにちは。返信が遅くなりましてすみません。 >①list.php, plain.php, threaditem.phpは削除機能実装前の古いバージョンで >説明してあると記されていましたので、修正されたものの方をコピペして使用しました。 >しかし、「スレッド順インデックス」の説明のthread.phpも削除機能実装前の >古いバージョンで説明されておられますが、修正バージョンのソースが見当たりません? >修正バージョンをご提示いただければ幸いです。 この掲示板の記事は、掲示板自体を作りながら書いたものですので、 最終的に動く形でのソースコードは公開していません。 もちろん公開は可能ですが、動作する掲示板のソースをまるごと公開すると、 サポートの義務が発生しそうですし、当方にその余力はないのでこの状態になっています。 というよりも、既にPHPのバージョンが古いですし(公開時点ではPHP4でした) magic quoteを前提にしていたりもるので、このソースを参考にして 自作していただくのは大歓迎ですが、これをまるごともっていくのはちょっと お勧めできないです。 どうしても、ということであれば、メールいただければ固めて送ります。 あしからず、ご了承くださいませ。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1836] PHP、MySQL掲示板で質問です
投稿者:inak2
2012/11/07 15:07:09

プログラミングのHP、大いに参考にさせていただいております。 「PHPとMySQLで掲示板を作る」コーナーで質問させていただきます。 ①list.php, plain.php, threaditem.phpは削除機能実装前の古いバージョンで説明してあると記されていましたので、修正されたものの方をコピペして使用しました。 しかし、「スレッド順インデックス」の説明のthread.phpも削除機能実装前の古いバージョンで説明されておられますが、修正バージョンのソースが見当たりません?修正バージョンをご提示いただければ幸いです。 ②説明の最後のほうで「修正版のlist.phpの14行目で、get_css($board_id)という関数を呼んでCSSの設定・・・・この関数はutil.phpで定義されていて・・・」と説明がありますが、util.phpにはこの関数の定義が見当たりません。 このためか、当方で設定してBBSを動かそうとし、「投稿成功しました」の表示から「一覧表示に戻る」をクリックしてもこのlist.phpの上部の「<link rel="STYLESHEETY" TITLE="default" TYPE="text/css" href="」の表示でとまってしまいます。 勉強中なのでいいかげんな質問をしているかもしれませんが、よろしくご指導お願いいたします。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1833] Re:makeできない
投稿者:(ぱ)こと管理人
2012/09/30 19:38:18

すみません、いくつか確認させてください。 >cd ./memory; gmake >指定されたパスが見つかりません。 >gmake: *** [memory/mem.o] Error 1 (1) 使用したcrowbarは、どこからダウンロードしたどのバージョンでしょうか? (2) crowbarを展開し、コマンドプロンプトにてMakefileやcrowbar.yのある  ディレクトリまでcdして、そこからgmakeを実行した、ということでよいでしょうか? (3) crowbarを展開したフォルダ(Makefileやcrowbar.yのあるところ)に、  「memory」という名前のフォルダはあるでしょうか?  (普通に考えて、わざわざ消したり名前を変えたりしない限りあるはずですが…) (4)出たメッセージは上記がすべてでしょうか? crowbarをビルドすると、  「cd ./memory; gmake」が動く前に、以下のようなメッセージが出ているかと  思いますが、出ているでしょうか? bison --yacc -dv crowbar.y flex crowbar.l gcc -c -g lex.yy.c gcc -c -g y.tab.c gcc -c -g -Wall -Wswitch-enum -ansi -pedantic -DDEBUG main.c gcc -c -g -Wall -Wswitch-enum -ansi -pedantic -DDEBUG interface.c gcc -c -g -Wall -Wswitch-enum -ansi -pedantic -DDEBUG create.c gcc -c -g -Wall -Wswitch-enum -ansi -pedantic -DDEBUG execute.c gcc -c -g -Wall -Wswitch-enum -ansi -pedantic -DDEBUG eval.c  質問に質問で申しわけありませんが、確認をよろしくお願いいたします。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1832] Re:makeできない
投稿者:(ぱ)こと管理人
2012/09/29 17:15:31

すみません、最近掲示板を見ておらず、この投稿に今気づきました。 今出先なのですが、この週末中には確認して回答します。 >windows7にてcrowbarをmakeしようとすると、 > >cd ./memory; gmake >指定されたパスが見つかりません。 >gmake: *** [memory/mem.o] Error 1 > >とでてmakeできません。 >gccやmingwも同じバージョンのものを使いました。 > >回答よろしくお願いします。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1831] makeできない
投稿者:daiki
2012/09/26 18:11:43

windows7にてcrowbarをmakeしようとすると、 cd ./memory; gmake 指定されたパスが見つかりません。 gmake: *** [memory/mem.o] Error 1 とでてmakeできません。 gccやmingwも同じバージョンのものを使いました。 回答よろしくお願いします。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1830] 掲示板作成に取り掛かり中
投稿者:タカ
2012/09/04 19:02:20

一からはじめるとなかなか手間取りますね…
[この投稿を含むスレッドを表示] [この投稿を削除]
[1829] Re:C++のメモリ管理
投稿者:南山まさかず
2012/07/24 17:46:23

>ただ、文脈上ここは、「Diksamにファイナライザを付けなかった理由」です。  もうちょっと深く読み込むべきでした。ご返信ありがとうございます。 >ヒープに確保したオブジェクトの >deleteのめんどくささを考えるとついつい  C/C++のメモリ管理は確かに面倒くさいですね。僕はもっぱらboost::shared_ptrを使って ますが……。  現在、貴書を参考にプログラミング言語を作成中です。その課程で少し気になったので書 き込みをさせていただいた次第です。  ご返信ありがとうございました
[この投稿を含むスレッドを表示] [この投稿を削除]
[1828] Re:C++のメモリ管理
投稿者:(ぱ)こと管理人
2012/07/24 02:42:22

> 303ページに「オブジェクトの寿命をプログラマが完全に制御しなければならないC++」 >とありますが。 「プログラミング言語を作る」のp.303ですね。 > C++はコンストラクタ、デストラクタによるリソース管理を行っており、 >原則オブジェクトの寿命はそのスコープ内です。 はい(まあ、どこまでのオブジェクトをスタック上に取るかという問題はありますが)。 > そのため、この記述はC++にとっては特殊な状況を除いて正しくない、という >ことにはならないでしょうか ただ、文脈上ここは、「Diksamにファイナライザを付けなかった理由」です。 C++の場合、デストラクタが動くタイミングは、スタックに取ったオブジェクトなら ブロックを抜けるときですし、ヒープに取ったオブジェクトならdeleteする時です。 よって、デストラクタが動くタイミングはプログラマが完全に予期できるので、 C++ではデストラクタは有用なのだけれど、Diksamではタイミングが予期できないので 役に立たない、ということを書いています。 そういう意味だと「オブジェクトの寿命をプログラマが完全に制御できるC++」と いう言い方の方が適切だったかもしれませんが、ヒープに確保したオブジェクトの deleteのめんどくささを考えるとついつい「オブジェクトの寿命をプログラマが 完全に制御しなければならないC++」と書きたくなってしまう……という感情が 私の中にあったかもしれません。 間違いとは思いませんが、C++好きな方からするとカチンとくるかもしれませんね。 失礼しました。 ご意見ありがとうございました。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1827] C++のメモリ管理
投稿者:南山まさかず
2012/07/23 18:12:07

 303ページに「オブジェクトの寿命をプログラマが完全に制御しなければならないC++」とありますが。  C++はコンストラクタ、デストラクタによるリソース管理を行っており、原則オブジェクトの寿命はそのスコープ内です。  そのため、この記述はC++にとっては特殊な状況を除いて正しくない、ということにはならないでしょうか
[この投稿を含むスレッドを表示] [この投稿を削除]
[1823] Re:標準ライブラリのヘッダファイルのインクルードガード
投稿者:yuya
2012/04/03 07:57:41

>まあ、誰もが規格票を参照できるわけではないですし、ここを読む別の人の >参考になればよいのではないでしょうか。 >今回も774RRさんのおかげでいろいろ話題が広がりましたし。 ありがとうございます。 どうもJISのサイトでスンナリ閲覧できないことが多くて、表示できても操作しにくいし(愚痴) あのビジネスモデルだけはホンマに……(愚痴)
[この投稿を含むスレッドを表示] [この投稿を削除]
[1822] Re:標準ライブラリのヘッダファイルのインクルードガード
投稿者:yuya
2012/04/03 07:56:00

>から、現代的「ヘッダで宣言を100%先行させる」プログラミングにおいて >正しく作られたヘッダはガードしなくても良い可能性があります。 ここだけ読んで「インクルードガードでコンパイラを黙らせるくらいなら、ヘッダファイルを正しく書き直そう」ってキャンペーンを張れるかと思いましたが、 そういうわけには行かなそうですね(笑)
[この投稿を含むスレッドを表示] [この投稿を削除]
[1821] Re:標準ライブラリのヘッダファイルのインクルードガード
投稿者:(ぱ)こと管理人
2012/04/03 03:14:03

>すみません、規格票は閲覧できるのだから、調べれば分かる質問をしてちゃいけませんね(反省)。 まあ、誰もが規格票を参照できるわけではないですし、ここを読む別の人の 参考になればよいのではないでしょうか。 今回も774RRさんのおかげでいろいろ話題が広がりましたし。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1820] Re:標準ライブラリのヘッダファイルのインクルードガード
投稿者:774RR
2012/04/02 15:01:47

あとついでに ・先のスレッドで紹介したとおり、関数宣言は(矛盾しない限り)繰り返してよいこと ・同一内容の #define を繰り返すことは認められていること ISO/IEC 14882:1998 16.3 - 3,4 JIS X 3010:2003 6.10.3 ・C++ では typedef の同一内容の繰り返しは認められている (同 7.1.3-2) こと ・C では typedef の同一内容の繰り返しについて記述が無いこと  (未規定なので、処理系は許しても良いしエラーにしても良い) から、現代的「ヘッダで宣言を100%先行させる」プログラミングにおいて 正しく作られたヘッダはガードしなくても良い可能性があります。 typedef の同一内容の繰り返しに関して調査した範囲では ・ Visual C++ 2005 の C コンパイラは無警告で認めています。 ・ GCC 4 の C コンパイラは認めていません。 ・某社の組み込み系コンパイラは認めていません。 (enum/struct 等の繰り返し宣言の認め方については言語仕様書・処理系の挙動とも調べていません) コンパイル時間の短縮のためには「ヘッダの同一内容を複数回 parse しない」よう ガードに類する機構があったほうが望ましいですけどね。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1819] Re:標準ライブラリのヘッダファイルのインクルードガード
投稿者:yuya
2012/04/02 14:21:24

再度ありがとうございます。 考えてみれば、多くの入門書では 分割コンパイルも自分で.h書く局面にも到達しないことが多いから、当然かもしれませんね。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1818] Re:標準ライブラリのヘッダファイルのインクルードガード
投稿者:774RR
2012/04/02 14:05:44

> 意外に少なかったりしません? そんな瑣末なところにページ割くくらいならもっと別なことに使いたい、 んだと思います(俺でもそうします) 入門書では「おまじないとして」 #include <stdio.h> と書くんだよ・・・ と説明しているものが多いような気がします。 (標準)ヘッダとは何か?の解説が必要になるほどの分量が必要なサンプルを作ると 読者がついてこれないでしょう(だからサンプルも hoge.c 1個で完成する程度で) 手前味噌ですが http://kmaebashi.com/bbs/thread.php?boardid=kmaebashibbs&from=1706&range=1 #1712 のような .h と .c の使い分けの認識が必要になる、程度まで来ると それはもう入門レベルではないのかもしれません。 使い分けができるようになって、その先ですからね > 二重 include
[この投稿を含むスレッドを表示] [この投稿を削除]
[1817] Re:標準ライブラリのヘッダファイルのインクルードガード
投稿者:yuya
2012/04/02 10:39:17

774RRさん、ありがとうございます。 面白いですねぇ。実例があれば見てみたい。 ところで入門書に「標準ライブラリは二重インクルードの心配はないよ」って書いてくれてること、 意外に少なかったりしません?(たくさん読んでいるわけではないので分かりませんが)
[この投稿を含むスレッドを表示] [この投稿を削除]
[1816] Re:標準ライブラリのヘッダファイルのインクルードガード
投稿者:774RR
2012/04/02 09:50:55

ついでに C++ の場合 ISO/IEC 14882:1998 17.4.2.1 Headers に同等の文言があります。 もっとついでに C にも C++ にも ・「ヘッダ」は必ずしもソースファイルでなくてよい ・ヘッダの < ... > で囲まれた文字の列がソースファイル名でなくてよい とあります(関連節の脚注など) 処理系は「ヘッダ」(のうちの特に <標準ヘッダ>)の1回目の読み込みに関して ・ソースファイルとして提供してもいい ・プリコンパイル済みバイナリファイルで提供してもいい ・処理系固有のビルトイン機能として実装してもいい ・謎の「ほげほげ機能」の結果として実装してもいい ようです。 2回目以後の読み込みに対しては ・正しく include ガードされているソースファイルとして提供してもいい ・処理系側で2回同じ標準ヘッダを読まない機構を用意してもよい  ・処理系側ビルトイン機構として同一<ヘッダ>を2回読まない機構を用意  ・#pragma once 類似機構を設けて<ヘッダ>側記載で回避 わけです。 なんにせよ [実装手段] は問われていない模様です。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1815] Re:標準ライブラリのヘッダファイルのインクルードガード
投稿者:yuya
2012/03/31 14:26:40

>X 3010:2003 (ISO/IEC 9899:1999)の「7.1.2 標準ヘッダ」から引用します。 >| 標準ヘッダはどのような順序で取り込んでもよい。各ヘッダは与えられた有効範囲内で >| 2回以上取り込んでもよいが,その効果は,<assert.h>の取込みの効果がNDEBUG の >| 定義に依存すること(7.2 参照)を除いて,1 回だけ取り込んだ場合と同じとする。 > >とのことなので、保証されています。(実現手段は問わないのでしょうが) ありがとうございます。 すみません、規格票は閲覧できるのだから、調べれば分かる質問をしてちゃいけませんね(反省)。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1814] Re:標準ライブラリのヘッダファイルのインクルードガード
投稿者:(ぱ)こと管理人
2012/03/31 13:38:26

>標準ライブラリのヘッダファイルにインクルードガードが施されていることって、保証されているものなんでしょうか? X 3010:2003 (ISO/IEC 9899:1999)の「7.1.2 標準ヘッダ」から引用します。 | 標準ヘッダはどのような順序で取り込んでもよい。各ヘッダは与えられた有効範囲内で | 2回以上取り込んでもよいが,その効果は,<assert.h>の取込みの効果がNDEBUG の | 定義に依存すること(7.2 参照)を除いて,1 回だけ取り込んだ場合と同じとする。 とのことなので、保証されています。(実現手段は問わないのでしょうが)
[この投稿を含むスレッドを表示] [この投稿を削除]
[1813] 標準ライブラリのヘッダファイルのインクルードガード
投稿者:yuya
2012/03/30 09:15:50

あの、今更こんなこと恥ずかしくて聞きづらいんですが…… 標準ライブラリのヘッダファイルにインクルードガードが施されていることって、保証されているものなんでしょうか? そうじゃなきゃ使い物にならないことは分かるのですが。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1812] kmaebashi.com停止のお詫び
投稿者:(ぱ)こと管理人
2012/03/29 04:30:54

おそらく3/27~3/28にかけて、本Webサイトkmaebashi.comが停止しておりました。 管理人である私が、忙しさにかまけてレンタルサーバの利用料金の振込みを失念していたのが原因です。3/28に振り込んで復旧していただきました。 利用者の皆様にはご迷惑をおかけしまして申しわけありませんでした。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1811] Re:char hoge = 'A';
投稿者:yuya
2012/03/15 11:52:07

>この書き方とは? getchar()==(unsigned char)('a') っすか? >俺ならここまで厳密に書くことは絶対にしない(お仕事コードでも)と思うですよ。 あわわ、ちゃいますgetchar() == 'a'のほうです、紛らわしい書き方ですいません(^^;) >俺が本を書くとしたら 貴重なご意見ありがとうございます。 原理に深入りするかどうかはともかく、getchar() == 'a' が意図したとおりに動くかどうかは、 基本文字集合以外は保証されない、基本文字集合なら保証される、 ということは伝えるべきなのでしょうねぇ。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1810] Re:char hoge = 'A';
投稿者:774RR
2012/03/14 18:49:51

この書き方とは? getchar()==(unsigned char)('a') っすか? 俺ならここまで厳密に書くことは絶対にしない(お仕事コードでも)と思うですよ。 俺が本を書くとしたら unsigned char の話には触れないです。 EOF は一般の意味での [文字] ではないため int が必要であるとは書きます。 int c=getchar(); switch (c) { case EOF: case 'a': } のように文字コードに関しては単純に 'a' と書くでしょう。んで、脚注にでも (†1) C はもともと英語圏で発展した言語なので、英語のアルファベットにない文字: ドイツ語のウムラウト文字とかエスツェットとか フランス語のアクサングラーブ文字とか 日本語の各種ひらがなカタカナ漢字とか は、C の初期からある標準関数ではうまく扱えないことがある。 たとえばこの例で case 'ア': と書いても動かない処理系のほうが多い。 (†2) そもそも日本語や中国語などの文字は多バイトで表現するので、 取り扱い方法がまったく変更になることが通例である。 とでもしておきますかね。もしかしたら脚注3で (†2) 標準関数で無理なく問題なく扱える文字の集合を基本実行文字集合と呼ぶ。 とするかもしれないです。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1809] Re:char hoge = 'A';
投稿者:yuya
2012/03/14 15:36:23

よく理解できました。 自分がコーディングするときはこの書き方を使い続けることになると思いますが、 初心者に指導する際はどうすればいいんでしょうかねぇ…… 例えば入門書を書く機会があればどうされますか>皆様
[この投稿を含むスレッドを表示] [この投稿を削除]
[1808] Re:char hoge = 'A';
投稿者:774RR
2012/03/14 14:32:29

まあついでに言うと getchar()=='ア' も getchar()=='a' も「本質的には」間違っているわけで。 getchar() は [unsigned char 型として取り込み] [int 型に変換] なので、 返却される文字の値は char 型としての値ではなく unsigned char 型としての値となるため getchar()==(unsigned char)('ア') や getchar()==(unsigned char)('a') としておかないと 言語仕様と不一致になってしまう、と判断すべきでしょう。 これではあまりにもウザイので =='a' のような判断を許すべく 多く使われる基本文字については非負と決めているのだと思われますです。 非負ならば (unsigned char) にキャストしても、しなくても、値が同じなので。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1807] Re:char hoge = 'A';
投稿者:774RR
2012/03/13 12:32:04

処理系依存にならないよう、基本文字は [後半] にできないことになっているようですね。 #1806 基本文字は非負、の文言は C にもありました。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1806] Re:char hoge = 'A';
投稿者:774RR
2012/03/13 10:55:31

>>この「非負の」に相当する文言がCの方にはないように思えるんですよね。 >俺が探した範囲でも無いっすね。 C++ で追記されたと読むべきでしょう。 あった。 JIS X 3010:2003 6.2.5 型 型 char として宣言されたオブジェクトは、実行基本文字集合の任意の要素を格納するのに十分な大きさを持つ。 基本実行文字集合の任意の要素を char 型のオブジェクトに格納した場合、その値は非負であることを保証する。 その他の文字を char 型のオブジェクトに格納した場合、その結果の値は処理系定義とするが、 その型で表現可能な値の範囲に含まれなければならない。 ってことは EBCDIC では char 型の内部表現は unsigned char と同じにならざるを得ないってことか?
[この投稿を含むスレッドを表示] [この投稿を削除]
[1805] Re:char hoge = 'A';
投稿者:yuya
2012/03/13 10:49:35

kitさん、ありがとうございます。 >いや、それは勘違いです。与れますよ。 >ファイルからコード 255 のバイトを getchar() で読むと、-1 ではなく 255 を返しますから。 あちゃ、まだ完全に分かってませんでした。 getc系の関数はストリームから得た文字をunsigned char型の値として解釈して、それをint型に変換するのでした。 つまり、「ア」の文字コードが 0xB1のとき、 文字定数'ア'の値がデフォルトcharによって異なる(signedならint型の-79、unsignedならint型の177になる)のに対し、 getcの戻り値は必ずint型の177になるのですね。 バイナリエディタで0xB1を書き込んだファイルを使って実験すると、 手元のVCでは 'ア' == getc() が偽になります。 はっきり言って「文字定数」と「getc系関数の戻り値」とは、ぜんっぜん違う!ということですね。 どちらも最終的にint型になるが、【値を解釈するときに】デフォルトcharに合わせるか、unsigned char固定か。 あれ?ということは、 int hoge = getchar(); if(hoge == 'a'){ /* ...... */ } のほうが(C++ではなくCでは)処理系依存ということになるのですか? 「a」が「後半の」文字かもしれないことを考えると。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1804] Re:char hoge = 'A';
投稿者:kit
2012/03/12 16:43:58

>>EOFは-1とは限らない(負でさえあればよい)ので回避のしようはありますね。 > >そうですね。 > >手元のVCだと無印charはデフォルトでsigned、EOFの値は-1になっていて、 >回避できるにも関わらず回避していない。 多くのUNIX系プラットフォームでもそうです。 (powerpc なんかは char のデフォルトが unsigned だったような気もしますが) >getchar()などの戻り値をintで受ける理由は言わずと知れたFAQですが、 >上記のような処理系では、せっかくの「文字コードの空間の外でEOFを扱えるように」という恩恵に与れないことになりますよね。 >(というか、そういう処理系がほとんどのような気がします。) いや、それは勘違いです。与れますよ。 ファイルからコード 255 のバイトを getchar() で読むと、-1 ではなく 255 を返しますから。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1802] Re:char hoge = 'A';
投稿者:yuya
2012/03/07 11:33:17

774RRさん、C++の情報ありがとうございます。 私の理解の変遷: 文字定数は本来はchar型だが、汎整数拡張されてint型になると理解していた →プギャー、規格に「int型を持つ」って明記されてるぅ! (汎整数拡張が抑止されるはずのsizeofでもint型のサイズが返ってくる) →じゃあcharに一旦入れちゃったら、表現しきれない値は壊れるかもしれないのか? →「charの符号の扱いに合わせた」int値になるから大丈夫だよん ということですね。 「なんでcharの符号は処理系定義なのにめったに困ることがないのか」という疑問が晴れたように思います。 ヘンにsigned/unsignedを指定して文字コードを扱ってしまった場合にこそバグるんですね。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1801] Re:char hoge = 'A';
投稿者:774RR
2012/03/05 14:51:19

>この「非負の」に相当する文言がCの方にはないように思えるんですよね。 俺が探した範囲でも無いっすね。 C++ で追記されたと読むべきでしょう。 # 最初 [基本] を見落としていて 負数のcharは一切ダメ? と思ったのは内緒。 >しかし、EBCDICのC++処理系があるものかどうか (^^; あって、自由に使ってよければ是非試してみたいところです。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1800] Re:char hoge = 'A';
投稿者:(ぱ)こと管理人
2012/03/04 23:22:39

すみません、この投稿を見落としていました。 >2.2 - 3 基本実行文字集合 >基本実行文字集合において、それぞれの文字は非負の互いに異なる値をもっていなければならない。 この「非負の」に相当する文言がCの方にはないように思えるんですよね。探したのですが。 >char オブジェクトが負の値をもてるか否かは、処理系定義とする >EBCDIC およびその派生な文字セットの場合 'A'=h'C1, '0'=h'F0 なので、 >[基本文字集合は非負の値] からいくと「単なる char は符号なし」しかダメなんだろう。 なのだろうと思います。しかし、EBCDICのC++処理系があるものかどうか (^^;
[この投稿を含むスレッドを表示] [この投稿を削除]
[1799] Re:char hoge = 'A';
投稿者:yuya
2012/02/28 09:49:14

>EOFは-1とは限らない(負でさえあればよい)ので回避のしようはありますね。 そうですね。 手元のVCだと無印charはデフォルトでsigned、EOFの値は-1になっていて、 回避できるにも関わらず回避していない。 getchar()などの戻り値をintで受ける理由は言わずと知れたFAQですが、 上記のような処理系では、せっかくの「文字コードの空間の外でEOFを扱えるように」という恩恵に与れないことになりますよね。 (というか、そういう処理系がほとんどのような気がします。) ただ「0xFFに文字が割り当てられることは滅多にない」という「実情」に依存しているような……。 >(いつものことですが)私も勉強させていただいております。 こちらこそ、いつも本当にありがとうございます。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1798] Re:char hoge = 'A';
投稿者:774RR
2012/02/28 09:42:53

出遅れ気味... C++ の場合は仕様書の文言が若干違うようです。 以下 ISO/IEC 14882:1998 ならびに JIS X3014:2003 から 2.2 - 3 基本実行文字集合 基本実行文字集合において、それぞれの文字は非負の互いに異なる値をもっていなければならない。 実行文字集合は、基本実行文字集合をその部分集合とする集合とする。 実行文字集合における文字の値は、処理系定義とする。 俺:この文言は [基本文字集合は非負の値] [基本でない文字集合は負でもよい] と読むべきなのだろう・・・ 2.13.2 文字リテラル 文字リテラルは型 char をもち、実行文字集合での符号数値に等しい値を持つ。 俺:C の 6.4.4.4 の例のような文言は無いな・・・ 3.9.1 基本型 char として宣言されたオブジェクトの大きさは、処理系定義である実行文字集合のすべての要素を 格納するのに十分なだけ大きくなければならない。 char オブジェクトが負の値をもてるか否かは、処理系定義とする EBCDIC およびその派生な文字セットの場合 'A'=h'C1, '0'=h'F0 なので、 [基本文字集合は非負の値] からいくと「単なる char は符号なし」しかダメなんだろう。 ただ、実処理系で確認しようにもいろいろ微妙かも。 すぐ使える場所に EBCDIC な処理系は無いし printf("%d\n", '\xF0'); とすると [汎整数拡張] 後の int 型の値確認にしかならないし cout << '\xF0'; だと[文字表記]になって[文字の値]ではないし cout << int('\F0'); だと同 int の確認だし
[この投稿を含むスレッドを表示] [この投稿を削除]
[1797] Re:char hoge = 'A';
投稿者:(ぱ)こと管理人
2012/02/28 03:28:44

># でもEOFとかち合ったりしないのかなぁ…… ここだけ見て、規格にこっそり「charがsignedな処理系では1バイト文字定数は0xFFになってはいけない」みたいなことが書いてないかなあと見てみたのですが書いてなく、それどころか上記引用部には堂々と0xFFのケースが書いてあるわけですが、EOFは-1とは限らない(負でさえあればよい)ので回避のしようはありますね。 (いつものことですが)私も勉強させていただいております。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1796] Re:char hoge = 'A';
投稿者:yuya
2012/02/27 12:37:08

すみません、たぶん自己解決しました。 JIS X3010:2003 6.4.4.4 文字定数 | |意味規則 単純文字定数は、型intをもつ。 |(中略) |単純文字定数が単一の文字又は逆斜線表記を含む場合、その値はその単一の文字又は逆斜線表記の値をもつ |char型のオブジェクトをint型に変換したときの結果の値とする。 |(中略) |例2. 整数に対し2の補数表現を用い、型charをもつオブジェクトに対して8ビットを用いる処理系を考える。 |型charがsigned charと同じ範囲の値をもつ処理系では、単純文字定数'\xFF'は値-1をもつ。型charが |unsigned charと同じ範囲の値をもつ場合、'\xFF'は値+255をもつ。 この例2を見ると、文字定数の値が、「charがsignedかunsignedか」に連動して定まることになりますね。つまり、int型のモノが「char型に対する扱い」に依存するんですね。知りませんでした。 ということは、無印のcharがsignedの処理系であろうとunsignedの処理系であろうと、文字定数を代入して値が変わってしまう心配はない、と。 一番気になっていたのは、「等しいはずの文字を比較したのに『等しくない』と判定されてしまうかも」ということだったのですが、これで心配はなくなりました。 # でもEOFとかち合ったりしないのかなぁ……
[この投稿を含むスレッドを表示] [この投稿を削除]
[1795] Re:char hoge = 'A';
投稿者:yuya
2012/02/27 10:08:44

ありがとうございます。 >これが > >>char hoge[] = {'ア', 'イ', 'ウ', '\0'}; > >だったら間違いなく違和感があると思うのですが。 なるほど、考えてみれば半角カナで実験してみればよかったですね。 #include <stdio.h> int main(void){ printf("%d\n", 'ア'); return 0; } VCでコンパイルして実行すると -79 あり?どうなってるんだ・・・
[この投稿を含むスレッドを表示] [この投稿を削除]
[1794] Re:char hoge = 'A';
投稿者:(ぱ)こと管理人
2012/02/27 01:45:30

どうもです。 >「A」の文字コードは決まっていないし、charがsignedになるかunsignedになるかは処理系によるので、結局この代入自体が処理系定義になるわけですよね。 確かにそうなりそうに思うのですが…… >よくchar配列の初期化の例で、 > >char hoge[] = "ABC"; > >は > >char hoge[] = {'A', 'B', 'C', '\0'}; こういう説明は私もしていますし、でも確かに処理系定義だと思います。 これが >char hoge[] = {'ア', 'イ', 'ウ', '\0'}; だったら間違いなく違和感があると思うのですが。 まあ、'A'がunsigned char側に割り当てられるような処理系はまずないだろうという前提を、たいていのCの入門書著者は置いてしまっているのだと思います。私も含めて。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1793] Re:char hoge = 'A';
投稿者:yuya
2012/02/21 04:04:30

(ぱ)さん、ありがとうございます。 「A」の文字コードは決まっていないし、charがsignedになるかunsignedになるかは処理系によるので、結局この代入自体が処理系定義になるわけですよね。 よくchar配列の初期化の例で、 char hoge[] = "ABC"; は char hoge[] = {'A', 'B', 'C', '\0'}; の略であって……といった説明になるわけですが、この場合も同様だとすると、 あれれ?そんな処理系定義な例で説明がなされているのか?と疑問に思ってしまったわけです。 (すみません、もの凄くアホな勘違いをしているかもしれません。)
[この投稿を含むスレッドを表示] [この投稿を削除]
[1792] Re:char hoge = 'A';
投稿者:(ぱ)こと管理人
2012/02/21 03:15:15

すみません、しばらくここを放置してしまいました。 >C言語において、文字定数は1バイトの表現に収まることが保証されていますが、 >たとえば'A'が200のような値をとっていけないことはないですよね。 >すると、charがsignedな処理系で char hoge = 'A'; と書くと、未定義動作になるのでしょうか? 'A'自体の型はintですので、普通にintからsigned charへの型変換と考えると、 X 3010:2003の6.3.1.3によれば >そうでない場合,すなわち,新しい型が符号付き整数型であって,値がその型で表現できない場合は, >結果が処理系定義の値となるか,又は処理系定義のシグナルを生成するかのいずれかとする。 なので、処理系定義ですかね。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1791] char hoge = 'A';
投稿者:yuya
2012/02/19 11:24:57

C言語において、文字定数は1バイトの表現に収まることが保証されていますが、 たとえば'A'が200のような値をとっていけないことはないですよね。 すると、charがsignedな処理系で char hoge = 'A'; と書くと、未定義動作になるのでしょうか?
[この投稿を含むスレッドを表示] [この投稿を削除]
[1790] fd
投稿者:aa
2012/02/16 19:29:55

fd
[この投稿を含むスレッドを表示] [この投稿を削除]
[1789] test
投稿者:test
2012/02/05 21:15:15

test
[この投稿を含むスレッドを表示] [この投稿を削除]
[1788] 無題
投稿者:くそ河野
2012/01/23 13:50:01

cvgcgdghdgおっぱ
[この投稿を含むスレッドを表示] [この投稿を削除]
[1787] 無題
投稿者:くそ河野
2012/01/23 13:49:22

ああああなんあなん
[この投稿を含むスレッドを表示] [この投稿を削除]
[1786] 無題
投稿者:キリン
2012/01/23 13:49:13

tinkoとmankoを合体させよう
[この投稿を含むスレッドを表示] [この投稿を削除]
[1785] 無題
投稿者:くそ河野
2012/01/23 13:48:52

おppai
[この投稿を含むスレッドを表示] [この投稿を削除]
[1784] 無題
投稿者:はなくそ
2012/01/23 13:48:15

どうもはなくそです
[この投稿を含むスレッドを表示] [この投稿を削除]
[1783] 無題
投稿者:キリン
2012/01/23 13:47:21

鼻隠せ
[この投稿を含むスレッドを表示] [この投稿を削除]
[1782] 無題
投稿者:くそ河野
2012/01/23 13:46:48

河野、がやべぇ鼻の中ほじくりまはわしてる
[この投稿を含むスレッドを表示] [この投稿を削除]
[1781] 無題
投稿者:くそ河野
2012/01/23 13:45:25

mんこのー  おしりのなかを  なまないでくださいー
[この投稿を含むスレッドを表示] [この投稿を削除]
[1780] 無題
投稿者:キリン
2012/01/23 13:45:17

鼻の整形をひきうけましょうか?
[この投稿を含むスレッドを表示] [この投稿を削除]
[1779] 無題
投稿者:くそ河野
2012/01/23 13:43:57

ぱぱぱぱぱぴい
[この投稿を含むスレッドを表示] [この投稿を削除]
[1778] 無題
投稿者:キリン
2012/01/23 13:43:37

河野逃げるな
[この投稿を含むスレッドを表示] [この投稿を削除]
[1777] 無題
投稿者:
2012/01/23 13:42:10

鼻くそ見えてるよ
[この投稿を含むスレッドを表示] [この投稿を削除]
[1776] 無題
投稿者:キリン
2012/01/23 13:41:50

鼻デカ
[この投稿を含むスレッドを表示] [この投稿を削除]
[1775] 無題
投稿者:くそ河野
2012/01/23 13:41:04

ま こ
[この投稿を含むスレッドを表示] [この投稿を削除]
[1773] 無題
投稿者:
2012/01/23 13:39:28

鼻でか
[この投稿を含むスレッドを表示] [この投稿を削除]
[1772] 無題
投稿者:くそ河野
2012/01/23 13:39:24

洋一郎が怒られるのこわいからにげた
[この投稿を含むスレッドを表示] [この投稿を削除]
[1771] 無題
投稿者:くそ河野
2012/01/23 13:37:51

まえののー  おしりのなかを  なめないでくださいー そこに
[この投稿を含むスレッドを表示] [この投稿を削除]
[1770] 無題
投稿者:
2012/01/23 13:37:27

鼻でか
[この投稿を含むスレッドを表示] [この投稿を削除]
[1769] 無題
投稿者:you
2012/01/23 13:37:06

どうすんの?
[この投稿を含むスレッドを表示] [この投稿を削除]
[1768] 無題
投稿者:くそ河野
2012/01/23 13:36:36

あああ
[この投稿を含むスレッドを表示] [この投稿を削除]
[1767] 無題
投稿者:you
2012/01/23 13:33:36

千の風になっての替え歌を作りたいんだが。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1766] Re:掲示板を移行しました
投稿者:a
2012/01/22 22:18:48

>仕様について簡単に説明します。 > >・発言内容は全て<pre>で囲まれます。ソースリストを載せるのに便利にするためです。 > 適当な位置で改行を入れてください。 >・でもやっぱり改行を入れ忘れる人もいるので、プレビュー表示をつけました。 > 確認してから「送信」をクリックしてください。 >・タグは全無効です。<font color="red">ほらね</font> >・クリッカブルURLの機能があります。 > http://kmaebashi.com > タグは無効なので<a>タグは書けません。 >・現状では削除機能がないので削除用パスワードは単なるお飾りです。 >・スレッド表示時、スレッドトップの「▼」をクリックすると、そのスレッドの > 発言を一覧表示します。 >・一画面あたりの表示数は以下の通りです。 > - 日付順表示…30 > - 日付順インデックス…50 > - スレッド表示…20スレッド >
[この投稿を含むスレッドを表示] [この投稿を削除]
[1763] Re:DIKSAM_book_0_4のLinuxでの実行結果について (その2)
投稿者:(ぱ)こと管理人
2012/01/11 02:10:45

>st_string_literal_buffer[0]:a0 >st_string_literal_buffer[1]:a2 >st_string_literal_buffer[2]:a4 >st_string_literal_buffer[3]:a6 >st_string_literal_buffer[4]:a8 >st_string_literal_buffer[5]:62 >st_string_literal_buffer[6]:62 >st_string_literal_buffer[7]:0 >st_string_literal_buffer[8]:0 >8バイト目以降は、0x00 になります。 > >マルチバイトの1バイトが飛ばされているようです。 確かにそのように見えますし、だとすると、原因はLANG環境変数とかではなく diksam.lということになりそうなのですが…… こちらで現象が再現していません。 >・文字列の取得についてですが、 > デバック用の文字列を入れて確認しました。 > -リテラル(ダブルクォーテーション)の最初と最後の取込みは出来ていました。 > -リテラル部分の取込みは、diksam.l Line295 で行われていました。 お使いのdiksam.lの正確なバージョンは何でしょうか? (元の圧縮ファイルは どれをダウンロードされましたか?) diksam.lについては後半触っていないのでたぶん同じだと思うのですが、たとえば http://kmaebashi.com/programmer/devlang/book/download.html こちらのdiksam_book_0_4ですと、diksam.lの中にdkc_add_string_literal()の 呼び出しが何箇所かありますが、その中の Line285-286, Line295, Line303あたりの呼び出しについて、どのような順序で 呼び出されているかはわかりますでしょうか。それとも全部Line295でしょうか? こちらのデバッグにつきあわせてしまうことになるかもしれませんが、 よろしければご確認ください。 なお、失念していたのですが、diksam.lには以下の不具合があります。 http://kmaebashi.com/programmer/devlang/book/seigo.html#p186 この件には関係しないと思うのですが、追記しておきます。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1762] Re:DIKSAM_book_0_4のLinuxでの実行結果について (その2)
投稿者:ICHIA
2012/01/08 04:59:45

昨年はとてもお世話になりました、 今年もよろしくお願い致します。 連絡が、年を越してすみませんでした。 調査結果を報告します。 >そこで確認ですが、 >①入力ファイルの文字コードは何でしょうか? od -cxかなにかでバイト列は取得できますか? LANG=ja_JP.PCK のSJISです。 ソースのマルチバイトの部分のバイト列です。 println("あいうえおbb"); ^^^^^^^^^^^^^^ 22 82a0 82a2 82a4 82a6 82a8 62 62 22 でした。 >②dvm_mbstowcs_lenに渡す直前の、st_string_literal_bufferのバイト列は取得できますか? st_string_literal_buffer[0]~[12]までの値はわかりますか? > ・dkc_close_string_literal()の文字列長を得る関数の復帰値で、 「-1」が返って来た時に、バイト列を表示してみました。 ============================================== string.c:dkc_close_string_literal()  L47: new_str_len = dvm_mbstowcs_len(st_string_literal_buffer); if (new_str_len < 0) { 追加> for(i=0;i<20;i++) 追加> printf("st_string_literal_buffer[%d]:%x \n",         i,st_string_literal_buffer[i]); ============================================== 結果: st_string_literal_buffer[0]:a0 st_string_literal_buffer[1]:a2 st_string_literal_buffer[2]:a4 st_string_literal_buffer[3]:a6 st_string_literal_buffer[4]:a8 st_string_literal_buffer[5]:62 st_string_literal_buffer[6]:62 st_string_literal_buffer[7]:0 st_string_literal_buffer[8]:0 8バイト目以降は、0x00 になります。 マルチバイトの1バイトが飛ばされているようです。 ・文字列の取得についてですが、  デバック用の文字列を入れて確認しました。  -リテラル(ダブルクォーテーション)の最初と最後の取込みは出来ていました。  -リテラル部分の取込みは、diksam.l Line295 で行われていました。   取込み時にもバイト列を表示させてみましたが、   上記と同じでした。 以上となります。 どうすれば、1バイト目が取り込めるようになるのでしょうか? 現状のdiksam.l で不備はないと思えるのですが・・・ アドバイスをよろしくお願い致します。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1761] 管理者により削除されました
2012/01/01 12:23:12

テスト投稿なので削除しました。テスト投稿はテスト用掲示板にお願いします。 # 新年早々こんなことを書かなきゃいけないむなしさよ。
[この投稿を含むスレッドを表示]
[1760] Re:DIKSAM_book_0_4のLinuxでの実行結果について (その2)
投稿者:(ぱ)こと管理人
2011/12/22 03:47:16

>入力ソースは1行だけで、 println("あいうえおbb"); ええとですね。 >まだ、マルチバイト無しのエラー系は完璧には動作していません。 「マルチバイト無しのエラー系」が動かないのではなくて、「マルチバイトありの正常系」が動かない、というのが現状ということでしょうか? そうだとして、 >パラメタのst_string_literal_bufferは、”\240「,ヲィbb”で化けております。 >入力ソースは1行だけで、 println("あいうえおbb"); st_string_literal_bufferをデバッガで見たのだと思いますが、それだと、バイト列をデバッガが表示するところで文字化けが起きるので、渡ってきている正確なバイト列はわからないと思います。 ただ、いずれにしてもbbまで出ているわけですから、入力ファイルの、ダブルクォートが始まってから終わるまでの文字列は、dvm_mbstowcs_len()にまで届いているように見えま す。(たぶんですが。バイト数が違うっぽいのが結構怪しいですが) >①~③までの役割は以下の解釈であっているでしょうか? > ①は、マルチバイト処理用、 >  SJISコードの漢字の範囲のコードが来たら2バイト単位で >  リテラルに取り上げる所 > ②は、1バイト処理用 >  リテラル文字を1バイト単位でリテラルに取り上げる箇所 > ③は、②の続きで、 >  コンパイル時の指定文字コードがSJISだった場合、 >  2バイト目に0x5cを持つ可能性がある1バイト目が来た場合、 >  次の2バイト目も一緒にリテラルに吸上げる所 これは合っていますけど、いずれにしてもこの処理は、「入力ファイルの、ダブルクォートが始まってから終わるまでのバイト列」を、間違いなくdvm_mbstowcs_len()に届けるための処理でしかありません。0x5cのような変な文字が来なければ、あまり意識しなくてよいはずのところです。 そこで確認ですが、 ①入力ファイルの文字コードは何でしょうか? od -cxかなにかでバイト列は取得できますか? ②dvm_mbstowcs_lenに渡す直前の、st_string_literal_bufferのバイト列は取得できますか? st_string_literal_buffer[0]~[12]までの値はわかりますか? そこまでわかったら、正確なバイト列がdvm_mbstowcs_len(の中のmbrtowc)に渡ったと仮定できますから、環境変数LANGが何であるのかとかの話になるのかと思います。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1759] Re:DIKSAM_book_0_4のLinuxでの実行結果について (その2)
投稿者:ICHIA
2011/12/22 03:10:54

追加情報になります。 diksam.l の動作について SJIS対応の文字リテラルで関係のありそうな箇所(①~③)に、 printf()を入れてデバックしてみました。 ①~③までの役割は以下の解釈であっているでしょうか?  ①は、マルチバイト処理用、   SJISコードの漢字の範囲のコードが来たら2バイト単位で   リテラルに取り上げる所  ②は、1バイト処理用   リテラル文字を1バイト単位でリテラルに取り上げる箇所  ③は、②の続きで、   コンパイル時の指定文字コードがSJISだった場合、   2バイト目に0x5cを持つ可能性がある1バイト目が来た場合、   次の2バイト目も一緒にリテラルに吸上げる所 ######### <STRING_LITERAL_STATE>[\x81-\x9f\xe0-\xef][\x40-\x7e\x80-\xfc] { ① dkc_add_string_literal(yytext[0]); dkc_add_string_literal(yytext[1]); } <STRING_LITERAL_STATE><<EOF>> { dkc_compile_error(dkc_get_current_compiler()->current_line_number, EOF_IN_STRING_LITERAL_ERR, MESSAGE_ARGUMENT_END); } <STRING_LITERAL_STATE>. { Encoding enc = dkc_get_current_compiler()->source_encoding; ② dkc_add_string_literal(yytext[0]); if (enc == SHIFT_JIS_ENCODING && ((unsigned char*)yytext)[0] >= 0x81 && ((unsigned char*)yytext)[0] <= 0x9e) { ③ BEGIN SHIFT_JIS_2ND_CHAR; } } ######### ”表”等の文字を入れても①③が表示されておらず、②ばかりでした。 自分の解釈からすると、日本語は①か③で処理されるはずだと 思っていましたが、どうも違っていました。 enc=SJISだと判定されていないのか? SJIS文字コードは取得できていないのか? どうしてそうなってしまうのか? そこで、encの確認をしてみました。 ③のIFの条件を、SJISだった場合と2バイト目が0x5c範囲を持つものと段階的にバラシて見ました。 #### if(enc == SHIFT_JIS_ENCODING){ ④ if(((unsigned char*)yytext)[0] >= 0x81) && ((unsigned char*)yytext)[0] <= 0x9e) ){ ③ ##### ④は表示されました。コンパイルのencは問題ないようです。 @そこで、solaris特有なのか?と思い、 このサーバにEUCコードの環境を作って動作させて見ました。 ちょっと手を加える必要がありましたが、動作しました。 test/test.dkm を動作させた所、「不正なマルチバイト」が出力されました。 お尻の「日本語」の部分をコメントにしたら、正常に動作しました。 更に、「日本語」を分解していき、「語」があると「不正なマルチバイト」になる事がわかりました。 また、exit(1)を削除して、最後の文字列を表示させてみたら同じく「不正なマルチバイト」になり、上記と同様にしたら「れ」が原因だと判明しました。 語: B8EC れ: A4EC と2バイト目が"EC"で何かあるのでしょうか?0x5cの様なものが。 asciiコードの"EC"を見てもおかしくなるような感じはありませんでしたが・・・ 以上が現在の調査状況になります。 なにか、ヒントがあればよろしくお願い致します。 相手をしてくれて感謝しております。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1758] Re:DIKSAM_book_0_4のLinuxでの実行結果について (その2)
投稿者:ICHIA
2011/12/21 00:09:24

回答ありがとうございました。 凄く参考になりました。 GDBで確認しました、内容は以下の通りになります。 >その中のどれでエラーになっているかはわかりますでしょうか? string.c dkc_close_string_literal(void) { ・・・・ ・・・・ dkc_add_string_literal('\0'); new_str_len = dvm_mbstowcs_len(st_string_literal_buffer); if (new_str_len < 0) { ERRORメッセージ出力 不正なマルチバイトのエラーは、 dvm_mbstowcs_len() の復帰値が、”-1”で発生していました。 パラメタのst_string_literal_bufferは、”\240「,ヲィbb”で化けております。 入力ソースは1行だけで、 println("あいうえおbb"); マルチバイトなしでの確認をしました。 入力ソースは1行だけで、 println("aaaaaaaaa"); 正常に動作しました。 パラメタのst_string_literal_bufferは、「aaaaaaaaaa」でした。 なので、マルチバイトの時の読み込みがやはりうまくいっていないのだと 判断してもよいと思われます。 字句解析のどこで詰まっているんでしょうか? GDBで解析してみましたが、イマイチ解析箇所がわかりませんでした。 また、なにかヒントがあれば教えてください。 ピンポイントで指摘して頂けるので、本当に助かります。 以上です、 よろしくお願い致します。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1757] Re:DIKSAM_book_0_4のLinuxでの実行結果について (その2)
投稿者:(ぱ)こと管理人
2011/12/20 02:41:53

引用の順番を変えています。 >以下の箇所は、EUC版もWINDOWS版(SJIS)も違いがありませんが、 >コード系関係なく同じで構わないのでしょうか? この部分は、 dkc_get_current_compiler()->source_encoding; の値により動きを変えており、それの値はMakefile中の -DSHIFT_JIS_CODEのような指定で制御しています(interface.c)。 しかし、仮にここの指定を誤っていたとしても、入力するソースがASCII文字からだけで構成されているのなら、エラーにはならないように思います。 >やっとDIKSAMが、マルチバイト無しの正常系が動作し始めました。 >まだ、マルチバイト無しのエラー系は完璧には動作していません。 「マルチバイト無しのエラー系」とのことですし。 >自分のSJIS環境では、「不正なマルチバイト文字です。」と >なってしまいます。 このエラーメッセージは、このように、列挙子BAD_MULTIBYTE_CHARACTER_ERRに対応しています。 dkc_compile_error(dkc_get_current_compiler()->current_line_number, BAD_MULTIBYTE_CHARACTER_ERR, MESSAGE_ARGUMENT_END); これが発生する箇所は、BAD_MULTIBYTE_CHARACTER_ERRで*.cを検索するとわかるようにDiksamのver.4系だと5箇所あるようです。 ver.2系だと4箇所のようです。こちら: http://kmaebashi.com/programmer/devlang/diksam_src_0_2/R/19.html その中のどれでエラーになっているかはわかりますでしょうか? 何を言っているのかというと、入力となるDiksamのソースのマルチバイト文字の解釈でエラーになっているのではなく、別の原因で起きたコンパイルエラーの、日本語エラーメッセージの変換でエラーになっているのでは? と思っているわけです。 そちらの環境が再現できてるわけでもないのであくまで推測です。また、もしエラーメッセージの変換で失敗しているのなら、「不正なマルチバイト文字です。」はなぜ正しく出るのかという疑問もわきます。 というわけで確定情報は出せませんが、参考になりましたら。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1756] Re:DIKSAM_book_0_4のLinuxでの実行結果について (その2)
投稿者:(ぱ)こと管理人
2011/12/19 12:56:43

すみません、回答遅れております。 その場所はencがSJISであるかどうかで動きが変わるのですが、それを決めているのはMakefileの-DSHIFT_JIS_SOURCEとかです。 今は携帯で辛いので詳細は今夜に。 >先日は、Solaris+SJISコードで動作させる為の環境構築の方法を教えて頂いてありがとうございました。 >やっとDIKSAMが、マルチバイト無しの正常系が動作し始めました。 >まだ、マルチバイト無しのエラー系は完璧には動作していません。 >##################### >int a=0; > >if(a==0){ > println("CCCC"); >##################### >このソースと全く同じではありませんが、「}なし」のエラーを狙いテストしますが、 >EUC版は、「文法エラー($(token)付近)」 が出力されます。 >自分のSJIS環境では、「不正なマルチバイト文字です。」と >なってしまいます。 > >そこで、つっかえている所がマルチバイトの読込み辺りだと当たりがつきます。 > >また、自分の構築している環境では、マルチバイトが処理出来ていません。 >字句解析(lex)でのマルチバイトの読込みがまだうまく出来ていないからだと思っています。 > >ちゃんと調べてもいないのに質問して申し訳ありませんが、教えてください。 >以下の箇所は、EUC版もWINDOWS版(SJIS)も違いがありませんが、コード系関係なく同じで構わないのでしょうか? >自分の構築したい環境でなにか考慮すべき所はありませんでしょうか? > ><STRING_LITERAL_STATE>[\x81-\x9f\xe0-\xef][\x40-\x7e\x80-\xfc] { > dkc_add_string_literal(yytext[0]); > dkc_add_string_literal(yytext[1]); >} ><STRING_LITERAL_STATE>. { > Encoding enc = dkc_get_current_compiler()->source_encoding; > dkc_add_string_literal(yytext[0]); > if (enc == SHIFT_JIS_ENCODING > && ((unsigned char*)yytext)[0] >= 0x81 > && ((unsigned char*)yytext)[0] <= 0x9e) { > BEGIN SHIFT_JIS_2ND_CHAR; > } >} ><SHIFT_JIS_2ND_CHAR>. { > dkc_add_string_literal(yytext[0]); > BEGIN STRING_LITERAL_STATE; >} >
[この投稿を含むスレッドを表示] [この投稿を削除]
[1755] Re:DIKSAM_book_0_4のLinuxでの実行結果について (その2)
投稿者:ICHIA
2011/12/16 04:24:32

先日は、Solaris+SJISコードで動作させる為の環境構築の方法を教えて頂いてありがとうございました。 やっとDIKSAMが、マルチバイト無しの正常系が動作し始めました。 まだ、マルチバイト無しのエラー系は完璧には動作していません。 ##################### int a=0; if(a==0){ println("CCCC"); ##################### このソースと全く同じではありませんが、「}なし」のエラーを狙いテストしますが、 EUC版は、「文法エラー($(token)付近)」 が出力されます。 自分のSJIS環境では、「不正なマルチバイト文字です。」と なってしまいます。 そこで、つっかえている所がマルチバイトの読込み辺りだと当たりがつきます。 また、自分の構築している環境では、マルチバイトが処理出来ていません。 字句解析(lex)でのマルチバイトの読込みがまだうまく出来ていないからだと思っています。 ちゃんと調べてもいないのに質問して申し訳ありませんが、教えてください。 以下の箇所は、EUC版もWINDOWS版(SJIS)も違いがありませんが、コード系関係なく同じで構わないのでしょうか? 自分の構築したい環境でなにか考慮すべき所はありませんでしょうか? <STRING_LITERAL_STATE>[\x81-\x9f\xe0-\xef][\x40-\x7e\x80-\xfc] { dkc_add_string_literal(yytext[0]); dkc_add_string_literal(yytext[1]); } <STRING_LITERAL_STATE>. { Encoding enc = dkc_get_current_compiler()->source_encoding; dkc_add_string_literal(yytext[0]); if (enc == SHIFT_JIS_ENCODING && ((unsigned char*)yytext)[0] >= 0x81 && ((unsigned char*)yytext)[0] <= 0x9e) { BEGIN SHIFT_JIS_2ND_CHAR; } } <SHIFT_JIS_2ND_CHAR>. { dkc_add_string_literal(yytext[0]); BEGIN STRING_LITERAL_STATE; }
[この投稿を含むスレッドを表示] [この投稿を削除]
[1754] Re:DIKSAM_book_0_4のLinuxでの実行結果について (その2)
投稿者:ICHIA
2011/12/01 01:07:43

素早い回答ありがとうございます。 連絡が遅れてすいませんでした。 >(2)(コンパイラの)Makefileの中に-DEUC_SOURCEとか-DSHIFT_JIS_SOURCEとかの > 指定が入っている。SJISでは、「表」のように2バイト目に0x5Cを含む > 文字が存在しうるので、いわゆる0x5C問題が起こります。これを回避する > コードが入っています。(-DEUC_SOURCEと-DUTF8_SOURCEの動きは同じです) > これを使用しているのはcrowbar.lまたはdiksam.lです。 Makefile を -DSHIFT_JIS_SOURCE に変更しました。 errror_message.c は、iconv で変換しました。 コンパイラはgccを利用していますが、コンパイルも問題なく通りました。 例の場所でのエラーは回避できました! ありがとうございます。 diksamは、ちょっと進んで、コンパイルエラーが出てとまりました。 「int a; 」 だけのテストプログラムなんですが・・・ これから、GDBで詳しく調べていきます。 わからない事があったら、またお願い致します。 ありがとうございました。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1752] Re:無題
投稿者:(ぱ)こと管理人
2011/11/27 23:12:35

>高校生活最後の昼休みには何をすればよいか? 高校生は卒業前は学校は半ドンになったりして、高校生活最後の昼休みって 結構早い時期にあったりしてたっけか。 まあ、とりあえず、メシを食えばよいのでは。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1751] Re:DIKSAM_book_0_4のLinuxでの実行結果について (その2)
投稿者:(ぱ)こと管理人
2011/11/27 23:10:36

はじめまして。 >なので、漢字コードがSJISになっております。 > >LANG環境変数=ja_JP.PCK > >そこで、もちろんなんですが、EUC版もUTF-8版も下記エラーになってしまいます。 >どの様に対応したらよいのか教えて頂けないでしょうか? crowbarやDiksamのソースコードで、SJIS版、EUC版、UTF-8版の違いは 以下の通りです。 (1)error_message.cの文字コードが違う。crowbar, Diksamともに、  エラーメッセージは日本語で出ますし、そのメッセージはerror_message.c内に  埋め込まれています。エラーメッセージも表示前にwchar_tに変換するのですが、  この変換でエラーになっているというのが現状です。 (2)(コンパイラの)Makefileの中に-DEUC_SOURCEとか-DSHIFT_JIS_SOURCEとかの  指定が入っている。SJISでは、「表」のように2バイト目に0x5Cを含む  文字が存在しうるので、いわゆる0x5C問題が起こります。これを回避する  コードが入っています。(-DEUC_SOURCEと-DUTF8_SOURCEの動きは同じです)  これを使用しているのはcrowbar.lまたはdiksam.lです。 (3)お使いのコンパイラがgccの場合は、gcc自体の0x5C問題に引っかかるので、  SJIS版(Windows版)のerror_message.cでは、随所に\が入っています。  Windows版のerror_message.cを使うか、gccのオプション指定をする必要が  あります。 というわけで、対策は以下のようになるかと思います。(試していません) ・error_message.cの文字コードをSJISにする。必要に応じて\を入れて  0x5C問題に対応するか、gccのオプションを指定する。 ・Makefileの-DEUC_SOURCEとかになっているところを「-DSHIFT_JIS_SOURCE」に  変更する。 Windows版のソースを参考にされるとよいのではないかと。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1750] Re:DIKSAM_book_0_4のLinuxでの実行結果について (その2)
投稿者:ICHIA
2011/11/27 03:34:38

初めて投稿します。 Cソースの静的解析ツールを作成したくて、参考になる物を探し続けて やっとこのHPにたどり着きました。ありがとうございます。 自分の使っているサーバの環境ですが、ちょっと変わっています。 PCでソースを編集し、solarisでコンパイルする事になっています。 なので、漢字コードがSJISになっております。 LANG環境変数=ja_JP.PCK そこで、もちろんなんですが、EUC版もUTF-8版も下記エラーになってしまいます。 どの様に対応したらよいのか教えて頂けないでしょうか? お手数をおかけして申し訳ありませんが、 よろしくお願いいたします。 >Assertion failure (wc_format != NULL) file..error.c line..92 >wc_format is null. >Assertion failure (wc_format != NULL) file..error.c line..92 >wc_format is null.
[この投稿を含むスレッドを表示] [この投稿を削除]
[1749] 無題
投稿者:LDK
2011/11/24 23:50:10

高校生活最後の昼休みには何をすればよいか?
[この投稿を含むスレッドを表示] [この投稿を削除]
[1748] Re:Cにおける列挙型の扱いについて
投稿者:yuya
2011/10/10 14:07:56

再度ありがとうございます。 ># 集合論的におかしい 激しく同意。例によって例のごとく、といいますか(^^;) >となり、やはり int となるため問題ないです。 了解です。 >6.7.2.2 の[制約]は[定数の値を定義する式]としか書いてないので、 >enum e_bbb { bbb=2147483647, ccc }; は言語規格書的には合法と考えざるを得ません。 ># gcc ではきっちりコンパイルエラーになりますが。 ですよねぇ。そこも凄く気になってました。 ちなみにLSI-Cで試すとコンパイルが通りました。 (intが2バイトで、bbbを32767とするとcccは-32768)
[この投稿を含むスレッドを表示] [この投稿を削除]
[1747] Re:Cにおける列挙型の扱いについて
投稿者:774RR
2011/10/10 12:54:21

以下 JIS X3010:2003 より抜粋するので C の場合に限定 6.7.2.2 - 列挙型 - 列挙子並びの中の識別子は、型 int を持つ定数として宣言され、 この型の定数が許されるところならばどこに現れてもよい なので元ネタのキャストは要らないと判断してよさそうです。 enum e_aaa 型の underlying type は char であってもよい、のと、 その要素である aaa の型は int である、のとが矛盾してるように見えますが・・・ # 集合論的におかしい enum 型の識別子ではなくて enum 型の変数(オブジェクト)が現れた場合には 6.2.5 - 型 - 列挙体は[整数型]である 6.3.1.1 - 整数型 - 整数拡張 元の型のすべての値が int 型で表現可能な場合 int 型に変換される 6.7.2.2 - 列挙型 - 列挙定数の (既述につき snip) となり、やはり int となるため問題ないです。 6.7.2.2 の[制約]は[定数の値を定義する式]としか書いてないので、 enum e_bbb { bbb=2147483647, ccc }; は言語規格書的には合法と考えざるを得ません。 # gcc ではきっちりコンパイルエラーになりますが。 C++ の場合はこの辺いろいろ規制緩和されている+言語仕様も厳密化されているので 仕様書を読んでいて安心できます。先の [制約] のような不安要素も文書化され済み。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1746] Re:Cにおける列挙型の扱いについて
投稿者:yuya
2011/10/09 18:08:45

774RRさん、ありがとうございます。よく理解できました。 列挙体のメンバを右辺値として使うときに「int型の定数」とみなして実質的に不都合が起こることはなさそうですね。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1745] Re:Cにおける列挙型の扱いについて
投稿者:774RR
2011/10/07 13:32:08

>例えばメンバの値の範囲がcharで収まるなら、 >処理系はcharを使って領域を節約してもよい ですます。たとえば gcc であれば -fshort-enums オプションがあります。 enum e_aaa { aaa=1 }; printf("%zd\n", sizeof (enum e_aaa)); -fshort-enums なしでコンパイルすると 4 -fshort-enums ありでコンパイルすると 1 >あくまで「(charと適合する)列挙型の列挙定数」であって、 >式の中に現れると汎整数拡張されてint型に格上げされる ですます。 ただし sizeof('a') と同様に C と C++ で違うところなので要注意。 printf("%zd\n", sizeof (aaa)); gcc -fshort-enums hoge.c だと 4 g++ -fshort-enums hoge.cpp だと 1
[この投稿を含むスレッドを表示] [この投稿を削除]
[1744] Cにおける列挙型の扱いについて
投稿者:yuya
2011/10/07 09:35:26

C限定の話で、列挙型についての疑問です。 JIS X3010:2003の6.7.2.2 列挙型指定子(p77~p78)に、 > 制約 列挙定数の値を定義する式は、int型で表現可能な値を持つ整数定数式でなければならない (中略) >それぞれの列挙型は、char、符号付き整数型又は符号無し整数型と適合する型とする。型の選択は、処理系定義とする。しかし、その型は列挙型のすべてのメンバの値を表現できなければならない。 とあります。 列挙型が必ずしもint型ではなく上記のような選択の余地を処理系に与えているのは、 例えばメンバの値の範囲がcharで収まるなら、処理系はcharを使って領域を節約してもよい、という意義だと理解してよいのでしょうか? 通常、列挙体のメンバを式中で用いるときには、何も意識せずにint型の定数として (私は)書いているのですが、このメンバ自体はint型とは限らないわけですよね。 ある列挙型に対して例えば「charと適合する型」が選ばれた場合、そのメンバは あくまで「(charと適合する)列挙型の列挙定数」であって、 式の中に現れると汎整数拡張されてint型に格上げされる、という理解でよいのでしょうか? この疑問が生じた直接のきっかけは、(ぱ)さんの「プログラミング言語MIL」の雑誌記事のmini_mvm.cにおいて、 (A)や(B)の箇所でintへのキャストがなされているのを見て、「どんなときにキャストすべきなんだっけ?」と再考したことによります。 相変わらず記事の本筋と関係なくてすみません……。 皆様よろしければご教示ください。 typedef enum { OP_PUSH_INT, OP_ADD, OP_MUL, OP_PRINT } OpCode; int g_bytecode[] = { /* (A) */ (int)OP_PUSH_INT, 10, (int)OP_PUSH_INT, 2, (int)OP_PUSH_INT, 4, (int)OP_MUL, (int)OP_ADD, (int)OP_PRINT, }; int st_stack[STACK_SIZE_MAX]; void mvm_execute(void){ int pc = 0; int sp = 0; // スタックポインタ while (pc < sizeof(g_bytecode) / sizeof(*g_bytecode)) { switch (g_bytecode[pc]) { case OP_PUSH_INT: // 整数をスタックに積む st_stack[sp] = (int)g_bytecode[pc+1]; /* (B) */ sp++; pc += 2; break; case OP_ADD: // 加算 /* 以下略 */ } } }
[この投稿を含むスレッドを表示] [この投稿を削除]
[1743] モチベが~~~
投稿者:
2011/10/05 16:07:12

また、モチベーションが落ちてきた… 根性が居る修正を始めようとして、なぜか横道に逸て、逸れすぎて。 何をしようとしてたか忘れた。 もちろん、大きな内容の修正は忘れてないが、ソースのどの部分を修正しようと してたのか忘れた… 何かしないと復活できない>< (日記ですね;;)
[この投稿を含むスレッドを表示] [この投稿を削除]
[1741] Re:ローカル変数のアドレスをスタックにpushしている?
投稿者:とも
2011/09/11 11:34:04

早速のお返事ありがとうございます。 なるほど、crowbarスタックの構造を勘違いしてました。 Stack構造体のstackメンバがCRB_Value*型だということは、"CRB_Value*"の集合ではなく、"CRB_Value"そのものの集合だということですね。 自分で作成中のものが、スタックを"アドレスの集合"にしているので、それと同じだと思い込んでいました。 参考になりました。 これからも、「プログラミング言語を作る」を参考にオリジナル言語の作成を続けたいと思います。 >こんにちは。ご意見ありがとうございます。 > >>「プログラミング言語を作る」を大いに参考にさせて頂いています。 >>というより、かなりまねをさせてもらってます。 > >そういっていただけると私も嬉しいです。 > >>関数の初頭で、resultというCRB_Value型の変数を宣言していますね。 >>式の評価結果をそれに詰め、最終的にcrowbarスタックにそのアドレスをpushしていると思います。 >>しかし、resultはローカル変数なので、関数を抜けるとその領域は既に使えないのではないか?という心配です。 > >・resultはローカル変数なので、関数を抜けるとその領域は使えません。 >・最終的にcrowbarスタックにresultをpush()する際は、以下のような処理を > 行っています。 > push_value(inter, &result); >・resultのポインタをpush_value()に渡したって、resultの領域は > すぐに開放されてしまうのだから役に立たないのではないか? というのが > ご懸念されていることだと思います。 > >しかし、push_value()の中では、最終的には以下のようにして値をcrowbarスタックに >格納しています。 > >static void >push_value(CRB_Interpreter *inter, CRB_Value *value) >{ >(中略) > inter->stack.stack[inter->stack.stack_pointer] = *value; > >渡されたCRB_Valueは確かにポインタですが、*演算子により >「ポインタの指す先の値」をコピーしてスタックに格納していますので、 >この後でresultが開放されても問題ありません。 > >なお、push_value()の引数として、CRB_Value*ではなくCRB_Valueを受け取るように >することはもちろん可能です。 >現状の実装でなぜポインタを渡しているのかというと…… 構造体は大きいかも >しれないので値渡しをすると効率上の問題が出るかも、という懸念があったのかと >思います。実際問題としては、CRB_Value程度のサイズの型なら値渡しにするという >選択肢は十分考えられると思うのですけれども。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1740] Re:ローカル変数のアドレスをスタックにpushしている?
投稿者:(ぱ)こと管理人
2011/09/11 03:00:48

こんにちは。ご意見ありがとうございます。 >「プログラミング言語を作る」を大いに参考にさせて頂いています。 >というより、かなりまねをさせてもらってます。 そういっていただけると私も嬉しいです。 >関数の初頭で、resultというCRB_Value型の変数を宣言していますね。 >式の評価結果をそれに詰め、最終的にcrowbarスタックにそのアドレスをpushしていると思います。 >しかし、resultはローカル変数なので、関数を抜けるとその領域は既に使えないのではないか?という心配です。 ・resultはローカル変数なので、関数を抜けるとその領域は使えません。 ・最終的にcrowbarスタックにresultをpush()する際は、以下のような処理を  行っています。 push_value(inter, &result); ・resultのポインタをpush_value()に渡したって、resultの領域は  すぐに開放されてしまうのだから役に立たないのではないか? というのが  ご懸念されていることだと思います。 しかし、push_value()の中では、最終的には以下のようにして値をcrowbarスタックに 格納しています。 static void push_value(CRB_Interpreter *inter, CRB_Value *value) { (中略) inter->stack.stack[inter->stack.stack_pointer] = *value; 渡されたCRB_Valueは確かにポインタですが、*演算子により 「ポインタの指す先の値」をコピーしてスタックに格納していますので、 この後でresultが開放されても問題ありません。 なお、push_value()の引数として、CRB_Value*ではなくCRB_Valueを受け取るように することはもちろん可能です。 現状の実装でなぜポインタを渡しているのかというと…… 構造体は大きいかも しれないので値渡しをすると効率上の問題が出るかも、という懸念があったのかと 思います。実際問題としては、CRB_Value程度のサイズの型なら値渡しにするという 選択肢は十分考えられると思うのですけれども。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1739] ローカル変数のアドレスをスタックにpushしている?
投稿者:とも
2011/09/10 21:18:23

始めて投稿します。 趣味で、オリジナルの言語を作成している途中です。 「プログラミング言語を作る」を大いに参考にさせて頂いています。 というより、かなりまねをさせてもらってます。 その中で気になるところがあり、投稿しました。 私自身はC言語をそれなりに習得しているつもりなのですが、誤解があったらご指摘下さい。 気になったのは、書籍の163ページの下部から165ページにわたる、eval_method_call_expression関数の例です。 eval系では、似たようなコードがいくつかあると思います。 関数の初頭で、resultというCRB_Value型の変数を宣言していますね。 式の評価結果をそれに詰め、最終的にcrowbarスタックにそのアドレスをpushしていると思います。 しかし、resultはローカル変数なので、関数を抜けるとその領域は既に使えないのではないか?という心配です。 Cでは関数の戻り値としてローカル変数のアドレスを返そうとすると警告が出ると思います。 書籍の例は、関数の戻り値として返しているわけではないので警告は出ないとは思います。 が、crowbarスタックにpushするということは、後からそれを使用する可能性があると思うのですが。 つまり次のプログラムと本質的には同じ事をしているように思えます。 ---------------------------------------------- #include <stdio.h> typedef struct { int type; char* data; } CRB_Value; CRB_Value *value; void eval_method_call_expression(){ CRB_Value result; result.type = 10; result.data = "Hello!"; value = &result; } int main(){ eval_method_call_expression(); printf("%d\n", value->type); printf("%s\n", value->data); } ---------------------------------------------- コンパイルではエラーも警告も出ないですが、上のプログラムはもちろん不正です。 既に議論済みだったら申し訳ありません。 はたまた、私がとんでもない勘違いをしているかもしれません。 御教示をお願いいたします。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1735] Re:もう忘れられている気が・・・
投稿者:
2011/08/14 16:28:20

返事ありがとうございます。 >これって問題になるほど遅いですかね? 関数パラメータのコピーや、ローカル変数の設定命や、 その初期値の設定等がバイトコードではなく、C++の1関数でまとめて 領域を作成して、定数コピーと参照アドレスの一括変換をする予定なので。 ローカル変数の設定処理に一切のバイトコードが無くなるんです。 その結果、トータルとして関数コールがとても高速になると思いますよ。 >6.5万行というと、言語処理系としては相当なサイズだと思うのですが… いえ、ほとんどは、私が作っている言語以外のシステムのコードです。 言語部分はそれほど多くはないです。 たぶん、前回の出した行数より少し増えただけだと思います。 いまは、画面表示は総てDirectXで表示して、3Dキャラが動き回ってます。 もちろん、コンソール的な機能も持っていて、print関数もDirectX上でコンソール をエミュレートして表示しています。getchar()やgets()関数もある。 これをしたからといってシステムが入力待ちで止まったりはしません。 言語上の1スレッドが入力待ちでシステムにもどる(タスクスイッチのOSに処理が 戻るようなもの)だけです。 いまは、システム全体をセーブして、ロードするとそこから再開できる機能を 作っています。ちょっと苦労してる。 PCで言うところにリジュームみたいな機能です。 今のバイトコードです。 関数コールとリターンを分割したので、void関数コールは速いです 組み込み関数と言語上の関数も分割。 一般的な言語ではなく、組込言語なので、エラー処理のほとんどは システムが受け持って処理するので、ほとんどの関数はエラーリターン がありません。そのため、90%以上の関数はvoid型になり高速処理されます。 そうそう、総ての型にキャスト命令を作っていますが、明示的な型変換の方が いいのか多少悩み中。将来この自動キャストは止めるかもしれません。  ↓ {L"dummy", L"", 0}, {L"push_int_1byte", L"b",8}, {L"push_int_2byte", L"s",8}, {L"push_int_4byte", L"i",8}, // 実際の値を持つ {L"push_double_0", L"", 12}, {L"push_double_1", L"", 12}, {L"push_double_8byte", L"d",12}, // 実際の値を持つ {L"push_string_const", L"s",12}, // 文字列の位置NOを持つ0~ {L"push_null", L"", 8}, /**********/ {L"push_stack_int", L"s", 8}, // intローカル変数をスタックに {L"push_stack_double", L"s", 8}, // {L"push_stack_string", L"s", 12}, // {L"pop_stack_int", L"s", -8}, // スタックのintをローカル変数に {L"pop_stack_double", L"s", -8}, // {L"pop_stack_string", L"s", -12}, // /**********/ {L"push_static_int", L"s", 8}, // int静的変数をスタックに 予約 {L"push_static_double", L"s", 12}, // {L"push_static_string", L"s", 12}, // {L"pop_static_int", L"s", -8}, // スタックのintを静的変数に 予約 {L"pop_static_double", L"s", -12}, // {L"pop_static_string", L"s", -12}, // /**********/ {L"push_sheet", L"s", 8}, // sheet番号をスタックに {L"push_sheet_int ", L"s", 8}, // sheet変数をスタックに {L"push_sheet_double", L"s", 12}, // {L"push_sheet_str ", L"s", 12}, // {L"pop_sheet_int ", L"s", -24}, // スタックからsheet変数に {L"pop_sheet_double", L"s", -28}, // {L"pop_sheet_str ", L"s", -28}, // /**********/ {L"push_sheet_ref", L"s", 8}, // 参照したsheet番号をスタックに {L"push_sheet_ref_int ", L"s", 8}, // 参照sheet変数をスタックに {L"push_sheet_ref_double", L"s", 12}, // {L"push_sheet_ref_str ", L"s", 12}, // {L"pop_sheet_ref_int ", L"s", -24}, // スタックから参照sheet変数に {L"pop_sheet_ref_double", L"s", -28}, // {L"pop_sheet_ref_str ", L"s", -28}, // /**********/ {L"push_array_ref ", L"s", 8}, // 配列参照 {L"push_array_int ", L"s", -1}, // int配列処理 {L"push_array_double", L"s", -1}, // {L"push_array_string", L"s", -1}, // {L"pop_array_int ", L"s", -1}, // スタックからint配列に {L"pop_array_double", L"s", -1}, // {L"pop_array_string", L"s", -1}, // /**********/ {L"and_int", L"", -8}, // 以下は総て算術演算子 {L"or_int", L"", -8}, {L"xor_int", L"", -8}, {L"add_int", L"", -8}, {L"add_double", L"", -12}, {L"add_string", L"", -12}, {L"sub_int", L"", -8}, {L"sub_double", L"", -12}, {L"mul_int", L"", -8}, {L"mul_double", L"", -12}, {L"div_int", L"", -8}, {L"div_double", L"", -12}, {L"mod_int", L"", -8}, {L"mod_double", L"", -12}, {L"minus_int", L"", 0}, {L"minus_double", L"", 0}, {L"increment", L"", 0}, {L"decrement", L"", 0}, // ここまで算術演算子 /**********/ {L"cast_int_to_double", L"", 4}, // 以下はキャスト処理 {L"cast_double_to_int", L"", -4}, {L"cast_string_to_int", L"", -4}, {L"cast_string_to_double", L"", 0}, {L"cast_boolean_to_string", L"", 4}, {L"cast_int_to_string", L"", 4}, {L"cast_double_to_string", L"", 0}, // ここまでキャスト処理 /**********/ {L"eq_int", L"", -8}, // 以下は総て論理演算子 {L"eq_double", L"", -16}, {L"eq_string", L"", -16}, {L"gt_int", L"", -8}, {L"gt_double", L"", -16}, {L"gt_string", L"", -16}, {L"ge_int", L"", -8}, {L"ge_double", L"", -16}, {L"ge_string", L"", -16}, {L"lt_int", L"", -8}, {L"lt_double", L"", -16}, {L"lt_string", L"", -16}, {L"le_int", L"", -8}, {L"le_double", L"", -16}, {L"le_string", L"", -16}, {L"ne_int", L"", -8}, {L"ne_double", L"", -16}, {L"ne_string", L"", -16}, // ここまで論理演算子 {L"logical_and",L"", -8}, // {L"logical_or", L"", -8}, // {L"logical_not",L"", 0}, // /**********/ {L"pop", L"", -8}, // スタックを1つ減らす {L"duplicate", L"", 16}, // スタック内容をコピーしてスタックに {L"jump", L"s", 0}, // 指定ポインターにjump {L"jump_if_true", L"s", -8}, // スタックがtrueならjump {L"jump_if_false", L"s", -8}, // スタックがfalseならjump {L"nop------------",L"", 0}, // nop /**********/ {L"push_function", L"", 0}, // 関数情報をスタック、未使用 {L"call_n_function_v", L"s", 0}, // void 組込み関数コール {L"call_n_function", L"s", 0}, // 組込み関数コール {L"call_function_v", L"ssss", 0}, // void 関数コール {L"call_function", L"ssss", 0}, // 関数コール {L"return_v", L"", -1}, // void 関数戻り {L"return", L"", -1}, // 関数戻り /**********/ {L"set_array_literal_int", L"ss", 0}, // int定数配列を変数にコピー {L"set_array_literal_double",L"ss", 0}, // double定数配列を変数にコピー {L"set_array_literal_string",L"ss", 0}, // string定数配列を変数にコピー
[この投稿を含むスレッドを表示] [この投稿を削除]
[1734] Re:もう忘れられている気が・・・
投稿者:(ぱ)こと管理人
2011/08/10 02:17:58

お久しぶりです。 >・関数コールをVMの再帰ではなく、VM内でそのまま実行に変えました。 > (システムをそっくりセーブロードに必要なために) これはそのほうがよいと思います。そして、そうした場合、 >・関数起動の高速化は、優先順位が低くて保留。 これって問題になるほど遅いですかね? >その時は約3.5万行有ったのが、今は6.5万行になっても、まだ足りません(泣 >いまは、あと半年から1年で初期バージョンをと、またも楽観的な目標を>< 6.5万行というと、言語処理系としては相当なサイズだと思うのですが… javacでも、初代は1万行以内だと聞いたことがあるような気が(記憶違いかも しれませんけど)
[この投稿を含むスレッドを表示] [この投稿を削除]
[1733] もう忘れられている気が・・・
投稿者:
2011/08/04 19:01:43

あまりにもお久しぶりです。 相変わらず作成は続いています。 言語的な変更点は。 ・関数コールをVMの再帰ではなく、VM内でそのまま実行に変えました。  (システムをそっくりセーブロードに必要なために) ・elsif -> else if に変更。(よりCに似せるために><) ・static 宣言の追加、sheetと関数宣言のみ。  (言語上のプログラムを多く書いていますが、やはりスコープが…)  (いっそのこと、継承・多態もないカプセル化だけのクラスを…) その他にもちょこちょこと。 ・関数起動の高速化は、優先順位が低くて保留。 8ヶ月前、半年から1年で初期バージョンができるのを期待していましたが。 その時は約3.5万行有ったのが、今は6.5万行になっても、まだ足りません(泣 いまは、あと半年から1年で初期バージョンをと、またも楽観的な目標を><
[この投稿を含むスレッドを表示] [この投稿を削除]
[1732] 無題
投稿者:test
2011/07/29 22:27:05

test
[この投稿を含むスレッドを表示] [この投稿を削除]
[1730] Re:たちよりました!
投稿者:(ぱ)こと管理人
2011/07/11 01:41:55

>最近、0からphpで掲示板を作ってみようと思ってます。その流れできてみましたー(`・♀・´) はじめまして。 うちのページを参考にしていただけるのは嬉しいのですが、 ・バージョンが古いこと ・magic quoteを前提にしたコードになっていること については留意してください。 こちらも参考にしてみてください。 http://kmaebashi.com/zakki/zakki0042.html
[この投稿を含むスレッドを表示] [この投稿を削除]
[1729] Re: 
投稿者:(ぱ)こと管理人
2011/07/11 01:39:21

>おれは良い意味で良い。 >おれは良い意味で良い。 >お前ら悪い意味で悪すぎ。 また注意書きの読めない人が適当なテスト投稿をしていったのかと思ったら、 はてなのブログのコメント欄まで同様の書き込みが……(消しますが) なんなんだろう。怖い。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1728] たちよりました!
投稿者:p
2011/07/10 19:15:39

最近、0からphpで掲示板を作ってみようと思ってます。その流れできてみましたー(`・♀・´)
[この投稿を含むスレッドを表示] [この投稿を削除]
[1727]  
投稿者: 
2011/07/06 23:40:49

おれは良い意味で良い。 おれは良い意味で良い。 お前ら悪い意味で悪すぎ。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1726] 管理者により削除されました
2011/06/29 02:52:57

テスト投稿はテスト掲示板にお願いします、とでかでかと書いてあるのに、なおここに書き込むような人達にはどう対処すべきなのですかねえ。
[この投稿を含むスレッドを表示]
[1722] 管理者により削除されました
2011/03/31 20:46:15

この掲示板の上部にリンクがありますが、テスト投稿はテスト用掲示板にお願いします。
[この投稿を含むスレッドを表示]
[1721] Re:構造体へのポインタを返す関数
投稿者:512
2011/03/21 20:06:13

おーこんなにたくさんの方が! みなさんどうもありがとうございます。 おかげさまでだいぶ大事なことをいくつか理解できました。 .hと.cの使い分けは正直うすうす悩んでいたことなので、 今回の質問で、間接的ではありますが、すっきりできてよかったです。 とりあえず元のコードの.hは大掃除した方がよさそうですね。 あと、intの場合なぜ通ってしまったかは、 これから聞こうと思っていたのですが、 皆さん先回りありがとうございます(笑 ここまで分かるとだいぶすっきり感がありますねぇ。 tiさんのサンプルコード大変参考になります。 たぶんまた近いうちに壁に当たって戻ってきますので 引き続きよろしくお願いします。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1720] Re:構造体へのポインタを返す関数
投稿者:774RR
2011/03/21 19:58:15

えっと、今は「関数宣言」の話しかしてない、っての大丈夫? 「関数定義」の話は一切出てきてないんだけど。 関数宣言が何回現れても、関数定義がなければリンクエラーにはならないよん。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1719] Re:構造体へのポインタを返す関数
投稿者:774RR
2011/03/21 19:41:51

すばらしい。 typedef を使っているあたりが素敵すぎる。 というわけで第三者読者へのふぉろーを追加。 typedef は新しい型を作るのではなくて、既存の型への別名を作る。 提示の例だと名前のない構造体(便宜上 anonymous_struct_1 と名づける) struct anonymous_struct_1 { int val; }; に対して、別名1 KOUZOU1 別名2 KOUZOU2 をつけているだけ。 なので KOUZOU1 と KOUZOU2 はどちらも struct anonymous_struct_1 であり、 関数宣言のほうもエラーにならない。 typedef struct { int x; } KOUZOU1, *PKOUZOU2; KOUZOU1 *func(); PKOUZOU2 func(); int main() { return 0; } これもエラーにならない。 一方で KOUZOU3 は struct anonymous_struct_2 { int val; }; の別名になるので これは KOUZOU1, 2 とは別のものになり、宣言が矛盾するエラー。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1718] Re:構造体へのポインタを返す関数
投稿者:mano
2011/03/21 19:31:25

へぇ。そうなんだ。問題ないんだ。 遠い昔、Cコンパイラに怒られるのが嫌で、○○の一つ覚えみたいに、2個目以降はexternを付けたような、、、、確かリンカでエラーが、ん!あぁなるほど、今回はstaticだからだいじょーぶなんだ。。。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1717] Re:構造体へのポインタを返す関数
投稿者:yuya
2011/03/21 18:35:08

にゃるほどー。 コンパイラは宣言がダブってる(re-declared)ことに怒ってるんじゃなくて、 型が合わない(conflicting types)から怒ってるんですね。 >static KOUZOU3 *func();の行だけエラーです。 さすがにデータ構造がたまたま同じでも、別の構造体だとダメか(笑)
[この投稿を含むスレッドを表示] [この投稿を削除]
[1716] Re:構造体へのポインタを返す関数
投稿者:ti
2011/03/21 18:16:48

tiです。 >矛盾しない関数宣言は何回行ってもよい(正しいプログラムである)ので、 >この2行があってもエラーにはならない。 >過去に書かれたソースコードとの互換性を維持するために、このコードに対して >警告は出ないのが大多数のコンパイラの挙動だろうね。 ># 俺的には、出たらびっくり。 どうもそうみたいでびっくりです(VC++ 2008で確認)。 実例です。 typedef struct { int val; } KOUZOU1,KOUZOU2; typedef struct { int val; } KOUZOU3; static KOUZOU1 *func(); static KOUZOU2 *func(); static KOUZOU3 *func(); int main(void) { return 0; } static KOUZOU3 *func();の行だけエラーです。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1715] Re:構造体へのポインタを返す関数
投稿者:774RR
2011/03/21 15:56:46

512 氏の [1706] 発言に一言付け加えると理解しやすくなるだろう。 > 構造体ではなくintへのポインタであればエラーは出ません。 「両方を」を追加。 すると main.c 中には static int *func(); // File1.h 由来 static int *func(); // File2.h 由来 と書かれた2行が入ることになる。 矛盾しない関数宣言は何回行ってもよい(正しいプログラムである)ので、 この2行があってもエラーにはならない。 過去に書かれたソースコードとの互換性を維持するために、このコードに対して 警告は出ないのが大多数のコンパイラの挙動だろうね。 # 俺的には、出たらびっくり。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1714] Re:構造体へのポインタを返す関数
投稿者:mano
2011/03/21 12:17:05

[1706]の > 構造体ではなくintへのポインタであればエラーは出ません。 は、どう?エラーじゃなくても警告ぐらい出す気がするんだけど、 こちら、Cが詳しくないのでよく分りません。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1713] Re:構造体へのポインタを返す関数
投稿者:(ぱ)こと管理人
2011/03/21 08:01:42

既に回答がついていますが、File1.hとFile2.hの static KOUZOU1 *func(); static KOUZOU2 *func(); このふたつのプロトタイプ宣言が、main.cの中で両方とも見えてしまって いるのが原因です。 「static KOUZOU1 *func()」という関数を、File1.cの中だけで使うのであれば、 .hファイルではなくFile1.cの中で宣言すればOKです。 関数定義自体を、それを呼び出すところよりも先に書けるのであればそれでも OKです(私はこちらの書き方の方が好みです)。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1712] Re:構造体へのポインタを返す関数
投稿者:774RR
2011/03/21 07:07:27

正解っす。あえてフォローするなら ti 氏が解説を省略したところを。 C のプリプロセッサは単純置換を行う機能であるため、 #include "hogehoge.h" は この行が hogehoge.h の中身に置き換わるだけ である、ということを意識すると理解が早い。 main.c は File1.h と File2.h を両方取り込む 取り込んだ結果のファイルを翻訳単位という main.c 中に static KOUZOU1* func(); と static KOUZOU2* func(); が両方入る 同一関数名が違う機能であると宣言されているのでエラー。 gcc -E hoge.c とか gcc -E -C hoge.c とかしてみると参考になるかもしれない。 次のステップへのヒントを 複数人開発をするようになると、重要度は .h ファイル> .c ファイル になる。 .h ファイルには「他人に使ってもらうため」の宣言・コメントを書く .c ファイルにはその実装を書く だから、 ・他人に使ってもらいたくない static 変数や関数は .h に書かずに .c に書く ・inline 展開される前提の短い static 関数は .h に書くことがある
[この投稿を含むスレッドを表示] [この投稿を削除]
[1711] Re:構造体へのポインタを返す関数
投稿者:ti
2011/03/21 02:28:24

tiと申します。 自分の勉強のため回答させていただきますので、 前橋さん間違いや補足のご指摘お願いします。 main.cの中で >#include "File1.h" >#include "File2.h" となっていて、 >static KOUZOU1 *func(); >static KOUZOU2 *func(); /* ここがエラーになります:error: conflicting types for 'func' */ で 展開後にfunc識別子が重複していることが原因です。 どちらかと関係するところを変えればコンパイルできるはずです。 なお、static宣言はmain.cなど、公開したくないソースに対してのヘッダファイルに 含めるべきでないと思います。 公開用(extern宣言の関数)と非公開用(ある関数だけで使うstatic宣言の関数)で ヘッダファイルは分けるべきです。 また、ヘッダファイルは二重展開防止機能をつけておきましょう。 #ifndef FILE1_H #define FILE1_H ~ #endif 以上 >お返事遅れました。 >(ぱ)さん、yuyaさん、ありがとうございます。 >(ぱ)さんの回答にひもづけて続けます。 > >下記がサンプルコードとエラーメッセージです。 >(環境はMac OSXのXcode3.2.4です。) > >main.c >-------------------------------------------------- >#include "File1.h" >#include "File2.h" > >int main (int argc, const char * argv[]) { > > file1(); > file2(); > > return 0; >} >-------------------------------------------------- > >File1.h >-------------------------------------------------- >typedef struct KOUZOU1_tag { > int var; >} KOUZOU1; > >void file1(); >static KOUZOU1 *func(); >-------------------------------------------------- > >File1.c >-------------------------------------------------- >#include <stdio.h> >#include <stdlib.h> >#include "File1.h" > >void file1() { > KOUZOU1 *kouzou; > kouzou = func(); > > printf("%d\n", kouzou->var); >} > >static KOUZOU1 *func() { > KOUZOU1 *kouzou; > > kouzou = malloc(sizeof(KOUZOU1)); > kouzou->var = 1; > > return kouzou; >} >-------------------------------------------------- > >File2.h >-------------------------------------------------- >typedef struct KOUZOU2_tag { > int var; >} KOUZOU2; > >void file2(); >static KOUZOU2 *func(); /* ここがエラーになります:error: conflicting types for 'func' */ >-------------------------------------------------- > >File2.c >-------------------------------------------------- >#include <stdio.h> >#include <stdlib.h> >#include "File2.h" > >void file2() { > KOUZOU2 *kouzou; > kouzou = func(); > > printf("%d\n", kouzou->var); >} > >static KOUZOU2 *func() { > KOUZOU2 *kouzou; > > kouzou = malloc(sizeof(KOUZOU2)); > kouzou->var = 2; > > return kouzou; >} >-------------------------------------------------- > >エラーは >error: conflicting types for 'func' >というもので >File2.h の static KOUZOU2 *func(); >の所に出ます。 > >ちなみに >error: previous declaration of 'func' was here >というメッセージも同時に出て、開くと >File1.h の static KOUZOU1 *func(); >を指していました。 > >やっぱりstaticを付けているのに >「funcさっき宣言したじゃん!」と言われているようなんですが、 >いかがでしょうか。 > >うーん、どこを勘違いしてるんだろうか。。。 > >よろしくお願いします! > >P.S. >「記憶クラス指定子」「型修飾子」の違いなど、 >自分で間違えて指摘されるとスムーズに理解しやすいですね。 >本で読むときはつい飛ばしてしまいがちですが(笑
[この投稿を含むスレッドを表示] [この投稿を削除]
[1710] Re:構造体へのポインタを返す関数
投稿者:512
2011/03/20 17:26:03

お返事遅れました。 (ぱ)さん、yuyaさん、ありがとうございます。 (ぱ)さんの回答にひもづけて続けます。 下記がサンプルコードとエラーメッセージです。 (環境はMac OSXのXcode3.2.4です。) main.c -------------------------------------------------- #include "File1.h" #include "File2.h" int main (int argc, const char * argv[]) { file1(); file2(); return 0; } -------------------------------------------------- File1.h -------------------------------------------------- typedef struct KOUZOU1_tag { int var; } KOUZOU1; void file1(); static KOUZOU1 *func(); -------------------------------------------------- File1.c -------------------------------------------------- #include <stdio.h> #include <stdlib.h> #include "File1.h" void file1() { KOUZOU1 *kouzou; kouzou = func(); printf("%d\n", kouzou->var); } static KOUZOU1 *func() { KOUZOU1 *kouzou; kouzou = malloc(sizeof(KOUZOU1)); kouzou->var = 1; return kouzou; } -------------------------------------------------- File2.h -------------------------------------------------- typedef struct KOUZOU2_tag { int var; } KOUZOU2; void file2(); static KOUZOU2 *func(); /* ここがエラーになります:error: conflicting types for 'func' */ -------------------------------------------------- File2.c -------------------------------------------------- #include <stdio.h> #include <stdlib.h> #include "File2.h" void file2() { KOUZOU2 *kouzou; kouzou = func(); printf("%d\n", kouzou->var); } static KOUZOU2 *func() { KOUZOU2 *kouzou; kouzou = malloc(sizeof(KOUZOU2)); kouzou->var = 2; return kouzou; } -------------------------------------------------- エラーは error: conflicting types for 'func' というもので File2.h の static KOUZOU2 *func(); の所に出ます。 ちなみに error: previous declaration of 'func' was here というメッセージも同時に出て、開くと File1.h の static KOUZOU1 *func(); を指していました。 やっぱりstaticを付けているのに 「funcさっき宣言したじゃん!」と言われているようなんですが、 いかがでしょうか。 うーん、どこを勘違いしてるんだろうか。。。 よろしくお願いします! P.S. 「記憶クラス指定子」「型修飾子」の違いなど、 自分で間違えて指摘されるとスムーズに理解しやすいですね。 本で読むときはつい飛ばしてしまいがちですが(笑
[この投稿を含むスレッドを表示] [この投稿を削除]
[1709] Re:構造体へのポインタを返す関数
投稿者:yuya
2011/03/18 11:07:40

どーでもいい私の感想ですが、 >もちろん関数の名前を変えれば解決するのですが、 >せっかくCを勉強しているので、原因をはっきりさせたいです。 これに惚れますね(笑)
[この投稿を含むスレッドを表示] [この投稿を削除]
[1708] Re:構造体へのポインタを返す関数
投稿者:yuya
2011/03/18 10:46:38

(ぱ)さんのおっしゃる通りで、エラーメッセージ(とサンプルコード)をコピペしたものを見ないと原因は分かりませんが、 >staticが"func"にかかっていないのかな? >という気がしますが、どうなんでしょうか。 このような疑問が湧くということは、 static, extern のような「記憶クラス指定子」と、 constのような「型修飾子」を混同なさっているのではないかと思います。 static が宣言中のどこにあるかによって、宣言の意味が変わることはありません。 先頭以外に書いた場合には、先頭に書いたのと同じ意味になるか、文法エラーになるか、のどちらかです。 ……って言い切っちゃったけど自信ない(^^;)
[この投稿を含むスレッドを表示] [この投稿を削除]
[1707] Re:構造体へのポインタを返す関数
投稿者:(ぱ)こと管理人
2011/03/18 03:34:38

はじめまして。 >最近C言語をがんばって勉強しています。(もちろん楽しいです) >ポインタ完全制覇には大変お世話になりました。 ありがとうございます。 で、ご質問の件ですが、 >現在、ソースファイルを分けてプログラムを書いており、 >他のファイルからアクセスしない関数にはstaticをつけています。 >なので、複数ファイル上で同名の関数を持っていても >エラーは出ません。 > >しかし、構造体へのポインタを返す関数の場合は、 >staticを付けてもエラーになってしまいます。 さすがにこれはありえないと思います。 戻り値の型が構造体へのポインタであっても、文法上、staticで名前を隠蔽することに 関係はしませんし、処理系のバグにしてもあまりにも変に見えます。 具体的にどのようなエラーが出ているのか、エラーメッセージを教えてもらえますか?
[この投稿を含むスレッドを表示] [この投稿を削除]
[1706] 構造体へのポインタを返す関数
投稿者:512
2011/03/17 22:11:51

はじめまして! 最近C言語をがんばって勉強しています。(もちろん楽しいです) ポインタ完全制覇には大変お世話になりました。 未だに完全消化できておらず、 この本を消化できれば分かることなのかもしれませんが、 身近に頼れる人がいなく、質問させてください! 現在、ソースファイルを分けてプログラムを書いており、 他のファイルからアクセスしない関数にはstaticをつけています。 なので、複数ファイル上で同名の関数を持っていても エラーは出ません。 しかし、構造体へのポインタを返す関数の場合は、 staticを付けてもエラーになってしまいます。 構造体ではなくintへのポインタであればエラーは出ません。 構造体はそれぞれ別のものです。 もちろん関数の名前を変えれば解決するのですが、 せっかくCを勉強しているので、原因をはっきりさせたいです。 具体的には ファイル1に static KOUZOU1 *func(); ファイル2に static KOUZOU2 *func(); を置いています。 ポインタ完全制覇読者としては staticが"func"にかかっていないのかな? という気がしますが、どうなんでしょうか。 お知恵を拝借できれば幸いです。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1704] Re:オセロについて
投稿者:学生
2011/02/19 22:26:47

> >Board.javaのput()メソッドの中のwindow.redraw()を抜けばよいようです。 > >このメソッドは、最終的にはCanvasのrepaint()を呼び出すことで、オセロの >盤面の再描画を行います。石を置いた後、アニメーションとともに画面の更新は >終わっているのですが、「念のために」全体の再描画をかけているわけです。 > >しかし、AWTにおけるrepaint()は非同期なので、即座に実行されるとは限りません。 >この再描画要求が、「次に石を置き、盤面の状態は変わったが、アニメーションの前」 >という状況で実行されると、アニメーション前に盤面の絵が更新されてしまいます。 > >ソースは近日中に差し替えます。ご指摘ありがとうございました。 お忙しい中、ありがとうございました。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1703] Re:オセロについて
投稿者:(ぱ)こと管理人
2011/02/14 02:17:25

大変遅くなってしまいましてすみません。学生さんがまだここを見ているかどうかも わかりませんが… >>石がひっくり返るアニメーションの前に、既にBoard内のデータは >>書き換えられているので、もしその前に画面の再描画が動いてしまえば >>現状のような現象になると思うのですが、すみませんが最近どたばたしていて >>私のほうでは原因が追えていません。 > >自分の方で調べて直してみたのですができませんでした。 > >今、お忙しそうですが原因がわかったらでいいので教えてもらえるとありがたいです。 Board.javaのput()メソッドの中のwindow.redraw()を抜けばよいようです。 このメソッドは、最終的にはCanvasのrepaint()を呼び出すことで、オセロの 盤面の再描画を行います。石を置いた後、アニメーションとともに画面の更新は 終わっているのですが、「念のために」全体の再描画をかけているわけです。 しかし、AWTにおけるrepaint()は非同期なので、即座に実行されるとは限りません。 この再描画要求が、「次に石を置き、盤面の状態は変わったが、アニメーションの前」 という状況で実行されると、アニメーション前に盤面の絵が更新されてしまいます。 ソースは近日中に差し替えます。ご指摘ありがとうございました。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1702] またまた、おひさしぶりです
投稿者:
2011/02/09 00:03:24

またまた、お久しぶりです。 最近は、主に3Dグラフィック関係の組込関数ばかり作っています。 言語部分の修正はあまり無いです。しかし、組み込み関数及び、 普通の関数のほとんどがリターンコード0のばかりだったので、void型を 作りました。関数の戻り値だけにしか使い道がありませんが。  その結果、バイトコードでは、call後のpopが必要なくなったのと、call機能 の実装部分が、void関数ではリターンコード処理がない分シンプルになりました。  おお、今気がついた、voidの関数はcall_voidの様な命令追加して、より シンプルにしよう。ほとんどがvoid関数なので効果が出る。  また、関数コールを数倍速する方法。それは、初期値の定数処理バイト コードが不要になり、パラメータ処理も単純になります。しかし、修正部分が 多いのでまた今度にします。  方法は簡単で、関数コールのスタック情報を事前に総て持っていて、 それをスタックにコピーして、インデックスアドレスとパラメータデータ のみ調整することで高速に関数が呼べます。定数コピーとかパラメータ 領域作成等細かな処理を一発コピーで終わらせます。  いまはまだ出来ませんが、行く行く組込みます。  また、シート変数を普通の関数パラメータに指定できるようにするため、 バイトコードが7つも増えてしまいました。orz  はやく、こんなことがしたかったんですと見せられるといいのですが、 まだまだ先が遠いです。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1701] Re:オセロについて
投稿者:(ぱ)こと管理人
2011/02/08 02:57:17

>今、お忙しそうですが原因がわかったらでいいので教えてもらえるとありがたいです。 すみません、ちょっと手間取ってます…
[この投稿を含むスレッドを表示] [この投稿を削除]
[1700] Re:オセロについて
投稿者:学生
2011/02/03 21:52:07

> >石がひっくり返るアニメーションの前に、既にBoard内のデータは >書き換えられているので、もしその前に画面の再描画が動いてしまえば >現状のような現象になると思うのですが、すみませんが最近どたばたしていて >私のほうでは原因が追えていません。 自分の方で調べて直してみたのですができませんでした。 今、お忙しそうですが原因がわかったらでいいので教えてもらえるとありがたいです。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1699] Re:「ほげ」について
投稿者:(ぱ)こと管理人
2011/02/02 03:30:05

はじめまして。時間がないので簡単な変身となってしまいますが、 >私のうっすらとした記憶では「Dr.スランプ」で使用されていたのではないかと >思うのですが(ソースが見つけられず、正確な情報でなくて申し訳ございません)。 Dr.スランプ、実家に帰れば文庫版を持っているのですが… >P.S.「ぴよ」といえば、「Dr.スランプ」より「めぞん一刻」や「タッチ」あたりのエプロン、シャツの柄でよく目にする「模様に困ったらpiyo」的なイメージが強いですが・・・これも今書き込もうとしてふと思っただけなので正確な情報でなくてすみません。 で、「ぴよ」のほうですが、こちらは「ほげ」と違い発祥が(たぶん)わかっています。 http://togetter.com/li/47113 やはり響子さんのエプロンが元ネタとのこと。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1698] 「ほげ」について
投稿者:通りすがりのD
2011/02/01 13:26:01

はじめまして。言語のお勉強をしていたはずが、「ほげ」にはまってしまいました(笑) 私のうっすらとした記憶では「Dr.スランプ」で使用されていたのではないかと思うのですが(ソースが見つけられず、正確な情報でなくて申し訳ございません)。 ちょうど80年代前半(1979~1984)あたりですし、全国的に広まった理由としてもまぁ納得かなぁ・・・なんて。 (まぁ、流行とコードなどの命名をいっしょにはできないでしょうが) あられちゃんの「ほよよ」などはメジャーですが、爆発に巻き込まれた後や眠いのを起こされたような場面で使用されているイメージがあります。 http://www.studiohs.com/28if/text/slump/whoswho/ka_ko.html の「暗悪健太」に > スーパーほげげスペシャルをやっていたりする。 や、 http://blog.livedoor.jp/comic2ch/archives/80579.html >213 >羽の生えたでかい猿に喰われそうになってほげげーっとか悲鳴あげてるのにワロタw とありました。 もし、機会があればご確認下さい。 P.S.「ぴよ」といえば、「Dr.スランプ」より「めぞん一刻」や「タッチ」あたりのエプロン、シャツの柄でよく目にする「模様に困ったらpiyo」的なイメージが強いですが・・・これも今書き込もうとしてふと思っただけなので正確な情報でなくてすみません。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1696] Re:オセロについて
投稿者:(ぱ)こと管理人
2011/02/01 02:55:43

>これは、どこを直せばよろしいのですか? 前回書いたとおりJudge.javaがGUIのイベントドリブンなスレッドとは 別スレッドで動いていて、石をひっくり返すところは、Judge.javaの方の スレッドで、Board.javaのput()から呼び出されています (window.animationPut()メソッド)。 石がひっくり返るアニメーションの前に、既にBoard内のデータは 書き換えられているので、もしその前に画面の再描画が動いてしまえば 現状のような現象になると思うのですが、すみませんが最近どたばたしていて 私のほうでは原因が追えていません。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1695] Re:オセロについて
投稿者:学生
2011/01/30 19:02:26

>>いや、確かに表示がおかしくなってますね。 >>実際にコンピュータ同士対戦させてみて、最後のほうの石の表示を観察してみてください。 >>結果的な盤面変化は問題ないのですが、ひっくり返る過程の表示だけ変です。 > >再確認しました。思い込みとは恐ろしいもので、たくさんの石を一気に >ひっくり返すとき、ひっくり返す前から色が変わっているにもかかわらず >気付いていませんでした。失礼しました > 学生さん > >このプログラムは、ゲームのメインループ(先手後手を切り替えながら >ゲームオーバーまでぐるぐる処理)を普通のループで書きたかったため、 >イベントドリブンであるGUIとは別のスレッドで動かしています。 >その待ち合わせがうまくいっていなくて、アニメーション前に盤面が >再描画されているように思います。 > >何年も前に公開したプログラムなのでいまさらなのですが、ちょっと確認してみます。 > これは、どこを直せばよろしいのですか?
[この投稿を含むスレッドを表示] [この投稿を削除]
[1694] Re:オセロについて
投稿者:(ぱ)こと管理人
2011/01/30 14:33:42

>>このプログラムは、ゲームのメインループ(先手後手を切り替えながら >>ゲームオーバーまでぐるぐる処理)を普通のループで書きたかったため、 >>イベントドリブンであるGUIとは別のスレッドで動かしています。 >>その待ち合わせがうまくいっていなくて、アニメーション前に盤面が >>再描画されているように思います。 > >この処理は、どこでやっているんですか? ゲームオーバーまでぐるぐる回る処理のことであれば、 Judge.javaでやっています。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1693] Re:オセロについて
投稿者:学生
2011/01/27 22:18:57

>このプログラムは、ゲームのメインループ(先手後手を切り替えながら >ゲームオーバーまでぐるぐる処理)を普通のループで書きたかったため、 >イベントドリブンであるGUIとは別のスレッドで動かしています。 >その待ち合わせがうまくいっていなくて、アニメーション前に盤面が >再描画されているように思います。 この処理は、どこでやっているんですか?
[この投稿を含むスレッドを表示] [この投稿を削除]
[1692] Re:オセロについて
投稿者:(ぱ)こと管理人
2011/01/23 16:51:12

>いや、確かに表示がおかしくなってますね。 >実際にコンピュータ同士対戦させてみて、最後のほうの石の表示を観察してみてください。 >結果的な盤面変化は問題ないのですが、ひっくり返る過程の表示だけ変です。 再確認しました。思い込みとは恐ろしいもので、たくさんの石を一気に ひっくり返すとき、ひっくり返す前から色が変わっているにもかかわらず 気付いていませんでした。失礼しました > 学生さん このプログラムは、ゲームのメインループ(先手後手を切り替えながら ゲームオーバーまでぐるぐる処理)を普通のループで書きたかったため、 イベントドリブンであるGUIとは別のスレッドで動かしています。 その待ち合わせがうまくいっていなくて、アニメーション前に盤面が 再描画されているように思います。 何年も前に公開したプログラムなのでいまさらなのですが、ちょっと確認してみます。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1691] Re:オセロについて
投稿者:yuya
2011/01/23 16:01:32

>この説明ではなんだかよくわかりませんが、たぶん自動でパスしてるんじゃ >ないでしょうか? このプログラムでは、打つところがないときは勝手にパスします。 > いや、確かに表示がおかしくなってますね。 実際にコンピュータ同士対戦させてみて、最後のほうの石の表示を観察してみてください。 結果的な盤面変化は問題ないのですが、ひっくり返る過程の表示だけ変です。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1690] Re:オセロについて
投稿者:(ぱ)こと管理人
2011/01/22 23:15:09

>たとえば、黒を置いた時に白から黒にひっくり返るのですが >最後のほうになると黒を置いた時に石が黒に代わってから白から黒に回って変化して >いるんですけどそれはなんで最後のほうだけなるんでしょうか? この説明ではなんだかよくわかりませんが、たぶん自動でパスしてるんじゃ ないでしょうか? このプログラムでは、打つところがないときは勝手にパスします。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1689] Re:オセロについて
投稿者:学生
2011/01/22 22:45:58

>こちらのサンプルアプレットでのオセロゲームで >石がひっくり返るときに > >たとえば、黒を置いた時に白から黒にひっくり返るのですが >最後のほうになると黒を置いた時に石が黒に代わってから白から黒に回って変化して >いるんですけどそれはなんで最後のほうだけなるんでしょうか? 前の質問ですけど コンピュータの時だけなってしまいます。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1688] Re:オセロについて
投稿者:学生
2011/01/22 22:29:49

アドバイスのおかげでコンピュータが作成できました。 ありがとうございます。 こちらのサンプルアプレットでのオセロゲームで 石がひっくり返るときに たとえば、黒を置いた時に白から黒にひっくり返るのですが 最後のほうになると黒を置いた時に石が黒に代わってから白から黒に回って変化して いるんですけどそれはなんで最後のほうだけなるんでしょうか?
[この投稿を含むスレッドを表示] [この投稿を削除]
[1687] Re:オセロについて
投稿者:(ぱ)こと管理人
2011/01/21 00:50:07

>次にミニマック法を作成してみたいと思うのですが >ComputerPlayer.javaでは何手先まで読んでいて、どこでやっているんでしょうか? ComputerPlayer.javaはほぼ全域がミニマックス法とαβ枝刈りなので 「どこで」というのはないのですが、先読みの深さについては以下のように なっています。 ・通常は4手先までです(DEFAULT_SEARCH_DEPTH)。 ・残りのマスの数を数えます。これが残りの手数の概算(パスを考慮しない)と  なるのですが、これが5(WIN_SEARCH_DEPTH)以下になったら、  完全読み切りモードに入ります。 >後、ab法はどこでやっているのですか? 変数alphaBetaValueで処理を分けているあたりです。 今ソースを見ると、残手数がPERFECT_SEARCH_DEPTH以下のときと WIN_SEARCH_DEPTH以下のときとでなにやら分岐していますが、 ここで設定した変数は使っていないので、無視してください。すみません。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1686] Re:オセロについて
投稿者:学生
2011/01/20 22:05:39

基本値の計算が作成できました。 次にミニマック法を作成してみたいと思うのですが ComputerPlayer.javaでは何手先まで読んでいて、どこでやっているんでしょうか? 後、ab法はどこでやっているのですか?
[この投稿を含むスレッドを表示] [この投稿を削除]
[1685] Re:オセロについて
投稿者:(ぱ)こと管理人
2011/01/20 00:30:23

>Eval00.javaでは、 cellPriority[][]で評価をしていて、 >自分の石だったら足して、コンピュータの石だったら引いているのは >わかるのですか最後のcellsValue + canPutNum * 100では >なぜ100をかけているんでしょうか? canPutNumは石が置ける場所の数(着手数)です。 オセロは石が置ける限りたとえ不利になるとしてもパスはできないので、 着手数は重要です。手詰まりが最大の敵です。 そのため、canPutNumが評価値に対して大きなウエイトを占めるように するために、100をかけています。 もちろん、cellPriorityの各要素の値を小さくしても同じ効果が あるでしょうけど。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1684] Re:オセロについて
投稿者:学生
2011/01/19 22:54:45

返信ありがとうございます。 >Eval00.javaやEval01.javaの方が、Eval02.javaよりはずっと簡単なので、 >読むならそちらの方がよいでしょう。 その通りで、自分にはEval02.javaは難しいので、 Eval00.javaを参考に作成したいと思います。 Eval00.javaでは、 cellPriority[][]で評価をしていて、 自分の石だったら足して、コンピュータの石だったら引いているのは わかるのですか最後のcellsValue + canPutNum * 100では なぜ100をかけているんでしょうか? 後、Eval00.javaは上の説明であっているでしょうか? 違っていたら、流れを教えてもらえないでしょうか? たびたび質問すいません。よろしくお願いします。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1683] Re:オブジェクト指向のメリット
投稿者:(ぱ)こと管理人
2011/01/19 02:44:56

>インスタンスを理解していないので、「どのインスタンスのメソッドを呼ぶのか」と >いう発想ができず、その場でnewして呼んでしまう。これは、私が以下のページで書いた >画面に線を引くたびにCanvasをnewした新人君と同レベルの発想です。 すみません、「以下のページ」のURLを貼り忘れました。ここです。 http://kmaebashi.com/programmer/object/shigoto.html いやさ、それにしても、本当にこのページの 「「どの」オブジェクトに仕事をさせればよいのか」 あたりの説明を読んで、それでもまったく理解できなかったの? だとすれば、いかに相手がアレな人とはいえ、さすがに私も自信をなくします……
[この投稿を含むスレッドを表示] [この投稿を削除]
[1682] Re:オブジェクト指向のメリット
投稿者:(ぱ)こと管理人
2011/01/19 02:32:48

たいやきさんからの回答がないですが(アクセスログも見ましたが、私が 質問を書いた以後ここを見ていないようです)、 たいやきさんって、ハンドルと発言内容からして、こちらで質問されている taiyaki123さんですよね? http://oshiete.goo.ne.jp/qa/6438120.html >せっかく回答してくださって申し訳ないのですが、100%の自信がないのであれば >回答くださらなくても結構です。ありがとうございました。 ……まあこれはさておき。 他にこちらでも質問されているようですが、 http://oshiete.goo.ne.jp/qa/6438154.html >信じられないのは、インスタンス変数が書き換えられるということです。 >サーブレットではインスタンス変数が共有されるのは理解していますが、 >サーブレットから呼ばれるインスタンスで定義されているインスタンス変数も >それに該当するのでしょうか。 >それとも、サーブレット内だけの話で、サーブレットから呼ばれるインスタンスでは >インスタンス変数は独立していると思ってよいでしょうか。 >後者の認識ですが、こういう書き方をされると、サーブレットから呼ばれた先でも >インスタンス変数が共有されると読めて、怖くて仕方ないです。 どう見ても、明らかに「インスタンス」を理解してないですよね。 (そしておそらくは「参照」も) 「サーブレットから呼ばれるインスタンス」って、そもそもインスタンスは 呼ぶものではありません。呼ぶことができるのは「インスタンスのメソッド」です。 揚げ足取りに見えるかもしれませんが、おそらくこのケースでは違います。 なぜなら、No.1の回答の方への「お礼」のところに、taiyaki123さんは 以下のように書いているからです。 >念のため質問内容が分かるようなソースをつけます。 >SampleClassで定義されているメンバー変数(staticではない変数)が、 >スレッド毎に共有されるかという質問です。 >servletclass extends HttpServet{ > public int a = 0; > public void doPost(){ > SampleClass sc = new SampleClass(); > } >} > >SampleClass{ > public int x = 0; >} >このようなプログラムがあったとします。 >このプログラムを複数の人が、同時にアクセスした場合に、 >SampleClassで定義されているメンバー変数のxが共有されるかという意味です。 >もちろん、共有されないという認識です。 新しいSampleClassをdoPost()のたびにnewしてるんだから、 共有されないのは当たり前です。サーブレットは何も関係ありません。 以下も。 http://oshiete.goo.ne.jp/qa/6438120.html >オブジェクトを作って実行するなら >testclass tc = new testclass(); >tc.method(); >というように2行です。 >オブジェクトを作らないなら、testclass.method() >というように1行です。 なにしろtaiyaki123さんはインスタンスを理解していないので、 インスタンスは、「メソッドを呼ぶときにnewするもの」でしかないのでしょう。 だから必要性もわからないし、「サーブレットから呼ばれるインスタンス」という トンチンカンな言葉も出てくる。 もしこの人がプロのJavaプログラマなのだとすれば(想像したくないですが)、 よく聞く、staticメソッドだけで開発している職場なのかもしれません。 インスタンスを理解していないので、「どのインスタンスのメソッドを呼ぶのか」と いう発想ができず、その場でnewして呼んでしまう。これは、私が以下のページで書いた 画面に線を引くたびにCanvasをnewした新人君と同レベルの発想です。 つまり、まったくのド素人です。 (いや、こんなのと一緒にしちゃ新人君に失礼ですが) 本来であれば、「疑りぶかい~」は、こういう人を対象読者としている はずなのですが…… サーブレットの件で当然の疑問を提示しているNo.1やNo.2の人に、 >ですので、以下の回答は間違いですね。 とか >まったくもって間違った回答ですね。 >サーブレットからインスタンスを呼ぶことができないなんて・・・。 とか答えて、せっかくのアドバイスを拒絶してしまうような人が相手では、 私の文章が理解されなかったのだとしても、私のせいではないでしょう。 http://oshiete.goo.ne.jp/qa/6402168.html このへんも、ねえ……
[この投稿を含むスレッドを表示] [この投稿を削除]
[1681] Re:オセロについて
投稿者:(ぱ)こと管理人
2011/01/19 01:54:09

今見てみたのですが、 >評価関数がどこにあるかといえば、Eval02.javaにあります。 >これはEvaluateBoardインタフェースを実装しており、Eval00.javaとかEval01.javaと >差し替えられるようになっています。Eval02を実際にnewしてくっつけているのは >ReversiApplet.javaです。 Eval00.javaやEval01.javaの方が、Eval02.javaよりはずっと簡単なので、 読むならそちらの方がよいでしょう。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1680] Re:オセロについて
投稿者:(ぱ)こと管理人
2011/01/19 00:43:38

>評価、着手数、要素の計算などはどこでやっているのか教えてもらえないでしょうか? 評価関数がどこにあるかといえば、Eval02.javaにあります。 これはEvaluateBoardインタフェースを実装しており、Eval00.javaとかEval01.javaと 差し替えられるようになっています。Eval02を実際にnewしてくっつけているのは ReversiApplet.javaです。 着手数や要石の計算は、このEval02.javaの中のscanLineで盤面を4方向にスキャンし、 フラグを立てています。以下のページに図があります。 http://kmaebashi.com/javaworld/index.html ただ、「学生」さんの現状のプログラムが、 >コンピュータの作成では、ランダムでしか対戦ができないため、 >コンピュータが強くないので強くしたいと思っている所です。 ランダムで(打てるところに?)打つ、というレベルなら、なにもこんな複雑な 評価関数をいきなり導入しなくてもよいのではないでしょうか。 …と、いうことを前回の返信で言いたかったのですが。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1679] Re:オセロについて
投稿者:学生
2011/01/18 22:35:29

ご返信ありがとうございました。 >「学生」さんがどの程度のスキルをお持ちかわかりませんが、 > javaは本を一冊読んだ程度の実力です。 オセロゲームを現在、作成しています。 コンピュータの作成では、ランダムでしか対戦ができないため、 コンピュータが強くないので強くしたいと思っている所です。 リバーシゲームのアルゴリズムは検索して調べてみたのですが、 ソースを見ても詳しくわからないので 評価、着手数、要素の計算などはどこでやっているのか教えてもらえないでしょうか?
[この投稿を含むスレッドを表示] [この投稿を削除]
[1678] Re:オセロについて
投稿者:(ぱ)こと管理人
2011/01/18 02:16:58

はじめまして。 >javaでオセロゲームを作っているのですが、リバーシゲームの思考ルーチンについて >ソースをダウンロードして見ているんですけど、よくわかりませんでした。 >どうやっているのかを詳しく教えていただけないでしょうか? 「学生」さんがどの程度のスキルをお持ちかわかりませんが、 http://kmaebashi.com/javaworld/index.html このページで簡単に説明しているように、このリバーシゲームのアルゴリズムは ミニマックス法とαβ枝刈りです。 それぞれどんなものかについても上記ページにごく簡単に説明していますが、 もちろんこの説明ではわからないからこそここで質問されたのかと思います。 ミニマックス法とαβ枝刈りはこの手のゲームの思考ルーチンとしては ごく一般的なものなので、検索すれば解説ページは出てきます。 Wikipediaの解説もそんなに悪くないかも。 http://ja.wikipedia.org/wiki/%E3%83%9F%E3%83%8B%E3%83%9E%E3%83%83%E3%82%AF%E3%82%B9%E6%B3%95 αβ枝刈りも検索すれば出ますが、高速化の手段なので(しかもそんな 劇的に早くなるわけでもないので)、最初はなくてもよいかも。 あとは評価関数ですが、少々手抜きの評価関数でも、ある程度先読みすれば、 並の人間の相手は可能なぐらいの強さにはなります。 たとえば盤面の各マスに評価値を付けておいて(当然四隅が最大)、 自分の石があったらその値を加算、敵の意思があったら減算、ぐらいの 評価関数でもそこそこ遊べるようなものになった記憶があります。 私のリバーシゲームでは結構凝った評価関数を実装していますが、 実のところこれがよい評価関数なのか、私には判定できません。 私自身がこの手のゲームが得意でないため、自分の作ったプログラムに まるっきり勝てないので、評価関数を直しても、強くなったのか弱くなったのか 判定できないためです。 実は、私のプログラムの評価関数は、以前別件で作った「6×6オセロ」の 評価関数の焼き直しです。「6×6オセロ」のときは、評価関数同士を 戦わせたりしてまじめに検討したのですが、それを8×8に焼き直すときには、 まったく検証していません。手抜きです……
[この投稿を含むスレッドを表示] [この投稿を削除]
[1677] オセロについて
投稿者:学生
2011/01/17 22:37:20

javaでオセロを作っているものですがよろしくお願いします。 javaでオセロゲームを作っているのですが、リバーシゲームの思考ルーチンについて ソースをダウンロードして見ているんですけど、よくわかりませんでした。 どうやっているのかを詳しく教えていただけないでしょうか?
[この投稿を含むスレッドを表示] [この投稿を削除]
[1676] Re:オブジェクト指向のメリット
投稿者:(ぱ)こと管理人
2011/01/16 23:52:17

>>オセロゲームですが、普通に一つのオブジェクトしかつくれないようなプログラムを書いておけば、サーブレットから起動されればそれぞれのオブジェクト(オセロ盤)が >>作られますから、マルチインスタンスを気にしなくてもよいと思います。 >>イメージ沸きますでしょうか。 > >すみません、イメージ沸きません。 >「普通に一つのオブジェクトしかつくれないようなプログラム」における >「プログラム」とはどのような単位ですか? >「サーブレットから起動」の「起動」とは、具体的にどういうことですか? >「起動」されたプログラムが終了するタイミングはいつですか? で、こちらについての回答はなしですか? 上記についても答えてもらいたいのですが、回答に時間がかかるかもしれないので、 追加で質問させてください。簡単に答えられるように選択式にしておきます。 たいやきさんは、今まで、サーブレットのプログラムを一度でも書いたことがありますか? a) 自分で全体を書いたことがある。(小さなテストプログラムのようなものでも可) b) 全体を書いたことはないが、仕事でチームで開発する等で、 c) 実際にコードを書いたことはない。ただ、本で勉強したことはある。  (書名を書いてください) d) 書いたこともなければ本で勉強したこともない。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1675] Re:オブジェクト指向のメリット
投稿者:(ぱ)こと管理人
2011/01/16 23:47:43

>そういう色んな経験やスキルがある人で、オブジェクト指向に挫折した人に、 >ちゃんと全てのオブジェクト指向の特徴とメリットを説明することが、 >アンチテーゼとしての役割だと思います。 知らんがな、としか言いようがありませんが。 うちのページが不満なら読んでいただかなくて結構ですし、 もっといい説明方法があると思うのなら、たいやきさんがご自分で Webでもなんでも書けばよいでしょう。 うちのページの趣旨は、「再入門」ですので、他の書籍やWebページの オブジェクト指向の説明において「欠けている」と私が感じた部分に 特化しています。 当時「マルチプルインスタンス オブジェクト指向」で検索しても 1件もヒットしなかったのが、今だと1000件以上ヒットします。 multiple instanceという言葉自体は一般的なものなので、この1000件 すべてが私の記事からの派生ではないと思いますが、それにしても 相応に需要はあったと言えると思います。 >>>継承には、重複コードを省くというメリットがあります。 >>>ポリモーフィズムには、ロジックの共通化というメリットがあります。 >私はこのメリットが正しいということに自信を持っています。 >また、そういう使い方をしているPGも回りにあります。 >また、書きませんでしたが、他にもメリットがあるとも思っています。 >私が言うメリットが正しいかどうかは置いておいて >ここで言いたかったのは、オブジェクト指向の3大特徴には、 >それぞれメリットがあって、それも説明しないと、オブジェクト指向の >説明としては不足であるということです。 >ですので、管理人様が間違っておられると思うのであれば、それはそれでいいと >思いますし、管理人様が思われるメリットを主張されればよいと思います。 >だた、継承やポリモーフィズムの説明をされる際には「今どきやらない」という >表現は誤解を生むと思います。 「今どきやらない」とは私は書いていません。 「今どきは、流行らない」と書いています。 まあ、これは実際紛らわしいですし、ひらがなで書いた私も悪いと思うのですが、 そもそも「継承やポリモーフィズム」について「今どきやらない」とも 「今どき流行らない」とも書いてはいません。ここで「今どき流行らない」と 書いているのはあくまで実装継承についてのみです。正しく読んでください。 で、 >>>継承には、重複コードを省くというメリットがあります。 実装継承については、かつては確かにもてはやされていた時代がありましたし、 便利な局面もあることはあるんでしょう(もちろん、デメリットの方が大きいと 判断されたからこそ流行らなくなったのですが)。 しかし、 >>>ポリモーフィズムには、ロジックの共通化というメリットがあります。 こっちについては実のところ意味がわかりません。 ポリモルフィズムで、どう、ロジックを共通化するのですか? 具体的な例を挙げて説明してください。 >私はこのメリットが正しいということに自信を持っています。 >また、そういう使い方をしているPGも回りにあります。 仕事のプログラムならそのまま提示することはできないと思いますが、 差し支えのない範囲で、どのようなコードを書いているか提示してもらえませんか? 興味があります。ここを見ている他の方もそうでしょう。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1674] Re:オブジェクト指向のメリット
投稿者:たいやき
2011/01/15 17:08:37

>こちらを見ていただくとわかるかと思うのですが、 >http://kmaebashi.com/programmer/object/othello.html > >「メンバー変数を隠したり、メンバー変数やメソッドをまとめたり」というのは、 >「疑りぶかい~」の想定読者は(たとえCで書いても)すでにやっているだろう、 >というのが前提です。 >この前提が正しいかどうかはよくわかりません。世間のCプログラマは、 >staticを使ってデータや関数を隠そうなどとは考えたこともない人が >大部分なのかもしれません。だとすれば、私がやっていることは効率の悪い方法だ、 >ということになるかと思います。 > >ただ、もしこの前提が正しいとするなら、そういうプログラマにカプセル化を >トクトクと語っても、「何だそんなことは俺もとっくにやってるよ」と思われるのが >オチです。 いいえ。そうではありません。 そもそも不思議なのが、なぜ、C言語をやってきた人(C言語に対するある程度 の知識があること)だけが対象なのでしょうか。 オブジェクト指向の理解に挫折した(このサイトを読む)人には、 今までC言語をやってきた人もいれば、やってきてない人もいます。 オブジェクト指向言語が始めてのプログラム言語の人もいると思います。 COBOLだけ知っている人もいると思います。 そういう色んな経験やスキルがある人で、オブジェクト指向に挫折した人に、 ちゃんと全てのオブジェクト指向の特徴とメリットを説明することが、 アンチテーゼとしての役割だと思います。 その特徴やメリットが、これまでのプログラム言語でも既に出来るのであれば、 それはその言語での特徴やメリットが、オブジェクト指向言語にも 連綿とひきつがれているんですと説明すればいいだけです。 そうすれば、「オブジェクト指向は今までの開発言語で出来ることやメリットも 継承しながら、新しい考え方や技術もとりいているんだよ」という事実が 分かってもらえると思います。その事実をちゃんと説明することが大切で、 「なんだそんなこととっくにやっているよ」という人だけを意識して説明することで、返ってオブジェクト指向を正しく理解してもら阻害になっていると感じます。 もし、C言語をやってきた人(C言語に対する知識がある程度ある方)向けの 説明であれば、「疑りぶかいあなたのためのオブジェクト指向再入門」という 名前の付け方や、書かれている内容は適切ではないと感じます。 すごく期待を持たせるようなタイトルであり、書き出しで オブジェクト指向の説明が不適切であることを指摘し、最適な説明を期待させる ような内容になっていながら、実は端にC言語との比較だけの説明になっています。 >>継承には、重複コードを省くというメリットがあります。 >>ポリモーフィズムには、ロジックの共通化というメリットがあります。 > >このメリットはどっちも間違っているような。 >少なくともいまどき実装継承ははやらないですし、ポリモルフィズムは >同じインタフェースで違うロジックを与える機能ですので(Template Methodパターン >みたいな使い方もあるにはありますが)。 私はこのメリットが正しいということに自信を持っています。 また、そういう使い方をしているPGも回りにあります。 また、書きませんでしたが、他にもメリットがあるとも思っています。 私が言うメリットが正しいかどうかは置いておいて ここで言いたかったのは、オブジェクト指向の3大特徴には、 それぞれメリットがあって、それも説明しないと、オブジェクト指向の 説明としては不足であるということです。 ですので、管理人様が間違っておられると思うのであれば、それはそれでいいと 思いますし、管理人様が思われるメリットを主張されればよいと思います。 だた、継承やポリモーフィズムの説明をされる際には「今どきやらない」という 表現は誤解を生むと思います。 もし、管理人様が世界中の全てのコードをみてそういわれているのであれば いいですが、そうではないと思いますから、このような狭い範囲での経験をもって 断定的な表現は、読む方に誤解を与えます。 今使われているかどうかというより、どういうメリットがあるかを一つ一つ正確に 伝えることが、一番正しく理解してもらえると思います。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1673] Re:オブジェクト指向のメリット
投稿者:(ぱ)こと管理人
2011/01/14 01:15:39

>クラスには、メンバー変数を隠したり、メンバー変数やメソッドをまとめたり、 >オブジェクトをたくさんつくれるというメリットがあります。 こちらを見ていただくとわかるかと思うのですが、 http://kmaebashi.com/programmer/object/othello.html 「メンバー変数を隠したり、メンバー変数やメソッドをまとめたり」というのは、 「疑りぶかい~」の想定読者は(たとえCで書いても)すでにやっているだろう、 というのが前提です。 この前提が正しいかどうかはよくわかりません。世間のCプログラマは、 staticを使ってデータや関数を隠そうなどとは考えたこともない人が 大部分なのかもしれません。だとすれば、私がやっていることは効率の悪い方法だ、 ということになるかと思います。 ただ、もしこの前提が正しいとするなら、そういうプログラマにカプセル化を トクトクと語っても、「何だそんなことは俺もとっくにやってるよ」と思われるのが オチです。でも、クラスには、たいやきさんも挙げておられるように 「オブジェクトをたくさんつくれるというメリット」もあるので、 そこを無視して「何だそんなことは俺もとっくにやってるよ」と思われたら 先に進めない。「疑りぶかい~」でマルチプルインスタンスを強調している 意図はそこです。 継承やポリモルフィズムは、いずれ書こうと思ってほったらかしになっている、 というのが実態ではありますが、 >継承には、重複コードを省くというメリットがあります。 >ポリモーフィズムには、ロジックの共通化というメリットがあります。 このメリットはどっちも間違っているような。 少なくともいまどき実装継承ははやらないですし、ポリモルフィズムは 同じインタフェースで違うロジックを与える機能ですので(Template Methodパターン みたいな使い方もあるにはありますが)。 >オセロゲームですが、普通に一つのオブジェクトしかつくれないようなプログラムを書いておけば、サーブレットから起動されればそれぞれのオブジェクト(オセロ盤)が >作られますから、マルチインスタンスを気にしなくてもよいと思います。 >イメージ沸きますでしょうか。 すみません、イメージ沸きません。 「普通に一つのオブジェクトしかつくれないようなプログラム」における 「プログラム」とはどのような単位ですか? 「サーブレットから起動」の「起動」とは、具体的にどういうことですか? 「起動」されたプログラムが終了するタイミングはいつですか?
[この投稿を含むスレッドを表示] [この投稿を削除]
[1672] Re:オブジェクト指向のメリット
投稿者:たいやき
2011/01/13 22:24:25

>JavaでServletを使う場合も、オセロ盤のインスタンスが複数作れないと、 >同時に複数の対戦を行うのはかなりやりにくくないですか? >たいやきさんがどのような作り方を想定しているのか具体的に >教えていただけると嬉しいです。 この質問に答える前に、私はオブジェクト指向が分かっているのか/分かってないのかすら分かりませんが、自分なりにオブジェクト指向とは、 「従来(非オブジェクト指向)のプログラミングを多少なりとも楽にする技術や概念の総称」だと理解しています。 そのオブジェクト指向の考え方を利用した技術や考え方として、フレームワーク、 ザインパターン、UML、オブジェクト指向プログラミングといった技術がありますが、 このサイトではオブジェクト指向プログラミングに焦点を当てておられるので、 それに特化してみると、クラス・継承・ポリフォーフィズムという3つの技術が あると思います。 クラスには、メンバー変数を隠したり、メンバー変数やメソッドをまとめたり、 オブジェクトをたくさんつくれるというメリットがあります。 継承には、重複コードを省くというメリットがあります。 ポリモーフィズムには、ロジックの共通化というメリットがあります。 この中にはオブジェクト指向でなくても出来る点はありますが、オブジェクト指向でも 使える訳で、これらを使うことにより、結果として、従来のプログラミングより 多少なりとも楽が出来るというのが、オブジェクト指向プログラミングだと思います。 これが正しいかどうかわかりませんが、仮りに正しいとすると、他の言語でも出来るとか、最初に覚えることではないとかではなく、 これらを一つ一つ丁寧に説明することが、「疑りぶかい人」へオブジェクト指向 をちゃんと説明することになると思っています。 他の説明を置いておいて、クラスのメリットであるオブジェクトをたくさん 作れることを主眼に置いて説明することは、「疑りぶかい人」にオブジェクト指向を 正しく理解してもらえることにはならないと思います。(私がそうでした。) このサイトは、下手なオブジェクト指向の説明にたいするアンチテーザとして作られた サイトだと思っていますので、このサイトを見た人がさらに挫折することの無いような工夫を期待します。 オセロゲームですが、普通に一つのオブジェクトしかつくれないようなプログラムを書いておけば、サーブレットから起動されればそれぞれのオブジェクト(オセロ盤)が 作られますから、マルチインスタンスを気にしなくてもよいと思います。 イメージ沸きますでしょうか。  
[この投稿を含むスレッドを表示] [この投稿を削除]
[1671] Re:オブジェクト指向のメリット
投稿者:(ぱ)こと管理人
2011/01/11 23:00:21

>サービス毎に(要するに対局1件毎に)別プロセスを起動するってのは UNIX 系では >一般的手法と思う。 それはそうなんですが、たいやきさんの主張は以下なので、 「Servletを使ったとき」を想定しなければいけないでしょう。 >というのはJavaでサーバを動かすときには、servletを使うことが出来ますが、 >その場合はマルチにインスタンスが作れなくても(1つしかつくれなくても)、 >オンラインオセロのようなゲームは作れるためです。 Servletそのもののインスタンスは(少なくとも通常は)全体でひとつなので、 複数対戦をホストしたければBoardのインスタンスを複数作って セッション等からそれを参照するように作るのが自然なように思います。 >俺なら「盤面は先読み1手につき1個必要」と例示するかな・・・ >再帰深さ1段につき盤面1個を要するってことで。 これはわかります。私が作ったプログラムでも実際にそうなっています。 http://kmaebashi.com/javaworld/index.html ただ、これを理解するにはオセロの思考ルーチンに対する理解がある程度必要で、 そうなると本筋から離れてしまいますから、「複数対戦をホストするため」という ことにしました。 ただ、公開当時も「複数対戦をホストするなら、自分ならプロセス分ける」という 方もいらっしゃって、「思考ルーチンで先読みするためにも使いますし」と答えたら 「それなら納得できます」と言われたので、このあたり、どのような説明なら 納得できるかは個人差がありそうです。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1670] Re:オブジェクト指向のメリット
投稿者:774RR
2011/01/11 11:36:49

たいやき氏ではないが一意見として サービス毎に(要するに対局1件毎に)別プロセスを起動するってのは UNIX 系では一般的手法と思う。 samba などでも接続1件につき1個 smbd が起動するわけで。 静的変数はプロセス毎に作られるものなので「対戦1件につき1プロセス」なら、 プロセス単位で盤面1個でも別に困らない、ってことではないかな・・・ 俺なら「盤面は先読み1手につき1個必要」と例示するかな・・・ 再帰深さ1段につき盤面1個を要するってことで。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1669] Re:オブジェクト指向のメリット
投稿者:(ぱ)こと管理人
2011/01/09 13:08:07

ご意見をいただくのは歓迎ですし、「偉そうに」とか恐縮される必要は ないのですが、 >マルチプルインスタンスをオブジェクト指向の特徴としてあげるのはよいと >思いますが、オセロでの説明はやめたほうがよいのではと個人的に思っています。 >というのはJavaでサーバを動かすときには、servletを使うことが出来ますが、 >その場合はマルチにインスタンスが作れなくても(1つしかつくれなくても)、 >オンラインオセロのようなゲームは作れるためです。 JavaでServletを使う場合も、オセロ盤のインスタンスが複数作れないと、 同時に複数の対戦を行うのはかなりやりにくくないですか? たいやきさんがどのような作り方を想定しているのか具体的に 教えていただけると嬉しいです。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1668] Re:ライザ言語の件(お久しぶりです)
投稿者:
2011/01/08 18:15:11

>迷惑ということはまったくありません。 ありがとうございます。でも、何かありましたら言ってください。 今は3Dグラフィックの組込を行っており、その一部の組み込み関数が87個です。 それでもまだまだ少なく、まだ多くの組込関数が必要です。 今は、3Dのマトリックス演算処理に四苦八苦しています。 いま、数行のプログラムで画面に3Dキャラが出て踊ったりはしているのですが、 それ自体では、システムを作っている意味が全く見えないのが残念です。 意味を持って見せられるようになるのは、先が遠そうです。 ふと、vector なり Matrix 変数型を作りたいとも思ってしまいましたが、 これはでは、本来の目的と外れて本末転倒とも思ってしまいます。 (でも結局 sheet 変数型作ってるけどね) 気は焦りますが、またーりやっていきます。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1667] Re:オブジェクト指向のメリット
投稿者:たいやき
2011/01/08 14:35:27

管理者様 返信が遅くなり申し訳ありません。 ご回答くださりありがとうございます。 オブジェクト指向でインスタンスがたくさん作れることが特徴であることと、 その特徴によって複数人で同時アクセスできるシステムが作れること (例えばオンラインオセロ)は、まったく無関係だと思います。 マルチプルインスタンスがオブジェクト指向の特徴の一つであることに 異論はありませんが、その説明をオンラインオセロで説明されることは、 返ってオブジェクト指向を間違って説明している(もしくは誤解をさせる)ことに なると思います。 実は、私はオブジェクト指向がわかっておらず、このサイトを読ませていただいて、 オブジェクト指向を教えてくれる親切なサイトがあるんだなとずっと思っていました。 が、最近、オブジェクト指向の本質がわかるにつれ、このサイトの説明は怪しいな と思うようになりました。 マルチプルインスタンスをオブジェクト指向の特徴としてあげるのはよいと 思いますが、オセロでの説明はやめたほうがよいのではと個人的に思っています。 というのはJavaでサーバを動かすときには、servletを使うことが出来ますが、 その場合はマルチにインスタンスが作れなくても(1つしかつくれなくても)、 オンラインオセロのようなゲームは作れるためです。 マルチプルインスタンスの説明は、もっと単純に説明できますし、そのほうが 本当に分かってない人にはわかりやすいと思います。 せっかくご説明をいただいて、偉そうに申し訳ありません。 では、失礼します。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1666] Re:ライザ言語の件(お久しぶりです)
投稿者:(ぱ)こと管理人
2011/01/05 23:03:15

お久しぶりです。Diksamはすっかり放置してしまっていますが、そちらは 開発が進んでいるのですね。 > また、日記みたいに書いてしまうかもしれません、問題がありましたら注意 >してください。でも、ここで書く事も1つのモチベーションになるので、ご迷惑 >でなければよろしくお願いいたします。 迷惑ということはまったくありません。 > {L"dummy", L"", 0}, > {L"push_int_1byte", L"b",8}, > {L"push_int_2byte", L"s",8}, > {L"push_int_4byte", L"i",8}, // 実際の値を持つ たぶん中身は全然違っていると思うのですが、バイトコードのニモニックには Diksamの痕跡が残っていますね。うれしいことです。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1665] ライザ言語の件(お久しぶりです)
投稿者:
2011/01/04 21:21:06

一年以上のお久しぶりです。8ヶ月ほど別のソフトを作っていたので、その間 何もしていませんでした。が、まだまだ作っています。 グラフィック部分をメインに作成しているので、なかなか見れる物ができません。 現在約4万5千行ほどのプログラムになっています。  また、日記みたいに書いてしまうかもしれません、問題がありましたら注意 してください。でも、ここで書く事も1つのモチベーションになるので、ご迷惑 でなければよろしくお願いいたします。 言語のインプリメントですが色々変えすぎて、何を変えたか分からなくなるほ どです。  まずはバイトコードが変わりました。 C++のwstringはやはり重たく、zwstringをオリジナルに作りました。 もちろんガーベージコレクションを必要としない可変長文字列変数です。 ↓がオペコードリストです。 {L"dummy", L"", 0}, {L"push_int_1byte", L"b",8}, {L"push_int_2byte", L"s",8}, {L"push_int_4byte", L"i",8}, // 実際の値を持つ {L"push_double_0", L"", 12}, {L"push_double_1", L"", 12}, {L"push_double_8byte", L"d",12}, // 実際の値を持つ {L"push_string_const", L"s",12}, // 文字列の位置NOを持つ0~ {L"push_null", L"", 8}, /**********/ {L"push_stack_int", L"s", 8}, // intローカル変数をスタックに {L"push_stack_double", L"s", 8}, // {L"push_stack_string", L"s", 12}, // {L"pop_stack_int", L"s", -8}, // スタックのintをローカル変数に {L"pop_stack_double", L"s", -8}, // {L"pop_stack_string", L"s", -12}, // /**********/ {L"push_static_int", L"s", 8}, // int静的変数をスタックに 予約 {L"push_static_double", L"s", 12}, // {L"push_static_string", L"s", 12}, // {L"pop_static_int", L"s", -8}, // スタックのintを静的変数に 予約 {L"pop_static_double", L"s", -12}, // {L"pop_static_string", L"s", -12}, // /**********/ {L"push_sheet", L"s", 8}, // sheet番号をスタックに {L"push_sheet_int ", L"s", 8}, // sheet変数をスタックに {L"push_sheet_double", L"s", 12}, // {L"push_sheet_str ", L"s", 12}, // {L"pop_sheet_int ", L"s", -24}, // スタックからsheet変数に {L"pop_sheet_double", L"s", -28}, // {L"pop_sheet_str ", L"s", -28}, // /**********/ {L"push_array_ref ", L"s", 8}, // 配列参照 {L"push_array_int ", L"s", -1}, // int配列処理 {L"push_array_double", L"s", -1}, // {L"push_array_string", L"s", -1}, // {L"pop_array_int ", L"s", -1}, // スタックからint配列に {L"pop_array_double", L"s", -1}, // {L"pop_array_string", L"s", -1}, // /**********/ {L"and_int", L"", -8}, // 以下は総て算術演算子 {L"or_int", L"", -8}, {L"xor_int", L"", -8}, {L"add_int", L"", -8}, {L"add_double", L"", -12}, {L"add_string", L"", -12}, {L"sub_int", L"", -8}, {L"sub_double", L"", -12}, {L"mul_int", L"", -8}, {L"mul_double", L"", -12}, {L"div_int", L"", -8}, {L"div_double", L"", -12}, {L"mod_int", L"", -8}, {L"mod_double", L"", -12}, {L"minus_int", L"", 0}, {L"minus_double", L"", 0}, {L"increment", L"", 0}, {L"decrement", L"", 0}, // ここまで算術演算子 /**********/ {L"cast_int_to_double", L"", 4}, // 以下はキャスト処理 {L"cast_double_to_int", L"", -4}, {L"cast_string_to_int", L"", -4}, {L"cast_string_to_double", L"", -0}, {L"cast_boolean_to_string", L"", 4}, {L"cast_int_to_string", L"", 4}, {L"cast_double_to_string", L"", 0}, // ここまでキャスト処理 /**********/ {L"eq_int", L"", -8}, // 以下は総て論理演算子 {L"eq_double", L"", -16}, {L"eq_string", L"", -16}, {L"gt_int", L"", -8}, {L"gt_double", L"", -16}, {L"gt_string", L"", -16}, {L"ge_int", L"", -8}, {L"ge_double", L"", -16}, {L"ge_string", L"", -16}, {L"lt_int", L"", -8}, {L"lt_double", L"", -16}, {L"lt_string", L"", -16}, {L"le_int", L"", -8}, {L"le_double", L"", -16}, {L"le_string", L"", -16}, {L"ne_int", L"", -8}, {L"ne_double", L"", -16}, {L"ne_string", L"", -16}, // ここまで論理演算子 {L"logical_and",L"", -8}, // {L"logical_or", L"", -8}, // {L"logical_not",L"", 0}, // /**********/ {L"pop", L"", -8}, // スタックを1つ減らす {L"duplicate", L"", 16}, // スタック内容をコピーしてスタックに {L"jump", L"s", 0}, // 指定ポインターにjump {L"jump_if_true", L"s", -8}, // スタックがtrueならjump {L"jump_if_false", L"s", -8}, // スタックがfalseならjump {L"nop------------",L"", 0}, // nop /**********/ {L"push_function", L"", 0}, // 関数情報をスタック、未使用 {L"call_function", L"ssss", 0}, // 関数コール {L"return", L"", -1}, // 関数戻り /**********/ {L"set_array_literal_int", L"ss", 0}, // int定数配列を変数にコピー {L"set_array_literal_double",L"ss", 0}, // double定数配列を変数にコピー {L"set_array_literal_string",L"ss", 0}, // string定数配列を変数にコピー また、メイン関数も1つのスレッドになり、待機リターンをしてVMを保持しないようにしました。  ↓例 //===================================================================== // 最初に実行されるmein関数 //===================================================================== int main(int qid,int p1) { if(qid == スレッド開始) { main_init(); return スレッド待機; } elsif(qid == 終了指示) { return スレッド終了; } return スレッドエラー終了; } また、配列操作のバイトコードもよりシンプルになり 2/3以下のバイトコードになりました。 シートの宣言も関数外で↓のようにラベル宣言するようにしました。 sheet s_system[10][20]; // システム設定のシート定義(変更不可) sheet s_key_input[2][256]; // キー入力定義(変更不可) sheet s_mouse_input[2][11]; // マウス入力定義(変更不可) sheet s_pad_input[8][20]; // パッド入力定義(変更不可) 初期バージョン完成にはまだまだかかりそうです。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1664] Re:MD5関数ですが
投稿者:sayonara
2010/12/29 16:50:38

>今頃だったら md5 でなく sha1 にするともう少しマシになるかもしれない。 sha1ですか。覚えておきます!
[この投稿を含むスレッドを表示] [この投稿を削除]
[1663] Re:MD5関数ですが
投稿者:774RR
2010/12/29 07:48:13

この種のセキュリティって奴を考察する上では、 ・誰から何を守るのか ・かかるコストが効果に見合うか を考えないと意味がない。 正規の管理人が平文パスワードを(見たくないのに誤って)見てしまうこと対策 掲示板運営している httpd サーバに侵入されて掲示板ソースだけ盗まれた場合の対策 遠隔地からデーターベースに侵入されてデータだけ盗まれた場合の対策 httpd と DB 両サーバに侵入されてソース+データが両方盗まれた場合の対策 下に行くほど、なさそうなシナリオ+被害大、なわけだが ・現実的にありえないような状況に対する施策のために  コスト(金銭的、手間的)をどこまでかける必然があるか? の線引きになるだけのこと。 掲示板ソフト上の固定文字+乱数 salt +ユーザーパスワード、ってのは現実的解だと思う。 今頃だったら md5 でなく sha1 にするともう少しマシになるかもしれない。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1662] Re:MD5関数ですが
投稿者:sayonara
2010/12/28 12:20:28

>また、データベースの中身を覗けている時点で、悪人はPHPのソースを見て >「秘密」の文字列を見ることができている可能性が高いような気もします。 >その場合には、「秘密」は役に立たないということになります。 ここは懸念ですね。ソースに記述しない方法ってあったりするのかな!
[この投稿を含むスレッドを表示] [この投稿を削除]
[1661] Re:MD5関数ですが
投稿者:(ぱ)こと管理人
2010/12/28 01:41:18

774RRさん、毎回ありがとうございます。 それだけでは何なので蛇足ですが。 こちらに以下のような説明がありますが、 http://kmaebashi.com/programmer/bbs_dev/delete.html | また、こうしておくことで、掲示板を運営しているサーバが万一クラックされたり、 | レンタルサーバ業者がD/B情報を漏洩させたりしたときにも、投稿者のパスワードを | 守ることができます。 | なお、いくらMD5アルゴリズムが逆方向の推測が困難だといっても、辞書攻撃や | 総当り攻撃により破られる可能性はあります。そこで、上のソースでは、 | パスワードに対し秘密の文字列(赤字部分)を連結しています。もちろん実際の | ソースでは、ここには「秘密」という文字列ではなく、推測されにくいでたらめな | 文字列が書かれています。こうしておけば、そのでたらめな文字列がばれない限り、 | パスワードそのものを推測することはできません。 saltの話はひとまず除外し、「秘密」についてだけ考えます。 もしこの「秘密」文字列をくっつけなかったとすると、 データベースの内容が悪人に漏洩した場合、悪人は、辞書等の単語に 片っ端からMD5をかけることでパスワードの推測が可能な場合があります。 ちょっと昔のUNIXでは、パスワードに1方向ハッシュをかけた文字列を そのまま(誰にでも見える形で!)保存していて、私も一度、とあるサーバにて、 「ユーザIDと同じパスワードを使っている人」がいないか調べてみたら ぼろぼろ見つかってしまった、ということがありました。 ユーザIDと同じパスワードは論外として、辞書攻撃的なものには「秘密」は 有効ですが、「総当り攻撃」に対しては、本質的には「程度問題」の防御にしか なりません。もっとも文字列長が増えるので、この「程度問題」はかなり 大きな「程度問題」ですけれども。 また、データベースの中身を覗けている時点で、悪人はPHPのソースを見て 「秘密」の文字列を見ることができている可能性が高いような気もします。 その場合には、「秘密」は役に立たないということになります。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1660] Re:MD5関数ですが
投稿者:sayonara
2010/12/27 18:10:43

課題1まで理解した上で質問しました。 わかりやすい説明でありがとうございます。 議論の板を読んで、 "秘密"は任意で良いとなんとなく思ってましたが、 確信できずに調べても出てこなかったです。 何度も回答していただいてすみません。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1659] Re:MD5関数ですが
投稿者:774RR
2010/12/27 15:42:48

salt の役割を理解していればそんな質問最初から出ないと思うが・・・ 先に挙げた掲示板上の議論の詳細は読んで理解できた? 課題1:パスワードを平文(ひらぶん)で保存するのはユーザにとっても管理人にとってもうれしくない 解決策:パスワードを1方向ハッシュで保存したらいい 1方向ハッシュとして MD5 アルゴリズムを使うとしたら md5($password) でいい # そもそも1方向ハッシュって何か?の解説は略 ここまで大丈夫?これが理解できていないのであれば以下の話は読むだけ無駄。 課題2:データベースクラックされてハッシュ化されているパスワードが漏れたら、 そのときのセキュリティをどう担保すればいい? 解決策:パスワードだけを md5 すると「md5 辞書アタック」で破られうるので、 パスワードに別の文字をくっつけたら「破るコストが跳ね上がる=破られない」。 そのために「くっつける文字」というのを用意するとよい (これが salt) PHP では文字列の連結に . を使う。"hoge" . "piyo" は連結されて "hogepiyo" になる。 http://www.php.net/manual/ja/language.operators.string.php ユーザーが入力したパスワード (例: "hoge") に 掲示板ソフトが用意した乱数文字列 salt (例: "piyo") をくっつけて md5("hogepiyo") としてハッシュ値を保存すれば、 データーベースがクラックされてハッシュ結果と salt の "piyo" が漏れても 元パスワード "hoge" を取り出すコストは膨大なものになる=破りにくい。 # 実用的時間のうちに破ることができないのであれば、破られないと言い切っていい。 先の hash_user_password は「ユーザの入力したパスワード」「ソフトが乱数で用意した salt 」の他に 「掲示板プログラムをインストールするごとに変えられるカスタマイズ可能文字 "秘密" 」をくっつけている。 だから "秘密" のところには何を入れてもいい。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1658] MD5関数ですが
投稿者:sayonara
2010/12/27 09:16:18

54: function hash_user_password($src, $salt) { 55: $dest = md5("秘密" . $src . $salt); 56: 57: return $dest; 58: } 以上の”秘密”のところに何を入れればいいでしょうか。 hash_user_passwordは$src, $saltの値が入力され、$destを出力すると 自分の理解はここまでですが、色々調べても乱数$saltを使ったMD5関数の使い方は見つからなかったです。 どうか教えてください。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1657] Re:DBにテーブル作成時の項目について
投稿者:(ぱ)こと管理人
2010/12/22 03:48:07

返信が遅くなりましてすみません。 また、774RRさん、回答ありがとうございました。 >このページにある「messageテーブル」についてですが、 >password項目が二個並んでいるのはどうしてでしょうか。 >↓ >password varchar(64) パスワード >password varchar(64) パスワードのsalt このページの記述がこうなってしまっているのは単なる誤植ですね。 修正しました。ご指摘ありがとうございました。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1656] Re:DBにテーブル作成時の項目について
投稿者:sayonara
2010/12/21 18:04:03

>片方はパスワードではなくて salt であって、要するにただの乱数。 >そのページの最後のほう、およびリンクのある掲示板上の議論参照。 > >salt という乱数を追加することでクラッキングがしづらくなるということ。 分かりました。 項目名をsaltに修正してcreate文が正常終了しました。 ありがとうございます。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1655] Re:DBにテーブル作成時の項目について
投稿者:774RR
2010/12/21 11:59:10

片方はパスワードではなくて salt であって、要するにただの乱数。 そのページの最後のほう、およびリンクのある掲示板上の議論参照。 salt という乱数を追加することでクラッキングがしづらくなるということ。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1654] DBにテーブル作成時の項目について
投稿者:sayonara
2010/12/20 15:13:02

質問です。 http://kmaebashi.com/programmer/bbs_dev/delete.html このページにある「messageテーブル」についてですが、 password項目が二個並んでいるのはどうしてでしょうか。 ↓ password varchar(64) パスワード password varchar(64) パスワードのsalt 宜しくお願いします。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1653] Re:PHPとmysqlで掲示板作成について
投稿者:sayonara
2010/12/20 09:07:02

勉強用に使わせていただいています。 初心者なので、とりあえず動くものが欲しいという段階です。 ご親切にありがとうございます。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1652] Re:PHPとmysqlで掲示板作成について
投稿者:(ぱ)こと管理人
2010/12/18 12:38:50

>get_cssの処理内容を貼ってください。 まあ貼るのはかまいませんけど、 get_css()がないのであれば、そこはひとまずべた書きにしてしまっても 構わないところですよね。 function get_css($board_id) { $sql_str = sprintf("select css from board where boardid='%s'", $board_id); $result = mysql_query_or_die($sql_str); if (mysql_num_rows($result) != 1) { die("掲示板のIDが変です。"); } $row = mysql_fetch_assoc($result); return $row["css"]; } 件のページでは、掲示板のソースを固めたものをダウンロード用として置いていません。 なぜかというと、私にとってあの記事の位置づけは「作り方の解説記事」であり 「掲示板スクリプトの配布ページ」ではないためです。 もちろん何を作るにも実際に動くものを動かしながら勉強する方が身につくものですし、 読者側からすれば動くソースを配布して欲しいという要望があるのもわかるのですが、 まるごと持っていった人にサポートを要求されたりバグの損害賠償を求められたり したらかなわないよな、ということで、現状のようにしています。ご了承ください。 あと、PHP4ですし、いろいろな意味で古くなってしまった記事でもあります。 ご利用は自己責任でお願いします。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1651] 管理者により削除されました
2010/12/18 12:39:21

重複投稿だったので削除しました。
[この投稿を含むスレッドを表示]
[1650] PHPとmysqlで掲示板作成について
投稿者:sayonara
2010/12/17 17:52:37

phpとmysqlで掲示板作成してみていますが、 「get_cssのfunctionが定義されていない」というエラーが出ました。 確認したところ、 util.phpに定義されていないです!!! get_cssの処理内容を貼ってください。 宜しくお願いします。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1649] Re:オブジェクト指向のメリット
投稿者:774RR
2010/12/17 11:39:11

オブジェクト指向という「概念」=抽象 実際のプログラミング言語という「実装」=具体 とがごっちゃになっているからわけわからん気味なのだと思うが C++ なり Python なり「オブジェクト指向を意識した言語」では 「対象物」を示す this や self が言語仕様上必須になっているため、 プログラマが引数の形で明示しなくても「何を対象に」が自動的に表現される =対象指定を欠くことができない =対象を暗示的に使う C の strtok のようなものは実装しづらい だけなのだと思う。 対象を指定することが強制されるってことはすなわち「対象が複数個数あるのが前提」 =マルチプルインスタンスであることは前提条件、当たり前である のだと思う。 C では「言語仕様上」 this が必須でない =「言語仕様上は」対象を明示しなくてもよい、ってだけで プロジェクトの運用方針などで「第一引数を hogehoge* にすること必須」と決めてしまえば それで十分オブジェクト指向なプログラムは可能。 言語側でのネイティブサポートがあるかないか、の違いでしかないと思うの心
[この投稿を含むスレッドを表示] [この投稿を削除]
[1648] Re:オブジェクト指向のメリット
投稿者:(ぱ)こと管理人
2010/12/17 01:34:38

>※C言語では問題という説明でしたよね。strtok()関数の実装[関数仕様]の問題でC言語で不可能という話ではないと思います。 「C言語で不可能」と書いたおぼえはないですが…… 「C言語では問題」と書いたおぼえもないですが…… 「Cの流儀では多くの場合こう書くのではないか」という想定はある程度置いていますけど。 >strtok2( STR, getid, delimiter ); >strtok2( NULL, id, delimiter ); http://kmaebashi.com/programmer/object/othello.html 上記のページで、 void board_put(Board *board, int x, int y, int senteOrGote); というCの関数に対し、 「---つまり、これがオブジェクト指向です。」 と書いています。 同様のことを以下のページでも書いています。 http://kmaebashi.com/programmer/c_yota/module.html >XXX_hoge(XXX_Instance xxx, 第2引数, 第3引数); >敢えて大雑把な言い方をすれば、要するにこれがオブジェクト指向です。 >継承を考えない限りにおいては、 C++でもJavaでも、要するにやってることは >インスタンスのポインタを第1引数に持って回ってるだけのことであって、 >あとは、表記法が若干異なるのと、メソッドの名前空間が異なる程度の話です。 >実例としては昔のSunOSに付属していたSunViewというウィンドウ環境がありました。 私はSunViewはほぼ触ったことがありません。その後のXViewは割と使いました。 Xtはもっと使ってます。 で、このへんのライブラリは、「Cで無理やりオブジェクト指向を実現した例」 だと思っています。 http://kmaebashi.com/programmer/c_yota/inherit.html 私の認識と、「偏」さんの認識はたいへんに近いと思うので、反論(?)の 必要はないですよね。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1647] Re:オブジェクト指向のメリット
投稿者:
2010/12/16 23:16:38

はじめまして。 >こちらにStringTokenizerの例を出しましたが、これはどうでしょうか? >http://kmaebashi.com/programmer/object/shigoto.html > >StringTokenizerはCのstrtok()と違って、プログラムの複数の箇所から同時アクセス >できる(というよりは、よそで使われているかどうかを意識せずに使うことができる) >わけです。 それって、strtok()がそういう使い方に配慮されてないだけに思えます。 ※C言語(非インスタンス化言語)だからできないという話とすり替えられているように感じました。 ※strtok()はそんな実装なので、それが保証できない時には別途用意したこっちの関数使おうねで良さそうに感じました。 オブジェクト指向が必要ないといいたい訳ではなく、旧来のC言語でも問題なく処理できる(ライブラリ化可能)と思います。 ※C言語では問題という説明でしたよね。strtok()関数の実装[関数仕様]の問題でC言語で不可能という話ではないと思います。 strtok2( STR, getid, delimiter ); strtok2( NULL, id, delimiter ); と呼び出し手順(IF)を変えてstrtok2内部でSTRを複数保持するようにする事で可能となりますよね。 StringTokenizerのインスタンスとして保持している情報をstrtok2()内部で保持してやる。 char coloncol[]="abc:cde:efg:ghij"; char commacol[]="abc,cde,efg,ghij"; char *result; int idcol, idcom; result = strtok2( coloncol, &idcol, ':' ); result = strtok2( NULL, idcol, ':' ); result = strtok2( commacol, &idcom, ',' ); result = strtok2( NULL, idcol, ':' ); result = strtok2( commacol, idcom, ',' ); result = strtok2( commacol, idcom, ',' ); ※実際使うにはインスタンスの開放的なIFも追加する事になるかと >また、たとえば大昔のBASICやHSPとかでは、画面に線を引く命令が、ウインドウを >引数に取りません。まあ、大昔のBASICにはマルチウインドウがなかったから >当然かもしれませんが、オブジェクト指向的に考えれば、最初から「ウインドウ」という >クラスを作り、複数のウインドウを開けるようにするのではないでしょうか。 実例としては昔のSunOSに付属していたSunViewというウィンドウ環境がありました。 C++が作られるより古い時代ですが、例えばPanelCreate()関数でPanelObjectを作る(もちろん複数可)感じでC言語のライブラリ使い実現されてましたよ。 ※WindowやPanelやItemやCanvasやと色々な部品がありました。同じ種類を複数生成する事もできましたよ。 ※SunOS3.x, SunOS4.xで使えた記憶が。4ではX11ベースのOpenWindowへの移行が推奨されてましたが。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1646] Re:オブジェクト指向のメリット
投稿者:(ぱ)こと管理人
2010/12/14 02:22:28

はじめまして。 >しかし、複数の人が同時アクセス出来ることがメリットの一つであるのであれば、 >それはそれで納得できます。 オセロでは確かにそういう例を出しましたが、「複数の人(人間)が」と言ってしまうと、 適用範囲がずいぶん狭くなってしまうように思います。 こちらにStringTokenizerの例を出しましたが、これはどうでしょうか? http://kmaebashi.com/programmer/object/shigoto.html StringTokenizerはCのstrtok()と違って、プログラムの複数の箇所から同時アクセス できる(というよりは、よそで使われているかどうかを意識せずに使うことができる) わけです。 また、たとえば大昔のBASICやHSPとかでは、画面に線を引く命令が、ウインドウを 引数に取りません。まあ、大昔のBASICにはマルチウインドウがなかったから 当然かもしれませんが、オブジェクト指向的に考えれば、最初から「ウインドウ」という クラスを作り、複数のウインドウを開けるようにするのではないでしょうか。 もちろん、オブジェクト指向のメリットはこれだけではなくて、継承やら多態も あるのですけれど、そのあたりは他の本とかにも書いてあるということ、 特に継承についてはあまりいい例題がないということから放置してしまっています。 すみません。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1645] オブジェクト指向のメリット
投稿者:たいやき
2010/12/13 18:53:26

疑り深いあなたのためのオブジェクト指向を読ませていただきました。 読んでいくなかで、自分のマルチプルインスタンスに対する知識や理解と、 記載されていることに差異があるように感じました。 どちらが正しいかは別として、まえばし様が記載されている内容を理解した上で、 どちらが正しいのか自分なりに判断したく、まえばし様が記載されている内容を、 私が正しく理解しているかどうか確認させていただければ幸いです。 オブジェクト指向の本質は、マルチプルインスタンスだと記載されており、 その後の説明で、オセロ盤を用いての説明で、C言語では、 (盤面ごとに別プロセスを立ち上げない限り)複数の人が同時アクセスして 使えるようなアプリは作れない(もしくは作りづらい)と書かれている という認識です。 そして、オブジェクト指向型であれば、複数のインスタンス(=盤面)が作成 出来るので、複数の人が同時アクセスするオセロが作れると記載されていると 理解しています。 もし、この理解が正なのであれば、マルチプルインスタンスの必要性やメリットが なんなのかを考えると、マルチプルインスタンスのメリットの一つは、複数の人が 当時アクセス出来るアプリを作ることが出来るアーキテクトであるということに なると思っています。 逆に、C言語のようなものは、複数の人が同時アクセスして動くアプリが作れない (つくりにくい)という特徴を持っていると理解したのですが、その認識は あっていますでしょうか? 私は、マルチプルインスタンスを作ることが出来るのがオブジェクト指向の 特徴であることは理解していますが、では、マルチプルインスタンスが作れる メリットは何なのかと考えると、一向に分かりません。 しかし、複数の人が同時アクセス出来ることがメリットの一つであるのであれば、 それはそれで納得できます。 よろしくお願いします。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1644] Re:from,phpについて
投稿者:(ぱ)こと管理人
2010/11/25 01:09:23

>すみませんが、この掲示板の作成とは具体的にどういうことでしょうか? >一応、dbは作ったのですが、データを作成するといったことでしょうか? こちらを参照してください。 http://kmaebashi.com/programmer/bbs_dev/newbbs.html 具体的には、boardテーブルにレコードをひとつ作る作業となります。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1643] Re:from,phpについて
投稿者:Paulo
2010/11/24 08:59:01

> >よって、ご自分で試されるのであれば、先に掲示板の作成を行ってから >その掲示板のIDを指定するようにしてください。 前橋さま 早速のご返答、感謝しています。 当方は、メインフレーム、AS/400などのプログラミングをブラジルで仕事としてやっていましたが、今後はオープン系のプログラミングを趣味もかねて勉強していこと思っているものです。  すみませんが、この掲示板の作成とは具体的にどういうことでしょうか? 一応、dbは作ったのですが、データを作成するといったことでしょうか?
[この投稿を含むスレッドを表示] [この投稿を削除]
[1642] Re:from,phpについて
投稿者:(ぱ)こと管理人
2010/11/21 15:28:41

from.phpの中の下記のところで "urlが変です。"と画面にでてきて、処理が先に進まない状態なのですが、進めるにはどうしたらいいのでしょうか? > > 11: if (!isset($_GET["boardid"])) { > 12: die('URLが変です。'); > 13: } 以下のページにも書いてありますが、 http://kmaebashi.com/programmer/bbs_dev/spec.html この掲示板は、仕様として boardid="掲示板のID" というように、掲示板のIDを渡すようにしています。 今あなたが見ているこの掲示板も、 http://kmaebashi.com/bbs/list.php?boardid=kmaebashibbs という形で、「kmaebashibbs」という掲示板のIDを渡しています。 テスト投稿用のテスト用掲示板も用意していますが、そのURLはこうです。 http://kmaebashi.com/bbs/list.php?boardid=testbbs よって、ご自分で試されるのであれば、先に掲示板の作成を行ってから その掲示板のIDを指定するようにしてください。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1641] from,phpについて
投稿者:Paulo
2010/11/20 16:33:08

php初心者ですが宜しくお願いします。 いま、このサイトに記載している投稿フォームのプログラムを勉強中なのですが、from.phpの中の下記のところで "urlが変です。"と画面にでてきて、処理が先に進まない状態なのですが、進めるにはどうしたらいいのでしょうか? 11: if (!isset($_GET["boardid"])) { 12: die('URLが変です。'); 13: } 教えて頂ければ幸いです。よろしくお願いします。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1640] Re:不具合について
投稿者:Tadashi
2010/09/20 10:04:24

>minGW でなきゃならない、ってことは無いので cygwin でも問題ないはず。 >現にウチでは問題ないし。 >まあなんにせよ minGW が欲しいのなら http://www.mingw.org/ > >> exeファイルはできるのですがなぜかcommand not foundとなってしまいます。 >どう作った?どう起動した? >UNIX 系 OS ではセキュリティ的配慮として、標準設定では >カレントディレクトリはコマンド検索パスに含まれない。 >#1621 と同様 gcc -o mycalc y.tab.c lex.yy.c と入力したのであれば >(cygwin の場合) a.exe というファイルが作成される。 >これを起動しようとして a<enter> と入力しても command not found になる。 > >$ ./a.exe <enter> のように どっと すらっしゅ を明示指定し、 >「カレントディレクトリにある a.exe を起動する」とするとよいはずだ。 > ありがとうございます!./で何とか起動しました。 それにしてもなぜ気づかなかったのか?わからないです。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1638] Re:不具合について
投稿者:774RR
2010/09/16 22:48:24

>#1621 と同様 gcc -o mycalc y.tab.c lex.yy.c と入力したのであれば >(cygwin の場合) a.exe というファイルが作成される。 ああ、大嘘 (爆) mycalc.exe というファイルが生成されるんだけど、 これを起動しようとして mycalc <enter> と入力すると以下略。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1637] Re:不具合について
投稿者:774RR
2010/09/16 22:40:01

minGW でなきゃならない、ってことは無いので cygwin でも問題ないはず。 現にウチでは問題ないし。 まあなんにせよ minGW が欲しいのなら http://www.mingw.org/ > exeファイルはできるのですがなぜかcommand not foundとなってしまいます。 どう作った?どう起動した? UNIX 系 OS ではセキュリティ的配慮として、標準設定では カレントディレクトリはコマンド検索パスに含まれない。 #1621 と同様 gcc -o mycalc y.tab.c lex.yy.c と入力したのであれば (cygwin の場合) a.exe というファイルが作成される。 これを起動しようとして a<enter> と入力しても command not found になる。 $ ./a.exe <enter> のように どっと すらっしゅ を明示指定し、 「カレントディレクトリにある a.exe を起動する」とするとよいはずだ。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1636] 不具合について
投稿者:Tadashi
2010/09/16 12:53:53

はじめまして。Tadashiと申します。非常に初歩的な質問で申し訳ないのですが、MinGW-5.1.4.exeがある場所がわかりません。記載のサイトにアクセスしてみましたが見つかりませんでした。しかたがないのでCygwinで電卓を作成してみたのですが、exeファイルはできるのですがなぜかcommand not foundとなってしまいます。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1635] Re:admindeletedindex.php
投稿者:coolm
2010/09/14 18:06:33

>前橋様、 なるほどです。ありがとうございます。 >>管理者削除後、日付順インデックスに、「管理者削除」を表記するためのadmindeletedindex.phpのソースが見当たらないので、ソースを教えていただけないでしょうか? よろしくお願いいたします。 > >たいしたものではありませんがいちおう貼っておきます。 > ><tr> ><td align="right">[<?=$serialid?>]</td> ><td> > <a href="./list.php?boardid=<?=$board_id?>&from=<?=$serialid?>&range=1"> > 管理者により削除されました > </a> ></td> ></tr> > >
[この投稿を含むスレッドを表示] [この投稿を削除]
[1634] Re:admindeletedindex.php
投稿者:(ぱ)こと管理人
2010/09/14 01:33:51

>管理者削除後、日付順インデックスに、「管理者削除」を表記するためのadmindeletedindex.phpのソースが見当たらないので、ソースを教えていただけないでしょうか? よろしくお願いいたします。 たいしたものではありませんがいちおう貼っておきます。 <tr> <td align="right">[<?=$serialid?>]</td> <td> <a href="./list.php?boardid=<?=$board_id?>&from=<?=$serialid?>&range=1"> 管理者により削除されました </a> </td> </tr>
[この投稿を含むスレッドを表示] [この投稿を削除]
[1633] admindeletedindex.php
投稿者:coolm
2010/09/13 01:11:54

前橋様、こんにちは。 前橋様の、「PHPとMySQLで掲示板を作る」を拝見させていただき、掲示板を作らせていただいてる者です。 本当にありがたく拝見させていただき、勉強させてもらいながら、悪戦苦闘しながら作っています。本当に感謝しております。 つまづいてる箇所がありまして、前橋様にお願いがあります。 管理者削除後、日付順インデックスに、「管理者削除」を表記するためのadmindeletedindex.phpのソースが見当たらないので、ソースを教えていただけないでしょうか? よろしくお願いいたします。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1629] 管理者により削除されました
2010/09/12 07:39:06

テスト用掲示板を知らずにこっちに書いちゃったのかな、、と思ったら、 テスト用掲示板よりもこっちの方が投稿時刻が遅い謎。
[この投稿を含むスレッドを表示]
[1628] Re:あら捜し
投稿者:(ぱ)こと管理人
2010/08/25 02:53:25

>http://kmaebashi.com/programmer/devlang/book/hosoku.html >不動になってますが浮動でしょうね(3箇所) > >http://kmaebashi.com/taiatari/seigo.html >p.333 scanf は変換個数ではなく代入個数を返す >(http://kmaebashi.com/seiha/seigo.html こっちは修正済み) ご指摘ありがとうございます。2点とも修正しました。 いやもうなんといいますか本当に、いつもお世話になってます(_o_)
[この投稿を含むスレッドを表示] [この投稿を削除]
[1627] あら捜し
投稿者:774RR
2010/08/24 15:15:04

http://kmaebashi.com/programmer/devlang/book/hosoku.html 不動になってますが浮動でしょうね(3箇所) http://kmaebashi.com/taiatari/seigo.html p.333 scanf は変換個数ではなく代入個数を返す (http://kmaebashi.com/seiha/seigo.html こっちは修正済み)
[この投稿を含むスレッドを表示] [この投稿を削除]
[1626] Re:mycalc でエラー発生
投稿者:774RR
2010/08/21 06:57:53

おお、よかったですな。 これに懲りずにいろいろ遊んでみてください。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1625] Re:mycalc でエラー発生
投稿者:チャチャ丸
2010/08/21 03:20:23

>俺んところでは MinGW をインストールした履歴は無いのでうまく動くのかもしれない。 >特に理由が無ければ MinGW 系をアンインストールしてみるといいかもしれない。 >ないしは cygwin をアンインストールして MinGW だけにしてみるか。 うわー出来ました!! アドバイス通りcygwinをアンインストールしてMinGWの方だけで設定したら出来ました。 本当にありがとうございます。 仰られた通りどっちも読み込んでいた(?)のが原因だったみたいです。 みなさんお忙しいなか何度もアドバイスをありがとうございました。 これからまた色々試してみたいと思います。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1624] Re:mycalc でエラー発生
投稿者:774RR
2010/08/20 16:13:48

俺んところと以下の二箇所が違うね・・(メモリ容量の数値とかは無視) >ignoring nonexistent directory "C" こちらは今回のエラーに直接関係なさそうなので無視してよいと思われる。 >#include <...> search starts here: >\MinGW\include こっちが問題の原因であろうと推測される。俺んところではこの行 (\MinGW\include) が無い。 cygwin 1.7 で MinGW のサポートが打ち切られているはずなので MinGW の関連ファイルを探してしまうのはあまりよろしくないのでは・・・ Q1.過去に minGW をインストールした? Q2.cygwin setup で gcc-mingw gcc-mingw-core とかインストールした? 俺んところでは MinGW をインストールした履歴は無いのでうまく動くのかもしれない。 特に理由が無ければ MinGW 系をアンインストールしてみるといいかもしれない。 ないしは cygwin をアンインストールして MinGW だけにしてみるか。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1623] Re:mycalc でエラー発生
投稿者:チャチャ丸
2010/08/20 10:41:31

>ちなみに gcc --version と入力したときになんて表示される? >ウチでは gcc (GCC) 4.3.4 20090804 (release) 1 になっている。 全く同じバージョンでした。 ので出力されたhoge.txt載せますね。 gcc: 2: No such file or directory Using built-in specs. Target: i686-pc-cygwin Configured with: /gnu/gcc/releases/respins/4.3.4-3a/gcc4-4.3.4-3/src/gcc-4.3.4/configure --srcdir=/gnu/gcc/releases/respins/4.3.4-3a/gcc4-4.3.4-3/src/gcc-4.3.4 --prefix=/usr --exec-prefix=/usr --bindir=/usr/bin --sbindir=/usr/sbin --libexecdir=/usr/lib --datadir=/usr/share --localstatedir=/var --sysconfdir=/etc --infodir=/usr/share/info --mandir=/usr/share/man --datadir=/usr/share --infodir=/usr/share/info --mandir=/usr/share/man -v --with-gmp=/usr --with-mpfr=/usr --enable-bootstrap --enable-version-specific-runtime-libs --with-slibdir=/usr/bin --libexecdir=/usr/lib --enable-static --enable-shared --enable-shared-libgcc --disable-__cxa_atexit --with-gnu-ld --with-gnu-as --with-dwarf2 --disable-sjlj-exceptions --enable-languages=ada,c,c++,fortran,java,objc,obj-c++ --disable-symvers --enable-libjava --program-suffix=-4 --enable-libgomp --enable-libssp --enable-libada --enable-threads=posix --with-arch=i686 --with-tune=generic --enable-libgcj-sublibs CC=gcc-4 CXX=g++-4 CC_FOR_TARGET=gcc-4 CXX_FOR_TARGET=g++-4 GNATMAKE_FOR_TARGET=gnatmake GNATBIND_FOR_TARGET=gnatbind --with-ecj-jar=/usr/share/java/ecj.jar Thread model: posix gcc version 4.3.4 20090804 (release) 1 (GCC) COLLECT_GCC_OPTIONS='-v' '-o' 'mycalc.exe' '-mtune=generic' '-march=i686' /usr/lib/gcc/i686-pc-cygwin/4.3.4/cc1.exe -quiet -v -D__CYGWIN32__ -D__CYGWIN__ -Dunix -D__unix__ -D__unix -idirafter /usr/lib/gcc/i686-pc-cygwin/4.3.4/../../../../include/w32api -idirafter /usr/lib/gcc/i686-pc-cygwin/4.3.4/../../../../i686-pc-cygwin/lib/../../include/w32api y.tab.c -quiet -dumpbase y.tab.c -mtune=generic -march=i686 -auxbase y.tab -version -o /cygdrive/c/DOCUME~1/user-1/LOCALS~1/Temp/ccyoqpc6.s ignoring nonexistent directory "C" ignoring nonexistent directory "/usr/local/include" ignoring nonexistent directory "/usr/lib/gcc/i686-pc-cygwin/4.3.4/../../../../i686-pc-cygwin/include" ignoring duplicate directory "/usr/lib/gcc/i686-pc-cygwin/4.3.4/../../../../i686-pc-cygwin/lib/../../include/w32api" #include "..." search starts here: #include <...> search starts here: \MinGW\include /usr/lib/gcc/i686-pc-cygwin/4.3.4/include /usr/lib/gcc/i686-pc-cygwin/4.3.4/include-fixed /usr/include /usr/lib/gcc/i686-pc-cygwin/4.3.4/../../../../include/w32api End of search list. GNU C (GCC) version 4.3.4 20090804 (release) 1 (i686-pc-cygwin) compiled by GNU C version 4.3.4 20090804 (release) 1, GMP version 4.3.1, MPFR version 2.4.1-p5. GGC heuristics: --param ggc-min-expand=45 --param ggc-min-heapsize=28600 Compiler executable checksum: f80f2b86ee4951059548b57e98331af2 COLLECT_GCC_OPTIONS='-v' '-o' 'mycalc.exe' '-mtune=generic' '-march=i686' /usr/lib/gcc/i686-pc-cygwin/4.3.4/../../../../i686-pc-cygwin/bin/as.exe -v -o /cygdrive/c/DOCUME~1/user-1/LOCALS~1/Temp/ccVAFJ0o.o /cygdrive/c/DOCUME~1/user-1/LOCALS~1/Temp/ccyoqpc6.s GNU assembler version 2.20.51 (i686-cygwin) using BFD version (GNU Binutils) 2.20.51.20100410 COLLECT_GCC_OPTIONS='-v' '-o' 'mycalc.exe' '-mtune=generic' '-march=i686' /usr/lib/gcc/i686-pc-cygwin/4.3.4/cc1.exe -quiet -v -D__CYGWIN32__ -D__CYGWIN__ -Dunix -D__unix__ -D__unix -idirafter /usr/lib/gcc/i686-pc-cygwin/4.3.4/../../../../include/w32api -idirafter /usr/lib/gcc/i686-pc-cygwin/4.3.4/../../../../i686-pc-cygwin/lib/../../include/w32api lex.yy.c -quiet -dumpbase lex.yy.c -mtune=generic -march=i686 -auxbase lex.yy -version -o /cygdrive/c/DOCUME~1/user-1/LOCALS~1/Temp/ccyoqpc6.s ignoring nonexistent directory "C" ignoring nonexistent directory "/usr/local/include" ignoring nonexistent directory "/usr/lib/gcc/i686-pc-cygwin/4.3.4/../../../../i686-pc-cygwin/include" ignoring duplicate directory "/usr/lib/gcc/i686-pc-cygwin/4.3.4/../../../../i686-pc-cygwin/lib/../../include/w32api" #include "..." search starts here: #include <...> search starts here: \MinGW\include /usr/lib/gcc/i686-pc-cygwin/4.3.4/include /usr/lib/gcc/i686-pc-cygwin/4.3.4/include-fixed /usr/include /usr/lib/gcc/i686-pc-cygwin/4.3.4/../../../../include/w32api End of search list. GNU C (GCC) version 4.3.4 20090804 (release) 1 (i686-pc-cygwin) compiled by GNU C version 4.3.4 20090804 (release) 1, GMP version 4.3.1, MPFR version 2.4.1-p5. GGC heuristics: --param ggc-min-expand=45 --param ggc-min-heapsize=28600 Compiler executable checksum: f80f2b86ee4951059548b57e98331af2 COLLECT_GCC_OPTIONS='-v' '-o' 'mycalc.exe' '-mtune=generic' '-march=i686' /usr/lib/gcc/i686-pc-cygwin/4.3.4/../../../../i686-pc-cygwin/bin/as.exe -v -o /cygdrive/c/DOCUME~1/user-1/LOCALS~1/Temp/ccEYJmqj.o /cygdrive/c/DOCUME~1/user-1/LOCALS~1/Temp/ccyoqpc6.s GNU assembler version 2.20.51 (i686-cygwin) using BFD version (GNU Binutils) 2.20.51.20100410
[この投稿を含むスレッドを表示] [この投稿を削除]
[1622] Re:mycalc でエラー発生
投稿者:チャチャ丸
2010/08/20 10:27:08

>管理人の前橋です。はじめまして。 >しばらくこちらを見ていなくて、反応が遅くなりましてすみません。 はじめまして。お返事ありがとうございます。 >ここ↑からダウンロードしたファイルに含まれているmake.batやmake.shを >使わず、手作業でyacc(bison?)やlex(flex?)も動かしたということでしょうか? そうですね。bisonとflexを手入力で動かしました。そこではエラーは出ないのですが、 gcc -o mycalc y.tab.c lex.yy.c の所で以下の様なエラーが表示されます。 /cygdrive/c/DOCUME~1/Temp/ccxzh81W.o:y.tab.c:(.text+0x8e): undefined reference to `__imp__iob' /cygdrive/c/DOCUME~1/Temp/ccxzh81W.o:y.tab.c:(.text+0xc2): undefined reference to `__imp__iob' /cygdrive/c/DOCUME~1/Temp/ccxzh81W.o:y.tab.c:(.text+0xed): undefined reference to `__imp__iob' /cygdrive/c/DOCUME~1/Temp/ccxzh81W.o:y.tab.c:(.text+0x133): undefined reference to `__imp__iob' /cygdrive/c/DOCUME~1/Temp/ccxzh81W.o:y.tab.c:(.text+0x168): undefined reference to `__imp__iob' /cygdrive/c/DOCUME~1/Temp/ccxzh81W.o:y.tab.c:(.text+0x1af): more undefined reference to `__imp__iob' /cygdrive/c/DOCUME~1/Temp/ccrE3OK5.o:lex.yy.c:(.text+0x872): undefined reference to `__errno' /cygdrive/c/DOCUME~1/Temp/ccrE3OK5.o:lex.yy.c:(.text+0x87f): undefined reference to `__errno' /cygdrive/c/DOCUME~1/Temp/ccrE3OK5.o:lex.yy.c:(.text+0x899): undefined reference to `__errno' /cygdrive/c/DOCUME~1/Temp/ccrE3OK5.o:lex.yy.c:(.text+0x1195): undefined reference to `__errno' /cygdrive/c/DOCUME~1/Temp/ccrE3OK5.o:lex.yy.c:(.text+0x1231): undefined reference to `__errno' /cygdrive/c/DOCUME~1/Temp/ccrE3OK5.o:lex.yy.c:(.text+0x16fb): undefined reference to `__errno' collect2: Id returned 1 exit status make.batを使った場合も同じ部分に「アクセスが拒否されました」と表示されます。 >具体的にどう操作されたのでしょうか。また、そこで何かエラーは出て >いないでしょうか。 特に変わった事をしたつもりはなかったのですが僕がした操作は、 mycalc.y mycalc.lをc/cygwin/home/user/に作成して >bison --yacc -dv mycalc.y >flex mycalc.l >gcc -o mycalc y.tab.c lex.yy.c と入力しただけです。 エラーが表示されたのは先ほど記述したインストールの最後に表示されるものだけです。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1621] Re:mycalc でエラー発生
投稿者:774RR
2010/08/20 09:54:49

特になにか妙な設定が必要であったとか、そういうことはないはずだけど。 ttp://www.cygwin.com/ から setup.exe をダウンロードしローカルに保存 保存した setup.exe を起動 国内ミラーサイトを選択の上でダウンロード+インストールを実施 cygwin bash shell を起動し cd <to/where/mycalc/is/expanded> bison -y -dv mycalc.y flex mycalc.l gcc -o mycalc y.tab.c lex.yy.c ちなみに gcc --version と入力したときになんて表示される? ウチでは gcc (GCC) 4.3.4 20090804 (release) 1 になっている。 gcc -v -o mycalc y.tab.c lex.yy.c だと何が表示される? 結構膨大な量が出るので、先の --version が同じだった場合のみ実行すればいい。 メモを取ったりすると転記ミスが怖いので gcc -v -o mycalc y.tab.c lex.yy.c 2&>hoge.txt として hoge.txt を見たほうがいい。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1620] Re:mycalc でエラー発生
投稿者:774RR
2010/08/20 08:58:30

cygwin (1.5 も 1.7 も) のデフォルトインストール時は unix 改行。 ダウンロードページの mycalc (sjis/zip) に入っているファイルは dos 改行。 ・cygwin の bash-shell 上で make.sh を使うとこの dos 改行が邪魔して動かない。 ・cygwin の bash-shell 上で make.bat を使うと cmd.exe を呼ぶので下記参照 ・アクセサリ→コマンドプロンプトの cmd.exe 上で make.bat を使うと  cygwin 1.7 の /bin/gcc や /bin/cc が (cygwin 仕様による) symlink であるため  cmd.exe が gcc/cc を認識できず、起動失敗する といういささか困ったチャン状態なので、手打ちしたほうが早いという・・・ 改行コードの違いで動かないことが発見できる人なら改行コード変換もできるだろうけど 初めてチャレンジします!って人にそれを求めるのも酷な話で。 改行を修正しても cygwin には flex しか存在しないので lex → flex に要修正。 (/bin/yacc は /bin/bison の symlink になっているのでこっちは問題ない)
[この投稿を含むスレッドを表示] [この投稿を削除]
[1619] Re:mycalc でエラー発生
投稿者:(ぱ)こと管理人
2010/08/20 03:02:05

管理人の前橋です。はじめまして。 しばらくこちらを見ていなくて、反応が遅くなりましてすみません。 さて、チャチャ丸さんが具体的に行った操作がよくわからないのですが、 >今2章のyacc/lexで電卓を作る部分で、とりあえずmycalc.yとmycalc.lを >模写して実行したのですが、 >"cc -o mycalc y.tab.c lex.yy.c"のコマンドを行うとエラーが出ます。 ということは、 >>http://kmaebashi.com/programmer/devlang/book/download.html ここ↑からダウンロードしたファイルに含まれているmake.batやmake.shを 使わず、手作業でyacc(bison?)やlex(flex?)も動かしたということでしょうか? 具体的にどう操作されたのでしょうか。また、そこで何かエラーは出て いないでしょうか。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1618] Re:mycalc でエラー発生
投稿者:チャチャ丸
2010/08/20 01:42:54

連続投稿ですいません。 インストール時のエラーを見逃していました。 (長時間のインストールのせいでボケていたのでしょうかw) インストール終了時になかったパッケージみたいなのが表示されます。 どのサイトを選んでも同じものが表示されました。 以下 Package: No package boxes.sh exit code 2 brltty.sh exit code 1 docbook-xml-simple10.sh exit code 1 docbook-xml-simple11.sh exit code 1 docbook-xml412.sh exit code 1 docbook-xml42.sh exit code 1 docbook-xml43.sh exit code 1 docbook-xml44.sh exit code 1 docbook-xml45.sh exit code 1 docbook-xsl-ns.sh exit code 1 docbook-xsl.sh exit code 1 exim.sh exit code 1 libglade2.0.sh exit code 2 mined.sh exit code 1 です。 setupの前になにか設定が必要なのでしょうか?
[この投稿を含むスレッドを表示] [この投稿を削除]
[1617] Re:mycalc でエラー発生
投稿者:チャチャ丸
2010/08/19 23:35:43

タイトルありがとうございます。 >これは多分ライブラリを正しくリンクできていないことが原因だと思われる。 >ソースコードが原因ではなくて、まず間違いなく開発環境側の原因。 >cygwin のインストールが不足しているか、操作ミスと思われる。 今日再インストールしてみたのですが同じエラーが表示されました。 今回は出来る物は一応全部インストールしました。 またバージョンは確認したところ1.7.6でした。 同じバージョンで出来ないということは、やはり環境構築にミスがあるのかもしれないです。 再度調べて検証してみます。 >チャチャ丸氏のところの cygwin のバージョンとかインストール状態が不明なので、 >今この場でこれ以上のアドバイスはできないなぁ。 とても助かりました。ありがとうございます。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1616] mycalc でエラー発生
投稿者:774RR
2010/08/18 21:44:44

タイトル変えておくね > undefined reference to `__imp__iob' > undefined reference to `__errno' これは多分ライブラリを正しくリンクできていないことが原因だと思われる。 ソースコードが原因ではなくて、まず間違いなく開発環境側の原因。 cygwin のインストールが不足しているか、操作ミスと思われる。 で、ウチの cygwin 1.7.6 だと何の問題も無くうまくコンパイル・リンクされる。 実行結果も期待通り。 チャチャ丸氏のところの cygwin のバージョンとかインストール状態が不明なので、 今この場でこれ以上のアドバイスはできないなぁ。 cygwin の再/追加インストールしてみるとか・・・ > # make.sh 中 lex → flex に修正が必要かも はとりあえず忘れていいよ。こっちを追求しだすと横道にそれていくので。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1615] Re:はじめまして
投稿者:チャチャ丸
2010/08/18 20:29:19

素早いお返事ありがとうございます。とても助かります。 >提示部はすべて警告であってエラーぢゃない(=承知の上で使う分には問題ない) >以下略の部分にあるエラー(警告でなくエラー)を見せてもらわないと判断不能。 エラーの方はよくわからなくて勝手にはしょってしまいました。すいません。 以下エラーです。 /cygdrive/c/DOCUME~1/Temp/ccxzh81W.o:y.tab.c:(.text+0x8e): undefined reference to `__imp__iob' /cygdrive/c/DOCUME~1/Temp/ccxzh81W.o:y.tab.c:(.text+0xc2): undefined reference to `__imp__iob' /cygdrive/c/DOCUME~1/Temp/ccxzh81W.o:y.tab.c:(.text+0xed): undefined reference to `__imp__iob' /cygdrive/c/DOCUME~1/Temp/ccxzh81W.o:y.tab.c:(.text+0x133): undefined reference to `__imp__iob' /cygdrive/c/DOCUME~1/Temp/ccxzh81W.o:y.tab.c:(.text+0x168): undefined reference to `__imp__iob' /cygdrive/c/DOCUME~1/Temp/ccxzh81W.o:y.tab.c:(.text+0x1af): more undefined reference to `__imp__iob' /cygdrive/c/DOCUME~1/Temp/ccrE3OK5.o:lex.yy.c:(.text+0x872): undefined reference to `__errno' /cygdrive/c/DOCUME~1/Temp/ccrE3OK5.o:lex.yy.c:(.text+0x87f): undefined reference to `__errno' /cygdrive/c/DOCUME~1/Temp/ccrE3OK5.o:lex.yy.c:(.text+0x899): undefined reference to `__errno' /cygdrive/c/DOCUME~1/Temp/ccrE3OK5.o:lex.yy.c:(.text+0x1195): undefined reference to `__errno' /cygdrive/c/DOCUME~1/Temp/ccrE3OK5.o:lex.yy.c:(.text+0x1231): undefined reference to `__errno' /cygdrive/c/DOCUME~1/Temp/ccrE3OK5.o:lex.yy.c:(.text+0x16fb): undefined reference to `__errno' collect2: Id returned 1 exit status です。 >とりあえずタイプミスとか無いかい? >http://kmaebashi.com/programmer/devlang/book/download.html >ここからダウンロードした mycalc は正しく動いたよ。 僕もタイプミスしてるのではと思ってそこからダウンロードしたものでも試したんですが同様のエラーが出てしましました。 ># make.sh 中 lex → flex に修正が必要かも とても基本的なことで申し訳ないのですがどのファイルのどのあたりの部分の事でしょうか?
[この投稿を含むスレッドを表示] [この投稿を削除]
[1614] Re:はじめまして
投稿者:774RR
2010/08/18 13:14:16

提示部はすべて警告であってエラーぢゃない(=承知の上で使う分には問題ない) 以下略の部分にあるエラー(警告でなくエラー)を見せてもらわないと判断不能。 とりあえずタイプミスとか無いかい? http://kmaebashi.com/programmer/devlang/book/download.html ここからダウンロードした mycalc は正しく動いたよ。 # make.sh 中 lex → flex に修正が必要かも
[この投稿を含むスレッドを表示] [この投稿を削除]
[1613] はじめまして
投稿者:チャチャ丸
2010/08/18 02:34:17

はじめまして。「プログラミング言語を作る」を読み初めて勉強中のチャチャ丸と申します。 まだまだ序盤なのですが質問があって投稿させてもらいました。 今2章のyacc/lexで電卓を作る部分で、とりあえずmycalc.yとmycalc.lを模写して実行したのですが、 "cc -o mycalc y.tab.c lex.yy.c"のコマンドを行うとエラーが出ます。 エラーの内容は-Wallで見たところ y.tab.c: In function 'yyparse' : y.tab.c:1270: warning: implicit declaration of function 'yylex' y.tab.c:1439: warning: implicit declaration of function 'yyerror' lex.yy.c:1120: warning: 'yyunput' defined but not used lex.yy.c:1163: warning: 'input' defined but not used (以下略) と表示されます。 y.tab.cを見てみたところ622行目から #ifdef YYLEX_PARAM # define YYLEX yylex (YYLEX_PARAM) #else # define YYLEX yylex () #endif という部分があったのでyylexは定義されているように思えるのですが、なにが原因なのでしょうか? ちなみにcygwinを利用しています。 何かお答えいただければ幸いです。よろしくお願いします。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1612] 管理者により削除されました
2010/08/12 02:08:17

広告削除…ふぅ。
[この投稿を含むスレッドを表示]
[1611] 管理者により削除されました
2010/08/08 18:24:55

テスト投稿はテスト用掲示板にお願いします。
[この投稿を含むスレッドを表示]
[1610] Re:prime.milについて
投稿者:yuya
2010/08/01 08:29:09

(ぱ)さん、お返事ありがとうございます。 ご事情、了解いたしました。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1609] Re:prime.milについて
投稿者:(ぱ)こと管理人
2010/07/31 18:19:16

>日経ソフトウエア8月号「MIL」の記事を読んでいます。 > >本編に進む前に、p18のprime.milでつまづいてしまいました。 もうしわけありません。たしかにprime.milは直感的なコードとは 言えないと思います。ふつうに考えて、そもそもループが三重である必要は ないはずですし。 prime.milがこうなってしまった事情はいろいろあるのですが、最終的には 私の責任であると思います。もうしわけありませんでした。 まあ、prime.milはMILの機能を示すためのサンプルコードなので、制御構造や 計算等の機能を使っていれば問題ない、ということで雑になってしまった面は あります。そこまで丁寧に読んでいただけるのは正直想定外でした。 ありがとうございました。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1608] Re:prime.milについて
投稿者:yuya
2010/07/30 16:56:16

774RRさん、ご意見ありがとうございます。 >ならば処理上は一見無駄に思えるような記述であっても合目的でおkだと思いますが。 ># その無駄さ自体がイイというか ># どこがどう無駄かを読者に考えてもらうのがイイというか おっしゃるとおりで、おかげで私も自分で組んでみる機会を得て勉強になりました。 >yuya さんの投稿プログラムも「素数の個数」には実用的でないですよね? ええ、あれは元のソースとほぼ同じアルゴリズムを、自分に読めるように書き直したものです。 脇道に気を取られて、本編のことに全然言及していませんが、 いつものとおり素晴らしく分かりやすい解説です。 「車輪の再発明」にもピンからキリまで、 歴然としたクォリティの違いがあるものだな、と改めて思いました。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1607] Re:prime.milについて
投稿者:774RR
2010/07/30 10:26:31

# 元ネタは読んでいません 記事(というかサンプルプログラム)の目的は、 素数の個数を求めることではなくて、その独自言語の解説なんですよね? ならば処理上は一見無駄に思えるような記述であっても合目的でおkだと思いますが。 # その無駄さ自体がイイというか # どこがどう無駄かを読者に考えてもらうのがイイというか yuya さんの投稿プログラムも「素数の個数」には実用的でないですよね?
[この投稿を含むスレッドを表示] [この投稿を削除]
[1606] prime.milについて
投稿者:yuya
2010/07/29 10:00:34

日経ソフトウエア8月号「MIL」の記事を読んでいます。 本編に進む前に、p18のprime.milでつまづいてしまいました。 かなり時間をかけて、「確かにこれで素数は求まる」ことは納得したのですが、 それでも疑問がたくさん残ります。 たとえば、c を number / 2 まで回すのなら分かりますが、 小さな number に対しても一律 HALF_OF_MAX まで回す必要があるのでしょうか? はじめ、ソースが複雑なのは言語の仕様を切り詰めているせいかと思いましたが、 自分で書いてみるとこうなりました。 MAX = 1000; number_of_prime = 0; number = 2; while(number <= MAX){ i = 2; while(i < number){ # 2 から number - 1 の範囲の整数で if(number / i * i == number){ # 割り切れたら goto *exit; # 素数ではない } i = i + 1; } print(number); number_of_prime = number_of_prime + 1; *exit number = number + 1; } print("the number of prime is"); print(number_of_prime); 書いたあとで再度p18のソースを見ると、 必要以上の複雑さがかなり含まれていると感じました。 (ぱ)さんの記事はいつも日本語が驚異的に分かりやすいので、 ソースにも同じくらいの分かりやすさを無意識に要求してしまっているのかもしれません。 読者のわがままというものですが……。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1605] Re:Diksamのmakeでエラーとなる
投稿者:(ぱ)こと管理人
2010/07/28 03:30:25

はじめまして。 >>bison --yacc -dy diksam.y >>diksam.y:428 13-14: $$ for the midrule at $2 of 'block' has no declared type >>gmake: *** [y.tab..h] Error 1 本件、おそらく正誤表の以下の件(p.206の件)だと思います。 http://kmaebashi.com/programmer/devlang/book/seigo.html#p206 当時、どのように判断したのかは正直なところあまり覚えていないのですが、 公開しているソースが修正されていないのは問題かと思います。 週末あたりをめどに確認させてください。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1604] bison2.4系列だとDiksamがコンパイル出来ないようです
投稿者:hasim
2010/07/28 01:09:03

こんばんは、hasimと申します。 言語作成に関する詳しい解説、勉強させて頂いてます。 Diksamのソースコードをコンパイルしようとしたのですが、 bisonのバージョンが2.4だとエラーが起きるようです。 bisonのバージョンを2.3に落としたら、無事コンパイル出来ました。 エラー内容は以下のようなものでした。 % bison compiler/diksam.y compiler/diksam.y:748.13-14: $$ for the midrule at $2 of `catch_clause' has no declared type compiler/diksam.y:786.13-14: $$ for the midrule at $2 of `block' has no declared type ご参考になれば幸いです。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1601] 管理者により削除されました
2010/07/05 00:20:27

テスト書き込みはテスト用掲示板にどうぞ。 http://kmaebashi.com/bbs/list.php?boardid=testbbs
[この投稿を含むスレッドを表示]
[1600] 一応できたのでソースをさらします。
投稿者:バッファロー
2010/07/01 09:57:49

助言をいただき、それをむねに一応完成したソースを書き込みます。 変なところがあれば、ぜひ助言をお願いします。 #include <stdio.h> #include <stdlib.h> #include <string.h> typedef int (*Compare)(int,int) ; typedef struct DATA DATA; struct DATA { DATA * next; char * name; int math; int language; int sum; }; #define MAX 256 int AscendinOrder(int a,int b); int DescendingOrder(int a,int b); DATA* merge_sort(DATA* top,Compare); DATA* merge_list(DATA* x, DATA* y,Compare); /**************************************** 機能:線形リストのデータをすべて解放する。 引数:top 線形リストのトップデータ comp 使用した比較関数 出力:無し ****************************************/ void AllFree(DATA *top,Compare *comp) { DATA *temp,*freeData; if(*comp == AscendinOrder || *comp == NULL){ temp = top; while(temp->next){ freeData = temp; temp =temp->next; free(freeData->name); free(freeData); } }else if(*comp == DescendingOrder){ temp = top->next; while(temp){ freeData = temp; temp =temp->next; free(freeData->name); free(freeData); } } } /**************************************** 機能:線形リストのノードを作成。 引数:無し 出力:DATA型の新しいノードのポインタ ****************************************/ DATA* newnode(){ DATA *p; p=malloc(sizeof(DATA)); p->next=NULL; return p; } /**************************************** 機能:合計点を求める 引数:data 合計点を求めるDATA型のポインタ 出力:mathとlanguageの合計点 ****************************************/ int SUM(DATA *data) { return data->math+data->language; } /**************************************** 機能:線形リストの末尾にノードを追加。 引数:p リストの先頭 c リストnameにはいる名前 lang リストのlanguageに入る数値 math リストのmathに入る数値 出力:無し ****************************************/ void add(DATA *p,char *c,int lang,int math){ while(p->next != NULL){ p= p->next; } p->math = math; p->language = lang; p->sum = SUM(p); p->name=malloc(strlen(c)+1); strcpy(p->name,c); p->next=newnode(); } /**************************************** 機能:線形リストの内容を表示。 引数:data リストの先頭 comp 使った比較関数 出力:無し ****************************************/ void ShowData(DATA *data,Compare *comp) { DATA *temp; if(*comp == AscendinOrder || *comp == NULL){ for(temp = data; temp->next;temp= temp->next){ printf("name : %s, language : %d, math : %d, sum :%d \n",temp->name,temp->language,temp->math,temp->sum); } }else if(*comp == DescendingOrder){ for(temp = data->next; temp;temp= temp->next){ printf("name : %s, language : %d, math : %d, sum :%d \n",temp->name,temp->language,temp->math,temp->sum); } } } /**************************************** 機能:表示方法の設定。 引数:無し 出力:表示方法の値。 ****************************************/ int ShowCase() { char c; printf("昇順で表示 :1 ,降順で表示:2\n"); c = getchar(); switch(c){ case '1': return 1; case '2': return 2; default: return 0; } } int main() { char data[MAX] = {'\0'}; char ctemp[100] = {'\0'}; int m,l,type; FILE *fp = fopen("data.txt","r"); char *n; DATA *top = malloc(sizeof(DATA)); Compare comp = NULL; type=ShowCase(); if(type == 1){ comp = AscendinOrder; }else if(type == 2){ comp = DescendingOrder; }else{ comp = NULL; } top->next = NULL; while(fgets(data,MAX,fp)){ if(n = strchr(data,'\n')) *n = '\0'; sscanf(data,"%s%d%d",ctemp,&m,&l); add(top,ctemp,l,m); } if(comp != NULL){ top =merge_sort(top,comp); } ShowData(top,&comp); AllFree(top,&comp); return 0; } /**************************************** 機能:線形リストのマージソートする。 引数:top リストの先頭 comp 使う比較関数 出力:ソート済みのリストのポインタ ****************************************/ DATA* merge_sort(DATA* top,Compare comp) { DATA *a, *b, *y; /* リストに含まれる要素数が0または1個のときは、ソートの必要がない */ if( top == NULL || top->next == NULL ){ return top; } a = top; /* aは先頭の要素を指す */ b = top->next; if( b != NULL ){ b = b->next; } /* bは先頭から3番目の要素を指す */ /* 線形リストを中心くらいから半分に分けるため、中心位置がどこにあるのか探る */ while( b != NULL ) { a = a->next; /* aは常に1つだけ進む */ b = b->next; if( b != NULL ){ b = b->next; } /* bは基本的に2つ進む */ } /* 線形リストを2つに分割する */ y = a->next; /* yは分割後の2つのリストのうちの、後半部分の方の先頭を指す */ a->next = NULL; /* 分割した2つのリスト */ return merge_list( merge_sort( top ,comp), merge_sort( y ,comp) ,comp); } /************************************************************************ 機能:2つの線形リストをマージする。 引数:x マージする2つの線形リストのうちの片方の先頭要素へのポインタ  y マージする2つの線形リストのうちの片方の先頭要素へのポインタ comp 比較関数 出力: マージされた線形リストの先頭要素へのポインタ *************************************************************************/ DATA* merge_list(DATA* x, DATA* y,Compare comp) { DATA z, *p; p = &z; /* xとyをマージしてzを作り上げる */ /* 分割されている2つのリストのいずれか一方が空になるまで繰り返す */ while( x != NULL && y != NULL ) { /* 2つのリストの先頭要素同士を比較する */ if( comp(x->sum , y->sum) ) { /* リストxの方の先頭要素を、マージ後のリストに連結する */ p->next = x; p = x; x = x->next; } else { /* リストyの方の先頭要素を、マージ後のリストに連結する */ p->next = y; p = y; y = y->next; } } /* 先に片方のリストが空になるので、残された方のリストの要素を、マージ後リストに連結する */ if( x == NULL ) { p->next = y; } else { p->next = x; } return z.next; } int AscendinOrder(int a,int b) { return a>=b? 1:0; } int DescendingOrder(int a,int b) { return a <= b?1:0; } data.txtの中身 jon 90 30 sum 40 50 jack 20 100 tom 35 70
[この投稿を含むスレッドを表示] [この投稿を削除]
[1599] Re:自己参照構造体のソートの方法がわかりません
投稿者:バッファロー
2010/07/01 07:40:14

>>線形リストをつくったのですが、リストに値をセットした後連結リストをソートしたい >>のですが、わかりません。どなたか教えてください。 > >だったらマージソート…と思ったのですが774RRさんに先に書かれてしまったので、 >本題からずれますが、 > >> DATA *top = malloc(sizeof(DATA)); > >最初にいきなりダミーのノードを作っていて、そのために以後、 >ループをまわすとき、p->nextを終了判定に使うことになっています。 >add()関数が微妙に楽になる以外、ここにダミーノードを置くことは >あまりメリットがないんじゃないかなあ、と私は昔から思っているのですが >(センス・オブ・プログラミングに書いたりもしましたが)どうなんでしょうねえ。 > >あとまあ、ものすごく細かいことですが、 > >>int SUM(DATA *data) >>{ >> return data->language+data->language; >>} > >ここはdata->math + data->languageですよね。 > >また、連結リストのソートは、効率を気にしないのなら単純選択ソートとかでも >できるんじゃないでしょうか。 > >・連結リストを頭からスキャンして、最大値のノードを探す。 >・最大値のノードをリストから引っぺがし、ソート済みリストの先頭につなぐ。 >・上記操作を繰り返す。 > 貴重なご意見ありがとうございました。 たしかにdata->math + data->languageでした。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1598] Re:自己参照構造体のソートの方法がわかりません
投稿者:バッファロー
2010/07/01 07:11:18

>線形リストのソートは結構めんどくさいので、できればやらずにすむのが理想。 >最初からデータをソート済みの形で保持する構造を使うほうがよい結果が出ることが多い。 >二分木構造とかを使うのが普通(実用上、赤黒木になるかな) > >でもどうしても線形リストをそのままソートしたいのであれば、 >まさにそのような目的のために考案された「マージソート」を使うといい。 >http://ja.wikipedia.org/wiki/%E3%83%9E%E3%83%BC%E3%82%B8%E3%82%BD%E3%83%BC%E3%83%88 >http://www.geocities.jp/ky_webid/algorithm/021.html > 貴重なご意見ありがとうございました。 無事ソートできました。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1597] Re:自己参照構造体のソートの方法がわかりません
投稿者:(ぱ)こと管理人
2010/07/01 01:53:45

>線形リストをつくったのですが、リストに値をセットした後連結リストをソートしたい >のですが、わかりません。どなたか教えてください。 だったらマージソート…と思ったのですが774RRさんに先に書かれてしまったので、 本題からずれますが、 > DATA *top = malloc(sizeof(DATA)); 最初にいきなりダミーのノードを作っていて、そのために以後、 ループをまわすとき、p->nextを終了判定に使うことになっています。 add()関数が微妙に楽になる以外、ここにダミーノードを置くことは あまりメリットがないんじゃないかなあ、と私は昔から思っているのですが (センス・オブ・プログラミングに書いたりもしましたが)どうなんでしょうねえ。 あとまあ、ものすごく細かいことですが、 >int SUM(DATA *data) >{ > return data->language+data->language; >} ここはdata->math + data->languageですよね。 また、連結リストのソートは、効率を気にしないのなら単純選択ソートとかでも できるんじゃないでしょうか。 ・連結リストを頭からスキャンして、最大値のノードを探す。 ・最大値のノードをリストから引っぺがし、ソート済みリストの先頭につなぐ。 ・上記操作を繰り返す。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1596] Re:自己参照構造体のソートの方法がわかりません
投稿者:774RR
2010/06/30 21:41:22

線形リストのソートは結構めんどくさいので、できればやらずにすむのが理想。 最初からデータをソート済みの形で保持する構造を使うほうがよい結果が出ることが多い。 二分木構造とかを使うのが普通(実用上、赤黒木になるかな) でもどうしても線形リストをそのままソートしたいのであれば、 まさにそのような目的のために考案された「マージソート」を使うといい。 http://ja.wikipedia.org/wiki/%E3%83%9E%E3%83%BC%E3%82%B8%E3%82%BD%E3%83%BC%E3%83%88 http://www.geocities.jp/ky_webid/algorithm/021.html
[この投稿を含むスレッドを表示] [この投稿を削除]
[1595] 自己参照構造体のソートの方法がわかりません
投稿者:バッファロー
2010/06/30 11:27:14

線形リストをつくったのですが、リストに値をセットした後連結リストをソートしたい のですが、わかりません。どなたか教えてください。 ソース(free用関数は後で作ります。): #include <stdio.h> #include <stdlib.h> #include <string.h> typedef struct DATA DATA; struct DATA { DATA * next; char * name; int math; int language; int sum; }; #define MAX 256 void listSort(DATA *top); DATA* newnode(){ DATA *p; p=malloc(sizeof(DATA)); p->next=NULL; return p; } int SUM(DATA *data) { return data->language+data->language; } void add(DATA *p,char *c,int lang,int math){ while(p->next != NULL){ p= p->next; } p->math = math; p->language = lang; p->sum = SUM(p); p->name=malloc(strlen(c)+1); strcpy(p->name,c); p->next=newnode(); } void ShowData(DATA *data) { FILE *fp = fopen("result.txt","w"); DATA *temp; for(temp = data; temp->next;temp= temp->next){ printf("name : %s, language : %d, math : %d, sum :%d \n",temp->name,temp->language,temp->math,temp->sum); } for(temp = data; temp->next;temp= temp->next){ fprintf(fp,"name : %s, language : %d, math : %d, sum :%d \n",temp->name,temp->language,temp->math,temp->sum); } fclose(fp); } int main() { char data[MAX] = {'\0'}; char ctemp[100] = {'\0'}; int m,l; FILE *fp = fopen("data.txt","r"); char *n; DATA *top = malloc(sizeof(DATA)); top->next = NULL; while(fgets(data,MAX,fp)){ if(n = strchr(data,'\n')) *n = '\0'; sscanf(data,"%s%d%d",ctemp,&m,&l); add(top,ctemp,l,m); } listSort(top); ShowData(top); return 0; } void listSort(DATA *top) { //ここのしょりがわかりません //ちなみにsumで比較 }
[この投稿を含むスレッドを表示] [この投稿を削除]
[1593] Re:spam判定テスト
投稿者:(ぱ)こと管理人
2010/06/13 13:45:23

すみません、ものすごく初歩的なバグがあって本来弾けるはずのspamが来ていました。 修正しました。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1592] Re:spam判定テスト
投稿者:(ぱ)こと管理人
2010/06/13 06:19:31

>一時的にテスト用のスクリプトを上げます。 NGワード機能を搭載し、ひととおりの動作テストをしました。 ここで高級バッグの話をしたりするとひっかかるかもしれません。 spammer以外の人には申し訳ないですがご了承ください。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1591] spam判定テスト
投稿者:(ぱ)こと管理人
2010/06/13 05:58:08

一時的にテスト用のスクリプトを上げます。 しばらくは投稿がエラーになる可能性があります。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1577] Re:IF文の判定について
投稿者:通行人B
2010/06/11 17:34:13

管理人さま >どちらについても保証されています。 根拠まで示していただき、ありがとうございました。m(_ _)m 774RRさま、yuyaさま >一方で #define TRUE 1 とかしていることが多いので >func()==TRUE はバグの元だからやらないほうがいいよ 取り急ぎ、アドバイスにお礼申し上げます。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1575] Re:業務連絡:ほげほげ認証をほげぴよ認証に変更しました
投稿者:こくぼ
2010/06/11 09:30:04

>IPアドレスがだめで、かつ、人力でやっているのなら、NGワードのような >「spamでない投稿をspam扱いしかねない」手段しかないんですかねえ。 特定のURLが含まれていたらspam扱いする、としたらちょっとはマシになるかも…?
[この投稿を含むスレッドを表示] [この投稿を削除]
[1573] Re:業務連絡:ほげほげ認証をほげぴよ認証に変更しました
投稿者:(ぱ)こと管理人
2010/06/11 03:07:48

>spamがあまりにひどいので、「ほげほげ認証」のキーワードを「ほげほげ」から >「ほげぴよ」に変更しました。投稿時にはご注意ください。 spam、来ましたねえ…… とほほ。 人力でやっているんでしょうか。やっぱり。 IPアドレスがだめで、かつ、人力でやっているのなら、NGワードのような 「spamでない投稿をspam扱いしかねない」手段しかないんですかねえ。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1572] Re:IF文の判定について
投稿者:yuya
2010/06/10 14:21:06

>ほげぴよ認証のテストを兼ねて ># ってか既に spam ってるんだけど > >C では、偽は0、真は0以外である。 >一方で #define TRUE 1 とかしていることが多いので > >func()==TRUE はバグの元だからやらないほうがいいよ 賛成。 関数が正常終了したら0を返す慣習って、けっこう頭が混乱しますよね。 「この戻り値は、『何かヘンなことが起こりましたか?』という質問に対する答えだ!」と 自分に言い聞かせて納得するようにしてました。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1571] Re:IF文の判定について
投稿者:774RR
2010/06/10 13:24:01

ほげぴよ認証のテストを兼ねて # ってか既に spam ってるんだけど C では、偽は0、真は0以外である。 一方で #define TRUE 1 とかしていることが多いので func()==TRUE はバグの元だからやらないほうがいいよ
[この投稿を含むスレッドを表示] [この投稿を削除]
[1569] 業務連絡:ほげほげ認証をほげぴよ認証に変更しました
投稿者:(ぱ)こと管理人
2010/06/10 00:52:01

spamがあまりにひどいので、「ほげほげ認証」のキーワードを「ほげほげ」から 「ほげぴよ」に変更しました。投稿時にはご注意ください。 spammerが機械的に投稿しているのなら効果があるのかも、と思っています。 IPアドレスによる制限も考えたのですが、結構ばらけているみたいで……
[この投稿を含むスレッドを表示] [この投稿を削除]
[1568] Re:IF文の判定について
投稿者:(ぱ)こと管理人
2010/06/10 00:46:38

>if((func_hoge() == 真) && (func_piyo() == 真)) // (1) > 実行文; > >if(func_hoge() == 真) > if(func_piyo() == 真) // (2) > 実行文; > >上記(1)または(2)において、func_hoge()が偽であった場合、 >func_piyo が実行されないことは文法上保証されるのでしょうか? どちらについても保証されています。 (1)は短絡演算子というやつで、JIS X 3010:2003 (ISO/IEC 9899:1999)であれば 6.1.13に以下の記述があります。 | ビット単位の2項&演算子と異なり,&&演算子は左から右への評価を保証する。 | 第1 オペランドの評価の直後を副作用完了点とする。第1オペランドの値が0と | 比較して等しい場合,第2オペランドは評価しない。 「||」も同様です(6.5.14 論理OR演算子より) | ビット単位の|演算子と異なり,||演算子は左から右への評価を保証する。 | 第1オペランドの評価の直後を副作用完了点とする。第1オペランドの値が0と | 比較して等しくない場合,第2 オペランドは評価しない。 (2)はさすがにif文の動作として自明ではないでしょうか。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1567] IF文の判定について
投稿者:通行人B
2010/06/09 10:51:43

初めまして。お邪魔します。 C言語の文法?について質問させて下さい。 if((func_hoge() == 真) && (func_piyo() == 真)) // (1) 実行文; if(func_hoge() == 真) if(func_piyo() == 真) // (2) 実行文; 上記(1)または(2)において、func_hoge()が偽であった場合、 func_piyo が実行されないことは文法上保証されるのでしょうか? ご教示をお願い致します。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1562] Re:C++って使われていますか?
投稿者:(ぱ)こと管理人
2010/06/08 00:31:16

>「使われているそうです」や、「ごくたまにC++を使う機会もあります」 >という表現から考えると、主流ではないようですね。 前回、「.NETってどこで使われているんですか?」と言われた、という話を 出したように、会社や業界により使われている言語はかなりまちまちです。 もちろんそれは私にしても同じですので、私自身が仕事で使う言語の 範囲から「主流ではない」という結論を導かれても困ります。 業界全体でのトレンドを見たければ、たとえば以下のようなページはどうでしょうか。 http://www.tiobe.com/index.php/content/paperinfo/tpci/index.html 現時点で、Java, Cに続いて3位です。昔に比べても伸びているようにも見えます。 http://d.hatena.ne.jp/takoratta/20080430/1209512678 前回リンクしたLinusの投稿にしても、「GitってなんでいまどきC++じゃないの?」 という投稿に対する反論ですから、元発言者にしてみれば、「いまどき C++があたりまえ」という感覚だったわけでしょう。 Linuxはさておき、たとえばOpenOfficeのソースはC++ですよね。 もちろん、Hiropyonさんが以下のように思われるのであれば、 >どうもプログラムオタクがひとりよがりで作った言語のような感じがします。 それはそれでひとつの見識ですし(同意する人も多いはず)、根拠を挙げた上で 主張されれば面白い話になるように思います。 >C++を使う場合というのは、今回のソフトウェア開発はC++でいこう! >とか、仕様で決められて、それでコーディングするのでしょうか? どうでしょうか。Windowsでネイティブアプリを作りたいとか、環境によって 決められてしまうことが多いように思いますが。 組み込みとかでリソースが少なくて、JavaやC#は到底使えないけれど、 Cじゃあんまりだよね、とか。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1561] Re:C++って使われていますか?
投稿者:Hiropyon
2010/06/07 18:31:46

管理人様、忙しい中ご回答頂きありがとうございます。 「使われているそうです」や、「ごくたまにC++を使う機会もあります」 という表現から考えると、主流ではないようですね。 C++を使う場合というのは、今回のソフトウェア開発はC++でいこう! とか、仕様で決められて、それでコーディングするのでしょうか? >Hiropyonさん、はじめまして。 > >>単純に思うのですが、実際の現場でC++は使われているのでしょうか? > >これについては774RRさんから回答がついていますが、場所によっては >使われているそうです。私自身も、7~8年くらい前には仕事で使っていました。 >最近は.NETがメインなのですが、ごくたまにC++を使う機会もあります。 > >つい最近、某JavaのMLで、「.NETってどこで使われているんですか?」という話題が出て >「この5年くらいC#ばっかりですが何か?」というようなレスを返したのを >思い出しました…… > >>現にLinuxのプログラムやカーネルソース等もC言語で記述されていて >>だれもC++を使っていないようです。 > >Linuxに関して言えば、Linusさんがこういう人だという理由もあるんでしょう。 > >http://tabesugi.net/memo/2009/1a.html#152154
[この投稿を含むスレッドを表示] [この投稿を削除]
[1555] Re:C++って使われていますか?
投稿者:(ぱ)こと管理人
2010/06/06 21:55:36

Hiropyonさん、はじめまして。 >単純に思うのですが、実際の現場でC++は使われているのでしょうか? これについては774RRさんから回答がついていますが、場所によっては 使われているそうです。私自身も、7~8年くらい前には仕事で使っていました。 最近は.NETがメインなのですが、ごくたまにC++を使う機会もあります。 つい最近、某JavaのMLで、「.NETってどこで使われているんですか?」という話題が出て 「この5年くらいC#ばっかりですが何か?」というようなレスを返したのを 思い出しました…… >現にLinuxのプログラムやカーネルソース等もC言語で記述されていて >だれもC++を使っていないようです。 Linuxに関して言えば、Linusさんがこういう人だという理由もあるんでしょう。 http://tabesugi.net/memo/2009/1a.html#152154
[この投稿を含むスレッドを表示] [この投稿を削除]
[1554] Re:各モジュールについて
投稿者:(ぱ)こと管理人
2010/06/06 21:49:46

HiroakiSoftwareさん、はじめまして。 >メモリ管理モジュール(MEM) >デバッグライト用モジュール(DBG) > >についてなのですが、オリジナルの言語で使用して >作った言語を配布しても問題ないでしょうか? >また、使用にあたって条件等はありますでしょうか? まったく問題ありません。単純なモジュールですが、あんなものでよろしければ いくらでもご利用ください。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1553] 各モジュールについて
投稿者:HiroakiSoftware
2010/06/06 21:09:39

前橋様 はじめまして、HiroakiSoftware(※個人のハンドルネームです)と申します。 メモリ管理モジュール(MEM) デバッグライト用モジュール(DBG) についてなのですが、オリジナルの言語で使用して 作った言語を配布しても問題ないでしょうか? また、使用にあたって条件等はありますでしょうか? これは著作権侵害等のトラブルを防止するために、 確認の意味で本投稿(質問)をさせていただきました。よろしくお願いいたします。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1552] Re:C++って使われていますか?
投稿者:774RR
2010/06/06 07:25:03

Windows の MFC や ATL は C++ Ruby on Rails の passenger は C++ ウチではワンチップマイコンの組み込みにも使っている。 自分の狭い視野だけで判断してない?
[この投稿を含むスレッドを表示] [この投稿を削除]
[1551] C++って使われていますか?
投稿者:Hiropyon
2010/06/06 00:21:19

前橋 様、このサイトのオブジェクト指向の意見について読ませていただきました。 単純に思うのですが、実際の現場でC++は使われているのでしょうか? どうもプログラムオタクがひとりよがりで作った言語のような感じがします。 現にLinuxのプログラムやカーネルソース等もC言語で記述されていて だれもC++を使っていないようです。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1550] 管理者により削除されました
2010/06/06 17:17:20

[この投稿を含むスレッドを表示]
[1549] 管理者により削除されました
2010/06/06 17:17:13

[この投稿を含むスレッドを表示]
[1548] 管理者により削除されました
2010/06/06 17:17:05

[この投稿を含むスレッドを表示]
[1547] 管理者により削除されました
2010/06/06 17:16:38

[この投稿を含むスレッドを表示]
[1546] 管理者により削除されました
2010/06/06 17:15:11

[この投稿を含むスレッドを表示]
[1545] 管理者により削除されました
2010/06/06 17:14:52

[この投稿を含むスレッドを表示]
[1544] 管理者により削除されました
2010/06/06 17:14:41

[この投稿を含むスレッドを表示]
[1543] 管理者により削除されました
2010/06/04 02:53:40

[この投稿を含むスレッドを表示]
[1542] 管理者により削除されました
2010/06/04 02:53:31

[この投稿を含むスレッドを表示]
[1541] 管理者により削除されました
2010/06/04 02:53:22

[この投稿を含むスレッドを表示]
[1540] 管理者により削除されました
2010/06/04 02:53:13

[この投稿を含むスレッドを表示]
[1539] 管理者により削除されました
2010/06/04 02:52:59

[この投稿を含むスレッドを表示]
[1538] 管理者により削除されました
2010/06/04 02:52:46

[この投稿を含むスレッドを表示]
[1537] 管理者により削除されました
2010/06/04 02:52:26

[この投稿を含むスレッドを表示]
[1536] 管理者により削除されました
2010/06/02 03:58:07

spamの履歴、しばし保存しておこう。
[この投稿を含むスレッドを表示]
[1535] 管理者により削除されました
2010/06/01 02:10:16

アクセスログを見ると、どうもいきなり投稿画面に行くのではなく、一度一覧を見ているっぽい(なのでリファラでは弾けない)。しかも一覧画面でしばらく(15秒くらい)滞留している。なんだろこれ。
[この投稿を含むスレッドを表示]
[1533] 管理者により削除されました
2010/06/01 02:06:56

最近テスト掲示板だけでなくこちらの掲示板にもかなりspamが来るようになって、いい加減うざいので対策を検討中。 ちょっと見てみるとIPアドレスは中国っぽいのでそれで弾きますかねえ。
[この投稿を含むスレッドを表示]
[1532] Re:ホームページのリンクについて
投稿者:管理人
2010/05/09 17:07:12

>さて、本題ですが、 >C言語ヨタ話 >その3「モジュールと命名とヘッダファイルと」のページのリンクが死んでいるようです。 報告ありがとうございます。どうもHTMLがPHPとして解釈されているようです。 今は出先なのですが、早めに対処いたします。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1530] ホームページのリンクについて
投稿者:ぬるぽの使い
2010/05/07 10:52:51

こんにちは。 オブジェクト指向再入門のページを見ました。とてもわかりやすかったです。 さて、本題ですが、 C言語ヨタ話 その3「モジュールと命名とヘッダファイルと」のページのリンクが死んでいるようです。 では。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1529] Re:質問
投稿者:(ぱ)こと管理人
2010/05/03 23:08:32

>過去に投稿をされている 山 さん >のプログラムのソースコードは、 >どこで手に入るのですか? 山さんは私個人宛でソースを送ってくださいましたが、一般公開しているかどうかは私は知りません。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1528] 質問
投稿者:test
2010/05/02 19:59:11

過去に投稿をされている 山 さん のプログラムのソースコードは、 どこで手に入るのですか?
[この投稿を含むスレッドを表示] [この投稿を削除]
[1522] Re:PHPとMySQLで掲示板を作る
投稿者:HN
2010/04/22 22:14:21

>>PHPとMySQLで掲示板を作るの掲示板のプログラムを圧縮して配布していただけませんか? >>あと、パーミッションの設定も教えていただけませんか? > >そういう要望があり得るとは当初より思っていましたが、そのつもりはありません。 >あのページではあくまで作り方の解説をしているだけであり、掲示板のプログラム >そのものをリリースしようとは考えていないためです。 >すぐにインストールできるようなパッケージとして配布すると、インストールできない >等の質問が来る可能性がありますし、そのサポートをする気もないからです。 >プログラムの作り方に関する質問やクレームであれば受け付けます。そういう情報を >共有することは価値があると思えるからです。 > >あしからずご了承ください。 > >あとまあ正直なところ、あのプログラムはPHP4として書いたものですし(5でも >動いてますが)、記事中で言い訳してますがサニタイズ言うなポリシー的にも >よろしくないものですので。 > そうでしたか。 わかりました。 わざわざ返答していただきありがとうございます。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1521] Re:PHPとMySQLで掲示板を作る
投稿者:(ぱ)こと管理人
2010/03/26 02:28:55

>PHPとMySQLで掲示板を作るの掲示板のプログラムを圧縮して配布していただけませんか? >あと、パーミッションの設定も教えていただけませんか? そういう要望があり得るとは当初より思っていましたが、そのつもりはありません。 あのページではあくまで作り方の解説をしているだけであり、掲示板のプログラム そのものをリリースしようとは考えていないためです。 すぐにインストールできるようなパッケージとして配布すると、インストールできない 等の質問が来る可能性がありますし、そのサポートをする気もないからです。 プログラムの作り方に関する質問やクレームであれば受け付けます。そういう情報を 共有することは価値があると思えるからです。 あしからずご了承ください。 あとまあ正直なところ、あのプログラムはPHP4として書いたものですし(5でも 動いてますが)、記事中で言い訳してますがサニタイズ言うなポリシー的にも よろしくないものですので。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1519] Re:疑り深いあなたのためのオブジェクト指向再入門
投稿者:(ぱ)こと管理人
2010/03/16 02:08:48

>C言語出身の私としては「オブジェクト指向」で言うところのウリ(カプセル化や再利用性など)が、C言語でやってきたこととどこが違うのか!と反発することが理解できない原因だと思ってきましたが、このサイトでは「反発して当然」のように書かれており、かつ説明が非常に具体的でよく理解できました。 ありがとうございます。 >「オブジェクト指向も裏を返せばただの・・・」と思えただけで今後は前回と違った理解ができそうな気がしています。 >再チャレンジするきっかけを与えて頂いてありまとうございました。 孫悟空さんは再チャレンジ中ですので誤解はないと思うのですけれど、 一応補足しますと、私はオブジェクト指向について「役に立たない」とか 「くだらない」と思っているわけではありません。 # 仕事では、あまり使わないケースはあるかもしれないと思っていますが。 http://d.hatena.ne.jp/kmaebashi/20090427/p1 (継承の乱用とかしないで)ちゃんと使えば強力な概念だと思いますので 再チャレンジが成功することをお祈りしております。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1518] Re:lexicalanalyzer.c について
投稿者:(ぱ)こと管理人
2010/03/16 00:48:08

>「入力が char_buf のサイズ(1024)を超えていて fgets がナル文字を付けた場合」 >を想定しておりましたです。 「1024文字もあるんだから普通はオーバーしません!」 とか言い切ってしまうとそれはそれで問題ありかとは思うのですが。 実際、こういう意見↓もあるのですが、 http://www.kijineko.co.jp/tech/superstitions/gets-can-be-replaced-with-fgets-simply.html この程度の用途のプログラムでどこまで想定するかは難しいところだと思います。 私の場合、たとえばポインタ完全制覇のp.79でも 「自分で使う程度のプログラムだったらまず大丈夫でしょう」 とかいって逃げてしまっています。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1517] 疑り深いあなたのためのオブジェクト指向再入門
投稿者:悟空
2010/03/15 18:04:23

こんにちは。 かなり以前にオブジェクト指向に挫折したものです。 私の「オブジェクト指向」への反発は、このサイトに書かれている事、一つ一つに該当し全文を読み終えてしまいました。 目からうろこです!大変感謝しております!! C言語出身の私としては「オブジェクト指向」で言うところのウリ(カプセル化や再利用性など)が、C言語でやってきたこととどこが違うのか!と反発することが理解できない原因だと思ってきましたが、このサイトでは「反発して当然」のように書かれており、かつ説明が非常に具体的でよく理解できました。 「オブジェクト指向も裏を返せばただの・・・」と思えただけで今後は前回と違った理解ができそうな気がしています。 再チャレンジするきっかけを与えて頂いてありまとうございました。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1516] Re:lexicalanalyzer.c について
投稿者:yuya
2010/03/15 05:27:03

さっそく正誤表で対応して頂き、ありがとうございます。 >改行なしの行を食わせるためにはファイルからリダイレクト等しなければならないので うぐぅ、私は単純に 「入力が char_buf のサイズ(1024)を超えていて fgets がナル文字を付けた場合」 を想定しておりましたです。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1515] Re:lexicalanalyzer.c について
投稿者:yuya
2010/03/14 22:22:06

ああそうか、レクサの問題というより、 テストドライバをそんなに厳密に書いていないというだけの話ですね。 ありがとうございました。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1514] Re:lexicalanalyzer.c について
投稿者:(ぱ)こと管理人
2010/03/14 21:49:17

>となっています。'\0'に出会ったら BAD_TOKEN として処理するという意図だと思いますが、 >現状だと'\0'が現れた時点でwhileを抜けてしまうので、 >st_line_pos がインクリメントされないまま再び get_token() が呼ばれてしまい、 >実行時に無限ループに陥ります。 BAD_TOKENが返ってきているのにまたget_token()を呼ぶほうが変なんじゃ、と 思って本に掲載されているソースのテストドライバを確認したのですが、 END_OF_LINE_TOKENのチェックはしていてもBAD_TOKENのチェックをしていないので、 たとえば改行で終わらないファイルをリダイレクトで食わせたときに、 確かに無限ループになりますね。 電卓のパーサと組み合わせる限りではそんなにおかしなことにはならないような 気もします。 バグかというと微妙ではないかと思いますが、補足を入れておきます。 ># ただいま「プログラミング言語を作る」を骨の髄までしゃぶる勢いで読んでます。 ># 面白すぎて睡眠不足(笑)。 ありがとうございます。また何かあればご指摘ください。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1513] lexicalanalyzer.c について
投稿者:yuya
2010/03/13 09:10:00

「プログラミング言語を作る」p.59の、 lexicalanalyzer.c の23~24行からの構造を見ると、 token->kind = BAD_TOKEN; while(st_line[st_line_pos] != '\0'){ /* メインの処理 */ } となっています。'\0'に出会ったら BAD_TOKEN として処理するという意図だと思いますが、 現状だと'\0'が現れた時点でwhileを抜けてしまうので、 st_line_pos がインクリメントされないまま再び get_token() が呼ばれてしまい、 実行時に無限ループに陥ります。 一度ご確認ください。 # ただいま「プログラミング言語を作る」を骨の髄までしゃぶる勢いで読んでます。 # 面白すぎて睡眠不足(笑)。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1512] Re:「1回以上の繰り返し」の定義
投稿者:yuya
2010/03/10 14:48:02

ご回答ありがとうございます。 >-が降ってきた時点でそれまでの分をreduceしないと左結合にならないわけですが、 >現状、ここでshift/reduce conflictが起きており、shiftが優先されるため >結合規則が逆順になっています。 なるほどー、よく分かりました。もし右結合を明示したければ expression /* 「式」とは… */ : primary_expression /* 「一次式」、 */ | primary_expression ADD expression /* または、「一次式」 + 「式」 */ と書くべきなわけですね。 そもそも件名に「『一回以上の繰り返し』の定義」なんて書いちゃいましたが、 ただ単にそう定義するだけならレクサのレベルの話であって、 階層的な解析木を築くための構文規則を定めるのがパーサの役割だから、 結合規則によって規則の書き方が変わって当然なのですね。 結果的には誤植(?)がきっかけで非常に勉強になりました。引き続き読み進めていきます。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1511] Re:「1回以上の繰り返し」の定義
投稿者:(ぱ)こと管理人
2010/03/10 03:09:06

>expression /* 「式」とは… */ > : primary_expression /* 「一次式」、 */ > | expression ADD expression /* または、「式」 + 「式」 */ > (以下略) >だと、 >yacc: 4 shift/reduce conflicts. >となりますね。 申しわけありません。これはやはり間違いと判断すべきだと思います。 >どうしてそうなるのかは、まだ自分で説明できません……。 1 - 2 - 3 - 4 - 5 のような式のとき、 -が降ってきた時点でそれまでの分をreduceしないと左結合にならないわけですが、 現状、ここでshift/reduce conflictが起きており、shiftが優先されるため 結合規則が逆順になっています。 この構文規則は、優先順位を気にしなくてよいのなら…という文脈で出てきていた はずですし、その趣旨は構文規則を簡単にしたかったためなのですが、 結合規則まで気にしないとは書いてないですし、警告が出るのはそれ自体まずいですね。 数日中にWeb上で補足を入れます。ご指摘ありがとうございました。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1510] Re:「1回以上の繰り返し」の定義
投稿者:yuya
2010/03/09 10:18:47

人に聞く前に、実験してみるべきでした。 expression /* 「式」とは… */ : primary_expression /* 「一次式」、 */ | expression ADD expression /* または、「式」 + 「式」 */ (以下略) だと、 yacc: 4 shift/reduce conflicts. となりますね。 どうしてそうなるのかは、まだ自分で説明できません……。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1509] 「1回以上の繰り返し」の定義
投稿者:yuya
2010/03/08 09:19:49

「プログラミング言語を作る」p43~p44にかけてのソースに、 expression /* 「式」とは… */ : primary_expression /* 「一次式」、 */ | expression ADD expression /* または、「式」 + 「式」 */ (以下略) とあるのを見て、はたと疑問に思いました。 これって、 expression /* 「式」とは… */ : primary_expression /* 「一次式」、 */ | expression ADD primary_expression /* または、「式」 + 「一次式」 */ (以下略) としなくてもよいのでしょうか? 他のソースではそうなっているので、反射的に「あっ、間違いだ!」と思ってしまったのですが、 よく考えると、これでもいいような気がします。 一般に、「hoge は piyo の1回以上の繰り返しである」という定義を、 hoge : piyo | hoge piyo と書かずに hoge : piyo | hoge hoge と書いてはいけない理由って、何かありますでしょうか?
[この投稿を含むスレッドを表示] [この投稿を削除]
[1508] 管理者により削除されました
2010/02/23 18:57:42

>前橋さん >ふさわしくなければ削除を 名指しでこんなこと書いてくるふざけたspammerは 初めて見た。
[この投稿を含むスレッドを表示]
[1507] Re:疑りぶかいあなたのための・・・
投稿者:たいやき
2010/02/22 11:06:30

こんにちは。 どうもありがとうございます。 私はSEですが、ゲームが嫌いで一切ゲームをしませんので、どういう想定で 書かれているのか理解できませでした。 このサイトは7年程前から知っていたのですが、7年来の疑問がやっと晴れました。 ありがとうございました。 >そうです。 >ネットワーク対戦オセロのサーバを立てるなら、そりゃ複数の対戦を同時に >行えるようにするでしょ、と思ってこう書いているのですが、確かにここで >引っ掛かりを覚える方もいらっしゃるかもしれませんね。 >ちょっと表現を考えてみます。 >
[この投稿を含むスレッドを表示] [この投稿を削除]
[1506] Re:疑りぶかいあなたのための・・・
投稿者:(ぱ)こと管理人
2010/02/20 01:33:50

こんにちは。 >この例は、ネットワーク対戦=複数の対戦が同時に行われる という意味で >書かれていると理解すればよいのでしょうか。 そうです。 ネットワーク対戦オセロのサーバを立てるなら、そりゃ複数の対戦を同時に 行えるようにするでしょ、と思ってこう書いているのですが、確かにここで 引っ掛かりを覚える方もいらっしゃるかもしれませんね。 ちょっと表現を考えてみます。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1505] 疑りぶかいあなたのための・・・
投稿者:たいやき
2010/02/18 11:12:49

「疑りぶかいあなたのためのオブジェクト指向再入門」を読ませていただきました。 そこで、疑問に思ったのが、ネットワーク対戦でオセロをする話なのですが、 どうして、ネットワーク対戦になると「複数のオセロの盤面を管理しなければならない」のかです。 ネットワーク対戦であっても、常にAさんとBさんというような一組だけが対戦する のであれば、オセロ盤は一つ管理すればいいだけですよね。 AさんとBさん、CさんとDさん、EさんとFさんというように複数の対戦が 同時期に行われる場合に、初めて複数管理する必要があると思いますが。 この例は、ネットワーク対戦=複数の対戦が同時に行われる という意味で 書かれていると理解すればよいのでしょうか。 よろしくお願いします。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1504] Re:「プログラミング言語を作る」のURL
投稿者:(ぱ)こと管理人
2010/02/17 00:41:47

>> 本に掲載したURLにリダイレクトを置くことで対処いたしました。 >と書かれていますが、エラーページが表示されているようです。 まさかと思って試してみたところその通りでした。 どうやら、リダイレクトのページをhttp://kmaebashi.com/devlang/ 直下(bookの 下でなく)に置き、置いたときの動作テストもそこを確認してしまったようです。 さきほど修正いたしました。 ここに書いても仕方がないのかもしれませんが、辿りつけなかった方には 重ね重ね申しわけありませんでした。お詫び申し上げます。 通りすがり様、情報ありがとうございました。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1502] 「プログラミング言語を作る」のURL
投稿者:通りすがり
2010/02/16 08:14:14

こんにちは。 > 本に掲載したURLにリダイレクトを置くことで対処いたしました。 と書かれていますが、エラーページが表示されているようです。 私はドメイン名からトップに飛び無事に辿り着けましたが…
[この投稿を含むスレッドを表示] [この投稿を削除]
[1501] Re:DIKSAM_book_0_4のMac/Winでの実行結果について(その2)
投稿者:(ぱ)こと管理人
2010/02/14 00:08:06

青餓鬼さん、yuyaさん、ありがとうございます。 管理人が放置してしまいましてすみません。 この結論を関連ページに追記しました。ありがとうございました。 >とりあえず、Macの人に対しては >「とりあえずUTF-8版を試してください。 >駄目なら export LANG=ja_JP.UTF-8 としてからUTF-8版を再度試してください。」 >って指針で、多くの人に使ってもらえそうですね。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1500] Re:DIKSAM_book_0_4のMac/Winでの実行結果について(その2)
投稿者:yuya
2010/02/11 22:20:01

青餓鬼さん、試していただいてありがとうございます。 とりあえず、Macの人に対しては 「とりあえずUTF-8版を試してください。 駄目なら export LANG=ja_JP.UTF-8 としてからUTF-8版を再度試してください。」 って指針で、多くの人に使ってもらえそうですね。 私のほうも、ここらで追究を一段落させていただきます。 ありがとうございました。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1499] Re:DIKSAM_book_0_4のMac/Winでの実行結果について(その2)
投稿者:青餓鬼
2010/02/11 16:04:04

>(1)10.5のほうはUTF-8版Diksamが無修正で動いた、と理解してよいのでしょうか? Mac OSX 10.5の方はコマンドの追加もなく、ちゃんと動きました。 >(2)10.4でLANGが設定されていないとなると、LC_ALLが設定されているのでしょうかね。 >差し支えなければ echo $LC_ALL も試してみてください。 echo $LC_ALL の実行結果は、Mac OSXの10.4、10.5共に(空文)でした。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1496] Re:DIKSAM_book_0_4のMac/Winでの実行結果について(その2)
投稿者:yuya
2010/02/03 18:05:11

>私のPPCMac G5には、Mac OS X 10.4と10.5の二つのバージョンをインストールして使い分けていますが、10.4の方で実行した echo $LANGの結果は(空文)でした。 >ついでに覗いた10.5のほうは ja_JP.UTF-8 でした。 返信ありがとうございます。 (1)10.5のほうはUTF-8版Diksamが無修正で動いた、と理解してよいのでしょうか? (2)10.4でLANGが設定されていないとなると、LC_ALLが設定されているのでしょうかね。 差し支えなければ echo $LC_ALL も試してみてください。 MacOS X のことは全然分かんないや……。FreeBSDベースらしいということと、 http://homepage3.nifty.com/toshi3/osx2t.html の最後に >Mac OS Xではファイル名はUTF-8、Unixに由来する部分では日本語EUC、 >従来のMac OSに由来する部分ではShift-JISと、複数の文字コードが混 >在して使用されている。 と書かれていて、とにかく複雑なことになってる、ってことは分かりました。 あと、Unicode正規化の方式も違うようで、 http://labs.unoh.net/2007/09/unicode-on-mac.html 手元で実験できない私としては混沌とするばかりです。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1495] Re:DIKSAM_book_0_4のMac/Winでの実行結果について(その2)
投稿者:青餓鬼
2010/01/31 16:05:29

>export LANG=ja_JP.UTF-8 > >で正常動作するということは、もとのLANGはUTFじゃなかったということですね。 >ちなみに、上のコマンドを実行する前の echo $LANG の結果は何だったのでしょうか? 私のPPCMac G5には、Mac OS X 10.4と10.5の二つのバージョンをインストールして使い分けていますが、10.4の方で実行した echo $LANGの結果は(空文)でした。 ついでに覗いた10.5のほうは ja_JP.UTF-8 でした。 環境変数LANGに何も指定されてなくても日本語が表示されるところを見ると別の環境変数があるのでしょうが、それについての解説は見つけることはできていません。 以上
[この投稿を含むスレッドを表示] [この投稿を削除]
[1494] Re:DIKSAM_book_0_4のMac/Winでの実行結果について(その2)
投稿者:yuya
2010/01/24 17:04:03

export LANG=ja_JP.UTF-8 で正常動作するということは、もとのLANGはUTFじゃなかったということですね。 ちなみに、上のコマンドを実行する前の echo $LANG の結果は何だったのでしょうか?
[この投稿を含むスレッドを表示] [この投稿を削除]
[1493] Re:DIKSAM_book_0_4のMac/Winでの実行結果について(その2)
投稿者:青餓鬼
2010/01/23 15:03:36

Macで実行する際、UTF-8の場合exportコマンドで環境変数を指定すると、正常に実行することがわかりました。 >export LANG=ja_JP.UTF-8 このコマンドを実行した後に DIKSAM を実行すると、サンプルと同じ結果を得ることができます。 Macの技術解説書にこのあたりを体系的に記述したものが見あたらず、たまたま読んだコマンドリファレンスの、別のコマンドの実行例に、上に掲げた一文があり、早速実行すると、エラーなく実行できました。 なお、EUCの場合は、ターミナル上の日本語表示が文字化けしますので、別の環境変数があるのかもしれません。これ以上、深入りは当面控えておきます。 以上
[この投稿を含むスレッドを表示] [この投稿を削除]
[1492] Re:ホームページと本との違いについて
投稿者:ぽむじぃさん
2010/01/19 10:32:35

>HEAP_THRESHOLD_SIZEが小さいと、頻繁にGCが走って遅くなるのはわかるのですが、 >死んでしまうのはおかしいと思うのですが…… >念のため当方でcrowbar_book_ver.0.2において、HEAP_THRESHOLD_SIZEを元に戻した >上で2000*2000*2の多次元配列を確保したところ、時間はかなりかかったようですが >死にはしませんでした。(Windows Vista環境) > 私もcrowbarcer_ver.0.2をターミナルで実行したところ時間はすごく掛かりましたが正常に終了しました.申し訳ないです.こちらも確認すべきでした. 私が開発環境はMacのXcodeです.GUIにcrowbarを組み込んでいます.ちなみにOS Xの10.6です. どこか実装にミスがあるのかもしれませんね^^;要素が大きくなるときだけGC_mark()で止まってるようなのですが難しいですね.本当にお手数かけました.
[この投稿を含むスレッドを表示] [この投稿を削除]
[1491] Re:ホームページと本との違いについて
投稿者:(ぱ)こと管理人
2010/01/19 03:08:15

>尚,私の環境では200*200*200では4秒ほどなのですが2000*2000*2の多次元配列を利用した場合EXC_BAD_ACCESSで止まってしまいデバッガが起動していました. >実際にHEAP_THRESHOLD_SIZEを変更したところ多少時間はかかるものの正常に実行されました. HEAP_THRESHOLD_SIZEが小さいと、頻繁にGCが走って遅くなるのはわかるのですが、 死んでしまうのはおかしいと思うのですが…… 念のため当方でcrowbar_book_ver.0.2において、HEAP_THRESHOLD_SIZEを元に戻した 上で2000*2000*2の多次元配列を確保したところ、時間はかなりかかったようですが 死にはしませんでした。(Windows Vista環境)
[この投稿を含むスレッドを表示] [この投稿を削除]
[1490] Re:ホームページと本との違いについて
投稿者:ぽむじぃさん
2010/01/17 18:24:47

>>サイトの説明:http://kmaebashi.com/programmer/devlang/array.htmlでは下記のコードが追加されています. >>#GCされないようにおまじない >>CRB_push_value(inter, &ret); >> >>CRB_pop_value(inter); > >これは、ネイティブ関数内で確保したオブジェクトがGCされないように >スタックに積んでいるわけですが、この方法は、ネイティブ関数を書く人に >(面倒くさいという意味で)負担をかけますので、 >Webページ版においても以下のページで方法を変更しています。 > >http://kmaebashi.com/programmer/devlang/crowbar_0_4_02.html > >前者の方法が後者の方法に比べて優れているところは特にないと思いますので、 >本の方では、最初から後者の方法で実装しているわけです。 >本では、後者の方法について、171ページで説明しています。 > >>私の実行環境ではnew_array()関数でたまに(要素数が大きくなると)gc_mark()の >>ところで止まってしまいます.私の実装ミスか,その部分のコードが足りない >>せいなのか分からないので質問させていただきました. > >crowbarのGCは単純なstop the world式のmark sweep GCなので、オブジェクト数が >増えてくるとmarkに時間がかかります。1次元の配列なら、多少数が多くても >オブジェクト数はひとつだからよいのですが、多次元ですと、現状の実装では >確保の途中で(無駄に)GCが動くのでかなり遅くなることがあります。new_array()の >中で不要なオブジェクトが増えることはないので、この間GCの発生を抑止する >方がよいのでしょうが、現状ではそうなっていません。 >ひとまずこちらでは、100×100×100の配列程度であればすぐに返りましたが、 >200×200×200だと30秒近く待たされました。 > >簡単にチューニングするには、crowbar.hのHEAP_THRESHOLD_SIZEを増やすという >方法があります。これは、どれだけのサイズのオブジェクトを確保したらGCを >動かすかという閾値で、現状では256KBになっています。 > 早速の返信ありがとうございます. 私はver0.2を参考にしていたのでそれ以降を見ていませんでした.申し訳ありません.最後まで読んで質問するべきでした. >>多次元ですと、現状の実装では確保の途中で(無駄に)GCが動くのでかなり遅くなることがあります なるほど納得しました.実装ミスというわけではないのですね.安心しました. 尚,私の環境では200*200*200では4秒ほどなのですが2000*2000*2の多次元配列を利用した場合EXC_BAD_ACCESSで止まってしまいデバッガが起動していました. 実際にHEAP_THRESHOLD_SIZEを変更したところ多少時間はかかるものの正常に実行されました. どうしても多次元で要素数が多い場合にも対応する必要があるため本当に助かりました. 有り難うございます.
[この投稿を含むスレッドを表示] [この投稿を削除]
[1489] Re:ホームページと本との違いについて
投稿者:(ぱ)こと管理人
2010/01/17 16:03:31

>サイトの説明:http://kmaebashi.com/programmer/devlang/array.htmlでは下記のコードが追加されています. >#GCされないようにおまじない >CRB_push_value(inter, &ret); > >CRB_pop_value(inter); これは、ネイティブ関数内で確保したオブジェクトがGCされないように スタックに積んでいるわけですが、この方法は、ネイティブ関数を書く人に (面倒くさいという意味で)負担をかけますので、 Webページ版においても以下のページで方法を変更しています。 http://kmaebashi.com/programmer/devlang/crowbar_0_4_02.html 前者の方法が後者の方法に比べて優れているところは特にないと思いますので、 本の方では、最初から後者の方法で実装しているわけです。 本では、後者の方法について、171ページで説明しています。 >私の実行環境ではnew_array()関数でたまに(要素数が大きくなると)gc_mark()の >ところで止まってしまいます.私の実装ミスか,その部分のコードが足りない >せいなのか分からないので質問させていただきました. crowbarのGCは単純なstop the world式のmark sweep GCなので、オブジェクト数が 増えてくるとmarkに時間がかかります。1次元の配列なら、多少数が多くても オブジェクト数はひとつだからよいのですが、多次元ですと、現状の実装では 確保の途中で(無駄に)GCが動くのでかなり遅くなることがあります。new_array()の 中で不要なオブジェクトが増えることはないので、この間GCの発生を抑止する 方がよいのでしょうが、現状ではそうなっていません。 ひとまずこちらでは、100×100×100の配列程度であればすぐに返りましたが、 200×200×200だと30秒近く待たされました。 簡単にチューニングするには、crowbar.hのHEAP_THRESHOLD_SIZEを増やすという 方法があります。これは、どれだけのサイズのオブジェクトを確保したらGCを 動かすかという閾値で、現状では256KBになっています。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1488] ホームページと本との違いについて
投稿者:ぽむじぃさん
2010/01/17 05:13:07

配列の確保、およびネイティブ関数の書き方についての質問です サイトの説明:http://kmaebashi.com/programmer/devlang/array.htmlでは下記のコードが追加されています. #GCされないようにおまじない CRB_push_value(inter, &ret); CRB_pop_value(inter); ところがこのコードの部分は本書及び,サンプルソースでも書かれていませんでした. これは必要ないということでしょうか? またそのような関数名はないようなのですが,eval.cのpush_value(),pop_value()のことでしょうか? 私の実行環境ではnew_array()関数でたまに(要素数が大きくなると)gc_mark()のところで止まってしまいます.私の実装ミスか,その部分のコードが足りないせいなのか分からないので質問させていただきました.
[この投稿を含むスレッドを表示] [この投稿を削除]
[1487] Re:質問
投稿者:(ぱ)こと管理人
2010/01/15 08:18:32

>crowbarのfor文どのように実装されているのですか。 >本を何回も読みましたが見逃してしまっているかもしれませんので、本にあるならば、ページ番号を教えてください。 p.115でwhileの実装についてコード込みで説明しています。 p.115には、「ここから呼び出される関数を全部見ていくのは紙面の無駄ですので、 ここでは代表としてwhile文で呼び出されるexecute_while_statement()を取り上げ ます。」と書いてあります。 紙面節約のため代表としてwhileを取り上げているわけですから、forについての 直接の説明はありません。whileを参考にソースを読めばわかるという意図で 省略しているわけです。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1486] 質問
投稿者:高校生
2010/01/14 13:45:57

crowbarのfor文どのように実装されているのですか。 本を何回も読みましたが見逃してしまっているかもしれませんので、本にあるならば、ページ番号を教えてください。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1484] Re:質問
投稿者:(ぱ)こと管理人
2009/12/23 21:19:00

>create.oなどOファイルがありますが、これには機械語とリンク処理に必要な情報が含まれている、と考えていいのですか。 何を知りたいのかわかりませんが、その通りです。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1483] 質問
投稿者:高校生
2009/12/21 11:55:46

create.oなどOファイルがありますが、これには機械語とリンク処理に必要な情報が含まれている、と考えていいのですか。Oファイルを見てみると機械語みたいなものが書いてありました。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1481] Re:質問
投稿者:(ぱ)こと管理人
2009/12/05 10:24:21

>前回はすみません。知りたかったのは、ファイルの題名です。 そのソースファイルでやっていることが理解できているのなら、題名くらい、 自分でつければよいでしょう。 そもそもなぜ「題名」などというものをつけなければいけないのかわかりませんが。 学校のレポートに書くというのなら、それを私にまるごと聞くのはカンニングと同じです。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1479] Re:質問
投稿者:(ぱ)こと管理人
2009/11/28 14:18:56

>crowbar_book_0_1の >string.cとmain.c(memoryフォルダに入ってないほう)の説明がほしいのですが。 >ファイル名や中身からしてなんとなくわかる気もするのですが、 出張中につき手元に本はないのですが、 main.cといえば、これですよね。 http://kmaebashi.com/programmer/devlang/crowbar_src_0_1_01/S/1.html このページの、 http://kmaebashi.com/programmer/devlang/crowbar.html 「Cからcrowbarを呼び出す」 は、説明になっていませんか? また、string.cについては、 http://kmaebashi.com/programmer/devlang/crowbar_0_1.html にて、以下のように説明しています。 | 文字列リテラルに関しては、開始の時点でcrb_open_string_literal() を | 呼び出し、途中の文字はcrb_add_string_literal()で追加、最後は | crb_close_string_literal()で文字列終了、という手順を踏みます。 | その間、文字列は、string.c中の st_string_literal_bufferという | static変数に保持されています。 説明不足でわからないのかもしれませんが、どこがどうわからないのか 言ってもらわないと、回答のしようがありません。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1478] 質問
投稿者:高校生
2009/11/26 13:04:12

crowbar_book_0_1の string.cとmain.c(memoryフォルダに入ってないほう)の説明がほしいのですが。 ファイル名や中身からしてなんとなくわかる気もするのですが、 簡単にでもいいのでお願いします。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1476] オブジェクト指向再入門/「オブジェクトに仕事をさせる、ということ」のソースについて
投稿者:(ぱ)こと管理人
2009/11/22 18:33:00

メールにてご指摘がありました。 以下のページのソースコードにおいて、 http://kmaebashi.com/programmer/object/shigoto.html Java版の以下のソースに間違いがありました。 // コロンで区切るためのStringTokenizerを生成 StringTokenizer st = new StringTokenizer(line, ":"); // 著者名を(複数)取り出す writers = st.nextToken(); // コンマで区切られた著者名を順に切り出すために // 新たなStringTokenizerを生成 StringTokenizer st2 = new StringTokenizer(line, ","); i = 0; while (st2.hasMoreTokens()) { writer[i] = st2.nextToken(); i++; } 著者名を順に切り出す対象は、その前のStringTokenizerで取得した writersですから、以下のようにしなければいけません。 // コンマで区切られた著者名を順に切り出すために // 新たなStringTokenizerを生成 StringTokenizer st2 = new StringTokenizer(writers, ","); 現在海外出張中でオリジナルが直せませんので、取り急ぎお知らせします。 すみませんでした。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1475] Re:質問
投稿者:(ぱ)こと管理人
2009/11/21 01:33:54

>util.cについて教えてください。 >/* BUGBUG >CRB_NativeFunctionProc * >    . >    . >*/ >とコメントにしたのはなぜでしょうか。 おそらくは昔はネイティブ関数とcrowbarの関数を別々の連結リストで 管理していたところ、あるとき一本化して、この関数だけ残骸として 残ったようです。無視してください。 リリース前にはきれいにしておくべきでした。すみません。 >/*FALLTHRU*/というのは何かの指令なのですか。 >C ソースコード検査プログラムの lint と関係ありますか。 lintと関係あります。 Cのswitch caseというのは、「breakを書かないと下に落っこちていく」という とんでもない仕様になっているので、よくbreakを書き忘れてはまる人が いるわけです。そこでlintはそれを検出する機能があるわけですが、 といって、本当に「下に落っこちていく」動きにしたい場合に警告が出て しまったのでは困りますので、その警告を抑止するコメントが/* FALLTHRU */です。 とはいえいまどき昔ながらのUNIXのlintを使っている人は少ないでしょうし、 gccとかだと無視するようなのであまり意味はないかもしれませんが。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1473] 質問
投稿者:高校生
2009/11/18 11:54:00

util.cについて教えてください。 /* BUGBUG CRB_NativeFunctionProc *     .     . */ とコメントにしたのはなぜでしょうか。 /*FALLTHRU*/というのは何かの指令なのですか。 C ソースコード検査プログラムの lint と関係ありますか。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1472] Re:DIKSAM_book_0_4のLinuxでの実行結果について (その2)
投稿者:(ぱ)こと管理人
2009/11/18 02:59:27

>UTF-8版がエラーとなり、 >EUC版がうまくいったのはたまたまLANG環境変数が一致したからですか? たまたまというか、たいていのLinux環境はEUCかUTF-8のどちらかであり、 それに対応するためにふたつの配布パッケージを用意しているわけです。 ところで青餓鬼さんにお願いですが、この掲示板で誰かの投稿に返信する際は、 「新規投稿」リンクではなく、対象の投稿の「返信」リンク(右上にあります)を 使っていただけないでしょうか。 「スレッド順インデックス」で見たときに、応答の流れが見えますので。 http://kmaebashi.com/bbs/thread.php?boardid=kmaebashibbs
[この投稿を含むスレッドを表示] [この投稿を削除]
[1471] Re:DIKSAM_book_0_4のLinuxでの実行結果について (その2)
投稿者:yuya
2009/11/18 01:13:48

こちらはVineLinuxでLANG環境変数がja_JP.UTF-8な環境で試してみました。 ちょうど青餓鬼さんと逆に、test.dkmはUTF版では正常動作し、EUC版では Assertion failure (wc_format != NULL) file..error.c line..92 wc_format is null. Assertion failure (wc_format != NULL) file..error.c line..92 wc_format is null. アボートしました とのメッセージが出ました。当然といえば当然の結果ですね。 これは納得が行きましたが、あとは青餓鬼さんが前に書いていたMacの結果だけが気になりますね(文字コード以前に、素のバイト列のままだった)。 むし返すようで申し訳ないんですけど、Macでの環境変数LANGは何だったのか、 よければ教えてもらえませんか。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1470] DIKSAM_book_0_4のLinuxでの実行結果について (その2)
投稿者:青餓鬼
2009/11/17 14:43:18

Vine Linuxでの echo $LANG の実行結果は ja_JP.eucJP でした。 UTF-8版がエラーとなり、 EUC版がうまくいったのはたまたまLANG環境変数が一致したからですか? 大変勉強になりました。 以上
[この投稿を含むスレッドを表示] [この投稿を削除]
[1469] Re:質問
投稿者:(ぱ)こと管理人
2009/11/17 03:22:16

>crowbar_book_0_1に、debubgフォルダとmemoryフォルダがあったのですが >これらは何のためのフォルダなのですか。 「高校生」さんが書籍版「プログラミング言語を作る」をお持ちなら、 92ページにディレクトリ構成の図があります。メモリ管理モジュール MEM(memoryフォルダ)の説明はp.92からありますし、デバッグ用モジュール DBG(debugフォルダ)の説明はp.96からです。 Web版なら、以下のページに説明があります。 http://kmaebashi.com/programmer/devlang/crowbar_0_1.html こちらにはdebugのほうの説明はないので補足すると、たとえば 以下のソースが例として挙げられると思います。 http://kmaebashi.com/programmer/devlang/crowbar_src_0_1_01/S/22.html#57 >if (cond.type != CRB_BOOLEAN_VALUE) { > crb_runtime_error(statement->u.if_s.condition->line_number, > NOT_BOOLEAN_TYPE_ERR, MESSAGE_ARGUMENT_END); >} >DBG_assert(cond.type == CRB_BOOLEAN_VALUE, ("cond.type..%d", cond.type)); このDBG_assert()を通るときにはcond.typeは絶対にCRB_BOOLEAN_VALUEであるに 決まっているわけですが、万一なにかの思い違いでそうでなかったとき、 DBG_assert()はメッセージを2行吐いて異常終了します。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1468] 質問
投稿者:高校生
2009/11/16 11:28:34

crowbar_book_0_1に、debubgフォルダとmemoryフォルダがあったのですが これらは何のためのフォルダなのですか。 一通り見たのですが難しいです。 こんな質問ですみません、学校のレポートにまとめなければならないので...。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1467] Re:DIKSAM_book_0_4のLinuxでの実行結果について
投稿者:(ぱ)こと管理人
2009/11/15 21:32:30

>2.UTF-8版の場合 >次のようなメッセージを2回表示しアボートします。 > >Assertion Failure (WC_format != NULL) file .. error.c line .. 92 当方のUbuntu Linuxで再確認しましたが、正常動作しました。 確認ですが、この時のLANG環境変数の値は何になっているでしょうか? Linuxなら、LANG環境変数の値は「echo $LANG」で確認することができます。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1466] DIKSAM_book_0_4のLinuxでの実行結果について
投稿者:青餓鬼
2009/11/14 15:35:42

Windows XP上のVirtualPCでVine Linuxを起動し、EUC版とUTF-8版のDIKSAM_book_0_4を実行してみました。 どちらもWindowsの時のようにdiksam.yのソース修正することなくmakeは正常に終了しました。 TEST.DKMを引数にして実行すると次のような差異が生じました。 1.EUC版の場合 実行結果はTESTディレクトリ内のTEST.RESULTと同じ内容が表示されます。 正常終了!! 2.UTF-8版の場合 次のようなメッセージを2回表示しアボートします。 Assertion Failure (WC_format != NULL) file .. error.c line .. 92 アボートしました。 *** とりあえず Linuxでは EUC コードで先に進めていきます。 *** 誰かIntel Macでの実行を試行してみませんか !!! 以上
[この投稿を含むスレッドを表示] [この投稿を削除]
[1464] Re:質問
投稿者:(ぱ)こと管理人
2009/11/05 01:46:09

>CrowbarからCを使うとありましたが,Cで書かれた別アプリケーションからインタプリタを使うことについて、どういうことかイメージがわきません。 「crowbarからCの関数を呼び出すことの意味はわかるけれど、  Cからcrowbarのインタプリタを呼び出せて何が嬉しいのかわからない」 ということでよいでしょうか? Cで書かれたある程度の規模のプログラムがあるとして、そこからcrowbarが 呼び出せると、crowbarを、そのプログラムのカスタマイズ用言語として使うことが できます。 すぐ思いつく例としては、 ・Microsoft WordやExcelはカスタマイズ用言語としてVBAを使うことができる。 ・UNIXのエディタEmacsは、Emacs Lispでカスタマイズできる。 ・CADなどでは、カスタマイズ用スクリプト言語がついているものがある。 などがありますが…考えてみれば高校生はOfficeは使わない気がするし、 UNIXも使っていなければEmacsも知らないかもしれないし、ましてやCADを 見たことがあるとも思えませんねえ。 手近な例としては、秀丸エディタのマクロなんかどうでしょうか。 http://hide.maruo.co.jp/lib/macro/index.html
[この投稿を含むスレッドを表示] [この投稿を削除]
[1463] 質問
投稿者:高校生
2009/11/04 11:55:59

CrowbarからCを使うとありましたが,Cで書かれた別アプリケーションからインタプリタを使うことについて、どういうことかイメージがわきません。説明やいいサイトを紹介してくれたら幸いです。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1462] Re:DIKSAM_book_0_4のMac/Winでの実行結果について(その2)
投稿者:(ぱ)こと管理人
2009/11/04 02:19:50

>出力結果と文字コード表を付き合わせると、Shift-JISじゃなくてEUCだと思うのですが……。 出力結果: > str[0]..50940 16進数に直すとC6FC 文字コード表を見ると…すみません、確かにEUCでした。ご指摘ありがとうございます。 同じ手順で確認したはずが、なぜShift-JISだと思ってしまったんだろう。 >つよしさんのテストではワイド文字への変換は行われているがUnicode化されていない。 >青餓鬼さんのテストではそもそもワイド文字にも変換されず、素のバイト列のまま、と。 ということですよね。つよしさんの実験がEUC環境下で行われたなら、実質無変換で、 ただしマルチバイトの1文字として変換されたということでしょうか。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1461] Re:DIKSAM_book_0_4のMac/Winでの実行結果について(その2)
投稿者:yuya
2009/11/03 00:47:46

Mac持ってませんが探究中です。 >なぜか当時追及しなかったようなのですが、Windowsと同じようには動いていませんね。 >この出力だけ見ると、ワイド文字に変換した結果がShift-JISになっているように >見えますが、いくらなんでもそんなはずは…… 出力結果と文字コード表を付き合わせると、Shift-JISじゃなくてEUCだと思うのですが……。 つよしさんのテストではワイド文字への変換は行われているがUnicode化されていない。 青餓鬼さんのテストではそもそもワイド文字にも変換されず、素のバイト列のまま、と。 引き続き調査しまーす。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1460] Re:質問
投稿者:(ぱ)こと管理人
2009/11/02 22:50:27

>crowbar.hを見ていると/*create.c*/や/*string.c*/などが書いてありました。 これですね。 http://kmaebashi.com/programmer/devlang/crowbar_src_0_4_02/S/6.html >これは、例えばcreate.cというファイルが、crowbar.hの/*create.c*/と書いてある以下の部分を使うということですか。 「以下の部分を使う」というのをどういう意味で書かれているのかはわかりませんが、 このコメントは、 「/* create.c */というコメントの下にある関数は、create.c内で定義されている」 ということを意味しています。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1459] 質問
投稿者:高校生
2009/11/02 10:51:03

crowbar.hを見ていると/*create.c*/や/*string.c*/などが書いてありました。 これは、例えばcreate.cというファイルが、crowbar.hの/*create.c*/と書いてある以下の部分を使うということですか。 気になりまして。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1458] Re:DIKSAM_book_0_4のMac/Winでの実行結果について(その2)
投稿者:(ぱ)こと管理人
2009/11/01 16:07:52

>私が問題にしているのは、Test.dkmの726行目 > if (str[i] == '本') { >の解釈で、WindowのCYGWINのGCCが作成した実行部は2バイト文字として >文字リテラルを解釈しているのに、MacのGCCで作成した実行部は文字リテラル数が >複数あるとしてエラーとしていることです。 まず、Diksamでは、"あいうえお".length()は5を返しますし、"あいうえお"[3]の 値は'え'である、というのが仕様です。つまり、Diksamでは、文字列は「バイトの 並び」ではなく「文字の並び」です。この「文字」は、日本語であっても、 1文字は1文字として解釈されなければなりません。 よって、実行に成功していれば、test.dkmにおける以下のコードの実行結果は、 string str = "日本語"; for (i = 0; i < str.length(); i++) { println("str[" + i + "].." + str[i]); if (str[i] == '本') { println("本"); } } 以下のようになるのが正解です。 str[0]..26085 str[1]..26412 本 str[2]..35486 ところが、青餓鬼さんの環境では、str.length()がEUCではが6, UTF-8では9に なっています。これはマルチバイト文字からUNICODEへの変換が行われておらず、 単にバイト列として読み込まれているように見えます。 マルチバイト文字からUNICODEへの変換処理はロケールに依存するので、 環境変数LANGの値はどうなっているのかが気になっているわけです。 とはいえ私はMacは持っておりませんしOS-Xを使ったこともないので、 見当はずれのことを書いている可能性はあります。詳しい方ご指摘ください。 過去MacOSで動かした人はいたはずだったよな、と思い掲示板の過去ログを 探したところ、以下の投稿が見つかりました。 http://kmaebashi.com/bbs/list.php?boardid=kmaebashibbs&from=1196&range=1 なぜか当時追及しなかったようなのですが、Windowsと同じようには動いていませんね。 この出力だけ見ると、ワイド文字に変換した結果がShift-JISになっているように 見えますが、いくらなんでもそんなはずは……
[この投稿を含むスレッドを表示] [この投稿を削除]
[1457] DIKSAM_book_0_4のMac/Winでの実行結果について(その2)
投稿者:青餓鬼
2009/10/31 16:43:49

私が問題にしているのは、Test.dkmの726行目 if (str[i] == '本') { の解釈で、WindowのCYGWINのGCCが作成した実行部は2バイト文字として文字リテラルを解釈しているのに、MacのGCCで作成した実行部は文字リテラル数が複数あるとしてエラーとしていることです。 文字リテラルに関しては、ほかの手段を執るか制限を設けるのか検討が必要だと思います。 以上
[この投稿を含むスレッドを表示] [この投稿を削除]
[1456] Re:質問
投稿者:(ぱ)こと管理人
2009/10/29 07:40:34

>lexicalanalyzer.cを見ていると >#if 0 >と書かれていましたが、どういう意味でしょうか。 #で始まっていることから、#includeと同じようなプリプロセッサの機能であると 見当がつきます。 そこで、「プリプロセッサ」でGoogle検索すると、たとえば以下のようなページが 見つかります。 http://www.cppll.jp/cppreference/preproc_details.html >/*ここから下はテストドライバ*/ >とありました。これはなくてもよいのですか。 >何を意味しているのかを教えてください。 「テストドライバ」でGoogle検索するとWikipediaの以下のページが見つかります。 http://ja.wikipedia.org/wiki/%E3%82%BD%E3%83%95%E3%83%88%E3%82%A6%E3%82%A7%E3%82%A2%E3%83%86%E3%82%B9%E3%83%88#.E3.83.86.E3.82.B9.E3.83.88.E3.83.89.E3.83.A9.E3.82.A4.E3.83.90.E3.81.A8.E3.83.86.E3.82.B9.E3.83.88.E3.82.B9.E3.82.BF.E3.83.96
[この投稿を含むスレッドを表示] [この投稿を削除]
[1455] 質問
投稿者:高校生
2009/10/28 11:56:27

scanf()の件はありがとうございました。 lexicalanalyzer.cを見ていると #if 0 と書かれていましたが、どういう意味でしょうか。 本のほうでは、 /*ここから下はテストドライバ*/ とありました。これはなくてもよいのですか。 何を意味しているのかを教えてください。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1454] Re:DIKSAM_book_0_4のMac/Winでの実行結果について
投稿者:(ぱ)こと管理人
2009/10/28 08:16:30

すみません、時間がないので手短に。 >◎◎結論 >文字列型stringの内部の表現形式は実行環境のC言語コンパイラに依存するとなると、他のUnix/Linuxは >わかりませんが、Mac/Winでの日本語のリテラル処理は、同じソースでは扱えないと思います。 内部の表現形式以前に、test.dkmの文字コードがunix_euc.tarではEUC、 unix_utf8.tarではUTF8になっており、それがそのまま出力されているように 見えます。 echo $LANG とすると、何が表示されますか?
[この投稿を含むスレッドを表示] [この投稿を削除]
[1453] DIKSAM_book_0_4のMac/Winでの実行結果について
投稿者:青餓鬼
2009/10/27 14:48:23

Diksam_book_0_4について、WinとMacの実行結果を次に示します。 ★Windowsの場合(XP ソースファイルはwin_sjis.lzh) 正誤表にあるCompilerディレクトリのdiksam.yのblockに関するソース修正を行い、diksam.yの745行目のソースを catch_clause : CATCH { $$ = dkc_start_catch_clause(); } 次のように修正すると catch_clause : CATCH { $<catch_clause>$ = dkc_start_catch_clause(); } makeは正常に終了し、test.dkmを処理してもtest.resultと同じ結果が得られます。 ★Mac(PPC G5,OS 10.4.11 ソースファイルはunix_euc.tar) diksam.yのソース修正をしなくてもmakeは正常に終了しますが、test.dkmを処理しようとすると 726行目のところでエラーとなります。(たぶんエラー内容は下と同じ) そこで次のようにソース修正すると、 string str = "日本語"; for (i = 0; i < str.length(); i++) { println("str[" + i + "].." + str[i]); // if (str[i] == '本') { if (i>0 && str[i-1] == 203 && str[i] == 220) { println("本"); } } 次のような結果が表示されます。 ・・(前の部分省略) 日本語 str[0]..198 str[1]..252 str[2]..203 str[3]..220 本 str[4]..184 str[5]..236 ★Mac(PPC G5,OS 10.4.11 ソースファイルはunix_etf8.tar) diksam.yのソース修正をしなくてもmakeは正常に終了しますが、test.dkmを処理しようとすると 726行目のところで"文字リテラルが2文字以上あります"というエラーとなります。 そこで次のようにソース修正すると、 string str = "日本語"; for (i = 0; i < str.length(); i++) { println("str[" + i + "].." + str[i]); // if (str[i] == '本') { if (i>2 && str[i-2] == 230 && str[i-1] == 156) && str[i] == 172) { println("本"); } } 次のような結果が表示されます。ただし、結果をファイルに落としてWinで表示させると日本語の部分は文字化けします。 ・・(前の部分省略) 日本語 str[0]..230 str[1]..151 str[2]..165 str[3]..230 str[4]..156 str[5]..172 本 str[6]..232 str[7]..170 str[8]..158 ◎◎結論 文字列型stringの内部の表現形式は実行環境のC言語コンパイラに依存するとなると、他のUnix/Linuxは わかりませんが、Mac/Winでの日本語のリテラル処理は、同じソースでは扱えないと思います。 以上、Mac/Winの実行結果を報告します。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1452] Re:質問
投稿者:(ぱ)こと管理人
2009/10/27 02:42:42

>crowbarにはC言語で言うscanf(キーボードから入力)的なものは、ありましたでしょうか。 少なくとも最新バージョン(book_ver.0.4)では、fgets()の入力元を STDINにすることでキーボードからの入力が可能です。 str = fgets(STDIN); print(str); Cのscanf()のように、文字列を数値に変換するような機能はありませんので、 必要であればネイティブメソッドを書き足してみてください。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1451] 質問
投稿者:高校生
2009/10/26 11:20:14

電卓の件は、ありがとうございました。 crowbarにはC言語で言うscanf(キーボードから入力)的なものは、ありましたでしょうか。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1450] Re:質問
投稿者:(ぱ)こと管理人
2009/10/23 03:05:44

>mycalc|_exで例えば >..5 >とか入力すると >電卓は終了してしまうのですか。 >それともlexical error とかが出るのですか。 現状では、手書きパーサのほうは syntax error. yacc/lex版のほうは、 lexical error. と表示して終了します。 yacc/lex版の_exありのほうは、パーサのエラーについては対処しており、 たとえば 1++2 のように入力すれば、エラーメッセージを出しますが電卓は終了しません。 確かにレキシカルアナライザの方でエラーが出ると終了してしまうので 実用上は対策がおおいに不完全ですが、ここではyaccのエラー処理の仕方を 説明しているということでご理解ください。 …とはいえ補足記事くらいは書いたほうがよさそうですね。検討します。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1449] 質問
投稿者:高校生
2009/10/22 15:26:57

mycalc|_exで例えば ..5 とか入力すると 電卓は終了してしまうのですか。 それともlexical error とかが出るのですか。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1448] Re:質問
投稿者:(ぱ)こと管理人
2009/10/22 07:35:27

>win_sjisのcalcフォルダにある電卓にはエラー処理はありますか? 本のほうで説明しているのはyaccのエラー処理の方法なので、 calcフォルダ以下の、mycalc_ex以下のmycalc.yにはエラー処理が入っています。 _exでないほうには入っていません。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1447] Re:mingw32-make
投稿者:(ぱ)こと管理人
2009/10/22 07:32:48

>情報ありがとうございました。正直、Makefileの中身を書き換える根性はないのですが、 >補足等の形で近日中にUPさせていただきます。 修羅場だったり出張してたりでここに書くのが遅くなりましたが、 申しわけ程度の説明を↓のページに入れました。 http://kmaebashi.com/programmer/devlang/book/winenv.html 今見返しても本当に申しわけ程度ですが……
[この投稿を含むスレッドを表示] [この投稿を削除]
[1446] 質問
投稿者:高校生
2009/10/21 11:52:38

win_sjisのcalcフォルダにある電卓にはエラー処理はありますか?
[この投稿を含むスレッドを表示] [この投稿を削除]
[1445] Re:mingw32-make
投稿者:yuya
2009/10/13 06:49:48

……とは言っても、Makefileにコマンドを書いた時点で、そもそもシェル依存なのか。 cdの構文が(ある程度)共通してるのはラッキーだったというだけで。 すいません、ひとりで納得してますm(_ _)m
[この投稿を含むスレッドを表示] [この投稿を削除]
[1444] Re:mingw32-make
投稿者:yuya
2009/10/13 05:52:44

まず、訂正。 >cd ../dvm; $(MAKE)$ 末尾の$は不要でした。 >makeが起動しようとするコマンド行を受け付けるのが、Cmd.exeの場合に >セミコロンを解釈しない、ということでしょうか。 そういうことだろうと思います。 >正直、Makefileの中身を書き換える根性はないのですが、 パスをダブルクォーテーションで囲んでみたり、 なんとかcmd.exeの機嫌をとろうとしたのですが、 うまく行く方法が見つかりません(^^;) 蛇足ですが、cdと$(MAKE)を別行にしてしまうと、 新しいシェルが立ち上がって、cd前のディレクトリに戻ってしまい、 makeで自分と同じMakefileを読みに行って再帰無限地獄に陥いりますよね。 #ってか、MinGWユーザが全員MSYS入れてるわけでもないでしょうし、 #けっこう普遍的な問題のような気がするのですが、情報が見つかりません。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1443] Re:mingw32-make
投稿者:(ぱ)こと管理人
2009/10/13 02:17:46

>> cd ../dvm; gmake; >> 指定されたパスが見つかりません。 >> gmake: *** [../dvm/dvm.o] Error 1 > >といったエラーに悩んでる人が出てきてないでしょうか。 > >MSYSだと起こらないので、今日初めて気づいたんですが、 Cygwinを入れている私の環境でもそのままでは再現しませんが、 makeが起動しようとするコマンド行を受け付けるのが、Cmd.exeの場合に セミコロンを解釈しない、ということでしょうか。実際、コマンドプロンプトから 直接入力すると、同様のエラーが出ます。 情報ありがとうございました。正直、Makefileの中身を書き換える根性はないのですが、 補足等の形で近日中にUPさせていただきます。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1442] mingw32-make
投稿者:yuya
2009/10/12 17:10:57

mingw32-makeを使うときの一般的な話で、CrowbarやDiksamと直接関係ないのですが……。 Makefileに cd ../dvm; $(MAKE)$ などとなっている箇所で、セミコロン以降も全部パスとみなされてしまい、 > cd ../dvm; gmake; > 指定されたパスが見つかりません。 > gmake: *** [../dvm/dvm.o] Error 1 といったエラーに悩んでる人が出てきてないでしょうか。 MSYSだと起こらないので、今日初めて気づいたんですが、 MinGWだけ入れてcmdから直接makeする人はハマる可能性があると思うのです。 余計なお世話ですけど。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1440] Re:「プログラミング言語を作る」のmycalc
投稿者:(ぱ)こと管理人
2009/09/10 03:05:28

>>・そちらのbisonのバージョンが2.1以外であれば、2.1ではどうでしょうか。 >bison2.1にするとちゃんと動くようになりました。 当方と同じ現象が起きているようですね。 >>・m4のみ別途インストールするか、Cygwinを入れてみるとどうでしょうか。 >m4のみ違うバージョンをインストールしてみましたが、だめでした。 > >bisonを空白のないパスにインストールすると、最新のバージョンでも動きました。 こちらについても、わざわざ報告いただきありがとうございました。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1439] Re:(初歩的な)質問
投稿者:(ぱ)こと管理人
2009/09/10 03:04:01

>gmake [Enter] > >とタイプしたのですが (中略) >というようなメッセージがでて、crowbar.exeがcrowbar_book_0_1のフォルダの中にできました。 おめでとうございます。コンパイルは成功しています。 >crowbar.exeをダブルクリックすればいいのですか?ダブルクリックしても一瞬だけ黒い画面が出るだけです。 crowbarの実行もコマンドプロンプトから行います。 コンパイルしたフォルダにtestというフォルダがあり、この中に、 test.crbというテストプログラムが入っています。 コンパイルしたフォルダから、 cd test[Enter] でtestフォルダに移動してから、 ..\crowbar test.crb[Enter] とタイプしてください。「..\」は「ひとつ上のフォルダ」を意味しますので、 これでひとつ上のフォルダのcrowbar.exeを実行することができます。 あるいは、test.crbをひとつ上のフォルダに移動してから、 コンパイルしたフォルダにて crowbar test.crb[Enter] でもよいです。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1438] Re:「プログラミング言語を作る」のmycalc
投稿者:wk
2009/09/09 17:08:12

ありがとうございます。 >・そちらのbisonのバージョンが2.1以外であれば、2.1ではどうでしょうか。 bison2.1にするとちゃんと動くようになりました。 >・m4のみ別途インストールするか、Cygwinを入れてみるとどうでしょうか。 m4のみ違うバージョンをインストールしてみましたが、だめでした。 bisonを空白のないパスにインストールすると、最新のバージョンでも動きました。 お忙しいところ、何度もアドバイスありがとうございました。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1437] (初歩的な)質問
投稿者:高校生
2009/09/09 11:58:21

プログラミングを作る の本を使ってやっているのでcrowbar_book_0_1は 「C:\Documents and Settings\s2007070\デスクトップ\win_sjis\crowbar_book_0_1」にあります。そこでコマンドプロンプトで cd C:\C:\Documents and Settings\s2007070\デスクトップ\win_sjis\crowbar_book_0_1[Enter] とタイプして C:\C:\Documents and Settings\s2007070\デスクトップ\win_sjis\crowbar_book_0_1に移動し、そこで gmake [Enter] とタイプしたのですが ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー C:\Documents and Settings\s2007070\デスクトップ\win_sjis\crowbar_book_0_1>gmake cd ./memory; gmake; gmake[1]: Entering directory `c:/Documents and Settings/s2007070/デスクトップ/wi n_sjis/crowbar_book_0_1/memory' gmake[1]: `mem.o' is up to date. gmake[1]: Leaving directory `c:/Documents and Settings/s2007070/デスクトップ/win _sjis/crowbar_book_0_1/memory' cd ./debug; gmake; gmake[1]: Entering directory `c:/Documents and Settings/s2007070/デスクトップ/wi n_sjis/crowbar_book_0_1/debug' gmake[1]: `dbg.o' is up to date. gmake[1]: Leaving directory `c:/Documents and Settings/s2007070/デスクトップ/win _sjis/crowbar_book_0_1/debug' gcc lex.yy.o y.tab.o main.o interface.o create.o execute.o eval.o string.o strin g_pool.o util.o native.o error.o error_message.o ./memory/mem.o ./debug/dbg.o -o crowbar -lm C:\Documents and Settings\s2007070\デスクトップ\win_sjis\crowbar_book_0_1> ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー というようなメッセージがでて、crowbar.exeがcrowbar_book_0_1のフォルダの中にできました。 crowbar.exeをダブルクリックすればいいのですか?ダブルクリックしても一瞬だけ黒い画面が出るだけです。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1436] Re:「プログラミング言語を作る」のmycalc
投稿者:(ぱ)こと管理人
2009/09/09 03:26:51

>C:\win_sjis\calc\mycalc>make.bat >> error.txt >m4: cannot open `Files\GnuWin32/share/bison': No such file or directory >m4: cannot open `C:\Program': No such file or directory >m4: cannot open `Files\GnuWin32/share/bison/m4sugar/m4sugar.m4': No such file or > directory (後略) このメッセージは見たことがあります。 以下のページの「bisonのインストール」のところで http://kmaebashi.com/programmer/devlang/book/winenv.html >ただし、私の環境では、m4でエラーが出ました。 >Cygwinのものを使おうがMSYSのものを使おうが、 bisonに付属のものを使おうが >エラーになっています。 >bison2.1は動作したので念のため置いておきます。 と書いていますが、この時に発生したエラーがこれでした。 bisonは内部的にm4を使用するのですが、「MSYSのm4は古いからbisonは動かない」という という記述がいくつかのWebページにありましたし、メッセージを見る限り、 確かにm4がエラーを出しています。ただ、その後MSYSをアンインストールして cygwinを入れなおしても状況が改善されず、bisonの入れ直しで(私のところでは)直りました。 ・そちらのbisonのバージョンが2.1以外であれば、2.1ではどうでしょうか。 ・m4のみ別途インストールするか、Cygwinを入れてみるとどうでしょうか。 はっきりした回答ができず申しわけありません。 私の環境では、bisonはC:\Program Files\GnuWin32\bin\bisonであり、 m4はcygwinのものを使用しています。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1435] Re:「プログラミング言語を作る」のmycalc
投稿者:wk
2009/09/08 14:43:46

ありがとうございます。 >かつ、その中で、該当のエラーになったのは、mycalc以下のmake.batでよいでしょうか? はい。 >エラーメッセージが出るようであれば、そのままこの掲示板にコピペしてください。 C:\win_sjis\calc\mycalc>make.bat >> error.txt m4: cannot open `Files\GnuWin32/share/bison': No such file or directory m4: cannot open `C:\Program': No such file or directory m4: cannot open `Files\GnuWin32/share/bison/m4sugar/m4sugar.m4': No such file or directory m4: cannot open `C:\Program': No such file or directory m4: cannot open `Files\GnuWin32/share/bison/bison.m4': No such file or directory m4: cannot open `C:\Program': No such file or directory m4: cannot open `Files\GnuWin32/share/bison/c-skel.m4': No such file or director y gcc: y.tab.c: No such file or directory mycalc.l:3:19: y.tab.h: No such file or directory mycalc.l: In function `yylex': mycalc.l:12: error: `ADD' undeclared (first use in this function) mycalc.l:12: error: (Each undeclared identifier is reported only once mycalc.l:12: error: for each function it appears in.) mycalc.l:13: error: `SUB' undeclared (first use in this function) mycalc.l:14: error: `MUL' undeclared (first use in this function) mycalc.l:15: error: `DIV' undeclared (first use in this function) mycalc.l:16: error: `CR' undeclared (first use in this function) mycalc.l:20: error: `yylval' undeclared (first use in this function) mycalc.l:21: error: `DOUBLE_LITERAL' undeclared (first use in this function) bisonをインストールした場所が悪かったのでしょうか。エラーを読んでいると、Program Filesが2つのパスに分割されているようにも思えます。環境変数のpathにC:\Program Files\GnuWin32\binを登録してコマンドプロンプトを実行しています。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1434] Diksamのmakeが成功しました。
投稿者:青餓鬼
2009/09/08 12:05:49

掲示板#1432に指摘されているdiksam.yのソース修正を施すと、 無事gmakeは正常終了しました。 これで先に進めます。 ありがとうございました。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1433] Re:「プログラミング言語を作る」のmycalc
投稿者:(ぱ)こと管理人
2009/09/08 02:45:32

こんにちは。 >ソースファイルをダウンロードして、mycalcをmake.batを実行してgccで >コンパイルすると、lex.yy.cというファイルはできましたが、もう一つの >ファイルはCのファイルではなくy.outputになっています。Windows上で、 >MinGW, MSYS, bison, flexをインストールして実行しています。 >アドバイスいただけないでしょうか。 こちらも確認ですが、そちらで試されたファイルは、以下のページからダウンロード した win_sjis.LZHまたはwin_sjis.zipのいずれかで、 http://kmaebashi.com/programmer/devlang/book/download.html かつ、その中で、該当のエラーになったのは、mycalc以下のmake.batでよいでしょうか? (mycalc_exではなく) lex.yy.cができていて、y.tab.cおよびy.tab.hができていないとすると、 yacc(bison)側が何らかのエラーになっているのではないかと思うのですが、 エラーメッセージの類は出ていないでしょうか? もしmake.batをダブルクリックして実行されているのであれば(それだと仮に エラーメッセージが出ていても読めないので)、以下を参考にコマンドプロンプトから 実行してみてください。 http://kmaebashi.com/bbs/list.php?boardid=kmaebashibbs&thread=1426 エラーメッセージが出るようであれば、そのままこの掲示板にコピペしてください。 よろしくお願いします。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1432] Re:Diksamのmakeでエラーとなる
投稿者:(ぱ)こと管理人
2009/09/08 02:15:10

>こんにちは。初めて投稿します。 はじめまして。 >8月17日にソースコードをダウンロードして、順にコンパイルしているうち、 >Diksamのcompiler項になったら次のようなエラーメッセージが表示されました。 確認ですが、そちらで試されたファイルは、以下のページからダウンロードした win_sjis.LZHまたはwin_sjis.zipのいずれかで、 http://kmaebashi.com/programmer/devlang/book/download.html かつ、その中で、該当のエラーになったのは、diksam_book_0_1でよいですよね。 >>bison --yacc -dy diksam.y >>diksam.y:428 13-14: $$ for the midrule at $2 of 'block' has no declared type >>gmake: *** [y.tab..h] Error 1 428行目でエラーが出ていますが、確かに、diksam_book_0_1のcompiler\diksam.yの 428行目近辺は、以下のようになっています。 1 2 3 4   12345678901234567890123456789012345678901234567890  425:block 426: : LC 427: { 428: $$ = dkc_open_block(); 429: } 430: statement_list RC 431: { 432: $$ = dkc_close_block($<block>2, $3); 433: } 434: | LC RC 435: { 436: Block *empty_block = dkc_open_block(); 437: $$ = dkc_close_block(empty_block, NULL); 438: } 439: ; 428行目の13~14文字目は「$$」ですが、この$$は、埋め込みアクションの ターゲットを示しています。「プログラミング言語を作る」p.206~207で、 「以下のように書くのと同値です。」と書かれている例におけるdummy_targetです。 メッセージを見る限り、dummy_target相当のターゲットは型の宣言をしていないので、 上記のエラーが出ているようです(「ようです」というのは、当方の環境では エラーにならずに動いているためです)。 428行目を以下のように変更して試してみていただけますでしょうか。 428: $<block>$ = dkc_open_block(); 正直、私はもうずいぶん前からここのところは$$で書いていてLinuxでもWindowsでも 動いていたはずですが、確かに、正しくは「$<block>$」と書くべきところかと 思います。 ご報告ありがとうございました。確認のうえでソースの修正および補足記事を Webで出させていただきます。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1431] 「プログラミング言語を作る」のmycalc
投稿者:wk
2009/09/07 17:17:55

ソースファイルをダウンロードして、mycalcをmake.batを実行してgccでコンパイルすると、lex.yy.cというファイルはできましたが、もう一つのファイルはCのファイルではなくy.outputになっています。Windows上で、MinGW, MSYS, bison, flexをインストールして実行しています。アドバイスいただけないでしょうか。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1430] Diksamのmakeでエラーとなる
投稿者:青餓鬼
2009/09/07 16:37:15

こんにちは。初めて投稿します。 8月17日にソースコードをダウンロードして、順にコンパイルしているうち、Diksamのcompiler項になったら次のようなエラーメッセージが表示されました。 >bison --yacc -dy diksam.y >diksam.y:428 13-14: $$ for the midrule at $2 of 'block' has no declared type >gmake: *** [y.tab..h] Error 1 実行環境はWin XPで、MinGWは今回インストールしましたが、CygWinは1年ほど前にインストールしたものを使っています。 システムの起動もツールとソースコードの展開もDドライブで実行していて、「鬼車」もインストール済みです。 Bisonの文法は自信がないので、エラーの内容について御教授ください。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1429] Re:test/if.dkmエラー
投稿者:(ぱ)こと管理人
2009/09/05 18:14:02

>[mugenkai@love] % diksam if.dkm >if.dkm: 8:変数名bが重複しています。 これですね。 int a = 10; if (a > 5) { int b = 20; println("<1>b.." + b); } else { int b = 30; println("<2>b.." + b); } わかりにくい仕様ですが、これで「変数名bが重複しています。」エラーになるのは 現状のDiksamでは仕様です。 言語仕様の「ローカル変数」のところで、以下のように書いています。 http://kmaebashi.com/programmer/devlang/dls_0_4_01.html >関数内で宣言された変数はローカル変数(local variable) となる。 >ローカル変数のスコープは、以下の両方の条件を満たす範囲である >(現状で、グローバル変数のスコープは、ブロックの影響を受けない)。 ここでのbは関数内で宣言された変数ではないので、グローバル変数です。 グローバル変数のスコープはブロックの影響を受けないので、ifのブロック内であっても 二重に宣言することはできません。 # 仕様書に書けばバグも仕様に変わる、レベルの話かもしれませんが。 testフォルダにif.dkmが入っているのは、エラーになることを確認した残骸では ないかと思います…… まぎらわしくてすみません。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1428] test/if.dkmエラー
投稿者:つんつん
2009/09/04 21:50:47

[mugenkai@love] % diksam if.dkm if.dkm: 8:変数名bが重複しています。 [mugenkai@love] % [/Users/mugenkai/Desktop/diksam_utf8/main/test] main/testフォルダのif.dkmが実行出来ません。 環境:MacOSX10.3.9
[この投稿を含むスレッドを表示] [この投稿を削除]
[1427] Re:(初歩的な)質問
投稿者:(ぱ)こと管理人
2009/09/02 22:33:18

こんにちは。 >mingw32-make.exeというファイル名を gmakeという名前にコピーしたのですが >それをどうすればいいのか分かりません。gmakeをダブルクリックしたのですが >[No such file or directory]と表示され,いくつかファイルが作られるだけです。 「gmakeをダブルクリック」しているところからして、コマンドプロンプトを お使いになったことがないのでは、と想像しています。 crowbarやDiksamは、コンパイルするのも実行するのもコマンドプロンプトから 行うことをを想定しています。 WindowsXPやVistaであれば、スタートメニューから  プログラム → アクセサリ → コマンドプロンプト で、コマンドプロンプトが表示されるはずです。 たとえば、crowbarの圧縮ファイル「crowbar_0_4_02_win.LZH」を C:\直下で展開したのであれば、「C:\crowbar_win」というフォルダができていると 思います。 コマンドプロンプトで cd C:\crowbar_win [Enter] とタイプして C:\crowbar_win に移動し、そこで gmake [Enter] とタイプすることで、crowbarがコンパイルされるはずです。 実行するときも、コマンドプロンプトから、 crowbar xxx.crb のようにタイプして実行します。 コマンドプロンプトの詳細は、たとえば以下のようなページが参考になると思います。 http://ykr414.com/dos/index.html 疑問点があれば遠慮なく書き込んでください。 なお、コマンドプロンプトでエラーが出た場合、それをここに書き込むのであれば かならずエラーメッセージをcopy&pasteしてください(正確なメッセージを知るため です。「エラーが出ました」だけでは何のエラーだかわかりません)。 コマンドプロンプト上のテキストをコピーする際は、コマンドプロンプトの タイトルバーで右クリックし、「範囲指定」→マウスで領域選択→「コピー」で 可能です。 # そのうち「Diksamではじめる12才からのゲームプログラミング」なんてのを # 書いてみたいと思っているのですが、コマンドプロンプトやフォルダ構造のところで # 若い人とはずいぶんギャップがありそうだ、とまさに思っていたところでした…… # とはいえWindowsをちゃんと使うなら、「コマンドプロンプトやフォルダ構造」は # 避けて通れないと思うんですがねえ。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1426] (初歩的な)質問
投稿者:高校生
2009/09/02 11:47:36

crowbarが実行できないのですが Cコンパイラもcygwinもbisonもflexもいれました。電卓(mycalc)は実行形式ができるのですがcrowbarやDiksamは実行形式ができません。 mingw32-make.exeというファイル名を gmakeという名前にコピーしたのですがそれをどうすればいいのか分かりません。gmakeをダブルクリックしたのですが[No such file or directory]と表示され,いくつかファイルが作られるだけです。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1425] Re:デバックシステム一応完成
投稿者:(ぱ)こと管理人
2009/08/16 21:38:16

>Diksam 2.0 より流用改変したソースはコンパイルラ部分のみで123K、 >全体の22%。その中はクラス化や、言語仕様の違いで全関数修正している >ため。元の6割ぐらいしか原型が残っていないと思います。VMについては、 >新たに書いているので基本アルゴリズムが同じで、中身は違ったものになっ >ています。 そういえばVMは新規と言う話は以前書いておられたと思うのですけれど、 バイトコードが基本的に同一らしいので、VMも流用かと思い込んでしまいました。 コンパイラをgenerate.cまで含めて流用していれば、そりゃバイトコードは 似たようなものになりますね。 > ソースの件ですが、正式にフリー公開時点でソース公開も考えています。 >現時点ではまだちょっとです。(ぱ)さん以外非公開を条件にVMのソース送り >ましょうか? 了解です。DiksamはGPLとかではないので、現時点では公開されないという 方針でしたらそれでよいかと思います。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1423] Re:デバックシステム一応完成
投稿者:
2009/08/14 21:22:27

つ、追記。 いや、ソフトを使って行数カウントしてみた。全体で17,657行ありました。それだけ^^;
[この投稿を含むスレッドを表示] [この投稿を削除]
[1422] Re:デバックシステム一応完成
投稿者:
2009/08/14 19:19:24

>山さんのVMがDVMとどれぐらい違うのだろうと思ってダウンロードしてみましたが、 >VM部分のソースはないのでしょうか……  どれぐらい違うのかソースファイルのサイズで定量的に計ってみました。 ・システム管理部分  115K(ソースファイルの合計) ・コンパイラ     150K ・VM         73K ・共用        45K ・組込み関数     34K ・ヘッダーファイル  140K (クラスやテンプレートでヘッダーファイルが大きくなるのはC++の宿命ですね)         合計 557K  プログラムの行数的にはコメント含み1万数千行ほどあります。 Diksam 2.0 より流用改変したソースはコンパイルラ部分のみで123K、 全体の22%。その中はクラス化や、言語仕様の違いで全関数修正している ため。元の6割ぐらいしか原型が残っていないと思います。VMについては、 新たに書いているので基本アルゴリズムが同じで、中身は違ったものになっ ています。  VMは最小になるように作られているので、73K 全体の13%です。ソース の60%は新しく作りこんだ仕様のためでした。内容はマルチVMのシステム・ 言語的にスレッドセーフな仕組み・コンパイルとVM間の協調動作管理、等々です。  私が言ってはいけないのかもしれませんが、結構複雑なシステムになってます。 難しいのもまた楽しくもあります。  ソースの件ですが、正式にフリー公開時点でソース公開も考えています。 現時点ではまだちょっとです。(ぱ)さん以外非公開を条件にVMのソース送り ましょうか?  VMは1つのクラスで、そのクラスのオブジェクトを1つ作ったら、それが1つの VMスレッドになり、VM機能を詰め込んだ、あまりクラスらしくないクラスです。 だから、メモリーがあるだけマルチでVMスレッドを自由に実行できます。  ちなみにコンパイラも見た目は1クラス(内部でいくつかのクラスを使用)で、 機能的にきれいに分離されています。ただその分システム管理で全体の協調 動作制御が必要です。 >あと、フォルダ名の「editer」は固有名詞でしょうか? いえ、LIZA.iniファイルで自由に変えられます。  先のことですが、ライザ言語はC言語のシンタックスにとても似ているので、 ライザ言語をC++のソースにコンパイルすることは簡単です。完成した後、 暇だったらシステムをライブラリー化して、コンパイルしたC++ソースとリンクし、 ネイティブな実行形式作成をやってみたいですね。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1421] Re:デバックシステム一応完成
投稿者:(ぱ)こと管理人
2009/08/14 00:24:29

>http://ux.getuploader.com/yamamoto/download/3/debug.zip 山さんのVMがDVMとどれぐらい違うのだろうと思ってダウンロードしてみましたが、 VM部分のソースはないのでしょうか…… あと、フォルダ名の「editer」は固有名詞でしょうか?
[この投稿を含むスレッドを表示] [この投稿を削除]
[1420] Re:デバックシステム一応完成
投稿者:
2009/08/13 19:38:47

 速いPCでも問題が…、日ごろノートPCで開発しているのですが。 久しぶりにディスクトップでやったら。  デュアルPC以上だと、本体のスピードが早すぎてモニターの処理が 追いつかないです。 約1秒に1000行ぐらいの情報を送っています。  UDP送信後 sleep(0)のウェイトをかけているのですが、シングルCPU だと、それなりに時間がかかるのですが、デュアル以上だと多少のウェイト だけで、高速にUDP送信をしていました。さすがに受けきれない結果に なります。t016.lzp t17.lzp でモニターが動作異常になります。デバック モニターがロックしたような状態、UDP受信例外、等々が発生します。  モニター側で、過負荷のときの処理を追加すべきでした。 そんな訳で、こんなデバックシステムが出来ましたよ程度としてみてください。  その他、ディスアセンブラの行情報異常や、システム変数配列処理ミス、 変数のコンフリクト問題、等々その後見つかった問題も対策終了しています。  見つかったバグのほとんどは、以前は無かったのですが、各種修正と機能 追加で新たにバグを作りこんだようです… 良くあることです orz
[この投稿を含むスレッドを表示] [この投稿を削除]
[1416] Re:デバックシステム一応完成
投稿者:
2009/08/12 18:01:54

 別のPCで実行したところ、MSVCXXXX.DLLが必要でした。 ↓にDLLを添付したファイルをUPしました。申し訳ありません。 http://ux.getuploader.com/yamamoto/download/3/debug.zip  また、add_stringのバイトコードでたまーに、システム変数が コンフリクトを起こす現象を発見しています。  あと、遅いPCでは、UDP通信が大幅に抜ける場合があります。 デバック用に最小時間を指定しているので、遅いPCでは大量の 送信データを受けきれないです。送信後のウェイトを長くすれば 問題ないのですが、デバックターンが長くなるのでこのままに しています。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1415] デバックシステム一応完成
投稿者:
2009/08/11 19:20:41

 プログラムのブレーク、ステップ処理等を除き一応の完成、ブレーク等は アプリケーションのGUIが出来上がらないとボタンが無いので。その他にも いろいろ修正をしました。  ・言語の内部コードをSJISからワイド文字wchat_tに変更。  ・動的コンパイラの組込み。  ・コンパイルエラーのモニター連携  ・VM実行時エラーのモニター連携  ・デバックシステムの組込み(第1段階終了、全体の80%以上は終わったかな)  ・コンパイラのpool導入による高速メモリー確保と一括開放。  ・VMも一部Pool化。  ・VMの言語関数起動の最適化と高速化。  ・ライザ付属エディターの組込み。  ・LIZA.iniファイルによる初期化設定を組込み  等々いろいろ修正しました。特にデバッグシステムの組み込みは大きかった。 もう、文字で示すのも画像で示すのも困難と思うので。↓にUPしています。 http://ux.getuploader.com/yamamoto/download/2/debug.zip もしお暇がありましたら試してみて、何かありましたらよろしくお願いします。 まだ本体はCUIで出来ています。多分バグだらけです。  手順は、ライザデバックモニタ「LZ_moniter1_001.exe」を実行して、本体の 「lz002.exe」を実行するとデフォルトの「start.lzp」を実行します。以前出した タイマプログラムです。  2つともローカルでUDP通信をしているので、通信許可でお願いします。 初期起動時は、UDP通信がごっそり抜ける時があるので、本体は2回以上起動して みたほうがいいかもしれません。時々モニターのログが抜ける時があります  本体はデバックモードのままなのでEXEも大きく、動作はとても遅いです。 大量のデバックトレースをモニターに送っているので。  また、XXX.lzpの起動をlz002.exeに起動リンクすれば、その他のプログラムは、 ダブルクリックで直接実行できます。そこに入っているXXX.lzpは総て動きます。 ただ、修正するとこける可能性が高いです。試作以前の段階なので。  デバックの組込みで以下の言語仕様が追加されました。 ただ、まだほとんど機能しません。本体のGUIを作る時でないと2度手間に なってしまうので。  次からはようやくアプリケーションの本体です。ああ~~長かった~ 次も長いんだろうな //-- デバック行コントロール ------------- #define DBL        // デバック行有効 //#define DBL       /-/ // デバック行のコメント化 //-- デバック関係関数 ----------------------- #define 一時停止    debug_break //-- デバックログ関係関数 ------------------- #define ファイル表示  debug_file_disp // モニタにファイル表示 #define トレースログ  debug_trace_log // トレースログに表示 #define システムログ  debug_system_log // sysログに表示 #define ログ1      debug_log1 // ログ1に表示 #define ログ2設定    debug_log2_set // ログ2にタブ追加設定 #define ログ2      debug_log2 // ログ2に表示 #define ログsys変数   debug_sysval // ログするシステム変数の登録 #define クリア     "クリア" // ログするシステム変数のクリア //-- デバックモニタ制御関数 ------------------- #define デバックモニタ制御 debug_monitor_control #define 変数ログクリア   1 // モニタ02の変数ログクリア #define 全ログクリア    2 // モニタ01全ログクリア #define トレースログクリア 3 // トレースログクリア #define sysログクリア    4 // sysログクリア #define ログ1クリア     5 // デバックログ1クリア #define ログ2クリア     6 // デバックログ2クリア //-- ログ出力制御用システム変数 --------------- #define 全ログSW      SLI001 // 全てのログ0:停止1:開始 #define トレースログSW   SLI002 // トレースログSW #define システムログSW   SLI003 // #define ログ1SW       SLI004 // #define ログ2SW       SLI005 // #define ローカル変数ログSW SLI006 // #define システム変数ログSW SLI007 // //-- 組込み関数宣言 -------------------- DBL int 一時停止()     // 戻り=0 DBL int デバックモニタ制御(int type); // 戻り=0 DBL int ファイル表示(string fname); // 戻り=0 DBL int システムログ(string str); // 戻り=0 DBL int トレースログ(string str); // 戻り=0 DBL int ログ1(string str); // 戻り=0 DBL int ログ2設定(string tag_name); // 戻り=log2id DBL int ログ2(int log2id,string str); // 戻り=0 DBL int ログsys変数(string str); // 戻り=0 //--------------------------------------
[この投稿を含むスレッドを表示] [この投稿を削除]
[1412] Re:「プログラミング言語を作る」について
投稿者:名無しの読者
2009/07/27 20:28:42

>この週末は、土曜の夜からなんだかまぶたが腫れ上がってましてほとんど寝てました >(医者には行って薬ももらいましたが、原因は不明です)。 >反応が遅れましてすみません。 いえいえ、十分反応は早いですよ。 最近の投稿の時間を見ると夜中の3時前後・・・。 余計なことかもしれませんが、あまり無理をなさらずに。 ご自愛ください。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1411] Re:「プログラミング言語を作る」について
投稿者:(ぱ)こと管理人
2009/07/27 03:09:48

この週末は、土曜の夜からなんだかまぶたが腫れ上がってましてほとんど寝てました (医者には行って薬ももらいましたが、原因は不明です)。 反応が遅れましてすみません。 >プログラミング言語を作るをもう一度読んでいて2つミスプリントを見つけました。 > >p106 3-3-3「解析木の構築---corwbar.yとcreate.c」の第5パラグラフに >「アクションにて、crb_crete_binary_expression()」とありますが、 >「アクションにて、crb_create_binary_expression()」だと思います。 > >p189 補足「別のあるべき姿---Code Set Independent」の最後から3つめのパラグラフに >「それに対し、CSIだと(N-1)必要になります。」とありますが、 >これではUnicodeに正規化する方法よりエンコーディングを変換するコンバーターが少なくなってしまいます。 >(N-1)はN(N-1)の間違いでしょうか? たびたびすみません。ご指摘ありがとうございます。 正誤表に追加しました。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1410] Re:「プログラミング言語を作る」について
投稿者:名無しの読者
2009/07/26 21:09:33

プログラミング言語を作るをもう一度読んでいて2つミスプリントを見つけました。 p106 3-3-3「解析木の構築---corwbar.yとcreate.c」の第5パラグラフに 「アクションにて、crb_crete_binary_expression()」とありますが、 「アクションにて、crb_create_binary_expression()」だと思います。 p189 補足「別のあるべき姿---Code Set Independent」の最後から3つめのパラグラフに 「それに対し、CSIだと(N-1)必要になります。」とありますが、 これではUnicodeに正規化する方法よりエンコーディングを変換するコンバーターが少なくなってしまいます。 (N-1)はN(N-1)の間違いでしょうか?
[この投稿を含むスレッドを表示] [この投稿を削除]
[1409] Re:「プログラミング言語を作る」について
投稿者:(ぱ)こと管理人
2009/07/23 02:11:11

>>確かにPerlのlocalはダイナミックスコープですから、CやJavaのローカル変数とは >>挙動が異なります。とはいえグローバル変数とも明確に違うものだと思います。 >確かにその通りのようです。 一応、「プログラミング言語を作る」では、p.153にて、本当にちょっとだけ ダイナミックスコープの説明をしています。お気づきかもしれませんが念のため 補足します。 今読み返すと、ここでのCRB_LocalEnvironment構造体のnextメンバが何を 指しているのかわかりにくいような気がします…… ここでのnextは、 呼び出し元のCRB_LocalEnvironment構造体を指しています。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1408] Re:マルチスレッドについて
投稿者:(ぱ)こと管理人
2009/07/23 02:05:08

ひとまずここだけ。 > Windowsのメッセージシステム…、あれは同期非同期以前のシーケンシャル >処理システムなんです。1スレッドでメッセージ取り出しループ処理して、メッセー >ジを受け取り、そのメッセージに対応する関数を呼んでいるだけで、並列処理は >していないです。 Windowsのメッセージシステムが並列でないのは当然ですけど、 ブラウザであれば、コンテンツの取得の方を別スレッドで回せるはずですよね。 IEがどうなっているかは知りませんが、いまどきのアプリですから当然そうなって いるのではないでしょうか。 でも、コンテンツ取得スレッドがネットワークの待ちでブロックされていたり、 ActiveXコンポーネントが動作中だったりすると、結局×ボタンで止められない ような感じがしています。まあいろいろ難しいよね、という程度の意味です。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1407] Re:「プログラミング言語を作る」について
投稿者:名無しの読者
2009/07/22 20:51:40

>確かにPerlのlocalはダイナミックスコープですから、CやJavaのローカル変数とは >挙動が異なります。とはいえグローバル変数とも明確に違うものだと思います。 確かにその通りのようです。 >>myがない頃はlocalが使われていたそうですが、なぜmyより先にlocalが作られた >>のでしょう? > >過去のある一時点において、多くの人が「ダイナミックスコープかっこいい!」と >思ったことがある、ということなのではないでしょうか。 そういう歴史があるとは知りませんでした。 わざわざ回答してくださってありがとうございます。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1406] Re:マルチスレッドについて
投稿者:
2009/07/22 20:46:20

>一応検索はしたのですが、Googleでは普通に非同期処理の記事しか出てこなかった >ような……  私のほうでは出るのですが…、では「非同期分散処理」という言い方でも いいかな、「非同期処理」までいくと意味合いがちょっと違うんですよね。 >ここのところが、yieldとかwait()とかの方法ではいけないのかな、というのが >私の疑問です。  その場合、キュー処理にいろいろ問題が出てくるのです。まず第1に、キューの 優先順位ができない、全部のスレッドに優先順位処理を作りこめばいいのかも しれませんが、まったく非効率です。次に、キューを送る元と受け側が同期処理 していなければいけない。こえは、たとえば受け側がキューを処理中に、いくつも キューを送れない。これもまた各スレッドに…。つぎに、受け側がスレッドを 終了した場合、送り元に終了した旨の連絡して止めてもらう同期処理をしなければ、 相手がいないのにキューを送って宙ぶらりんとなる。等々キュー処理には(ぱ)さん が示したスレッドの関数だけでは無理なことが多いです。  いろいろと作りこめば非同期もできます。しかしそれには、そのスレッド以外 でキューの管理システムを作らなければならないわけで。使用者にその管理部分 を作れと要求しているわけです。その要求をしている言語は「非同期分散処理」 をサポートしているとはいえません。  (作れば何でもできると考えれば、アセンブラでOKってなってしまう)  また、スレッド起きに監視ループが必要になってきますが。私が作りたい のは何十何百ものスレッドをターゲットに考えているので、そのスレッドの待機 処理時間が馬鹿にならないのです。私の言語は100スレッドあっても、待機時は 負荷0です。  「非同期分散処理」を純粋にサポートしようと思ったら、今のスレッド仕様で は無理があるのです。C言語でも、OOPの様にクラスやカプセル化のようなことが 出来ます。でもだれもC言語がOOP言語とは言いません。それと同じことを言って いるように感じます。単純な基本機能があれば、その組み合わせでほとんどの ことが出来ます。しかし、その言語でできる事をサポートしているとはいえま せん。 >固定個のスレッドプールを持っているようなので、それを使い切った場合を想定して >いるのでしょうか? うーん。  いえ、「非同期分散処理」を言語レベルでサポートするためにです。 >脱線しますけど、よく言われるマルチスレッドのメリットで、GUIのスレッドを >処理のスレッドと分けておけば、ユーザの操作にすぐ反応できる、というのが >ありますけど、じゃあ重たいページをIEで表示してしまった時、×ボタンですぐに >停止できるのかというと、さっぱり押せないことばっかりで……  Windowsのメッセージシステム…、あれは同期非同期以前のシーケンシャル 処理システムなんです。1スレッドでメッセージ取り出しループ処理して、メッセー ジを受け取り、そのメッセージに対応する関数を呼んでいるだけで、並列処理は していないです。だからその関数が終わらないと次の処理ができないシステム です。IEの中身がどうなっているかわかりませんが。即応できるシステムを作る のは難しいと思います。  だからと言って、私の言語は即応かというと、作り方いかんで幾らでも遅く 作れますし、シングルスレッドでも作り方いかんでは早く処理できるし。  マルチスレッドの方が融通は利きますが、その件は本質ではないと思います。 「非同期処理」だとイメージが違ってくるんです。掲示板で説明するのは難しい ので、作ったソフトを動かしてもらえれば…、ずいぶん先になりますが…。  PS.終了だけを考えれば、私の言語は終了は遅いです。言語上のスレッドの 終了処理、VMスレッドの終了処理、その他組み込みスレッドの終了処理、 それぞれにリソースの開放処理等々、多分重い。  終了は結構大変です。問題なければ1秒以内に終わると思いますけど。 何か問題があって、タイムアウト待ちでもしようものなら。冷汗たらー
[この投稿を含むスレッドを表示] [この投稿を削除]
[1405] 言語のデバックシステム
投稿者:
2009/07/22 20:10:38

 下記に示すURLに言語デバックシステムのプロトタイプイメージが あります。 http://dl7.getuploader.com/g/yamamoto/1/lz_db.gif こんな感じのデバックシステムを作る予定。エラーが発生したら、 モニターにファイルと行を表示して修正ができます。ただし、行番号 はないので、好みのエディターを使いたい場合は編集を押押すか エディターを登録してそのエディターを起動します。  ファイルタブは、ファイルリストとファイルが表示され編集可能 です。簡単な修正ならここでできます。  関数のトレースとログ1はスレッド置きにタブが作成されるので、 トレースが混合してわけワカメにならない予定。タブは200まで自動 で増えるので問題なし。  システム情報のログはsysログに、自由に定義して使用可能なのが ログ2です。また、モニタ02がローカル変数とシステム変数のログ を表示します。全部でモニター2種、本体1を起動します。  通信はUDPを使うので、LAN内の他PCでモニターできます。  これはまだGUIを作ったものなので、これから詳細の実装です。 また、本体の表示部分はできていないので、真っ黒です。それ に、右上の実行・ステップ・ステップインのボタンはイメージで、 画像合成です。こんなボタンとシステムログが透過で表示される 予定。  久しぶりにC#触ったけど、ユーザーインターフェース作るのが簡単だった。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1403] Re:マルチスレッドについて
投稿者:(ぱ)こと管理人
2009/07/22 03:33:57

回答が遅れましてすみません。 >でも、初期起動の中で必要なことを実行して、終了リターン >すれば、普通のスレッドと同じことが出来ます。 ここは了解です。 >違いは待機リターンが有りキュー待ち状態で待機できることです。 ここのところが、yieldとかwait()とかの方法ではいけないのかな、というのが 私の疑問です。 もちろん、yieldとかwait()とかで待つためには、VMがその状態を保持しなければ ならないので、固定数のネイティブスレッドのスレッドプールしか持たないのであれば 理解できます。これは前回 >固定個のスレッドプールを持っているようなので、それを使い切った場合を想定して >いるのでしょうか? うーん。 と書いたとおりです。 >これを説明しようとすると、とても長くなってしまいます。もしよろしけ >れば、「非同期協調処理」「非同期協調作業」「非同期分散処理」を検索 >していただければ嬉しいです。 一応検索はしたのですが、Googleでは普通に非同期処理の記事しか出てこなかった ような…… > 普通のスレッドを使用しないの理由は、起動するのも遅いし、終わる >のも遅い、非同期協調作業が出来るほど軽いものじゃないです。それに、 >キュー処理にはまったく対応していない。 脱線しますけど、よく言われるマルチスレッドのメリットで、GUIのスレッドを 処理のスレッドと分けておけば、ユーザの操作にすぐ反応できる、というのが ありますけど、じゃあ重たいページをIEで表示してしまった時、×ボタンですぐに 停止できるのかというと、さっぱり押せないことばっかりで……
[この投稿を含むスレッドを表示] [この投稿を削除]
[1402] Re:「プログラミング言語を作る」について
投稿者:(ぱ)こと管理人
2009/07/22 02:58:59

>P85の補足「各言語のグローバル変数の扱い」のPerlの部分に「localとかmyとかを >付けて宣言するとローカル変数となる。」とあります。 >しかし、Cやjavaをおもに使っている人にとってlocalがローカル変数というのは >かなり違和感があると思います。 確かにPerlのlocalはダイナミックスコープですから、CやJavaのローカル変数とは 挙動が異なります。とはいえグローバル変数とも明確に違うものだと思います。 以下のサンプルで、きっぱり再帰できていますし。 ================================================== &hoge(0); sub hoge { my $depth = shift; #print 'depth..' . $depth; if ($depth > 2) { return; } local $i; for ($i = 1; $i <= 3; $i++) { print ' ' x $depth . '$i..' . $i . "\n"; hoge($depth + 1); } } ================================================== 私の感覚だと、ダイナミックスコープの変数は、自分自身とそこから呼び出された 関数からしか見えないという点でローカルだと思うのですが、確かに単に 「localとかmyとかを付けて宣言するとローカル変数となる。」とだけ書いて しまうのは確かに乱暴かもしれません。まあでもここはPerl, Ruby, PHPそれぞれの 言語の特徴をさらりと書いているだけのところなので、正誤表に載せるような ことではないのでは、と思います。 後日、補足記事をWebに上げようかと思います。 >myがない頃はlocalが使われていたそうですが、なぜmyより先にlocalが作られた >のでしょう? 過去のある一時点において、多くの人が「ダイナミックスコープかっこいい!」と 思ったことがある、ということなのではないでしょうか。 http://hagi.is.s.u-tokyo.ac.jp/pub/essay/hagiya/h/tensai | 僕は、Schemeの開発こそ、コンピュータ・サ | イエンスの典型的なセンスの一つではないかと | 思うのである。それまでは、LISPの考案者 | McCarthyのまやかしともいえる「変数の動的な | スコープ」に、皆がだまされ続けていたわけで | ある。 http://www.rubyist.net/~matz/20041025.html#p01 | 歴史的にはLispは(少なくともインタプリタ処理系では)、ダイナミックスコープが | 当たり前だったのだが、SchemeやCommonLisp以来すっかりスタティックスコープの | 言語になってしまっている。ダイナミックスコープなら外側のローカル変数もごく | 自然に見える。変数名の重複にだけ気をつければ良い(そういう意味ではcondやcommの | ようなありふれた引数名は良くない)。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1401] Re:「プログラミング言語を作る」について
投稿者:名無しの読者
2009/07/21 21:32:14

もう一つ間違いとは言い切れないのですが、気になったところがあるのでついでに書いておきます。 P85の補足「各言語のグローバル変数の扱い」のPerlの部分に「localとかmyとかを付けて宣言するとローカル変数となる。」とあります。 しかし、Cやjavaをおもに使っている人にとってlocalがローカル変数というのはかなり違和感があると思います。 例えば、localを使った次のようなプログラムだとおかしな結果になります。 =============================================================== #!/usr/bin/perl $hoge = "global"; &func_local; &func_my; sub print_hoge { print "hoge is $hoge\n"; } sub func_local { local $hoge = "local"; print "func_local: "; print_hoge; } sub func_my { my $hoge = "my"; print "func_my: "; print_hoge; } =============================================================== 上記のプログラムを実行すると出力結果は func_local: hoge is local func_my: hoge is global になります。 myをつけた変数はCのローカル変数と同じように使えますが、localをつけた変数はCのローカル変数とは違います。 ちなみに、「初めてのPerl 第3版」の4.7 local演算子には「しかしlocalという名前は間違っています---あるいは、少なくとも、誤解を招く名前です。(中略)そうです、local変数と呼ばれる変数の正体は、実はグローバル変数なのです!」と書かれています。 myがない頃はlocalが使われていたそうですが、なぜmyより先にlocalが作られたのでしょう? 実装が楽だったとかなのでしょうか。 Cより新しい言語なのにCと同じローカル変数が使えなかったというのはどうなんだ・・・。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1400] Re:「プログラミング言語を作る」について
投稿者:(ぱ)こと管理人
2009/07/21 03:04:21

「名無しの読者」様 >「プログラミング言語を作る」を読ませていただきました。 >前橋さまの本は「C言語 ポインタ完全制覇」から読んでいるのですが、 >今回もおもしろい内容でした。 ありがとうございます。 >と書かれていますが、「Javaならファイナライザ、C++やC#なら・・・」の >間違いではないでしょうか? ご指摘ありがとうございます。正誤表に載せておきました。 普通に読んで変だと思う(たとえJavaやC++やC#をまったく知らなかったとしても!)であろう 文章であるにもかかわらず、チェック時に見落とすとは、人間の思い込みとは 侮れないものです……
[この投稿を含むスレッドを表示] [この投稿を削除]
[1399] 「プログラミング言語を作る」について
投稿者:名無しの読者
2009/07/20 15:43:49

前橋さま 「プログラミング言語を作る」を読ませていただきました。 前橋さまの本は「C言語 ポインタ完全制覇」から読んでいるのですが、 今回もおもしろい内容でした。 ところで、ミスプリントらしい部分を見つけました。 303ページの補足「ファイナライザというかデストラクタというか」の第1パラグラフに 「Javaならデストラクタ、C++やC#ならデストラクタというメソッドが呼び出されます。」 と書かれていますが、「Javaならファイナライザ、C++やC#なら・・・」の 間違いではないでしょうか? まだ、正誤表には載っていなかったようなので。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1398] Re:マルチスレッドについて
投稿者:
2009/07/19 23:45:20

以下の2行がミスです > なぜこうしたのかは、真に意味で完全な非同期協調処理をするためです。   ↓ > なぜこうしたのかは、真の意味で完全な非同期協調処理をするためです。 > この説明で、疑問に答えられてのかまったく持って不安です。   ↓ > この説明で、疑問に答えられたのかまったく持って不安です。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1397] Re:マルチスレッドについて
投稿者:
2009/07/19 10:35:19

>「終了指示」を含めると8回になるように思えるのですが……  タイマ表示関数に終了指示の処理がありますが、それのデバックのために 書いた部分が残っていました。このプログラムでは終了指示は出していない ので、7回です。 終了待ちをする関数コール > rtn[0] = スレ終了待ち(sid[0],終了待ち,10); 終了指示を出し終了を待ちをする関数コール > rtn[0] = スレ終了待ち(sid[0],終了指示待ち,10);  出したプログラムは上のコールを使っていました。 誤解を与えるようなプログラムですみません。 >私が不思議なのは、なぜユーザプログラムの側をこのように細切れに >呼び出さなければならないのか、ということです。ユーザプログラムが >自ら処理を明け渡す必要がないことが、マルチスレッドの利点だと思う >のですが。  一般的なマルチスレッドと、私が組み込みたいマルチスレッドは性格が 少し違います。でも、初期起動の中で必要なことを実行して、終了リターン すれば、普通のスレッドと同じことが出来ます。違いは待機リターンが有り キュー待ち状態で待機できることです。  なぜこうしたのかは、真に意味で完全な非同期協調処理をするためです。 これを説明しようとすると、とても長くなってしまいます。もしよろしけ れば、「非同期協調処理」「非同期協調作業」「非同期分散処理」を検索 していただければ嬉しいです。いいHPでもあれば紹介するのですが、 びみょーに全部専門的で、びみょーに違うので。  簡単に言うと、真のマルチ処理(複数CPU)環境における、同期処理を 必要としないで協調してひとつの処理を実行する。ああ、言葉を長くした だけだ。orz  私はそれを、理論的に構築しようと思っているわけではなく、今のプロ グラミングパラダイム、この場合一番単純なC言語ライクな関数言語パラダ イムの上で、実際的に動くものを構築しようとしている、実利主義的に 泥臭いことをやっているわけです。動けばなんでもOK、きれいな理論なん て求めてません。^^ 的な立場で作っています。 (動けばなんでもOKだから、シートなんて取って付けた物を使うあたりが)  orz orz  その目的に必衰だったのが、今回のスレッドの仕様です。  普通のスレッドを使用しないの理由は、起動するのも遅いし、終わる のも遅い、非同期協調作業が出来るほど軽いものじゃないです。それに、 キュー処理にはまったく対応していない。  この説明で、疑問に答えられてのかまったく持って不安です。 もしよろしければ、説明不足な点をご指摘ください。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1396] Re:マルチスレッドについて
投稿者:(ぱ)こと管理人
2009/07/18 23:59:26

まず訂正です。 >>その「タイマ表示」関数は、引数のqidを順に >>変えながら、3回呼び出されているように見えますが……(そして毎回、自ら >>returnしている) 3回ではないですね。指定回数分だけqidが「タイマ」で呼び出されるのだろう、 ということは前回投稿時も認識していたはずですが、書き損じました。 >例えば、6回実行のスレは、初期1回とタイマー6回で、合計7回実行 >しています。 「終了指示」を含めると8回になるように思えるのですが…… それはさておき。 私が不思議なのは、なぜユーザプログラムの側をこのように細切れに呼び出さなければ ならないのか、ということです。ユーザプログラムが自ら処理を明け渡す必要が ないことが、マルチスレッドの利点だと思うのですが。 確認ですが、「スレ開始」(#defineをはがした実体はthread_start)は、山さんの 言語自体が提供しているシステム関数的なものですよね? そして、「タイマ表示」は、ユーザプログラマが作成することを想定したものですよね? マルチスレッドというのなら、ユーザのプログラムがreturnすることで処理を 手放さなくても、別のスレッドは動くわけですから、こんなふうに細切れに 呼び出さなくてもよいと思うのですが。この形式だと、ユーザプログラムは、 毎回カウンタを見て処理を切り替える必要があります。 固定個のスレッドプールを持っているようなので、それを使い切った場合を想定して いるのでしょうか? うーん。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1395] Re:マルチスレッドについて
投稿者:
2009/07/18 00:47:27

>2:キュー処理開始 vm=3 procid=0 Qid=1 p1=999 >2:キュー処理開始 vm=4 procid=1 Qid=1 p1=6 >2:キュー処理開始 vm=2 procid=2 Qid=1 p1=5 >2:キュー処理開始 vm=0 procid=3 Qid=1 p1=4 >2:キュー処理開始 vm=4 procid=1 Qid=2 p1=1 >2:キュー処理開始 vm=1 procid=2 Qid=2 p1=1 >2:キュー処理開始 vm=1 procid=3 Qid=2 p1=1 >2:キュー処理開始 vm=4 procid=1 Qid=2 p1=1 >2:キュー処理開始 vm=1 procid=2 Qid=2 p1=1 >2:キュー処理開始 vm=1 procid=1 Qid=2 p1=1 >2:キュー処理開始 vm=1 procid=3 Qid=2 p1=1 >2:キュー処理開始 vm=2 procid=1 Qid=2 p1=1 >2:キュー処理開始 vm=4 procid=2 Qid=2 p1=1 >2:キュー処理開始 vm=1 procid=1 Qid=2 p1=1 >2:キュー処理開始 vm=2 procid=3 Qid=2 p1=1 >2:キュー処理開始 vm=1 procid=2 Qid=2 p1=1 >2:キュー処理開始 vm=4 procid=1 Qid=2 p1=1 >2:キュー処理開始 vm=1 procid=2 Qid=2 p1=1 >2:キュー処理開始 vm=1 procid=3 Qid=2 p1=1  こ、これはVM1の実行が多い… タイマ処理が周期に比べて短くなったので、VMの待機状態が多くなったのでしょう。 その結果、VM1がキューをGETしやすいタイミングになったのではないかと思わ れます。VM3はmainが占有しているので。私のPCはデュアルなので、たまたま VM1が、空きCPUに割り振られたのかもしれませんね。  面白い結果だと思います。もう少し重くなれば結果的にCPUの処理に対して 均等に負荷が割り振られるでしょう。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1394] Re:マルチスレッドについて
投稿者:
2009/07/18 00:37:21

連投すみませんです。 このタイミングでスレを起動したときの実行結果です デバックトレースはそのままです。それらしい出力になったと思いますよ。   sid[0] = スレ開始("タイマ表示",200,6," 200ms"," で6回実行");   sid[1] = スレ開始("タイマ表示",300,5," 300ms"," で5回実行");   sid[2] = スレ開始("タイマ表示",400,4," 400ms"," で4回実行");   ↓   ↓   ↓ 3:### スレッド起動 ### 3: sid[0] =1 sid[1] =2 sid[2] =3 3:眠る前 ms=36239130 3:タイマ表示スレッド開始 SID=1 QID=1 回数=6 200ms で6回実行 3:タイマ表示スレッド開始 SID=2 QID=1 回数=5 300ms で5回実行 3:タイマ表示スレッド開始 SID=3 QID=1 回数=4 400ms で4回実行 3:タイマ表示 SID=1 QID=2 cnt=1 200ms で6回実行 3:眠る後 ms=36239440 3:タイマ表示 SID=2 QID=2 cnt=1 300ms で5回実行 3:タイマ表示 SID=3 QID=2 cnt=1 400ms で4回実行 3:タイマ表示 SID=1 QID=2 cnt=2 200ms で6回実行 3:タイマ表示 SID=2 QID=2 cnt=2 300ms で5回実行 3:タイマ表示 SID=1 QID=2 cnt=3 200ms で6回実行 3:タイマ表示 SID=3 QID=2 cnt=2 400ms で4回実行 3:タイマ表示 SID=1 QID=2 cnt=4 200ms で6回実行 3:タイマ表示 SID=2 QID=2 cnt=3 300ms で5回実行 3:タイマ表示 SID=1 QID=2 cnt=5 200ms で6回実行 3:タイマ表示 SID=3 QID=2 cnt=3 400ms で4回実行 3:タイマ表示 SID=2 QID=2 cnt=4 300ms で5回実行 3:タイマ表示 SID=1 QID=2 cnt=6 200ms で6回実行 3:タイマ表示スレッド終了 SID=1 QID=2 3:タイマ表示 SID=2 QID=2 cnt=5 300ms で5回実行 3:タイマ表示スレッド終了 SID=2 QID=2 3:タイマ表示 SID=3 QID=2 cnt=4 400ms で4回実行 3:タイマ表示スレッド終了 SID=3 QID=2 3: rtn[0] =0 rtn[1] =0 rtn[2] =0 3:### 全スレッド終了 ### 2:### システム開始----- 2:### 組込み関数登録処理開始----- 2:### 組込み関数登録処理終了----- 2:### CL_VMexeスレッド 開始 2:スレッドRUN開始 vmid=0 2:### CL_VMexeスレッド 開始 2:スレッドRUN開始 vmid=1 2:### CL_VMexeスレッド 開始 2:スレッドRUN開始 vmid=2 2:### CL_VMexeスレッド 開始 2:スレッドRUN開始 vmid=3 2:### CL_VMexeスレッド 開始 2:スレッドRUN開始 vmid=4 2:### コンパイル初期化処理開始----- 2:### コンパイル開始----- 2:### コンパイル終了----- 2:### コンパイルの総てのリソースを開放----- 2:キュー処理開始 vm=3 procid=0 Qid=1 p1=999 2:キュー処理開始 vm=4 procid=1 Qid=1 p1=6 2:キュー処理開始 vm=2 procid=2 Qid=1 p1=5 2:キュー処理開始 vm=0 procid=3 Qid=1 p1=4 2:キュー処理開始 vm=4 procid=1 Qid=2 p1=1 2:キュー処理開始 vm=1 procid=2 Qid=2 p1=1 2:キュー処理開始 vm=1 procid=3 Qid=2 p1=1 2:キュー処理開始 vm=4 procid=1 Qid=2 p1=1 2:キュー処理開始 vm=1 procid=2 Qid=2 p1=1 2:キュー処理開始 vm=1 procid=1 Qid=2 p1=1 2:キュー処理開始 vm=1 procid=3 Qid=2 p1=1 2:キュー処理開始 vm=2 procid=1 Qid=2 p1=1 2:キュー処理開始 vm=4 procid=2 Qid=2 p1=1 2:キュー処理開始 vm=1 procid=1 Qid=2 p1=1 2:キュー処理開始 vm=2 procid=3 Qid=2 p1=1 2:キュー処理開始 vm=1 procid=2 Qid=2 p1=1 2:キュー処理開始 vm=4 procid=1 Qid=2 p1=1 2:キュー処理開始 vm=1 procid=2 Qid=2 p1=1 2:キュー処理開始 vm=1 procid=3 Qid=2 p1=1 2:スレッドRUN終了 vmid=3 2:スレッドRUN終了 vmid=1 2:スレッドRUN終了 vmid=0 2:スレッドRUN終了 vmid=2 2:スレッドRUN終了 vmid=4 2:### CL_VMexeスレッド 終了 2:### CL_VMexeスレッドハンドルをクローズしました 2:### CL_VMexeスレッド 終了 2:### CL_VMexeスレッドハンドルをクローズしました 2:### CL_VMexeスレッド 終了 2:### CL_VMexeスレッドハンドルをクローズしました 2:### CL_VMexeスレッド 終了 2:### CL_VMexeスレッドハンドルをクローズしました 2:### CL_VMexeスレッド 終了 2:### CL_VMexeスレッドハンドルをクローズしました 2:#debugMsg 残っているメモリーを開放 66 66 2:#debugMsg 残っている配列メモリーを開放 26 26 2:### システム終了----- 2:### CL_systemスレッド 終了 2:### CL_systemスレッドハンドルをクローズしました 2:### ダミーmain終了-----
[この投稿を含むスレッドを表示] [この投稿を削除]
[1393] Re:マルチスレッドについて
投稿者:
2009/07/17 21:55:22

ミスです… orz >  初期化とパラメーターをセーブして、待機終了 returnする >  初期化とパラメーターをセーブして、待機returnする
[この投稿を含むスレッドを表示] [この投稿を削除]
[1392] Re:マルチスレッドについて
投稿者:
2009/07/17 21:31:11

 追記の追加。  このプログラムは、周期タイマーを例に挙げていますが。本来の使い方は、 メッセージキューによる、完全非同期協調作業のための機能です。 おもに、スレが起動されたらすぐにキュー待ちになり。作業要求が来たら 処理するためにあります。仮にスレッドが100有っても、キュー待ち状態 のときは、CPU負荷が0なのでなんら問題は有りません。  う~~これ以上は、絵に描いた餅になりそうなのでこれで終わって。 実物のソフトで示して行きたいと思います。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1391] Re:マルチスレッドについて
投稿者:
2009/07/17 20:40:51

 追記、オンメモリーだけでも切り替わりのタイミングを調べるのは困難かも しれない。切り替わったことを調べるためには、それぞれのタイミングで どこかにその情報を書くのですが、書き先は順番が分かるために共通の場所に 書かなくてはいけないのだけど、共通の場所とは、セマホ等で排他処理をする わけで、排他処理の時点でスレッドが切り替わってしまうので。意味が無い。  物理的に信号監視できるICEがほしいと思ってしまう。^^ まあ問題が起こらなければ、いつ起ころうが関係が無いですけどね。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1390] Re:マルチスレッドについて
投稿者:
2009/07/17 20:30:56

>ここで、スレッドを3本起動しており、「タイマ表示」という関数名の関数を >呼び出しているようですが、その「タイマ表示」関数は、引数のqidを順に >変えながら、3回呼び出されているように見えますが……(そして毎回、自ら >returnしている)  ああ、やっぱりそう見えましたか。実は裏のデバックトレースが重過ぎて 実行が周期内に終わっていないのです。常にオーバフロー状態なんです。 で、デバックトレースOFFにすると、表示自体がデバックモニターの分類3 を使っているので、表示も消えてしまうと言うジレンマが…  なので、最後にデバックトレースのサンプルを出したのですが、やはり^^; 実際は、VMの実行がトレースのためにめちゃくちゃ遅いのです。プログラムの 途中で処理が変わるどころか、バイトコード1命令の実行の中で2-4回VMが 変わって、VMがそれぞれの担当処理を実行しようとがんばっています。 しかし、デバックトレースは、UDP通信でデバックモニターに送っているので、 その通信をしたタイミング(通信処理のためのスレ一時中断)でスレッド チェンジが起こってしまっています。デバック情報1行送るたびにスレッドが ころころ変わってしまっています。  まあでも、とてもいいデバック環境でした、ほんの些細なタイミングミスも、 ころころ引っかかるので、もう異常が出まくりでした。つぶすのは大変で したが、つぶし終わった後いろいろ変えてもなんら問題がおきませんでした。  で、そのまま使ってたデータで文を作ってUPした後、これまずいかなーと 思って、デバックトレースサンプルを追加してみました。  間違いなく、main+3スレッド=4スレッド、細切れどころかミジン切れの 状態で動いています。後で、タイミングを長くしたものの出力でもUPします。 今ちょっとノートPCシステム入れ直ししてて、それにかかりっきりで… 手順を簡単に説明すると。下のスレ開始から > sid[0] = スレ開始("タイマ表示",40,6," 40ms"," で6回実行"); 1、スレッド初期起動キューが作成される 2、空きVMがキューをGET位して、タイマ表示関数を実行 3.タイマ表示関数は初期起動なので、システム変数を生成し   初期化とパラメーターをセーブして、待機終了 returnする 4、管理部分が、周期起動のスレッドが有るので、そのスレッド向けに   時間が来たら、周期起動のキューを作る。 5.空きVMが周期起動キューを取り出し、その関数を実行する。 6.タイマ表示関数は周期起動キューで起動されたことを理解して   カウンタを+1して、そのカウンタを表示する。そして待機return 7.また4に戻り周期キューが作成されるー>4に戻り 8.タイマ表示関数は周期起動キューの中で、回数値とカウンタを   比較してカウンタ>=回数なら、終了returnして、スレッドが終わる。  こんな感じで動いています。たぶん説明が抜けていたのは、システムが 周期キューを生成している部分だと思います。 例えば、6回実行のスレは、初期1回とタイマー6回で、合計7回実行 しています。  スレ1が7回、スレ2が6回、スレ3が5回実行しています。 で、タイマ表示関数は周期に追いついていないので、システムは回数以上 の周期タイマーキューを生成していて、VMが実行しようとしています。 また、ちがうVMが同じスレッドの周期キューを平行して実行しようと してしまいます。もちろんこれは問題が起こるので、そうならないように 作られています。言葉で言うと簡単そうですが、複雑な制御をしています。  常に重い状態で動いているので、キューが溜まってヘビーな状態で デバックをしていました。 >「タイマ表示」関数がreturnしないまま、別のスレッドに制御を奪われることって >あるんでしょうか? もう、1回のキュー処理で数十回はVMのスレッドチェンジが起こっています。 各スレッド処理は、みじん切りの細切れで並列に動いています。 デバックトレースを止めればそのようなことは無いと思います。  デバックトレースを止めた時に、どの様なタイミングで切り替わるかは 興味があります。しかしそれを調べるためには、表示は一切使えないんで すねね、なんに表示してもその間に切り替わるから。オンメモリーだけで 高速のトレーサでも作りこまないと、それでも、VMの方が早いかもしれ ない。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1389] Re:【業務連絡】雑記帳が使えなくなっています
投稿者:(ぱ)こと管理人
2009/07/17 03:09:23

ホイヘンスさん、はじめまして。 情報ありがとうございます。 >駄文なページの「表計算ソフトって」のページで >Parse error: syntax error, unexpected '^' in /home/km3943/public_html/essay/excel.html on line 62 > >「15パズルの作り方」のページで >Parse error: syntax error, unexpected '^' in /home/km3943/public_html/essay/puzzle.html on line 181 ただのHTMLファイルのはずなのに、なぜかPHPが動いていますね…… .htaccess等でそのような設定にすることはできますが(そして雑記帳では、 その設定を入れていますが)、ここにはそのような設定ファイルは置いていません。 実は今、トップのディレクトリに.htaccessがなぜかあるのを発見し、 これのせいかと思ったのですが中身は0バイトでした(削除しても直らないですし)。 さすがに今は眠いので週末もう少し追ってみます。 情報ありがとうございました。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1388] Re:マルチスレッドについて
投稿者:(ぱ)こと管理人
2009/07/17 02:59:59

すみません、今みっつくらいよくわからないのですが、 > sid[0] = スレ開始("タイマ表示",40,6," 40ms"," で6回実行"); > sid[1] = スレ開始("タイマ表示",60,5," 60ms"," で5回実行"); > sid[2] = スレ開始("タイマ表示",80,4," 80ms"," で4回実行"); ここで、スレッドを3本起動しており、「タイマ表示」という関数名の関数を 呼び出しているようですが、その「タイマ表示」関数は、引数のqidを順に 変えながら、3回呼び出されているように見えますが……(そして毎回、自ら returnしている) >int タイマ表示(int sid, int qid,int p1, string p2, string p3) >{ > string questr = " SID=" + sid + " QID=" + qid; > if(qid == スレッド開始) { > // スレッド起動時のみ時実行 -------------- > println("タイマ表示スレッド開始"+questr+" 回数="+p1+p2+p3); > システム変数("HAI000-HAI001",生成); > カウント = 0; > 回数 = p1; > システム変数("HAS000-HAS001",生成); > P2STR = p2; > P3STR = p3; > } elsif(qid == タイマ) { > // タイマキューにより実行 -------------- > カウント++; > println("タイマ表示"+questr+" cnt="+カウント+P2STR+P3STR); > if(カウント >= 回数) { > println("タイマ表示スレッド終了" + questr); > return スレッド終了; > } > } elsif(qid == 終了指示) { > println("タイマ表示 終了指示により終了" + questr); > return スレッド終了; > } else { > println("タイマ表示スレッド エラー終了" + questr); > return スレッドエラー終了; > } > return スレッド待機; >} 「タイマ表示」関数がreturnしないまま、別のスレッドに制御を奪われることって あるんでしょうか?
[この投稿を含むスレッドを表示] [この投稿を削除]
[1387] 参考までにデバックトレース
投稿者:
2009/07/16 01:47:59

 参考までに今の2+VM5の7スレッド実行状態でのデバックトレースを 下記に示しますが、もうなんというか、7スレッド入り乱れたトレースで わけわからん状態です。デバックモニターシステムは4分類あるのですが スレ起きに無いともう分けわかめで、デバックモニターシステムも修正です。  下記ではVM内でぶちぶちにスレッドが入れ替わっている状態が見れます。 ---------------------------------------------------- 1:eq_int PC=25 sp=292 1:eq_int PC=25 sp=292 1:add_string PC=6 sp=416 1:add_string PC=6 sp=424 1:00B5FF54 : ES_INT size=12605 ref=NON int=1 1:00B6FF94 : ES_INT size=12605 ref=NON int=1 1:00BA2160 : ES_STRING size=40 ref=NON string="タイマ表示スレッド開始 SID=1 QID=1 回数=6 40ms で6回実行 " 1:00B916B8 : ES_STRING size=40 ref=NON string="眠る前 ms=40224457 " 1:jump_if_false PC=26 sp=276 1:jump_if_false PC=26 sp=276 1:call_function PC=7 sp=376 1:call_function PC=7 sp=384 1:00B5FF64 : ES_FUNCTION size=244 1:00B6FFA4 : ES_FUNCTION size=244 1:#-C_NF_print::funcexe() 1:#-C_NF_print::funcexe() 3:タイマ表示スレッド開始 SID=1 QID=1 回数=6 40ms で6回実行 1: 関数からの戻りプログラムカウンタ = 0 3:眠る前 ms=40224457 1: 関数からの戻りプログラムカウンタ = 0 1:00BA2178 : ES_INT size=16 ref=NON int=0 1: 関数からの戻りスタックポイント = 0 1:00B916D0 : ES_INT size=16 ref=NON int=0 1: 関数からの戻りスタックポイント = 0 1:pop PC=16 sp=352 1: VMが起動する関数情報 = 00BC60F0 1:pop PC=16 sp=360 1: VMが起動する関数情報 = 00BC60F0 1:00BA2188 : ES_FUNCTION size=320 1: ローカル変数数 = 6 1:00B916E0 : ES_FUNCTION size=352 1: ローカル変数数 = 6 1: 関数からの戻りプログラムカウンタ = 62 1:push_string_const PC=29 sp=260 1: 関数からの戻りプログラムカウンタ = 168 1:push_string_const PC=29 sp=260 1: 関数からの戻りスタックポイント = 65276 1:00B5FF3C : ES_STRING size=40 ref=NON string="タイマ表示スレッド開始" 1: 関数からの戻りスタックポイント = 65268 1:00B6FF7C : ES_STRING size=40 ref=NON string="タイマ表示スレッド開始" 1: VMが起動する関数情報 = 00BC6F48 1:push_stack_string PC=32 sp=300 1: VMが起動する関数情報 = 00BC6F48 1:push_stack_string PC=32 sp=300 1: ローカル変数数 = 1 1:00B5FF14 : ES_STRING size=40 ref=00B5FFB8 string=" SID=2 QID=1" 1: ローカル変数数 = 1 1:00B6FF54 : ES_STRING size=40 ref=00B6FFF8 string=" SID=3 QID=1" 1:push_int_1byte PC=17 sp=336 1:add_string PC=35 sp=340 1:push_int_1byte PC=17 sp=344 1:add_string PC=35 sp=340 1:00BA2178 : ES_INT size=16 ref=NON int=0 1:00B5FF3C : ES_STRING size=40 ref=NON string="タイマ表示スレッド開始 SID=2 QID=1" 1:00B916D0 : ES_INT size=16 ref=NON int=0 1:00B6FF7C : ES_STRING size=40 ref=NON string="タイマ表示スレッド開始 SID=3 QID=1" 1:return PC=19 sp=352 1:push_string_const PC=36 sp=300 1:return PC=19 sp=360 1:push_string_const PC=36 sp=300 1:00BA21C4 : ES_INT size=16 ref=NON int=0 1:00B5FF14 : ES_STRING size=40 ref=NON string=" 回数=" 1:00B9171C : ES_INT size=16 ref=NON int=0 1:00B6FF54 : ES_STRING size=40 ref=NON string=" 回数=" 1:pop PC=62 sp=276 1:add_string PC=39 sp=340 1:pop PC=168 sp=284 1:add_string PC=39 sp=340 1:00BA21D4 : ES_FUNCTION size=244 1:00B5FF3C : ES_STRING size=40 ref=NON string="タイマ表示スレッド開始 SID=2 QID=1 回数=" 1:00B9172C : ES_FUNCTION size=124 1:00B6FF7C : ES_STRING size=40 ref=NON string="タイマ表示スレッド開始 SID=3 QID=1 回数=" 1: 関数からの戻りプログラムカウンタ = 0 1:push_stack_int PC=40 sp=300 1: 関数からの戻りプログラムカウンタ = 0 1:push_stack_int PC=40 sp=300 1: 関数からの戻りスタックポイント = 0 ----------------------------------------------------------------
[この投稿を含むスレッドを表示] [この投稿を削除]
[1386] Re:システム変数について
投稿者:
2009/07/16 01:17:37

あれからもいろいろ考えましたが、システム変数をシート形式でやる方法 以上の良い案が浮かびませんでした。ワーク用のグローバル変数を作ること は簡単なのですが、サービスのほとんどはシート上にて提供されるため、 これを越える案が今の所出そうに無いです。  もしよろしければ、システム変数が座標であることは少し目をつぶって いただけたら嬉しいです。確かに私も抵抗が有りますが、良い代替案が浮か ばない、有れば変えるのもそう難しくないと思います。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1385] プログラムのアセンブラコード
投稿者:
2009/07/16 01:00:50

 下記はプログラムのアセンブラコードです、特に何も変わっていませんが、 ごく普通のコードでマルチスレッドを問題なく実行しています。 1:*** 一般関数情報ダンプ ****************** 1:int main_001() 1:*** ローカル変数の表示 no = 2 *** 1: 0:int [3] sid 1: 1:int [3] rtn 1:*** 配列定数 数 = 0 ********** 1:*** 文字列 数 = 25 *** 1: 0: "main_001" 1: 1: "sid" 1: 2: "rtn" 1: 3: "### スレッド起動 ###" 1: 4: "println" 1: 5: "タイマ表示" 1: 6: " 40ms" 1: 7: " で6回実行" 1: 8: "thread_start" 1: 9: " 60ms" 1: 10: " で5回実行" 1: 11: " 80ms" 1: 12: " で4回実行" 1: 13: " sid[0] =" 1: 14: " sid[1] =" 1: 15: " sid[2] =" 1: 16: "眠る前 ms=" 1: 17: "get_ms_time" 1: 18: "sleep" 1: 19: "眠る後 ms=" 1: 20: "thread_exit_waiting" 1: 21: " rtn[0] =" 1: 22: " rtn[1] =" 1: 23: " rtn[2] =" 1: 24: "### 全スレッド終了 ###" 1:*** 使用予定のスタックサイズ = 2116 1:*** 関数コードのディスアセンブラ size = 348 1: 0 push_string_const 3 1: 3 call_function 4 0 0 1 1: 12 pop 1: 13 push_string_const 5 1: 16 push_int_1byte 40 1: 18 push_int_1byte 6 1: 20 push_string_const 6 1: 23 push_string_const 7 1: 26 call_function 8 0 0 5 1: 35 push_stack_array 0 1: 38 push_int_1byte 0 1: 40 pop_array_int 1: 41 push_string_const 5 1: 44 push_int_1byte 60 1: 46 push_int_1byte 5 1: 48 push_string_const 9 1: 51 push_string_const 10 1: 54 call_function 8 0 0 5 1: 63 push_stack_array 0 1: 66 push_int_1byte 1 1: 68 pop_array_int 1: 69 push_string_const 5 1: 72 push_int_1byte 80 1: 74 push_int_1byte 4 1: 76 push_string_const 11 1: 79 push_string_const 12 1: 82 call_function 8 0 0 5 1: 91 push_stack_array 0 1: 94 push_int_1byte 2 1: 96 pop_array_int 1: 97 push_string_const 13 1: 100 push_stack_array 0 1: 103 push_int_1byte 0 1: 105 push_array_int 0 1: 107 cast_int_to_string 1: 108 add_string 1: 109 push_string_const 14 1: 112 add_string 1: 113 push_stack_array 0 1: 116 push_int_1byte 1 1: 118 push_array_int 0 1: 120 cast_int_to_string 1: 121 add_string 1: 122 push_string_const 15 1: 125 add_string 1: 126 push_stack_array 0 1: 129 push_int_1byte 2 1: 131 push_array_int 0 1: 133 cast_int_to_string 1: 134 add_string 1: 135 call_function 4 0 0 1 1: 144 pop 1: 145 push_string_const 16 1: 148 call_function 17 0 0 0 1: 157 cast_int_to_string 1: 158 add_string 1: 159 call_function 4 0 0 1 1: 168 pop 1: 169 push_int_2byte 300 1: 172 call_function 18 0 0 1 1: 181 pop 1: 182 push_string_const 19 1: 185 call_function 17 0 0 0 1: 194 cast_int_to_string 1: 195 add_string 1: 196 call_function 4 0 0 1 1: 205 pop 1: 206 push_stack_array 0 1: 209 push_int_1byte 0 1: 211 push_array_int 0 1: 213 push_int_1byte 0 1: 215 push_int_1byte 10 1: 217 call_function 20 0 0 3 1: 226 push_stack_array 1 1: 229 push_int_1byte 0 1: 231 pop_array_int 1: 232 push_stack_array 0 1: 235 push_int_1byte 1 1: 237 push_array_int 0 1: 239 push_int_1byte 0 1: 241 push_int_1byte 10 1: 243 call_function 20 0 0 3 1: 252 push_stack_array 1 1: 255 push_int_1byte 1 1: 257 pop_array_int 1: 258 push_stack_array 0 1: 261 push_int_1byte 2 1: 263 push_array_int 0 1: 265 push_int_1byte 0 1: 267 push_int_1byte 10 1: 269 call_function 20 0 0 3 1: 278 push_stack_array 1 1: 281 push_int_1byte 2 1: 283 pop_array_int 1: 284 push_string_const 21 1: 287 push_stack_array 1 1: 290 push_int_1byte 0 1: 292 push_array_int 0 1: 294 cast_int_to_string 1: 295 add_string 1: 296 push_string_const 22 1: 299 add_string 1: 300 push_stack_array 1 1: 303 push_int_1byte 1 1: 305 push_array_int 0 1: 307 cast_int_to_string 1: 308 add_string 1: 309 push_string_const 23 1: 312 add_string 1: 313 push_stack_array 1 1: 316 push_int_1byte 2 1: 318 push_array_int 0 1: 320 cast_int_to_string 1: 321 add_string 1: 322 call_function 4 0 0 1 1: 331 pop 1: 332 push_string_const 24 1: 335 call_function 4 0 0 1 1: 344 pop 1: 345 push_int_1byte 98 1: 347 return 1:*** 行情報 数 = 14 *** 1: 36: from 0 size 13 1: 38: from 13 size 28 1: 39: from 41 size 28 1: 40: from 69 size 28 1: 41: from 97 size 48 1: 43: from 145 size 24 1: 44: from 169 size 13 1: 45: from 182 size 24 1: 49: from 206 size 26 1: 50: from 232 size 26 1: 51: from 258 size 26 1: 52: from 284 size 48 1: 53: from 332 size 13 1: 54: from 345 size 3 1:*** end of main_001() -------------- 1:--------デバックログ中止-------- 1:--------デバックログ開始-------- 1:*** 一般関数情報ダンプ ****************** 1:int タイマ表示(int sid, int qid, int p1, string p2, string p3) 1:*** ローカル変数の表示 no = 6 *** 1: 0:int sid 1: 1:int qid 1: 2:int p1 1: 3:string p2 1: 4:string p3 1: 5:string questr 1:*** 配列定数 数 = 0 ********** 1:*** 文字列 数 = 19 *** 1: 0: "タイマ表示" 1: 1: "sid" 1: 2: "qid" 1: 3: "p1" 1: 4: "p2" 1: 5: "p3" 1: 6: "questr" 1: 7: " SID=" 1: 8: " QID=" 1: 9: "タイマ表示スレッド開始" 1: 10: " 回数=" 1: 11: "println" 1: 12: "HAI000-HAI001" 1: 13: "sysval" 1: 14: "HAS000-HAS001" 1: 15: " cnt=" 1: 16: "タイマ表示スレッド終了" 1: 17: "タイマ表示 終了指示により終了" 1: 18: "タイマ表示スレッド エラー終了" 1:*** 使用予定のスタックサイズ = 1612 1:*** 関数コードのディスアセンブラ size = 282 1: 0 push_string_const 7 1: 3 push_stack_int 0 1: 6 cast_int_to_string 1: 7 add_string 1: 8 push_string_const 8 1: 11 add_string 1: 12 push_stack_int 1 1: 15 cast_int_to_string 1: 16 add_string 1: 17 pop_stack_string 5 1: 20 push_stack_int 1 1: 23 push_int_1byte 1 1: 25 eq_int 1: 26 jump_if_false 127 1: 29 push_string_const 9 1: 32 push_stack_string 5 1: 35 add_string 1: 36 push_string_const 10 1: 39 add_string 1: 40 push_stack_int 2 1: 43 cast_int_to_string 1: 44 add_string 1: 45 push_stack_string 3 1: 48 add_string 1: 49 push_stack_string 4 1: 52 add_string 1: 53 call_function 11 0 0 1 1: 62 pop 1: 63 push_string_const 12 1: 66 push_int_1byte 1 1: 68 call_function 13 0 0 2 1: 77 pop 1: 78 push_int_1byte 0 1: 80 pop_sysval_int 1-364-0 1: 85 push_stack_int 2 1: 88 pop_sysval_int 1-364-1 1: 93 push_string_const 14 1: 96 push_int_1byte 1 1: 98 call_function 13 0 0 2 1: 107 pop 1: 108 push_stack_string 3 1: 111 pop_sysval_str 3-364-0 1: 116 push_stack_string 4 1: 119 pop_sysval_str 3-364-1 1: 124 jump 279 1: 127 push_stack_int 1 1: 130 push_int_1byte 2 1: 132 eq_int 1: 133 jump_if_false 227 1: 136 push_sysval_int 1-364-0 1: 141 increment 1: 142 pop_sysval_int 1-364-0 1: 147 push_string_const 0 1: 150 push_stack_string 5 1: 153 add_string 1: 154 push_string_const 15 1: 157 add_string 1: 158 push_sysval_int 1-364-0 1: 163 cast_int_to_string 1: 164 add_string 1: 165 push_sysval_str 3-364-0 1: 170 add_string 1: 171 push_sysval_str 3-364-1 1: 176 add_string 1: 177 call_function 11 0 0 1 1: 186 pop 1: 187 push_sysval_int 1-364-0 1: 192 push_sysval_int 1-364-1 1: 197 ge_int 1: 198 jump_if_false 224 1: 201 push_string_const 16 1: 204 push_stack_string 5 1: 207 add_string 1: 208 call_function 11 0 0 1 1: 217 pop 1: 218 push_int_1byte 1 1: 220 return 1: 221 jump 224 1: 224 jump 279 1: 227 push_stack_int 1 1: 230 push_int_1byte 3 1: 232 eq_int 1: 233 jump_if_false 259 1: 236 push_string_const 17 1: 239 push_stack_string 5 1: 242 add_string 1: 243 call_function 11 0 0 1 1: 252 pop 1: 253 push_int_1byte 1 1: 255 return 1: 256 jump 279 1: 259 push_string_const 18 1: 262 push_stack_string 5 1: 265 add_string 1: 266 call_function 11 0 0 1 1: 275 pop 1: 276 push_int_1byte 2 1: 278 return 1: 279 push_int_1byte 0 1: 281 return 1:*** 行情報 数 = 29 *** 1: 65: from 0 size 20 1: 66: from 20 size 6 1: 89: from 26 size 3 1: 68: from 29 size 34 1: 69: from 63 size 15 1: 70: from 78 size 7 1: 71: from 85 size 8 1: 72: from 93 size 15 1: 73: from 108 size 8 1: 74: from 116 size 8 1: 89: from 124 size 3 1: 75: from 127 size 6 1: 89: from 133 size 3 1: 77: from 136 size 11 1: 78: from 147 size 40 1: 79: from 187 size 11 1: 83: from 198 size 3 1: 80: from 201 size 17 1: 81: from 218 size 3 1: 83: from 221 size 3 1: 89: from 224 size 3 1: 83: from 227 size 6 1: 89: from 233 size 3 1: 84: from 236 size 17 1: 85: from 253 size 3 1: 89: from 256 size 3 1: 87: from 259 size 17 1: 88: from 276 size 3 1: 90: from 279 size 3 1:*** end of タイマ表示() -------------- 1:--------デバックログ中止-------- 1:--------デバックログ開始-------- 1:*** 一般関数情報ダンプ ****************** 1:int println(string str) 1:*** ローカル変数の表示 no = 1 *** 1: 0:string str 1:*** 配列定数 数 = 0 ********** 1:*** 文字列 数 = 4 *** 1: 0: "println" 1: 1: "str" 1: 2: " " 1: 3: "print" 1:*** 使用予定のスタックサイズ = 356 1:*** 関数コードのディスアセンブラ size = 20 1: 0 push_stack_string 0 1: 3 push_string_const 2 1: 6 add_string 1: 7 call_function 3 0 0 1 1: 16 pop 1: 17 push_int_1byte 0 1: 19 return 1:*** 行情報 数 = 2 *** 1: 95: from 0 size 17 1: 96: from 17 size 3 1:*** end of println() --------------
[この投稿を含むスレッドを表示] [この投稿を削除]
[1384] マルチスレッドの仕組み
投稿者:
2009/07/16 00:59:49

 下図に示すように、ダミーmainで1スレッド、システム管理で1スレッド VMスレッドが20、トータル22スレッドが動きます、VMが20がいいのか10が いいのかは、今後の調査により決まると思います。 実際の動作はVMの一つ が言語のmain関数が占有します。main関数が終了すると、サブのVMは強制 終了されます。だから、実際に作業するのは残りの19VMスレッドで処理が 自由に割り振られます。優先順位に従い、空いたVMから処理が行われます。 だから、言語上のスレッドはある時はVM3で実行しても次は空いていたVM12 が実行します。この構造が出来たことにより、普通の関数起動と同じよう な負荷でスレッドが起動できる軽いシステムになりました。  ちなみにVMの待ち状態は、極微小の負荷しかありません。  ダミーmainは、アプリケーションの各種表示処理の担当に使います。  このシステムが出来たので言語上のファイバーは、比較的簡単に実装 できます。そのときの実行負荷も軽いです。 ダミーmain         システム管理  -----    ----------------------------------------  |  | スレ起動 |                   |  |  | -> |                   |  -----    ----------------------------------------          ↓     ↓ VMスレッド起動  ↓   ------------------  --------       --------   |        |  |   |       |   |   ----------| 言 |  | V | VMスレッド | V |     ↓  | 語 |  | M | 20個が常に | M |   -------- | 管 |  | 0 |  起動し  | 1 |   | コ | | 理 |  | 0 | キュー待ち | 9 |   | ン | |   |  |   |       |   |   | パ | |   |  |   |       |   |   | イ | |   |  |   |       |   |   | ラ | |   |  |   |       |   |   -------- --------  --------       -------- -----------------------------     ↓   上の構造が実行した場合の、トレース情報。   デバック用にVMは5個起動しています。   このトレースではVM1がmainスレッドに割り当てられています。     ↓ ----------------------------- 2:### ダミーmain開始----- 2:### CL_systemスレッド 開始 2:### システム開始----- 2:### 組込み関数登録処理開始----- 2:### 組込み関数登録処理終了----- 2:### CL_VMexeスレッド 開始 2:スレッドRUN開始 vmid=0 2:### CL_VMexeスレッド 開始 2:スレッドRUN開始 vmid=1 2:### CL_VMexeスレッド 開始 2:スレッドRUN開始 vmid=2 2:### CL_VMexeスレッド 開始 2:スレッドRUN開始 vmid=3 2:### CL_VMexeスレッド 開始 2:スレッドRUN開始 vmid=4 2:### コンパイル初期化処理開始----- 2:### コンパイル開始----- 2:### コンパイル終了----- 2:### コンパイルの総てのリソースを開放----- 2:キュー処理開始 vm=1 procid=0 Qid=1 p1=999 2:キュー処理開始 vm=2 procid=1 Qid=1 p1=6 2:キュー処理開始 vm=3 procid=2 Qid=1 p1=5 2:キュー処理開始 vm=0 procid=3 Qid=1 p1=4 2:キュー処理開始 vm=4 procid=1 Qid=2 p1=1 2:キュー処理開始 vm=2 procid=2 Qid=2 p1=1 2:キュー処理開始 vm=3 procid=3 Qid=2 p1=1 2:キュー処理開始 vm=0 procid=1 Qid=2 p1=1 2:キュー処理開始 vm=4 procid=2 Qid=2 p1=1 2:キュー処理開始 vm=3 procid=3 Qid=2 p1=1 2:キュー処理開始 vm=2 procid=1 Qid=2 p1=1 2:キュー処理開始 vm=4 procid=2 Qid=2 p1=1 2:キュー処理開始 vm=3 procid=3 Qid=2 p1=1 2:キュー処理開始 vm=0 procid=1 Qid=2 p1=1 2:キュー処理開始 vm=2 procid=2 Qid=2 p1=1 2:キュー処理開始 vm=4 procid=1 Qid=2 p1=1 2:キュー処理開始 vm=0 procid=3 Qid=2 p1=1 2:キュー処理開始 vm=3 procid=2 Qid=2 p1=1 2:キュー処理開始 vm=2 procid=1 Qid=2 p1=1 2:スレッドRUN終了 vmid=1 2:スレッドRUN終了 vmid=4 2:スレッドRUN終了 vmid=0 2:スレッドRUN終了 vmid=2 2:スレッドRUN終了 vmid=3 2:### CL_VMexeスレッド 終了 2:### CL_VMexeスレッドハンドルをクローズしました 2:### CL_VMexeスレッド 終了 2:### CL_VMexeスレッドハンドルをクローズしました 2:### CL_VMexeスレッド 終了 2:### CL_VMexeスレッドハンドルをクローズしました 2:### CL_VMexeスレッド 終了 2:### CL_VMexeスレッドハンドルをクローズしました 2:### CL_VMexeスレッド 終了 2:### CL_VMexeスレッドハンドルをクローズしました 2:#debugMsg 残っているメモリーを開放 66 66 2:#debugMsg 残っている配列メモリーを開放 26 26 2:### システム終了----- 2:### CL_systemスレッド 終了 2:### CL_systemスレッドハンドルをクローズしました 2:### ダミーmain終了-----
[この投稿を含むスレッドを表示] [この投稿を削除]
[1383] マルチスレッドについて
投稿者:
2009/07/16 00:58:48

 ようやくマルチスレッドの組込みが終わりました。テストモデルは比較的 早くできたのですが、実際の組込みは多少時間がかかりました。全体的なり ファクタリングが必要だったし。  下記プログラムのように、同じ関数を3スレッドで平行実行しています。 この言語の特徴は、なんらマルチスレッドを意識することなく、ただ関数を 書くだけでマルチで実行可能な点です。関数の入り口の書式は決まっていま すが、そこから呼ばれているprintln()等は何も意識していません。ちなみ にHシートのシステム変数はスレッド置きに作成され、そのスレッドが所有 権を持ちます。スレッドが100個あれば100枚のHシートができます。  この様にシートによって各種特徴やサービスがあるシートと、自由に使え る汎用シートがあります。  システム変数は総て所有権が有り、一つのスレッドが所有者になります。 もちろん委譲したり戻したり出来ますが、一度に1つのスレッドしか所有権 を持ちません。  また、一般的なスレッドと多少性格が違い、1つのスレッドを起動すると、 初期起動実行後、メッセージ(キュー)が来るまで待ち状態で待機します。 待機時のCPU消費は0です。メッセージ駆動型のスレッドです。普通に関数 を書くだけで、いくら並列に起動されようと問題なく動きます。特別な知識 も要りません。 //-- スレッド操作関数 ---------------- #define スレ開始 thread_start #define スレ終了待ち thread_exit_waiting #define 終了待ち   0 // 終了を待つ #define 終了指示待ち 1 // 終了指示を出し終了を待つ #define 強制終了待ち 2 // 強制終了を出し終了を待つ //-- スレ終了待ち関数の戻り値 --------- #define 正常終了   0 // スレ正常終了 #define タイムアウト 1 // スレ終了待ちがタイムアウト //-- スレッド終了コード -------------- #define スレッド待機 0 // スレッドはキュー待ちに #define スレッド終了 1 // スレッド終了 #define スレッドエラー終了 2 // スレッドエラー終了 //-- キューID ------------------------ #define スレッド開始 1 // スレッド開始キューID #define タイマ    2 // タイマキューID #define 終了指示   3 // 終了指示キューID //------------------------------------ #define 時間取出し  get_ms_time #define 眠る     sleep #define システム変数 sysval #define 生成 1 // システム変数生成 //-- 組込み関数宣言 ------------------- int print(string str); int スレ開始(string fname,int ms,int p1,string p2,string p3); int スレ終了待ち(int sid,int type,int timeout); int システム変数(string str,int type); int 眠る(int time); int 時間取出し(); //------------------------------------------------------ int main() { //-- 同じ関数を違う周期でマルチスレッド起動する ------- int[3] sid; println("### スレッド起動 ###"); // 関数名, ms周期,P1, P2, P3 sid[0] = スレ開始("タイマ表示",40,6," 40ms"," で6回実行"); sid[1] = スレ開始("タイマ表示",60,5," 60ms"," で5回実行"); sid[2] = スレ開始("タイマ表示",80,4," 80ms"," で4回実行"); println(" sid[0] ="+sid[0]+" sid[1] ="+sid[1]+" sid[2] ="+sid[2]); println("眠る前 ms=" + 時間取出し()); 眠る(300); // 300ms眠る println("眠る後 ms=" + 時間取出し()); //-- スレッドが終了するまで待つ --------------------- int[3] rtn; rtn[0] = スレ終了待ち(sid[0],終了待ち,10); // 10秒でタイムアウト rtn[1] = スレ終了待ち(sid[1],終了待ち,10); rtn[2] = スレ終了待ち(sid[2],終了待ち,10); println(" rtn[0] ="+rtn[0]+" rtn[1] ="+rtn[1]+" rtn[2] ="+rtn[2]); println("### 全スレッド終了 ###"); return 98; } //-- システム変数の定義 -------------------------------- #define カウント HAI000 // タイマのカウンタ #define 回数 HAI001 // p1の終了回数 #define P2STR HAS000 // p2の文字列 #define P3STR HAS001 // p3の文字列 //-- 複数スレッド起動される周期タイマー処理関数 --------- int タイマ表示(int sid, int qid,int p1, string p2, string p3) { string questr = " SID=" + sid + " QID=" + qid; if(qid == スレッド開始) { // スレッド起動時のみ時実行 -------------- println("タイマ表示スレッド開始"+questr+" 回数="+p1+p2+p3); システム変数("HAI000-HAI001",生成); カウント = 0; 回数 = p1; システム変数("HAS000-HAS001",生成); P2STR = p2; P3STR = p3; } elsif(qid == タイマ) { // タイマキューにより実行 -------------- カウント++; println("タイマ表示"+questr+" cnt="+カウント+P2STR+P3STR); if(カウント >= 回数) { println("タイマ表示スレッド終了" + questr); return スレッド終了; } } elsif(qid == 終了指示) { println("タイマ表示 終了指示により終了" + questr); return スレッド終了; } else { println("タイマ表示スレッド エラー終了" + questr); return スレッドエラー終了; } return スレッド待機; } //------------------------------------------------------ int println(string str) { print(str + "\n"); return 0; } //------------------------------------------------------     ↓    実行結果     ↓ -------------------------------------------- 3:### スレッド起動 ### 3: sid[0] =1 sid[1] =2 sid[2] =3 3:タイマ表示スレッド開始 SID=1 QID=1 回数=6 40ms で6回実行 3:タイマ表示スレッド開始 SID=2 QID=1 回数=5 60ms で5回実行 3:タイマ表示スレッド開始 SID=3 QID=1 回数=4 80ms で4回実行 3:眠る前 ms=33696948 3:タイマ表示 SID=1 QID=2 cnt=1 40ms で6回実行 3:タイマ表示 SID=2 QID=2 cnt=1 60ms で5回実行 3:タイマ表示 SID=3 QID=2 cnt=1 80ms で4回実行 3:タイマ表示 SID=1 QID=2 cnt=2 40ms で6回実行 3:タイマ表示 SID=2 QID=2 cnt=2 60ms で5回実行 3:タイマ表示 SID=3 QID=2 cnt=2 80ms で4回実行 3:タイマ表示 SID=1 QID=2 cnt=3 40ms で6回実行 3:タイマ表示 SID=2 QID=2 cnt=3 60ms で5回実行 3:タイマ表示 SID=3 QID=2 cnt=3 80ms で4回実行 3:眠る後 ms=33697360 3:タイマ表示 SID=1 QID=2 cnt=4 40ms で6回実行 3:タイマ表示 SID=2 QID=2 cnt=4 60ms で5回実行 3:タイマ表示 SID=1 QID=2 cnt=5 40ms で6回実行 3:タイマ表示 SID=3 QID=2 cnt=4 80ms で4回実行 3:タイマ表示 SID=2 QID=2 cnt=5 60ms で5回実行 3:タイマ表示スレッド終了 SID=3 QID=2 3:タイマ表示スレッド終了 SID=2 QID=2 3:タイマ表示 SID=1 QID=2 cnt=6 40ms で6回実行 3:タイマ表示スレッド終了 SID=1 QID=2 3: rtn[0] =0 rtn[1] =0 rtn[2] =0 3:### 全スレッド終了 ### --------------------------------------------  上の例は、多少時間的な数値や前後がおかしいですが、この裏で大量の デバックトレースが動いているので、ずれています。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1382] Re:【業務連絡】雑記帳が使えなくなっています
投稿者:ホイヘンス
2009/07/16 00:15:04

>どうやら、(また勝手に)PHPのバージョンが5に上げられていて、 >しかもなぜか雑記帳のページだけで「Call to undefined function mysql_connect()」と、 >mysqlモジュールがインストールされていないかのようなエラーが出ています…… ポインタ本にいつもお世話になっております。 突然ですがおそらく↑に関連したことだと思いますが 駄文なページの「表計算ソフトって」のページで Parse error: syntax error, unexpected '^' in /home/km3943/public_html/essay/excel.html on line 62 「15パズルの作り方」のページで Parse error: syntax error, unexpected '^' in /home/km3943/public_html/essay/puzzle.html on line 181 上記のエラーが出てページが見れません・・・
[この投稿を含むスレッドを表示] [この投稿を削除]
[1381] 【業務連絡】雑記帳が使えなくなっています
投稿者:(ぱ)こと管理人
2009/07/09 02:14:54

このところ更新していませんが、雑記帳 http://kmaebashi.com/zakki/index.html のページが使えなくなっています。 どうやら、(また勝手に)PHPのバージョンが5に上げられていて、 しかもなぜか雑記帳のページだけで「Call to undefined function mysql_connect()」と、 mysqlモジュールがインストールされていないかのようなエラーが出ています…… 見てのとおり、掲示板は動いているのに。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1380] Re:システム変数について
投稿者:(ぱ)こと管理人
2009/07/05 13:18:44

> なぜこの様になったかを説明しても理解してもらうのは困難と思います。 >結局(ぱ)さんにとって、奇妙な言語ができたに過ぎないのではないかと思う >にいたりました。少し残念です。 ええと、私が先の投稿で書きたかったことは、「私から見れば変に見えるけど、 (NScripterがそうであるように)それがよいという人もいるのでしょう」という ことです。お気を悪くされましたらすみません。 私から見れば奇妙な言語であることは確かですが、Domain Specific Languageが 奇妙な言語に見えるのはよくあることですし、奇妙な言語でなければ、わざわざ 自作する価値がない、とも言えるでしょう(その意味で、crowbarやDiksamは 「おとなしすぎる」んだよなー)。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1379] Re:システム変数について
投稿者:
2009/07/03 22:04:56

 ここ数日いろいろ考えたすえ、プロのプログラマやプログラミングに精通して いる人ほど抵抗が大きいと思いました。当初は#defineでは、との返信もありま したが、結局の所シートを前面に出す以上、座標の変数が使われることが多いで しょう。  なぜこの様になったかを説明しても理解してもらうのは困難と思います。 結局(ぱ)さんにとって、奇妙な言語ができたに過ぎないのではないかと思う にいたりました。少し残念です。  今は、マルチスレッド化に専念しています。仕組みのベースがほぼ出来上がっ たので、より深く検証した上で本体に組み込と試験になります。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1378] Re:システム変数について
投稿者:(ぱ)こと管理人
2009/07/01 02:35:56

> 変数名は 「シート+列+データ型+項目番号」 = AAI000 となります。だから >自由に変数名はつけれない。それを解消するために#defnieが必衰でした。 こ、これは…… 名前が連番というのは私にはちょっと、と思いますし、この方法でプログラムを 作るとなると、「システム変数レイアウトシート」みたいなドキュメント(方眼紙か Excelシート?)上で、「ここからここまでにはこのデータを入れて…」といった 管理をしなければならなさそうです。ソースから離れたところにドキュメントが 必要になるのは、メンテナンスされないのでは、と心配になります。 ……というのが私の感想ですが、たとえばゲーム業界ではNScripterという言語が 結構広く使われているようなのですが、この言語は変数名が連番です。 http://kamakura.cool.ne.jp/o_show/nscripter/syo/08.htm 私の感覚ではのけぞってしまいますが、ユーザがいる以上、この仕様がよいという 人がいるということなのでしょう(山さんは、#defineでセル名を隠そうとして いますから、連番がよいと思っておられるわけではないと思いますが)。 あと、システム変数がこういう形式だと、入力フォームや出力帳票に直接 結びつけることができると便利かもしれませんね。 なつかしのRPGあたりを彷彿とさせますが。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1377] Re:システム変数について
投稿者:
2009/06/30 19:08:00

 さすが(ぱ)さんと言うか、鋭い突っ込みありがとうございます。実はシステム変数に ついては多少触れるのを避けていました。。なぜなら(ぱ)さんの「表計算ソフトって」 のコラムで表についての意見を読んでいて、まさにその表を言語に組み込もうとしている のです。だから、完成する前にキツイ指摘を受けるのではないかと…  システム変数は、簡単に説明すると。項と列によって構成されるシートが基本で、この シートによって複数の機能と特徴を持っています。   Aシート    ・・・~・・・     Zシート (26シート)   ----------- ------------   | | | |   | | | |   ----------- ------------  このシート名が変数の最初の「A」にあたり   000 ...................................... 999 (1000個の項目) ------------------------------------------------- A | | ・・・ | | : | | --------------------- | | Z | | | int double string | | | a | | --------------------- | | : | | ↑一つのセルの中に | | : | | 3つのデータがある | | z | | ・・・ | | ------------------------------------------------- (52の列)  変数名は 「シート+列+データ型+項目番号」 = AAI000 となります。だから 自由に変数名はつけれない。それを解消するために#defnieが必衰でした。  ちなみに、システム変数にアクセスする方法は、直値=AAI001と言う形と、相対配列 =ABI010「X][Y] これは、指定の座標から項にX値の相対座標指定、列にY値の相対座標を 指定してアクセスします。 ABI010[X] は項目のX相対座標指定です。  もともとこのシート形式は、目的アプリケーションで必要だった機能を実現する為の 些細なアイデアでした。しかし、言語を作っていく上でシステムの基本となり。言語上 でもかなめ的要素(中心的要素)になったのです。注意、EXCELを作るわけではありません。  ここからは既存の言語的常識を一時保留にして読んでください。  例えば、市役所等での情報の伝達はシート、書式を持った紙です。市民登録、婚姻届等に 必要な項目を記入し提出する。それを受け取り保存する。別にガッシリとデータ定義された 構造体やclassがあるわけではありません。記入する方も総ての項目を初期化したり記入し たりしません、必要な項目のみ記入して提出します。  このイメージをモジュール間の情報伝達に使用しようと考えたのです。例えばシートAに に必要なことを書いて、他のモジュールに動作指示を出す。その時シート名を伝達するだ けでいい、構造体やclassは不要です。なおかつしたい事の種類のよって、多くの構造体や 多くのクラス定義が必要になったりしますが、シートでは必要な部分だけを書けばいい。  と発想したのが元です。  情報伝達の単位は、最小のint,double,string、そして一つのセル、相対X領域,相対Y領域、 相対矩形の領域、列、シート、そしてパックされた情報の8つの単位で情報伝達を考えてい ます。この処理単位で情報伝達するために、言語は関数内では普通の言語的整合性を持って いますが、一歩外のグローバルではシステム変数で情報伝達する。その結果グローバル変数 はシステム変数となり、言語的整合性ではなくシステムの目的にそって作られています。 補足 1、一つのセルの中にint,double,stringデータの情報が入っているのは、もともとはデータ の型別にシートが分かれていました。しかし、リストやソート、検索、辞書(map)の場合、 3つのデータをまとめて処理したほうが利便性がいいとの理由です。そのため1セルに3つの 情報を入れました。しかし、変数としては別々にアクセスします。  例えばstringでソートした場合、intもdoubleもいっしょにソートされます。  例えば、intに優先NOが入っていたら、intでソートしたら文字列もいっしょにソート されます。  利便性の目的のためだけに、3つの情報を一セルに入れました。 2、パックされた情報は、stringデータに入ります。なのでstringデータは複数のデータ を大量に保持することが出来ます。 3.システム変数を言語内の変数と同じように、透過的にアクセスできるように作れたため、 システム変数の操作を速くする事ができた。これは、関数を用いてシステム変数を操作する ことを思えば、スレッドセーフでも、格段に融通が利き速い動作を保証できる。 最後に  この言語だけでは、奇妙な言語が一つ出来ただけの事です。この仕組が受け入れられる かは、その上に乗ったアプリケーションが洗練されていて使いやすく受け入れるか如何に かかっています。ここから先はいかにいい物を作るかだけでしょう。それに、言語の 初心者を対象にしているので、ここからはバリバリな日本語化に走ります。  プログラミング言語ができる人は、C/C++なりJavaなり、その他各種汎用言語を使って ください。がベースにあります。^^  今ある汎用言語は洗練されていて複雑で優秀です。だから私がいまさら作る意味が無い ですし。 追加の補足  上記のことを書いた後に、グローバル変数でもいいのではないか。の発想もありますが、 その場合、情報の集合体としての構造体やclassが必要です。でも、移転届用紙のような 多数の関係の薄そうなデータ総てを構造体やclassに入れるのは、根本的にシステム設計 が間違っている方向でしょう。やはり書式用紙に代表されるデータ構造と、プログラム上の データ構造とは明らかに違っています。プログラムでは関連のあるデータを参照やキー 情報、その他関連情報で持ちます。しかし、この構造は前にも話したように他の何かの サポート無しに完全な一意の意味を保証することは不可能です。  でも、シート形式なら完全かと言うとそうでもありません。実は時系列な情報変化の 保証は出来ないのです。これはあきらめています。時系列的な情報の変化とは、転移届を 受理して完全に処理される前に。同じ人から違う転移届を受け取ってしまった場合の矛盾 です。 これは外部の何らかのサポート、受理処理が完全に終了するまで受け付けない フラグ等のサポートが必要になり。これはシステムではなく、プログラマがそれを理解し 作らなければならないのです。  完全なデータフローマシンでも作ればいいのですが、そのプログラミングはまた違った、 別の複雑な知識が必要になってきます。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1376] Re:システム変数について
投稿者:(ぱ)こと管理人
2009/06/30 01:22:32

> システム変数は宣言だけが違い、多少特殊ですが普通の変数と同じように >使用できます。なおかつスレッドセーフで使用できます。 (中略) > sysval("AAS001",CREATION); 割と素朴な疑問だと思うんですが、システム変数の宣言がこのように関数形式だとすると、 システム変数の型について、コンパイラは知らないままだということになりませんか? ……と思ったのですが、「AAS」という名前がstring型だという型宣言を兼ねている (かつそれをコンパイラが解釈する)のでしょうか? > sysval("AAI001-ACI005",CREATION); そして、こういう書き方だと、AA「I」なので、intの配列の宣言になる、と。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1375] システム変数について
投稿者:
2009/06/29 17:53:00

 ようやくシステム変数の組込みが終わりました。下記に示すような感じで 使用します。上にある#defineは、システムのヘッダーファイルになり。 #includeされます。 また今回は日本語プログラムにするとこんな感じに なります。と言った感じのプログラムリストです。  システム変数は宣言だけが違い、多少特殊ですが普通の変数と同じように 使用できます。なおかつスレッドセーフで使用できます。 //-- システム変数定義ヘッダーファイル -------------- #define システム変数 sysval #define 生成 1 // システム変数使用 #define 廃棄 2 // システム変数廃棄 #define クリア 3 // システム変数を初期化 #define リスト 4 // システム変数のリスト宣言 #define 辞書 5 // システム変数の辞書宣言(予約) #define 昇順ソート 6 // システム変数をソート #define 降順ソート 7 // システム変数をソート #define システム変数検索 sysval_find #define 線形 1 // システム変数リストを線形検索 #define 二分 2 // システム変数リストを二分検索 #define 辞書 3 // システム変数辞書検索(予約) #define システム変数リスト挿入 sysval_push_list #define システム変数リスト取出 sysval_pop_list #define 先頭 1 // システム変数リストの先頭 #define 最後 2 // システム変数リストの最後 //-- 日本語定義ヘッダーファイル ------------------ #define メイン main #define 表示 print #define 文字列 string #define 整数 int //------------------------------------------------ //-- 日本語で書いた場合 ----------------- 整数 表示(文字列 str); 整数 システム変数(文字列 str,整数 type); 整数 メイン() { システム変数("AAS001",生成); システム変数("AAI001-ACI005",生成); システム変数("BAD001-BCD005",生成); システム変数("CAS001-CCS005",生成); AAS001 = "testdata"; 表示("AAS001 = " + AAS001 + "--\n\n"); AAI001[3][1] = 33; BAD002[2] = 3.2; CAS003[1] = "aaa"; 表示("AAI001 = " + AAI001[3][1] + "--\n\n"); 表示("BAD002 = " + BAD002[2] + "--\n\n"); 表示("CAS003 = " + CAS003[1] + "--\n\n"); } //-----------------------------------    ↓    ↓まったく同じプログラムで英語で書いた場合    ↓ //----------------------------------- int print(string str); int sysval(string str,int type); int main() { sysval("AAS001",CREATION); sysval("AAI001-ACI005",CREATION); sysval("BAD001-BCD005",CREATION); sysval("CAS001-CCS005",CREATION); AAS001 = "testdata"; print("AAS001 = " + AAS001 + "--\n\n"); AAI001[3][1] = 33; BAD002[2] = 3.2; CAS003[1] = "aaa"; print("AAI001 = " + AAI001[3][1] + "--\n\n"); print("BAD002 = " + BAD002[2] + "--\n\n"); print("CAS003 = " + CAS003[1] + "--\n\n"); } -----------------------------------    ↓    ↓日本語版も英語版まったく同じ下記のコードになります。    ↓ ------------------------------------ 1:*** 一般関数情報ダンプ ****************** 1:int main() 1:*** 配列定数 数 = 0 ********** 1:*** 文字列 数 = 23 *** 1: 0: "main" 1: 1: "AAS001" 1: 2: "sysval" 1: 3: "AAI001-ACI005" 1: 4: "sysval" 1: 5: "BAD001-BCD005" 1: 6: "sysval" 1: 7: "CAS001-CCS005" 1: 8: "sysval" 1: 9: "testdata" 1: 10: "AAS001 = " 1: 11: "-- " 1: 12: "print" 1: 13: "aaa" 1: 14: "AAI001 = " 1: 15: "-- " 1: 16: "print" 1: 17: "BAD002 = " 1: 18: "-- " 1: 19: "print" 1: 20: "CAS003 = " 1: 21: "-- " 1: 22: "print" 1:*** 使用予定のスタックサイズ = 1292 1:*** 関数コードのディスアセンブラ size = 223 1: 0 push_string_const 1 1: 3 push_int_1byte 1 1: 5 call_function 2 0 0 2 1: 14 pop 1: 15 push_string_const 3 1: 18 push_int_1byte 1 1: 20 call_function 4 0 0 2 1: 29 pop 1: 30 push_string_const 5 1: 33 push_int_1byte 1 1: 35 call_function 6 0 0 2 1: 44 pop 1: 45 push_string_const 7 1: 48 push_int_1byte 1 1: 50 call_function 8 0 0 2 1: 59 pop 1: 60 push_string_const 9 1: 63 pop_sysval_str 3-0-1 1: 68 push_string_const 10 1: 71 push_sysval_str 3-0-1 1: 76 add_string 1: 77 push_string_const 11 1: 80 add_string 1: 81 call_function 12 0 0 1 1: 90 pop 1: 91 push_int_1byte 33 1: 93 push_sysval_array 1-0-1 1: 98 push_int_1byte 3 1: 100 push_array_int 1 1: 102 push_int_1byte 1 1: 104 pop_array_int 1: 105 push_double_8byte 3.200000e+000 1: 114 push_sysval_array 2-52-2 1: 119 push_int_1byte 2 1: 121 pop_array_double 1: 122 push_string_const 13 1: 125 push_sysval_array 3-104-3 1: 130 push_int_1byte 1 1: 132 pop_array_string 1: 133 push_string_const 14 1: 136 push_sysval_array 1-0-1 1: 141 push_int_1byte 3 1: 143 push_array_int 1 1: 145 push_int_1byte 1 1: 147 push_array_int 0 1: 149 cast_int_to_string 1: 150 add_string 1: 151 push_string_const 15 1: 154 add_string 1: 155 call_function 16 0 0 1 1: 164 pop 1: 165 push_string_const 17 1: 168 push_sysval_array 2-52-2 1: 173 push_int_1byte 2 1: 175 push_array_double 0 1: 177 cast_double_to_string 1: 178 add_string 1: 179 push_string_const 18 1: 182 add_string 1: 183 call_function 19 0 0 1 1: 192 pop 1: 193 push_string_const 20 1: 196 push_sysval_array 3-104-3 1: 201 push_int_1byte 1 1: 203 push_array_string 0 1: 205 add_string 1: 206 push_string_const 21 1: 209 add_string 1: 210 call_function 22 0 0 1 1: 219 pop 1: 220 push_int_1byte 0 1: 222 return 1:*** 行情報 数 = 14 *** 1: 20: from 0 size 15 1: 21: from 15 size 15 1: 22: from 30 size 15 1: 23: from 45 size 15 1: 24: from 60 size 8 1: 25: from 68 size 23 1: 26: from 91 size 14 1: 27: from 105 size 17 1: 28: from 122 size 11 1: 29: from 133 size 32 1: 30: from 165 size 28 1: 31: from 193 size 27 1: 154: from 220 size 2 1: 32: from 222 size 1 1:*** end of main() -------------- --------------------------------------------------
[この投稿を含むスレッドを表示] [この投稿を削除]
[1374] Re:関数の再起について
投稿者:
2009/06/25 00:09:10

お返事遅れてすみません。 >ええと、細かいことですが「再起」ではなく「再帰」ですね。 うはは~~指摘ありがとうございます。思わぬミスをよくします。 >ファイバーとか考えるなら再考の必要がありますね……  ファイバーのことを考えてたら、 「ファイバーは関数ではなく、コードの一部を空きスレッドに渡すだけで実行だな」 と考えていたら下記の点を気がつきました。  今までは、スレッドは実行時にオブジェクト生成とスレッド起動を考えていま したが、良くよく考えれば毎回不必要ですね。初期に10なり20なり起動して待ち 状態で待たせ、その後プログラムのスレッド実行は空きスレッドで即実行を^^  この方法で組み込むことにしました。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1373] Re:関数の再起について
投稿者:(ぱ)こと管理人
2009/06/23 02:34:39

ええと、細かいことですが「再起」ではなく「再帰」ですね。 >その後言語内の関数実行部を >作ったのですが。そのまま、再起で実行する部分を使って組み込んだために、関数実行 >はVM実行部の再起になっています。 了解です。 再帰を使わずに作ると、例外処理機構でCの呼び出し階層を遡らなくてよいとか、 ファイバーのような機能を作るときに現在の実行状態を退避できるとかの メリットがあると思いますが、例外処理をDiksamで作ってみたら、再帰を使っている crowbarの例外処理よりもかえって大変だったような気がしますし、再帰なら 再帰でかまわないと思います。 実はDiksamでもネイティブ関数からDiksam関数を呼ぶところは再帰なので、 ファイバーとか考えるなら再考の必要がありますね…… >う~~んどうしようか、当面このままでいこうと思います。既に出来てしまっ >てるし。スタックを増やさない限り再起が450回しか出来ない欠点はあるけど。 実用的には使われてないであろうcrowbarはさておき、RubyやPerlもCのスタックを 使ってガンガン再帰してますからねえ。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1372] Re:関数の再起について
投稿者:
2009/06/22 19:06:01

>すみません、いまいちよくわからないです。関数呼び出しのたびにVM起動して >いるわけではないですよね? そうだった、VMが違うものでした。簡単にVMの構造を説明します。 ↓AP管理からVMとして起動される -------------------------------------- |      VM管理システム      | --------------------------------------  ↓     ・・・       ↓    ------    ------    |   |    |   |    | V |    | V |    | M |    ・・・     | M |    | 実 |    | 実 |    | 行 |    | 行 |    | 部 |    | 部 |    |   |    |   |    ------    ------  VMは上記のような構造をしています。VM管理システムは1つのスレッドで、VM実行 部のスレッド実行管理と各種サービスを提供します。機能は、  ・マルチスレッドでVM実行部の起動・停止・廃棄等の実行管理  ・動的コンパイルの管理、関数の管理  ・タイムスケジュールの管理(タイマーキューの生成と管理)  ・スレッドの実行優先順位管理(キューに優先順位がありその管理)  ・メッセージキューの管理(スレッドの実行はキューによって行われる)  ・グローバル変数の管理  ・その他各種IOや外部機能インターフェースの管理  ・言語のデバック機能  ・上記サービスをスレッドセーフで提供するための排他制御管理 等のいろいろな機能があり、それなりに大きなプログラムです。  それに対し、VM実行部は純粋にバイトコードを実行する以外何の機能も持っていま せん。VM実行部は1つのクラスで、そのオブジェクト一つが1スレッドになり、マルチ スレッドが実行可能であり、VM実行部が再起実行しても問題の無い仕様です。 そして、出来る限り単純で最小になるように作られています。  で^^;、最初に組込み関数部分を作りましたが、その時組込み関数から言語内の関数 を自由に起動したり廃棄したり、スレッド起動したり出来るように作ったので、それを 実行する一番いい方法はVM実行部の再起的実行でした。その後言語内の関数実行部を 作ったのですが。そのまま、再起で実行する部分を使って組み込んだために、関数実行 はVM実行部の再起になっています。今思えば別に再起しなくても良かったかな。^^;  今の実装の欠点は、VMのスタックを消費することと、ほんの少しのオーバーヘッド。 今の方法の利点は関数実行や管理が一元管理されて、プログラム的にすっきりしている。 かな、う~~んどうしようか、当面このままでいこうと思います。既に出来てしまっ てるし。スタックを増やさない限り再起が450回しか出来ない欠点はあるけど。 >なお、現在はDiksamはシングルスレッドですが、スレッドを分けるなら、 >VMのスタックも分離する必要があると考えています。 こちらも、1スレッドおきにスタック領域が作られます。そのためスタック領域はあまり 大きくしたくなっかったので。 ちなみにVM実行部の起動は S_Func_Val * CL_VMexe::execute(CL_Function *sfp,int stackp); 引数は関数情報と戻りスタックポインターです。ローカル変数をスタックに作成後すぐに S_Func_Val * CL_VMexe::execute_code(); のコード実行部が呼ばれる単純な構造です。
[この投稿を含むスレッドを表示] [この投稿を削除]