K.Maebashi's BBS

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

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

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

[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(); のコード実行部が呼ばれる単純な構造です。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1371] Re:関数の再起について
投稿者:(ぱ)こと管理人
2009/06/22 01:46:36

> 関数の再起についてですが、VC++ の標準スタックでデバックビルドの時、 >約460回の再起が可能です。その結果上限として450回を超えたらエラーとし、 >エラー表示とともに関数コールをせずにリターンする処理としました。 >リリースビルドでは多分この数倍いけると思いますが、450回も出来ればOK >だと考えています。スレッド分複数VM起動もしますから。 >diksamではどの様にしていますか? ええと、解析木を再帰でほじって実行するcrowbarならいざしらず、Diksamでは、 Diksamの関数をいくら再帰呼び出ししても、Cのスタックは消費しません。 DVMのスタック(ヒープに確保される)が伸びていくだけです。 なお、現在はDiksamはシングルスレッドですが、スレッドを分けるなら、 DVMのスタックも分離する必要があると考えています。 すみません、いまいちよくわからないです。関数呼び出しのたびにVM起動して いるわけではないですよね?
[この投稿を含むスレッドを表示] [この投稿を削除]
[1370] 関数の再起について
投稿者:
2009/06/22 00:27:40

 関数の再起についてですが、VC++ の標準スタックでデバックビルドの時、 約460回の再起が可能です。その結果上限として450回を超えたらエラーとし、 エラー表示とともに関数コールをせずにリターンする処理としました。 リリースビルドでは多分この数倍いけると思いますが、450回も出来ればOK だと考えています。スレッド分複数VM起動もしますから。 diksamではどの様にしていますか?
[この投稿を含むスレッドを表示] [この投稿を削除]
[1369] Re:配列の実装について
投稿者:
2009/06/20 21:10:37

>本のページの準備やらに追われていまして遅くなりましてすみません。 いえいえ >つまり、Cと同じですね。現実的な落としどころかと思います。 はい、まさにその通りです。スタックに固定で配列を既述する以上。 定数指定も固定にした方が統一的であるし、中身を替えたければ 個別に入れ替えればいいので、この方法にしました。 配列アクセスも直接インデックスなので多少速いですし。 diksamのテストプログラムは、配列の修正とnull削除で総て正しく 動いています。nullは参照の操作が無いのでなくなりました。 今は、システムグローバル変数の組み込みを行っています。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1368] Re:プログラミング言語を作る 書籍
投稿者:(ぱ)こと管理人
2009/06/20 13:46:11

>木曜日に三省堂神保町店で購入しました。ジュンク堂池袋店では、水曜日に入荷してたみたいです。 >http://twitter.com/junkudo_ike_pc/status/2203461804 お買い上げいただきありがとうございます (_o_) 編集さんからは19日ごろからと聞いていたので、サンプルコードをダウンロードできる ページについて、トップからリンクしたのが木曜の晩(というか金曜明け方)、 リンクはしないが暫定公開として配置したのが水曜の晩(というか木曜明け方)でした。 微妙に間に合いませんでした。こころあたりの方は再度見に来ていただきたく、 よろしくお願いいたします……(ここに書いても仕方がないかもしれませんけど) >書店で見つけて、お!と思ったのが書籍のサイズでした。コンパイラ系の本は大学の教科書(まえがきにある∩とかの)風でサイズはA5版が多いように思います(ドラゴンブックも)。 版型の決定については私は関わっていませんが、ゲラを見たとき、思ったより 文字サイズや余白が大きいな、とは思いました。かなり書きすぎた自覚があったので(^^; もっと詰め込まれるのではないかと。少なくとも版型に関しては読みやすい形で まとめていただけたと思っています。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1367] Re:配列の実装について
投稿者:(ぱ)こと管理人
2009/06/20 13:31:48

本のページの準備やらに追われていまして遅くなりましてすみません。 > 下記のように、配列の定数は配列定数バッファーに詰め込んで保持し、1命令で >配列変数に書き込みです。 つまり、Cと同じですね。現実的な落としどころかと思います。 リテラルに定数式しか書けなくなっているかとは思いますが。 つまりC同様、 double[] sin_table = {sin(0), sin(0.2*M_PI), sin(0.4*M_PI), ...}; のような書き方はできませんよね。実際使用することがそうそうあるとは 思えないので、問題ないと思いますが。 そういえば、昔のCは、ローカル変数の配列に初期化子を書くときはstaticしか許さない、 ということになっていました。でも、これで困ることも別段なかった気がしますし。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1366] Re:プログラミング言語を作る 書籍
投稿者:さとう
2009/06/20 00:46:11

木曜日に三省堂神保町店で購入しました。ジュンク堂池袋店では、水曜日に入荷してたみたいです。 http://twitter.com/junkudo_ike_pc/status/2203461804 書店で見つけて、お!と思ったのが書籍のサイズでした。コンパイラ系の本は大学の教科書(まえがきにある∩とかの)風でサイズはA5版が多いように思います(ドラゴンブックも)。 Webの連載を見ていなかったので、GC、VM、クラス、クロージャなどと類書にはなかなか見られない内容までを含むとは思ってもみませんでした。読みこなすのは大変ですが、なんとか読んでいこうと思います。 はてなをみて、ページ下部のおまけに気がつきました^^。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1365] Re:配列の実装について
投稿者:
2009/06/17 20:22:31

 これで、diksam0.2.0の機能で必要な部分は総て組み込むことが出来ました。 これからが本当の目的部分です。グローバルシステム変数関係、マルチスレッド システム関係。等々を組み込んだら言語としては完了となります。  そして、本当の目的アプリケーション…、まて、言語のデバックシステムの 組み込みが。簡単なIDEを組み込みます。まだまだです。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1364] Re:配列の実装について
投稿者:
2009/06/17 20:17:37

 配列の組み込みにより、バイトコードもまた変わりました、下記に。 S_OpcodeInfo D_opcode_info[] = { {"dummy", "", 0}, {"push_int_1byte", "b",16}, {"push_int_2byte", "s",16}, {"push_int_4byte", "i",16}, // 実際の値を持つ {"push_double_0", "", 16}, {"push_double_1", "", 16}, {"push_double_8byte", "d",16}, // 実際の値を持つ {"push_string_const", "s",40}, // 文字列の位置NOを持つ0~ {"push_null", "", 16}, /**********/ {"push_stack_array", "s", 16}, // 配列情報をスタックに {"push_stack_int", "s", 16}, // intローカル変数をi {"push_stack_double", "s", 16}, // {"push_stack_string", "s", 40}, // {"pop_stack_int", "s", -16}, // スタックのintをローカル変数に {"pop_stack_double", "s", -16}, // {"pop_stack_string", "s", -40}, // /**********/ {"push_static_array", "s", 16}, // 配列情報をスタックに 予約 {"push_static_int", "s", 16}, // int静的変数をスタックに 予約 {"push_static_double","s", 16}, // {"push_static_string","s", 40}, // {"pop_static_int", "s", -16}, // スタックのintを静的変数に 予約 {"pop_static_double", "s", -16}, // {"pop_static_string", "s", -40}, // /**********/ {"push_sysval_array", "i", 16}, // 配列情報をスタックに {"push_sysval_int", "i", 16}, // システムグローバル変数をスタックに {"push_sysval_double","i", 16}, // {"push_sysval_str", "i", 40}, // {"pop_sysval_int", "i", -16}, // スタックからシステムグローバル変数に {"pop_sysval_double", "i", -16}, // {"pop_sysval_str", "i", -40}, // /**********/ {"push_array_int", "", -1}, // int配列処理 {"push_array_double", "", -1}, // {"push_array_string", "", -1}, // {"pop_array_int", "", -1}, // スタックからint配列に {"pop_array_double", "", -1}, // {"pop_array_string", "", -1}, // /**********/ {"add_int", "", -16}, // 以下は総て算術演算子 {"add_double", "", -16}, {"add_string", "", -40}, {"sub_int", "", -16}, {"sub_double", "", -16}, {"mul_int", "", -16}, {"mul_double", "", -16}, {"div_int", "", -16}, {"div_double", "", -16}, {"mod_int", "", -16}, {"mod_double", "", -16}, {"minus_int", "", 0}, {"minus_double", "", 0}, {"increment", "", 0}, {"decrement", "", 0}, // ここまで算術演算子 {"cast_int_to_double", "", 0}, // 以下はキャスト処理 {"cast_double_to_int", "", -0}, {"cast_boolean_to_string", "", 24}, {"cast_int_to_string", "", 24}, {"cast_double_to_string", "", 24}, // ここまでキャスト処理 {"eq_int", "", -16}, // 以下は総て論理演算子 {"eq_double", "", -16}, {"eq_string", "", -40}, {"gt_int", "", -16}, {"gt_double", "", -16}, {"gt_string", "", -40}, {"ge_int", "", -16}, {"ge_double", "", -16}, {"ge_string", "", -40}, {"lt_int", "", -16}, {"lt_double", "", -16}, {"lt_string", "", -40}, {"le_int", "", -16}, {"le_double", "", -16}, {"le_string", "", -40}, {"ne_int", "", -16}, {"ne_double", "", -16}, {"ne_string", "", -40}, // ここまで論理演算子 {"logical_and", "", -16}, // {"logical_or", "", -16}, // {"logical_not", "", 0}, // {"pop", "", -1}, // スタックを1つ減らす {"duplicate", "", 16}, // スタック内容をコピーしてスタックに {"jump", "s", 0}, // 指定ポインターにjump {"jump_if_true", "s", -16}, // スタックがtrueならjump {"jump_if_false","s", -16}, // スタックがfalseならjump /**********/ {"push_function", "", 0}, // 関数情報をスタック、未使用 {"call_function","ssss", 1}, // 関数コール {"return", "", -1}, // 関数戻り /**********/ {"set_array_literal_int", "ss", 0}, // int定数配列を変数にコピー {"set_array_literal_double","ss", 0}, // double定数配列を変数にコピー {"set_array_literal_string","ss", 0}, // string定数配列を変数にコピー };
[この投稿を含むスレッドを表示] [この投稿を削除]
[1363] 配列の実装について
投稿者:
2009/06/17 20:11:21

 配列の実装は、結果的にまったく違うものになっています。配列領域を固定で スタックに持つことでGCを無くす。この目的のために結果的に多くの修正をしま した。下記のようなプログラムとディスアセンブルコードを見てください。  この並列はずいぶん悩みましたが、結果的に一番良いであろう方法に落ち着き ました。 ---------------------------------- int main() { int[2][3] i5dim; int id = 33; boolean[2] bdim1 = { true , false }; int[2][3] idim21 = {{1,2,3},{4,300,65536}}; int[2][3][4] idim3 = {{{1,2,3,4},{5,6,7,300},{8,9,10,11}}, {{11,12,13,65536},{14,15,16,17},{18,19,20,21}}}; double[4] ddim1 = { 0.0, 1.0, 4.1, 5.1 }; string[5] sdim1 = {"aa","bb","cc","dd","ee"}; int a1; i5dim[1][2] = 1; a1 = i5dim[i5dim[1][2]][0]; } ----------------------------------   ↓  下記のように、配列の定数は配列定数バッファーに詰め込んで保持し、1命令で 配列変数に書き込みです。もちろん配列数と一致したデータ以外はエラーです。 また、変数の配列次元数が一致しない場合もエラーになる処理が入っています。 int[10] P; P = P; の様なポインター的なコードが書けない仕様です。   ↓ バイトコード   ↓ 1:*** 一般関数情報ダンプ ****************** 1:int main() 1:*** ローカル変数の表示 no = 8 *** 1: 0:int [2][3] i5dim 1: 1:int id 1: 2:boolean [2] bdim1 1: 3:int [2][3] idim21 1: 4:int [2][3][4] idim3 1: 5:double [4] ddim1 1: 6:string [5] sdim1 1: 7:int a1 1:*** 配列定数 数 = 5 ********** 1: 0:int 配列 [2] size=20 1:int[0] = 1 1:int[1] = 0 1: 1:int 配列 [2][3] size=36 1:int[0][0] = 1 1:int[0][1] = 2 1:int[0][2] = 3 1:int[1][0] = 4 1:int[1][1] = 300 1:int[1][2] = 65536 1: 2:int 配列 [2][3][4] size=108 1:int[0][0][0] = 1 1:int[0][0][1] = 2 1:int[0][0][2] = 3 1:int[0][0][3] = 4 1:int[0][1][0] = 5 1:int[0][1][1] = 6 1:int[0][1][2] = 7 1:int[0][1][3] = 300 1:int[0][2][0] = 8 1:int[0][2][1] = 9 1:int[0][2][2] = 10 1:int[0][2][3] = 11 1:int[1][0][0] = 11 1:int[1][0][1] = 12 1:int[1][0][2] = 13 1:int[1][0][3] = 65536 1:int[1][1][0] = 14 1:int[1][1][1] = 15 1:int[1][1][2] = 16 1:int[1][1][3] = 17 1:int[1][2][0] = 18 1:int[1][2][1] = 19 1:int[1][2][2] = 20 1:int[1][2][3] = 21 1: 3:double 配列 [4] size=44 1:double[0] = 0.000000 1:double[1] = 1.000000 1:double[2] = 4.100000 1:double[3] = 5.100000 1: 4:string_no 配列 [5] size=32 1:string[0] = 9 1:string[1] = 10 1:string[2] = 11 1:string[3] = 12 1:string[4] = 13 1:*** 文字列 数 = 14 *** 1: 0: "main" 1: 1: "i5dim" 1: 2: "id" 1: 3: "bdim1" 1: 4: "idim21" 1: 5: "idim3" 1: 6: "ddim1" 1: 7: "sdim1" 1: 8: "a1" 1: 9: "aa" 1: 10: "bb" 1: 11: "cc" 1: 12: "dd" 1: 13: "ee" 1:*** 使用予定のスタックサイズ = 426 1:*** 関数コードのディスアセンブラ size = 63 1: 0 push_int_1byte 33 1: 2 pop_stack_int 1 1: 5 set_array_literal_int 0 2 1: 10 set_array_literal_int 1 3 1: 15 set_array_literal_int 2 4 1: 20 set_array_literal_double 3 5 1: 25 set_array_literal_string 4 6 1: 30 push_int_1byte 1 1: 32 push_stack_array 0 1: 35 push_int_1byte 1 1: 37 push_array_int 1: 38 push_int_1byte 2 1: 40 pop_array_int 1: 41 push_stack_array 0 1: 44 push_stack_array 0 1: 47 push_int_1byte 1 1: 49 push_array_int 1: 50 push_int_1byte 2 1: 52 push_array_int 1: 53 push_array_int 1: 54 push_int_1byte 0 1: 56 push_array_int 1: 57 pop_stack_int 7 1: 60 push_int_1byte 0 1: 62 return 1:*** 行情報 数 = 10 *** 1: 4: from 0 size 5 1: 5: from 5 size 5 1: 6: from 10 size 5 1: 8: from 15 size 5 1: 9: from 20 size 5 1: 10: from 25 size 5 1: 13: from 30 size 11 1: 14: from 41 size 19 1: 19: from 60 size 2 1: 15: from 62 size 1 1:*** end of main() --------------
[この投稿を含むスレッドを表示] [この投稿を削除]
[1362] Re:その後のVM
投稿者:
2009/06/17 19:52:00

>ここで埋め込まれる関数インデックスって、VM内で一意になるんですよね? >だとすれば、コンパイル単位の破棄の際に破棄対象の関数が使っていたインデックスの >ところをぎゅっと圧縮しようとさえ思わなければ、そもそも振りなおし自体不要なのでは >ないかと思うのですが…… 同じ所に、こう書いてあります。 >> 次にスピードの点ですが、現在はVMメイン管理で一元的にカウンターを持ってい >>ますが、これを関数単位でもてば、(ぱ)さんの指摘する問題は回避できます。 >> ただ、初期は出来る限り単純なもので済ませたいとの思いがあり。簡単な機構で >>すめばそのままにしています。 上記のように、今のところ優先順位が低いので、後回しにしています。 もちろん、圧縮等はしていないので、比較的簡単に実装出来ると思います。 たぶん二人とも同じことを考えてると思います。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1361] 管理者により削除されました
2009/06/16 22:54:54

なんだか意味不明の投稿が3連投されています。削除しました。 普通に考えれば広告なのですが、それっぽいページへのリンクもメールアドレスもないので、 何を意図したものかさっぱり。
[この投稿を含むスレッドを表示]
[1359] Re:その後のVM
投稿者:(ぱ)こと管理人
2009/06/16 01:14:21

> コンパイル時の負荷はまず棚においておいて、実際問題、再コンパイルが頻繁に >行わなければならない処理が多いと思われますか?、実際的に考えればそんな設計は >良い設計とは思えません。 うーん、再コンパイルの頻度は低くても、それが起きるたびに以後の関数呼び出しに ついてすべて一度ずつリンクが入るのはちょっと心配ですがそれはさておき、 ここで埋め込まれる関数インデックスって、VM内で一意になるんですよね? だとすれば、コンパイル単位の破棄の際に破棄対象の関数が使っていたインデックスの ところをぎゅっと圧縮しようとさえ思わなければ、そもそも振りなおし自体不要なのでは ないかと思うのですが……
[この投稿を含むスレッドを表示] [この投稿を削除]
[1358] Re:その後のVM
投稿者:
2009/06/14 08:20:38

>この方法だと、コンパイル単位が増えてきたとき、プログラムの端のほうでちょろっと >動的リンクが発生しただけで、それこそprint()みたいにあちこちで使われる関数の >呼び出し箇所すべて(通るところだけですが)に対し再リンクが必要になるような……  必ず突っ込まれるで有ろうと予測した部分が突っ込まれました^^。確かに再コンパ イルが頻繁に行われるようであれば、当然負荷が増えるでしょう。でもその場合、 コンパイル時に再リンクも大きな負荷に思えます。  コンパイル時の負荷はまず棚においておいて、実際問題、再コンパイルが頻繁に 行わなければならない処理が多いと思われますか?、実際的に考えればそんな設計は 良い設計とは思えません。  ではなぜ、動的コンパイルが必要だったか。それは、複数の違った処理を一元的 にメニュー管理する目的があったのです。利用目的ですね。このような利用目的が 無い場合、動的コンパイラは不要です。だからdiksamとは指向性が多少違います。  次にスピードの点ですが、現在はVMメイン管理で一元的にカウンターを持ってい ますが、これを関数単位でもてば、(ぱ)さんの指摘する問題は回避できます。  ただ、初期は出来る限り単純なもので済ませたいとの思いがあり。簡単な機構で すめばそのままにしています。  うう~~上記文は多々説明不足な気がすごくしますが、説明を始めると長くなっ てしまいそうなので短文にしています。「もっと説明しろ!」との指摘がありまし たら、ぜひ言ってくださいませ。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1357] Re:その後のVM
投稿者:(ぱ)こと管理人
2009/06/14 01:49:31

>はい、一つ目は文字列バッファーにある関数名インデックスを示し、二つ目はコン >パイル単位カウンター、三つ目は関数ID=インデックス、四つ目はパラメターの数 >です。P2,P3は実行時に埋め込まれます。コンパイルカウンターは、1~最大値ま >でのループカウンターで動的コンパイル実行時かコンパイル単位の消滅処理時に >+1されます。コード上は最初は0そしてカウンターは1なので、値が違うためP1の >関数名から動的リンクをしてP2に1、P3に関数インデックスが埋めこめられ、この >関数インデックスで直接関数が起動されます。以後、P2のコンパイルカウンターが >一緒なら、P3で直接関数起動です。直接起動の前にIF文が一回入る程度です。 うーん、いまいちわかりませんが、 ・call_functionのふたつめのオペランドを「P2」として、 ・「コンパイルカウンター」は、「動的コンパイル実行時かコンパイル単位の  消滅処理時に+1」というくらいだから、VMにひとつだけ存在するカウンタですよね? つまり、動的コンパイルが動いたり、逆にバイトコードを破棄したりするたびに VMの状態が変わるわけですが、この「状態」に対して、1から始まる連番が振られて いるわけですね。 で、call_functionごとに、それがリンクされた時点の連番(コンパイルカウンター)が 埋め込んであり、呼び出しごとに現在のコンパイルカウンターと比較して違っていたら 再リンクする、と。 この方法だと、コンパイル単位が増えてきたとき、プログラムの端のほうでちょろっと 動的リンクが発生しただけで、それこそprint()みたいにあちこちで使われる関数の 呼び出し箇所すべて(通るところだけですが)に対し再リンクが必要になるような…… ちなみにDiksamでは、バイトコード中の関数インデックスはコンパイル時に 決めています。これは「バイトコードごと」の関数インデックスであり、 ver.0.2~0.3系列では、リンク時に、これを「DVMごと」のインデックスに置き換えます。 ver.0.4では、置換は行わず、変換テーブルをバイトコードごとに持っています。 今のところ動的なバイトコードのアンリンクは実装していません。実装する場合、 DVM上のFunctionテーブルのis_implementedをfalseにすることになるかと思います。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1356] Re:その後のVM
投稿者:
2009/06/12 20:46:52

 追記、変数名とか関数名も文字列バッファーに入れています。これは言語のIDE サポートのためです。今デバックのために使っているモニターシステムがあるの ですが、これを高機能にすればIDEになるので、言語デバック用に簡単なIDEをと 思い追加しています。このデバックモニターシステムはC#で作られています。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1355] Re:その後のVM
投稿者:
2009/06/12 20:27:59

>2つ目と3つ目のオペランドは全部0, 0なのですが、関数の方はprintf, sprintf, printの はい、一つ目は文字列バッファーにある関数名インデックスを示し、二つ目はコン パイル単位カウンター、三つ目は関数ID=インデックス、四つ目はパラメターの数 です。P2,P3は実行時に埋め込まれます。コンパイルカウンターは、1~最大値ま でのループカウンターで動的コンパイル実行時かコンパイル単位の消滅処理時に +1されます。コード上は最初は0そしてカウンターは1なので、値が違うためP1の 関数名から動的リンクをしてP2に1、P3に関数インデックスが埋めこめられ、この 関数インデックスで直接関数が起動されます。以後、P2のコンパイルカウンターが 一緒なら、P3で直接関数起動です。直接起動の前にIF文が一回入る程度です。  このような感じで、スレッドセーフな動的リンクを実現しています。実はこれには 面白い副作用があって、例えば画面に文字を出す関数を動的コンパイル単位にすれば。 メインは一切い変更せず。あるときはゴシックで表示、コンパイル単位の消滅そして、 最コンパイルすると、その時から丸文字表示で文字が出される等が可能です。  関数の内部機能を動的に変えることが出来ます。もちろん総てのスレッドにスレッ ドセーフで。でも、使い道はそんなに無いかもしれませんけどね。^^; そうそう、今の所同じ関数名でも違う文字列IDですが、暇が出来たら同一IDにする 予定。 VMを作り始めてから何度もも構文処理からの修正が必要になり。なかなか前に進み ません。書きあがって動いても、スレッドセーフの問題点が見つかり、書き直しも ごそごそと。言語としては最終的なつめなので、すぐには終わりそうにないです。  でも、思った通りに作れるのはいい感じです。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1354] Re:その後のVM
投稿者:(ぱ)こと管理人
2009/06/11 23:44:05

自己フォロー。 >おそらく4つ目のオペランドが引数の数、2つ目か3つ目が関数のインデックス >なのだと思いますが(確か分割コンパイルはなかったと思うので、ひとつ余りますね…) >最初のオペランドは何でしょう? 2つ目と3つ目のオペランドは全部0, 0なのですが、関数の方はprintf, sprintf, printの 3種類ありますので、これが直接関数のインデックスということはないですね。 単なる場所取りで、実行前に第1オペランドの文字列を使ってインデックスを検索して ここに埋め込むとか……
[この投稿を含むスレッドを表示] [この投稿を削除]
[1353] Re:その後のVM
投稿者:(ぱ)こと管理人
2009/06/11 23:40:18

おお、私はDiksamのほうにさっぱり手を付けられないでいる間に、 だいぶ進んでいますね。 ぱっと見で目を引くのは関数呼び出しのインストラクションのオペランドの 数の多さですが、 >1: 9 call_function 3 0 0 4 おそらく4つ目のオペランドが引数の数、2つ目か3つ目が関数のインデックス なのだと思いますが(確か分割コンパイルはなかったと思うので、ひとつ余りますね…) 最初のオペランドは何でしょう? 関数名を文字列のコンスタントプールで保持していて、そのインデックスに 見えますが、用途がよくわかりません。リンク用の情報で、実行時には使わない? >1:*** 文字列 数 = 9 *** >1: 0: "main" >1: 1: "str" >1: 2: "printf P1 = %d P2 = %d P3 = %d >" >1: 3: "printf" >1: 4: "sprintf P1 = %d >" >1: 5: "sprintf" >1: 6: "print" >1: 7: "---------- test ---------
[この投稿を含むスレッドを表示] [この投稿を削除]
[1352] Re:その後のVM
投稿者:
2009/06/11 22:46:28

 追記で、バイトコードも結構変わっています。下記に。 >---------------------------------- >int printf(string str); >string sprintf(string str); >int print(string str); > >int main() >{ > string str; > printf("printf P1 = %d P2 = %d P3 = %d\n",12,20,30); > str = sprintf("sprintf P1 = %d\n",13); > print(str); > print("---------- test ---------\n"); >} >---------------------------------- ↓  バイトコード ↓ 1:*** 一般関数情報ダンプ ****************** 1:--- int main() 1:*** ローカル変数の表示 no = 1 *** 1: 0:string str 1:*** 文字列 数 = 9 *** 1: 0: "main" 1: 1: "str" 1: 2: "printf P1 = %d P2 = %d P3 = %d " 1: 3: "printf" 1: 4: "sprintf P1 = %d " 1: 5: "sprintf" 1: 6: "print" 1: 7: "---------- test --------- " 1: 8: "print" 1:*** 使用予定のスタックサイズ = 240 1:*** 関数コードのディスアセンブラ size = 65 1: 0 push_string_const 2 1: 3 push_int_1byte 12 1: 5 push_int_1byte 20 1: 7 push_int_1byte 30 1: 9 call_function 3 0 0 4 1: 18 pop 1: 19 push_string_const 4 1: 22 push_int_1byte 13 1: 24 call_function 5 0 0 2 1: 33 pop_stack_string 0 1: 36 push_stack_string 0 1: 39 call_function 6 0 0 1 1: 48 pop 1: 49 push_string_const 7 1: 52 call_function 8 0 0 1 1: 61 pop 1: 62 push_int_1byte 0 1: 64 return 1:*** 行情報 数 = 6 *** 1: 8: from 0 size 19 1: 9: from 19 size 17 1: 10: from 36 size 13 1: 11: from 49 size 13 1: 13: from 62 size 2 1: 12: from 64 size 1 1:*** end of main() --------------
[この投稿を含むスレッドを表示] [この投稿を削除]
[1351] その後のVM
投稿者:
2009/06/11 22:03:54

 ようやく下記のようなプログラムがVMで実行可能になりました。可変長 パラメータ用の書式は作らず、一部の組込み関数のみ可能にしました。 言語としての美しさは…、スタック情報も大きく変わり、VMはほとんど別の ものになりつつあります。VMの完成にはまだまだです。printfはCのprintf と同等ですが、中身はエミュレートを被せてオーバラン等の危険は一切 ありません。 ---------------------------------- int printf(string str); string sprintf(string str); int print(string str); int main() { string str; printf("printf P1 = %d P2 = %d P3 = %d\n",12,20,30); str = sprintf("sprintf P1 = %d\n",13); print(str); print("---------- test ---------\n"); } ----------------------------------  前に出した、組込み関数とのインターフェースは大幅に変更となり。 下記のようになっています。 //== スタック上の組込み関数データ =================================== struct NFstartDat { ushort vtype; // データタイプ E_StackDType ushort size; // スタック消費サイズ ushort m_vmid; // VMID = スレッドID ushort m_prm_inno; // 引き渡されたパラメータ数 void *m_sdatp; // スレッド別データ用ポインター S_Value *m_prmp[PRMMAX]; // 引き渡されたパラメータ S_Value m_return; // 関数からの戻り値データ }; //=================================================================== // 組み込み関数用定義 //=================================================================== class C_NFBase { protected: //-- VMから受け取る情報 ---------------- int m_fid; // 関数ID //-- VMに送る情報 ---------------------- char *m_name; // 関数名 int m_prmno; // 要求するパラメータ数0-10まで20は可変関数 ES_ValueType m_type[PRMMAX]; // 要求するパラメータの型 ES_ValueType m_return_type; // リターン変数タイプ public: C_NFBase() { this->m_name = NULL; this->m_prmno = 0; for(int i=0;i<PRMMAX;i++) { this->m_type[i] = ES_NON; } //----------------------- this->m_fid = 0; this->m_return_type = ES_INT; } virtual ~C_NFBase() { } virtual void * VMstart() { } // VM起動時実行 virtual void VMend() { } // VM終了時実行 virtual void funcexe(NFstartDat *nfd) { } // 関数起動メソッド inline char ** getname() { return &this->m_name; } inline int getprmno() { return this->m_prmno; } inline ES_ValueType getprmtype(int no) { return this->m_type[no]; } inline void setfid(int fid) { this->m_fid = fid; } inline ES_ValueType getrtntype() { return this->m_return_type; } };
[この投稿を含むスレッドを表示] [この投稿を削除]
[1350] Re:Traits (was Re:Smalltalk原理主義を粉砕せよ! (was Re: オブジェクト指向の…
投稿者:sumim
2009/06/10 09:31:57

>今度印刷してじっくり読んでみます。 ぜひ是非。Diksam でも活用可能かもしれません。 #ご出版、おめでとうございます。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1349] Re:プログラミング言語を作る 書籍
投稿者:(ぱ)こと管理人
2009/06/09 02:31:35

>アマゾン詣でをしていたら、、 >こんなんありました!! > >http://www.amazon.co.jp/dp/4774138959 >2009/6/20 あっ、まだ私のところに見本誌も届いていないのに! 価格とかページ数とか、今はじめて知りました。いやマジで。 >いやー楽しみです。 ありがとうございます(表紙がどんな感じになるのかとか、私も楽しみにしています)。 いやそのなんと言いますか、マイナーな分野だけに、ぜひともよろしくお願いいたします(_o_)
[この投稿を含むスレッドを表示] [この投稿を削除]
[1348] Re:Traits (was Re:Smalltalk原理主義を粉砕せよ! (was Re: オブジェクト指向の…
投稿者:(ぱ)こと管理人
2009/06/09 02:13:16

>ちゃんと知るには発案者のシェルリ自身が >書いたものに一度目を通しておくのが無難かと思います。 紹介ありがとうございます。片方はsumimさんのページから辿ってちょっと読みかけたのですが、 けっこう量が挫折してました。今度印刷してじっくり読んでみます。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1347] Re:Traits (was Re:Smalltalk原理主義を粉砕せよ! (was Re: オブジェクト指向の…
投稿者:sumim
2009/06/08 22:53:26

そうですね。C++ のテンプレートテクニックにも同名のがありますね。ややこしやー。w そんなかんじで Traits にはいろいろと別物がある上、ブラックたち(というかシェルリ) の Traits にインスパイヤされたと言明されたものでも、たとえば Scala の Traits の ように一部機能を限定した実装もあるので、ちゃんと知るには発案者のシェルリ自身が 書いたものに一度目を通しておくのが無難かと思います。 Flattening Traits http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.64.5836&rep=rep1&type=pdf Traits: Composable Units of Behavior http://web.cecs.pdx.edu/~black/publications/TR_CSE_02-012.pdf
[この投稿を含むスレッドを表示] [この投稿を削除]
[1346] プログラミング言語を作る 書籍
投稿者:さとう
2009/06/08 22:07:05

アマゾン詣でをしていたら、、 こんなんありました!! http://www.amazon.co.jp/dp/4774138959 2009/6/20 いやー楽しみです。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1345] Re:blockの重複について
投稿者:
2009/06/07 15:32:25

>すみません、ちょっと一筋縄ではいかないようです。 やっぱりそうでしたか、yaccエラーを無くすまでは出来たのですが。内部的な 問題が発生してしまって、当面は無視して先に進むことにします。^^;
[この投稿を含むスレッドを表示] [この投稿を削除]
[1344] Re:blockの重複について
投稿者:(ぱ)こと管理人
2009/06/07 11:51:11

>下記のようなプログラムで、ただのブロックを書いた場合、diksamで構文エラー >になります。4.01でも。これをエラーにしないように、diksam.yを修正したいの >ですが、お暇がありましたら何かアドバイスをお願いいたします。 そういえば、Diksamはぶら下がりifの類を許していないので、複合文も 作っていませんでした。 Cと同じように文の一種としてcompound_statementを導入すればよいのでは、 とちょっと試してみたのですが、yaccでconflictが出ました。 考えてみればDiksamでは配列リテラルがあるので、「{」の後に式が来たとき ブロックなのか配列リテラルの始まりなのかがわからないわけです。 こういう場合、構文規則を変形してreduceのタイミングを遅らせる手法が 使えることがありますが、現状のDiksamのブロックは、「{」の直後で 埋め込みアクションが動くようになっており、そのためにはreduceが必要です。 すみません、ちょっと一筋縄ではいかないようです。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1343] Re:Traits (was Re:Smalltalk原理主義を粉砕せよ! (was Re: オブジェクト指向の…
投稿者:(ぱ)こと管理人
2009/06/07 11:16:39

返信が遅くなりましてすみません。 >それは SELF の trait ですね。ここでいう Traits は、メソッドのセットを用いた多重 >継承機構で、従来のクラスやそれに準ずるものを用いた多重継承から一歩踏み込んだもの >です。Squeak Smalltalk で実効性が示されて、その後、各種言語で応用されています。 >新しい言語では言語組み込みのものもあったりと、ちょっとした流行りの機能かと。 > >http://www.slideshare.net/hiratara/traitmooserole/7 URLを紹介いただきありがとうございます。 Java上がりの私には、Scalaをベースとしたこちらの説明がわかりやすかったです。 http://www.ibm.com/developerworks/jp/java/library/j-scala04298.html 検索してみるとC++のテンプレートのテクニックとしてEffective C++第3版で 紹介されているものがあるようですが、これはまた別物……ですよね。 # うちにあるEffective C++は第2版まででした。 このところ日々の仕事に追われるばかりで、各種情報が追いかけられていないです。 いかんなぁ。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1342] blockの重複について
投稿者:
2009/06/07 02:19:50

下記のようなプログラムで、ただのブロックを書いた場合、diksamで構文エラー になります。4.01でも。これをエラーにしないように、diksam.yを修正したいの ですが、お暇がありましたら何かアドバイスをお願いいたします。 -------------------------- int func01() { { int a1; } } --------------------------
[この投稿を含むスレッドを表示] [この投稿を削除]
[1341] Traits (was Re:Smalltalk原理主義を粉砕せよ! (was Re: オブジェクト指向の…
投稿者:sumim
2009/06/04 01:52:13

>traitsは、「プロトタイプベース言語でクラスを実現するもの」ぐらいの認識でしたが、 >これも元祖はSmalltalk? ……と思ったら別物? それは SELF の trait ですね。ここでいう Traits は、メソッドのセットを用いた多重 継承機構で、従来のクラスやそれに準ずるものを用いた多重継承から一歩踏み込んだもの です。Squeak Smalltalk で実効性が示されて、その後、各種言語で応用されています。 新しい言語では言語組み込みのものもあったりと、ちょっとした流行りの機能かと。 http://www.slideshare.net/hiratara/traitmooserole/7
[この投稿を含むスレッドを表示] [この投稿を削除]
[1340] Re:Smalltalk原理主義を粉砕せよ! (was Re: オブジェクト指向の…
投稿者:(ぱ)こと管理人
2009/06/03 20:56:30

>他方で古くはデザパタ、ユニットテストやアジャイル的な手法、比較的新しいところでも >Classbox や Traits などのような静的型でも応用の利く役立つ物を次々と編み出して >くるのも、また Smalltalk 愛好者たちなので、 今日検索して知ったのですが、ケント・ベックってSmalltalkの開発者だったんですね。 知りませんでした。 http://biography.sophia-it.com/content/%E3%82%B1%E3%83%B3%E3%83%88%E3%83%BB%E3%83%99%E3%83%83%E3%82%AF traitsは、「プロトタイプベース言語でクラスを実現するもの」ぐらいの認識でしたが、 これも元祖はSmalltalk? ……と思ったら別物? http://sumim.no-ip.com:8080/wiki/818
[この投稿を含むスレッドを表示] [この投稿を削除]
[1339] Re:コード生成部分について
投稿者:
2009/06/03 19:56:14

>山さんの言語でこのあたりを変えるとなると、fix_tree.cでのTypeSpecifierの >扱いが変わってくるはずです。 はい、実質中では同じような構造を持っていますが意味が多少違ってきました。  いまようやくVM 入り口まで書けるようになりました。可変スタックはなかなか やっかいです。まずは動くことを目指してスピードUPはまた今度で書いています。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1338] Re:スレッドセーフについて
投稿者:
2009/06/03 19:51:23

>ひとつのVMで複数のスレッドを動かすのではなく、VMごと分けてしまって、 >それぞれ別のスレッドで動かせばよいのではないでしょうか。  大きな単位でのスレッドのことだと思いますが、当初はそう考えていましたが、 結局言語を作ることになったので、理想を少しあげてみました。 >Rubyのまつもとゆきひろさんが以前こんなことを書いています。 > (中略) >>という(むしろforkを活用すべきという)意見を述べています。  言語としての統一性と、インタープリター言語としてのスレッド化は、理想的な 形で両立するのは難しいと思います。なので、私はスレッド向けに参照操作を すっぱりなくしました。グローバルシステム変数にいたっては…、いやこれは目的 アプリケーションのためで…。  でも、せっかくだから殆どの面でスレッドセーフにすることで、利用者は並列動作 のためのプログラミングルールを気にすることなく書けるようになるのではないか と思いチャレンジしています。  それに、一般的な言語だったら、C/C++なりJavaなりその他のもっといい言語が あるので、作る気なんてしません。^^ どうせ作るなら一般言語では出来ないよう な事を、です。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1337] Re:Smalltalk原理主義を粉砕せよ! (was Re: オブジェクト指向の…
投稿者:sumim
2009/06/02 21:52:56

>おお、ご本人が降臨されるとは。 降臨だなんて勘弁してください。^^; >主義者を殲滅というのは物騒でいかんですねえ。反省。 型安全性を重視する人にとっては、Smalltalk 愛好者やそのやり方・考え方は、正気の 沙汰とは思えないいい加減さがあるでしょうから、「自分の周りからできれば排除した い…」と思うのも、やむを得ない反応だと思います。 他方で古くはデザパタ、ユニットテストやアジャイル的な手法、比較的新しいところでも Classbox や Traits などのような静的型でも応用の利く役立つ物を次々と編み出して くるのも、また Smalltalk 愛好者たちなので、そういう成果物はどんどん活用したいと 思っている人には、生かさず殺さずのさじ加減が難しい存在でもあるでしょうね。w
[この投稿を含むスレッドを表示] [この投稿を削除]
[1336] Re:Smalltalk原理主義を粉砕せよ! (was Re: オブジェクト指向の…
投稿者:sumim
2009/06/02 21:08:18

>この BBS では、だいぶ久しぶりですよね。 恐縮です。 >実は Actor よりも Alan Kay のアイディアの方が先だったとは... >勉強になりました。_o_ ストラウストラップによるOOの再定義(抽象データ型のOOの提唱)が後にくるので アクターが先、OOはあと、というのが定説になってしまったようです。ふたつのOOを 無理矢理ひとくくりにしてしまうと、こんな歴史的な事実も歪曲されてしまうのですね。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1335] Re:コード生成部分について
投稿者:(ぱ)こと管理人
2009/06/02 01:28:02

>int func(p1[],p2[]) >{ > p1[2]=10; // これはOK > p2[4]=9;    // これはOK > p1=p2;     // これがエラーです >} >ひょっとしてdiksamはOKでしたか? DiksamではOKです。Diksamの配列の仕様はJavaとほぼ同じですので。 よって、[]は演算子です。 int[][]という型の式に対し、1回適用すればその式の型はint[]になりますし、 2回適用すればintになります。 山さんの言語でこのあたりを変えるとなると、fix_tree.cでのTypeSpecifierの 扱いが変わってくるはずです。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1334] えーっと。
投稿者:(ぱ)こと管理人
2009/06/02 00:41:17

>私は「クラス単位」で「オブジェクト」で分割です。 前から思っていたのですが、「クラス」と「オブジェクト」の区別、ついてます? >しかしこれは構造化ですよ。オブジェクト指向ではありません。 すてぜりふ?
[この投稿を含むスレッドを表示] [この投稿を削除]
[1333] Re:スレッドセーフについて
投稿者:(ぱ)こと管理人
2009/06/02 00:29:53

> では、スレッド間で複数のデータを渡す場合の方法が無いのではないだろうかと思われ >るでしょう。これには、変数集合体のパック、アンパック機能を提供し、複数の情報を >パックして他スレッドに渡すことで、スレッドセーフを保障しています。 いまさらなのかも知れませんが、スレッド間のデータの受け渡しがこれぐらい疎結合で よいのなら、ひとつのVMで複数のスレッドを動かすのではなく、VMごと分けてしまって、 それぞれ別のスレッドで動かせばよいのではないでしょうか。 このスレッドでは、まさにそういうことを話していたつもりでした。 http://kmaebashi.com/bbs/thread.php?boardid=kmaebashibbs&from=1221&range=1 >この要求に対しポインターや参照を操作することは、スレッドセーフを著しく >阻害する要因です。 >なぜなら、2つのスレッドで同じ参照を持った場合、そのデータアクセスに対し >スレッドセーフを自動で行うことはとても大変であり重い処理となります。 少なくともDiksamの設計なら、ヒープもグローバル変数もDVMの配下にあります。 よって、DVMを複数生成すれば、ふたつのスレッドで同じオブジェクトへの参照を 持つことはありませんし、グローバル変数も別です。 その上で、VM共有変数とかを導入して、VM間のデータのやり取りを考えれば よいのではないかと。 スクリプト言語において、ひとつのVMで複数のネイティブスレッドを使うことに関しては、 Rubyのまつもとゆきひろさんが以前こんなことを書いています。 http://www.rubyist.net/~matz/20070530.html >global interpreter lockを使っているので、native threadを使ってもさほど >並列性はあがらず性能もあがりません。 >というのも、オブジェクトアクセスひとつひとつを排他制御しなければならないので、 >コンフリクトは無視して問題が起きそうなら自分で対処というようなC++のような >対応はスクリプト言語では難しいでしょう。 (中略) >また、PythonのGuido van Rossumはスクリプト言語の並列性について >http://mail.python.org/pipermail/python-3000/2007-May/007414.html >という(むしろforkを活用すべきという)意見を述べています。 まあ、JVMなんかでも、doubleの操作はアトミックであることを保証してはいないので、 割り切ってしまう、という考え方もあるかもしれませんけれど。 # ポインタが不正になってクラッシュするのはさすがにまずいのかなあ。 # でも、黙って間違った答を吐くアプリケーションはもっとひどいと思うけど。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1332] SEさんの継承の使い方
投稿者:(ぱ)こと管理人
2009/06/01 22:57:31

で、以下の指摘については、何の反論も弁明もなしですか? >仮に実装継承による差分プログラミングを(いろいろの弊害は度外視して)認めると >しても、それが趣旨ならUpperStackをStack型の変数に代入してはいけないし、 http://kmaebashi.com/bbs/list.php?boardid=kmaebashibbs&from=1269&range=1 >Stack st = new Stack(); にて、SEさんは、なぜUpperStackをStackに代入しているのですか? そうすることによるメリットは何ですか? >スタックから要素を取得するメソッドはget()をオーバーライドしてはいけません。 >getUpper()のような別のメソッドを作るべきです。 http://kmaebashi.com/bbs/list.php?boardid=kmaebashibbs&from=1260&range=1 にて、なぜget()をオーバーライドしたのですか? そうすることによるメリットは何ですか? >>FileWriterを例にした方がいいかもしれません。内容的には同じ意図です。 >「同じ意図です」って、どういう意図でしょうか? で、どういう意図でしょうか? #「抽象化」とか、まるっきり意味のない回答をしないでくださいよ。 >FileWriterがこういう継承関係になっている「意図」を理解しているのなら、 >オセロ盤に棋譜を吐かせるのに、Boardクラスによりによって「ファイル名」を >渡すなどという設計がでてくるはずがないのですけど。 >http://kmaebashi.com/bbs/list.php?boardid=kmaebashibbs&from=1303&range=1 私には、SEさんが、継承やポリモルフィズムを理解しているようにはとても見えないのですけど。 # ていうか「インスタンス」も理解してなさそうな。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1331] Re:>(ぱ)こと管理人さん
投稿者:(ぱ)こと管理人
2009/06/01 22:42:23

>>http://kmaebashi.com/programmer/c_yota/module.html >まずモジュールの定義が私と違っていたようです。 >(ぱ)さんの所で言うモジュールは「ヘッダファイル単位」で、私の言っていたのは「ライブラリ単位」だったようです。 むちゃくちゃですね。 「ヘッダファイル単位」っていったいどういう意味ですか? 私がどこかにそんなことを 書きましたか? (書いてあるというのなら引用してください) ご自分が何を言っているか 自分で理解していますか? 「モジュール」が先に決まって、それに対応するヘッダファイルを作ることはあっても、 ヘッダファイルが先に決まることはありえないでしょう。常識的に考えて。 よってモジュールが「ヘッダファイル単位」などということがあるわけがありません。 これではモジュール切り分けの指針がどこにもないではないですか。 件のページで、私はこう書いています。 >さて、Cでは、ソースファイル単位で名前空間の隠蔽が出来ますが、プログラムの >規模がさらに大きく、ソースファイルの数自体が膨大になってくると、今度は、 >いくつかのソースファイルをまとめて、もう1段階大きな固まりを作る必要が >出てきます。以下、この文章中では、この固まりのことを「モジュール」と呼びます。 ># こういうのは「ライブラリ」と呼ばれることもありますが、「ライブラリ」と ># 言うとどうも「下請け」的なイメージがあって、私にはちょっとしっくり来ません。 SEさんは、Cでは、「せいぜいDBアクセスとか通信部分など」しかモジュール化しない そうですが、これはやはり私と同様、「ライブラリ」には下請け的なイメージを 持っていて、DBアクセスとか通信部分のような下請け部分しかモジュール(SEさん用語の ライブラリ)にはしない、と言っているわけでしょう。 では、「せいぜいDBアクセスとか通信部分など」以外の部分は、Cの時代には、 どのように作っていたのですか? いっさい分割なしのぐちゃぐちゃですか? >私は、実装隠蔽の単位としてクラスは適当だと思っていて、機能を単位とするのは間違いだと思います。 で、なぜそう思うわけですか? 具体的にどのような例で、クラスで分割するとうまくいって、機能を単位とすると うまくいかないわけですか? 具体例としてSEさんから出てきたのは、[1287]のこの例だけです。 http://kmaebashi.com/bbs/list.php?boardid=kmaebashibbs&from=1287&range=1 >ちなみに簡単に変更できた例は、 >メモリ上で頻繁に検索するデータが100件から6万件に変わった時の事でした。 >検索にキャッシュやヒストリー機能などあらゆる機能を組み込み高速化しましたが、 >修正したクラスは1つです。もしCの構造化で組んでいたら、修正箇所と影響範囲を >調べるだけで嫌になっていたと思います。 これを普通に読めば、なにかの検索機能という「機能を単位とした」モジュールが あって、それがうまいこと隠蔽されていたから修正箇所がそこだけで済んだ、という 話にしか読めません(誤読であればご指摘ください)。 そこで私は、「そんなものはオブジェクト指向以前の、モジュール化で達成している ことではないか(よって、オブジェクト指向の利点ではない)」と指摘しているわけです。 ここでそう書いてますよね? http://kmaebashi.com/bbs/list.php?boardid=kmaebashibbs&from=1292&range=1 >関連する操作やデータをまとめる、というのは普通にモジュール化であって、 >私が「疑りぶかい~」で書いたオセロの例の、Cでstaticで隠蔽を行った >board.cで達成していることでは? 機能単位のモジュール化では実現できず、オブジェクト指向なら実現できることの 具体例を示してもらわないと、SEさんにとってのオブジェクト指向の定義がさっぱり わからないです。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1330] Re:>(ぱ)こと管理人さん
投稿者:SE
2009/06/01 20:47:24

(ぱ)さんも感じているのではないかと思いますが、何か全てが少しづつ違うようです。 ただこの違和感は経験があります。構造化とオブジェクト指向の違いによる違和感です。 (ぱ)さんは、モジュールは「ヘッダ単位ファイル」で「機能」で分割ですね。 私は「クラス単位」で「オブジェクト」で分割です。 プログラムの組み方も変わります。イメージ的に言うと縦割りと横割りぐらい違います。 話が噛み合わないのは、この縦割りと横割りで見方が違うためでしょう。 実際、構造化プログラミングの観点で言えば、(ぱ)さんの意見は納得出来ます。 私もその観点で言えば、「クラスとカプセル化した関数は同じ」とか、 「利点をあげるとしたら見やすさ」などと言うと思います。 しかしこれは構造化ですよ。オブジェクト指向ではありません。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1329] Re:Smalltalk原理主義を粉砕せよ! (was Re: オブジェクト指向の…
投稿者:kit
2009/06/01 20:07:19

>おお、ご本人が降臨されるとは。 この BBS では、だいぶ久しぶりですよね。 実は Actor よりも Alan Kay のアイディアの方が先だったとは... 勉強になりました。_o_ >「殲滅」ではなくて「粉砕」でしたね。 >しかも対象は「Smalltalk原理主義者」ではなく「Smalltalk原理主義」。 > >主義者を殲滅というのは物騒でいかんですねえ。反省。 字面はたしかにそうでも、内容からすると「河野さんを殲滅せよ!」って感じなので、 実は合ってるかも。:-) 河野さんのボケっぷりが懐かしいですな。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1328] Re:>(ぱ)こと管理人さん
投稿者:SE
2009/06/01 14:39:00

>そういう経験もあって、2000年2月ころに書いたのがこちら。 >http://kmaebashi.com/programmer/c_yota/module.html まずモジュールの定義が私と違っていたようです。 (ぱ)さんの所で言うモジュールは「ヘッダファイル単位」で、私の言っていたのは「ライブラリ単位」だったようです。 ただ、ヘッダーファイル単位だとしてもクラス単位とは違うので、CでJavaと同じ単位ではないと思います。 >なお、なにせCなのでモジュール化の単位はクラスではないですけど、 >これはその方が都合がよいという考えでそうしています。 >Javaでも、メンバのアクセスレベルがデフォルトで「パッケージ」になっている >あたり、「実装隠蔽の単位としてクラスは適当ではない」というのが現状の >コンセンサスでいいんじゃないかと思っています。 私は、実装隠蔽の単位としてクラスは適当だと思っていて、機能を単位とするのは間違いだと思います。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1327] スレッドセーフについて
投稿者:
2009/06/01 11:32:47

 会話の上で言語仕様に食い違いがあった原因を今理解しました。私の考慮不足だったの ですが、当初より言語に求める基本機能に、スレッドセーフなシステムでした。この要求 に対しポインターや参照を操作することは、スレッドセーフを著しく阻害する要因です。  なぜなら、2つのスレッドで同じ参照を持った場合、そのデータアクセスに対しスレッド セーフを自動で行うことはとても大変であり重い処理となります。同一スレッド内でも その機構の一部が動いてしまいます。これは避けたいことです。  次の問題がもっと深刻です。参照先が複数データの場合、他の何らかのサポートなしに 参照された複数のデータをスレッドセーフにすることは原理的に不可能です。  以上2つの理由により、一番最初から、ポインターや参照を直接操作する行為は無いとの、 大前提が私の思考基本にありました。そのため、無意識にそれが前提で思考や会話をして いたことを気がつきました。よくある事ですが考慮不足です。  では、スレッド間で複数のデータを渡す場合の方法が無いのではないだろうかと思われ るでしょう。これには、変数集合体のパック、アンパック機能を提供し、複数の情報を パックして他スレッドに渡すことで、スレッドセーフを保障しています。これは始めて 説明しています。その他にもスレッドセーフを自動保障するシステムがあります。まだ 説明されていません。しばらくお待ちください。なにぶん自己検証を先にしたくて。 本当に申し訳ありません。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1326] Re:コード生成部分について
投稿者:
2009/06/01 01:48:27

>>int[] func(p1,p2,p3); >>これの int[] 配列の戻りが禁止になっています。 > >対策するのであれば、ユーザには、配列への参照自体を取得できないようにしておかな Cで言う所のポインターの存在がありません。だから、グローバル変数に参照を 入れることが出来ません。 int func(p1[],p2[]) { p1[2]=10; // これはOK p2[4]=9;    // これはOK p1=p2;     // これがエラーです } ひょっとしてdiksamはOKでしたか? (駄目だと思い込んでいました)仕様が変わっています。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1325] Re:コード生成部分について
投稿者:(ぱ)こと管理人
2009/06/01 01:30:54

>int[] func(p1,p2,p3); >これの int[] 配列の戻りが禁止になっています。 具体的にどうされているのかがよくわかりませんが、少なくとも、関数の戻り値の型として 配列型を返せないようにするだけでは不完全ではないでしょうか。 ユーザが、配列への参照を取得できるのなら、それをグローバル変数に代入することも できるはずで、もしそれをされたら、関数を抜けてスタックが開放された時点で 不正なポインタになってしまいます。 対策するのであれば、ユーザには、配列への参照自体を取得できないようにしておかないと だめなのでは。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1324] Re:コード生成部分について
投稿者:
2009/06/01 01:11:00

>ええと、ということは、そもそもユーザは配列への参照を取ることができない >(配列を引数として別関数に渡すときは内部的には参照が作られるが、ユーザがそれを >変数に代入したりすることはできない)ということでしょうか? >それなら問題ないように思います。CやJavaに慣れた身にはちょっと不便そうですが。 言葉足らずですみません。 int[] func(p1,p2,p3); これの int[] 配列の戻りが禁止になっています。 int func(p1[][],p2[]) これは問題ありません。内部で操作しても問題なく処理されます。 配列は参照渡しなので、子関数で操作したものは、呼びだし関数の配列内が変わります
[この投稿を含むスレッドを表示] [この投稿を削除]
[1323] Re:コード生成部分について
投稿者:(ぱ)こと管理人
2009/05/31 22:03:45

>>Cですごくありがちなバグである、 > 配列の参照戻しは今エラーにしています。もともと、配列は参照渡しなので、 >リターンで戻す必要を感じなかったので。 ええと、ということは、そもそもユーザは配列への参照を取ることができない (配列を引数として別関数に渡すときは内部的には参照が作られるが、ユーザがそれを 変数に代入したりすることはできない)ということでしょうか? それなら問題ないように思います。CやJavaに慣れた身にはちょっと不便そうですが。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1322] Re:コード生成部分について
投稿者:
2009/05/31 03:19:58

 やはり寝ながら思いついたアイデアは細部まで検討されていませんでした。 出来なくは無いのですが、副作用が見つかったし。やはりトリッキーでnew事態の 一般的な意味の仕様も変えてしまうのは問題が有るので、上のアイデアは 無かったことにしてください。 orz  今日は寝れそうに無くなってしまった…
[この投稿を含むスレッドを表示] [この投稿を削除]
[1321] Re:コード生成部分について
投稿者:
2009/05/31 02:48:40

>Cですごくありがちなバグである、  配列の参照戻しは今エラーにしています。もともと、配列は参照渡しなので、 リターンで戻す必要を感じなかったので。  いや~~寝ようとしたら、動的配列生成でトリッキーな方法を思いついてしまって 眠れなくなってしまいました、ここ2日間の作成をチャラにして元に戻そうかな~~  何を思いついたかと言うと、配列をnew宣言したときにスタック上の配列データの所を 開ける、その為にスタックを移動することです。スタックにリアルアドレスを持ってい るわけではないし、アドレス操作をするときは移動してないわけで。たぶん問題ないかと。  ああ~~~だめだ、思いついたらやらないでおけなくなってしまう。寝ながら だめだ、だめだ、こんな変なこと考えてはと、何度繰り返したことか。でも、どうせ 好きに作れるんだからやってしまおう^^ どう思いますか? 
[この投稿を含むスレッドを表示] [この投稿を削除]
[1320] Re:コード生成部分について
投稿者:(ぱ)こと管理人
2009/05/31 02:10:17

>>(1)Cのように、配列の領域をスタック上に取る。 >ご指摘ありがとうございます。前の書き込みからVMをいろいろ調べていましたが、 >まさに(1)の方法を取ろうと思っています。このレス読んだのがちょうど今日なん >ですよ。 この方法を取るとして、ローカルな配列への参照を、別関数に渡すことは できるのでしょうか? できるとしたら、配列への参照がプログラマの思いのままにできるということですから、 Cですごくありがちなバグである、 char *get_line() { char buf[256]; /* bufに値をつめる処理 */ return buf; } みたいなのも許すことになりませんか?
[この投稿を含むスレッドを表示] [この投稿を削除]
[1319] 配列の仕様について
投稿者:
2009/05/30 21:54:58

 上記の仕様変更により。yacc,lex部分からの修正をしています。 下に示すようなプログラムに。diksamの言語仕様と離れていってしまうのは 仕方の無いことかもしれません。それに、ほぼC言語に近くなってしまう。 ちなみに、配列変数宣言時に[]内に変数を入れるとエラーになります。 ---------------------------------------- int main(int p1,int p2) {   int aa;   string[1+2] msg = { "asd","qwe","zzz"};   int[1+1+1] i1 = {1,2,65537};   int[10][9] id;   id[5][4] = 321;   aa =id[9][8]; } ----------------------------------------  結局の所、GCを装備して配列の動的確保を可能にし、管理のための処理及び間接 アクセスのためのオーバーヘッドを許すか。領域を固定にもって直接スアクセス し、高速で単純な処理だが配列領域は宣言時に固定で確保しなければならないか。 のチョイスで有ったのではないかと思います。  私は今回、連続的な処理(一般的なプログラム)より。マルチスレッドで複数の 小さな処理の集合体による制御を優先しているので下の方を選びました。単にGCを 入れたくなかっただけかもしれませんが^^;
[この投稿を含むスレッドを表示] [この投稿を削除]
[1318] Re:>(ぱ)こと管理人さん
投稿者:(ぱ)こと管理人
2009/05/30 12:38:04

>一応、抽象化されていますが、確かに分かりにくいかもしれません。 「分かりにくい」とか「一応、抽象化」といった話ではなくて、SEさんの出した UpperStackでの継承の使い方は *間違っています*。 仮に実装継承による差分プログラミングを(いろいろの弊害は度外視して)認めると しても、それが趣旨ならUpperStackをStack型の変数に代入してはいけないし、 スタックから要素を取得するメソッドはget()をオーバーライドしてはいけません。 getUpper()のような別のメソッドを作るべきです。 たとえ「リスコフの置換原則」とかの名前を知らなくても、ポリモルフィズムを 理解していれば、当然そう考えると思うんですが。 >FileWriterを例にした方がいいかもしれません。内容的には同じ意図です。 「同じ意図です」って、どういう意図でしょうか? FileWriterがこういう継承関係になっている「意図」を理解しているのなら、 オセロ盤に棋譜を吐かせるのに、Boardクラスによりによって「ファイル名」を 渡すなどという設計がでてくるはずがないのですけど。 http://kmaebashi.com/bbs/list.php?boardid=kmaebashibbs&from=1303&range=1
[この投稿を含むスレッドを表示] [この投稿を削除]
[1317] Re:>(ぱ)こと管理人さん
投稿者:(ぱ)こと管理人
2009/05/30 12:29:14

>Cではモジュール化しようと思った所しかモジュール化しません。 >具体的に言うと、せいぜいDBアクセスとか通信部分などでしょう。 えーっ! 私がある程度大きなプログラムを最初にCで設計から実施したのは、入社2年目でしたから かれこれ15年くらいは前の話ですけれど、すべての関数をモジュールに入れていました。 5万行程度の、UNIX上のシステムで、XとMotifで画面描画するようなシステムでした。 他にもいろいろなシステムを見ましたが、数万行以上の規模なら、誰が設計しても、 まずモジュール分割はやっていたように思います。ヘッダファイルをちゃんと分離して なかったりして変なことになっているケースはよくありましたが。 そういう経験もあって、2000年2月ころに書いたのがこちら。 http://kmaebashi.com/programmer/c_yota/module.html 現在作っているcrowbarやDiksamといった言語も、モジュール分割はしています。 Diksam ver.0.2のソースにGLOBALをかましたのはこちら。 http://kmaebashi.com/programmer/devlang/diksam_src_0_2/index.html メモリ管理モジュールMEMやデバッグ用モジュールDBGの上に、コンパイラDKCと 仮想マシンのDVMがあります。その中でも機能ごとにソースファイルを分けると いったようなことはしています。 なお、なにせCなのでモジュール化の単位はクラスではないですけど、 これはその方が都合がよいという考えでそうしています。 Javaでも、メンバのアクセスレベルがデフォルトで「パッケージ」になっている あたり、「実装隠蔽の単位としてクラスは適当ではない」というのが現状の コンセンサスでいいんじゃないかと思っています。 ……それはさておき。 私も長いことこの仕事をやってますから、いろいろアレな設計やナニなソースを 見てきたつもりでいましたけど、なんだかんだでずいぶん恵まれた環境にいたのかなあ。 これでも。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1316] Re:Smalltalk原理主義を粉砕せよ! (was Re: オブジェクト指向の…
投稿者:(ぱ)こと管理人
2009/05/30 12:11:31

おお、ご本人が降臨されるとは。 >それらしいのを見つけましたがこれですか? >http://groups.google.co.jp/group/fj.comp.oops/msg/973f372a89455de2 そうですそうですこれです。 「殲滅」ではなくて「粉砕」でしたね。 しかも対象は「Smalltalk原理主義者」ではなく「Smalltalk原理主義」。 主義者を殲滅というのは物騒でいかんですねえ。反省。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1315] Re:コード生成部分について
投稿者:
2009/05/29 23:00:15

> {"new_array_int", "b", 16}, // 次元数 基本データ-型の配列生成 > {"new_array_double", "b", 20}, // 次元数 基本データ-型の配列生成 > {"new_array_object", "b", 16}, // 次元数 基本データ-型の配列生成 > {"new_array_literal_int", "s", 16}, // int定数配列を変数に接続 > {"new_array_literal_double","s", 20}, // double定数配列を変数に接続 > {"new_array_literal_object","s", 16}, // object定数配列を変数に接続 補足  このnewは構文のnewではなくスタック上に実配列生成のnewです。 ちなみに、言語上の総ての関数は特に何も記述することなくスレッドセーフに なります。複数のスレッドから関数AAAを同時に呼んでも問題が無いです。 もちろん組み込み関数も。利用者はスレッドを意識することなく自由に組んでも 問題の無い言語になります。  しかしよくよく考えてみると、この仕様がOOのクラスに合わないんです。OOP 好きな私がOOPに合わない言語を作るとは、考えてしまいます。早く作って検証 したくてなりません。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1314] Re:コード生成部分について
投稿者:
2009/05/29 22:32:50

>(1)Cのように、配列の領域をスタック上に取る。 ご指摘ありがとうございます。前の書き込みからVMをいろいろ調べていましたが、 まさに(1)の方法を取ろうと思っています。このレス読んだのがちょうど今日なん ですよ。  ちなみに、配列の添え字記述が宣言時決定でnewは無くなる方向しかないかなと 思っています。スタック上に取る以上は動的確保は無理のようで。VMコードも多少 変わってしまいました。 下記がVMコードの現在の案です。 S_OpcodeInfo D_opcode_info[] = { {"dummy", "", 0}, {"push_int_1byte", "b", 8}, {"push_int_2byte", "s", 8}, {"push_int_4byte", "i", 8}, // 実際の値を持つ {"push_double_0", "", 12}, {"push_double_1", "", 12}, {"push_double_8byte", "d", 12}, // 実際の値を持つ {"push_string", "s", 40}, // 文字列の位置NOを持つ0~ {"push_null", "", 8}, /**********/ {"push_stack_int", "s", 8}, // intローカル変数をスタックに {"push_stack_double", "s", 12}, // {"push_stack_string", "s", 40}, // {"pop_stack_int", "s", -8}, // スタックのintをローカル変数に {"pop_stack_double", "s", -12}, // {"pop_stack_string", "s", -40}, // /**********/ {"push_static_int", "s", 8}, // int静的変数をスタックに {"push_static_double", "s", 12}, // {"push_static_string", "s", 40}, // {"pop_static_int", "s", -8}, // スタックのintを静的変数に {"pop_static_double", "s", -12}, // {"pop_static_string", "s", -40}, // /**********/ {"push_sysval_int", "i", 8}, // システムグローバル変数をスタックに {"push_sysval_double", "i", 12}, // {"push_sysval_str", "i", 40}, // {"pop_sysval_int", "i", -8}, // スタックからシステムグローバル変数に {"pop_sysval_double", "i", -12}, // {"pop_sysval_str", "i", -40}, // /**********/ {"push_array_int", "", 16}, // int配列値をスタックに {"push_array_double", "", 20}, // {"push_array_string", "", 16}, // {"pop_array_int", "", -16}, // スタックからint配列に {"pop_array_double", "", -20}, // {"pop_array_string", "", -16}, // /**********/ {"add_int", "", -8}, // 以下は総て算術演算子 {"add_double", "", -12}, {"add_string", "", -40}, {"sub_int", "", -8}, {"sub_double", "", -12}, {"mul_int", "", -8}, {"mul_double", "", -12}, {"div_int", "", -8}, {"div_double", "", -12}, {"mod_int", "", -8}, {"mod_double", "", -12}, {"minus_int", "", 0}, {"minus_double","", 0}, {"increment", "", 0}, {"decrement", "", 0}, // ここまで算術演算子 {"cast_int_to_double", "", 4}, // 以下はキャスト処理 {"cast_double_to_int", "", -4}, {"cast_boolean_to_string" "", 32}, {"cast_int_to_string", "", 32}, {"cast_double_to_string", "", 28}, // ここまでキャスト処理 {"eq_int", "", -8}, // 以下は総て論理演算子 {"eq_double", "", -12}, {"eq_string", "", -40}, {"gt_int", "", -8}, {"gt_double", "", -12}, {"gt_string", "", -40}, {"ge_int", "", -8}, {"ge_double", "", -12}, {"ge_string", "", -40}, {"lt_int", "", -8}, {"lt_double", "", -12}, {"lt_string", "", -40}, {"le_int", "", -8}, {"le_double", "", -12}, {"le_string", "", -40}, {"ne_int", "", -8}, {"ne_double", "", -12}, {"ne_string", "", -40}, {"logical_and", "", -8}, {"logical_or", "", -8}, {"logical_not", "", 0}, // ここまで論理演算子 {"pop", "", -1}, // スタックを1つ減らす {"duplicate", "", 12}, // スタック内容をコピーしてスタックに {"jump", "s", 0}, // 指定ポインターにjump {"jump_if_true", "s", -1}, // スタックがtrueならjump {"jump_if_false","s", -1}, // スタックがfalseならjump /**********/ {"push_function", "sss", 0},// 関数情報をスタックに {"invoke", "", -1}, // 関数コール {"return", "", -1}, // 関数戻り /**********/ {"new_array_int", "b", 16}, // 次元数 基本データ-型の配列生成 {"new_array_double", "b", 20}, // 次元数 基本データ-型の配列生成 {"new_array_object", "b", 16}, // 次元数 基本データ-型の配列生成 {"new_array_literal_int", "s", 16}, // int定数配列を変数に接続 {"new_array_literal_double","s", 20}, // double定数配列を変数に接続 {"new_array_literal_object","s", 16}, // object定数配列を変数に接続 };  (注:ちなみに1とか-1は未定です)  上の構造だとstringがやたらスタックを食っているのは、string自体の大きさ からです。このへんが、stringを使用するのを変えてしまいそうな気分です。 ちなみに、配列は3次元まで、要素の最大は60KByteまでの制限をする予定。汎用の 言語を作るわけではないし、あくまでもローカル変数の制限だけなので、目的と 効率を優先にしています。  また、スタック構造ですが、VC++だとenumが4byte取るのでスタック対応する フラグは消して、下記のようなS_Valueに変えて、タイプとサイズを持つことに しました。で結局の所、関数のローカル変数は総てスタックに持つことでint用と double当のプールはなくしました。前に話したようにVMは出来るだけシンプルに したいので、持つデータ構造は違う形になりそうです。配列の仕様も変えてし まったし。下記の構造体をスタックで使用します //=================================================================== typedef struct { ushort dimno; // 配列の次元数 ushort dimsno[DIMMAX]; // 配列の添え字数 union { int *intDim; // int配列実態 double *doubleDim; // double配列実態 string *stringDim; // string配列実態 }u; } SV_array; //=================================================================== typedef struct { ushort vtype; // データタイプ E_StackDType ushort size; // スタック消費サイズ union { int int_value; // intデータ double double_value; // doubleデータ string *string_value // string参照 SV_array *i_array; // int配列参照 SV_array *d_array; // double配列参照 SV_array *s_array; // string配列参照 }u; } S_Value;  以上が、今日までに想定した仕様です。まだVM自体を作っていないので、まだ 変更があるかもしれません。ちなみに、組み込み関数についてはラフ案で下記の ようなクラスを使用しようと思っています。組み込み関数からのリターンはエラー コードにする予定。パラメータ可変の関数も対応します。それと変数リファレンス 情報を持って一部の関数は総ての変数をリファレンスに操作します。この点は悩み ました。文字列と配列以外は実数渡しなのですが、一部のシステム関数のみリファ レンス操作してしまうんですよ。その一部のために構文を作るべきか特殊仕様とす るかで、たった2つの関数のために構文を変えることは止めにしました。 目的優先に^^; //=================================================================== typedef struct { char *name; // 変数名 ushort gval_x; // グローバル変数横軸数 ushort gval_y; // グローバル変数縦軸数 S_Value *val_ref; // 変数参照データ S_Value val; // 変数コピーデータ } S_Value_info; //=================================================================== class C_NFBase { //-- VMに送る情報 ---------------------- char *m_name; // 関数名 int m_prmno; // 要求するパラメータ数0-10まで20は可変関数 E_ValueType m_type[PRMMAX]; // 要求するパラメータの型 E_ValueType m_rtntype; // 関数戻り値の型 //-- VMから受け取る情報 ---------------------- int m_prninno; // 引き渡されたパラメータ数 S_Value_info m_prm[PRMMAX]; // 引き渡されたパラメータデータ //-- 関数の戻り情報 ---------------------- S_Value m_return; // 関数からの戻り値データ
[この投稿を含むスレッドを表示] [この投稿を削除]
[1313] Re:>(ぱ)こと管理人さん
投稿者:yuya
2009/05/29 20:02:21

>Cではモジュール化しようと思った所しかモジュール化しません。 主語は誰なんでしょうか……。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1312] Re:>(ぱ)こと管理人さん
投稿者:774RR
2009/05/29 16:59:07

そりゃ単にプログラマの技量の問題ぢゃん。 きれいにモヂュール化された C ソースや Fortran ソースを何度も見たことあるし ぜんぜんモヂュール化されていないグチョグチョ Java ソースも見たことあるよ。 モヂュール化を言語の仕様レベルで推し進める機構があるかないか という点ならば御意。 そしてその機構に関係なくグチョグチョソースを書く下手プログラマが どこにでも、いくらでも、いるのが現実。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1311] Re:>(ぱ)こと管理人さん
投稿者:SE
2009/05/29 16:54:50

>本質は抽象化だと仰っているのにSEさんが出してるスタックの例はまったく >抽象化されていないような気がするのですが…。 一応、抽象化されていますが、確かに分かりにくいかもしれません。 FileWriterを例にした方がいいかもしれません。内容的には同じ意図です。 ----------------------------------------------------------- java.lang.Object  |  +--java.io.Writer     |     +--java.io.OutputStreamWriter        |        +--java.io.FileWriter -----------------------------------------------------------
[この投稿を含むスレッドを表示] [この投稿を削除]
[1310] Re:>(ぱ)こと管理人さん
投稿者:SE
2009/05/29 16:49:09

>Cで「単位を合わせて」モジュール化する困難さと、クラスの階層構造を適切に設計する困難さは、 >あまり違いがないように思うんですが、人によるのかな。 Cではモジュール化しようと思った所しかモジュール化しません。 具体的に言うと、せいぜいDBアクセスとか通信部分などでしょう。 Javaの場合は全てのクラスがモジュール化なのです。 現実的に実システムでは、CでJavaと同様の単位でモジュール化するのは不可能です。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1309] Smalltalk原理主義を粉砕せよ! (was Re: オブジェクト指向の…
投稿者:sumim
2009/05/29 09:01:02

>全然完璧に関係ないですが、大昔、fjに高木浩光さんが >「Smalltalk原理主義者を殲滅せよ」なんてことを書いていて(もちろんネタですが)、 >今これを探そうとしてGoogleグループを見てみたのですが… それらしいのを見つけましたがこれですか? http://groups.google.co.jp/group/fj.comp.oops/msg/973f372a89455de2
[この投稿を含むスレッドを表示] [この投稿を削除]
[1308] Re:コード生成部分について
投稿者:(ぱ)こと管理人
2009/05/29 00:51:22

>それと、GCは不要なシステムになります。INT用とdouble用の固定長プール、そして >文字列はstringに任せてしまうのでVMとしてのGCは無くなりました。 intとdoubleが固定長のプールに保持されてGCがないということは、 配列はグローバルなものだけなのでしょうか? ローカルな配列が使えないのはちょっと不便なような。 ローカルな配列を使えるようにする場合、再帰を考えれば (1)Cのように、配列の領域をスタック上に取る。  →現状のDVMには、スタック上でインデックスを指定して要素を参照する   インストラクションがないので、追加が必要。 (2)配列の領域はヒープに取るが、その参照をスタックに持つ。  →最低でも参照カウンタのGCが必要。 ということになりそうな…
[この投稿を含むスレッドを表示] [この投稿を削除]
[1307] オブジェクト指向の利点の話
投稿者:(ぱ)こと管理人
2009/05/29 00:39:49

件名変えました。 >>関連する操作やデータをまとめる、というのは普通にモジュール化であって、 >>私が「疑りぶかい~」で書いたオセロの例の、Cでstaticで隠蔽を行った >>board.cで達成していることでは? >ここが重要です。 >構造化プログラミングの「モジュール化」は基本的にモジュール化した所でしか有効ではありません。 >1つの関数で考えた場合は分かりにくいかと思いますが、関連する複数の関数での場合を考えてください。 いや、だから私が例に出したboard.cにはちゃんと複数の関数があるんですけど。 http://kmaebashi.com/programmer/object/othello.html もうSEさんが何を言いたいのかさっぱりです。 >オブジェクト指向の >利点は「再利用性が高まる事」=「変更がしやすい、変更しても壊れにくい」。 >本質は「抽象化」 >だと言う事です。 「抽象化」なんてのはおよそあらゆるプログラミングパラダイムの目的みたいなもので、 それだけでは何がなんだかさっぱりです。 >774RRさんの言う通り、「対象読者層が異なる」というだけの話のようです。 >つまり「インスタンスが複数あっていい」というあたりを理解していないプログラマ向けの文書で、 >私の指摘は「インスタンスが複数あるのは当たり前」と理解しているプログラマの視点という事です。 私もそう思っていたのですが、ちょっと疑い始めているところです。 >棋譜をセーブデータとして残すために、コンストラクタかセッターにファイル名を渡すと >言うならボードクラスに入れるのはいいと思いますが、 >名人戦の障害発生対応が違うかもしれないので、エラーログクラスを受け渡すと言うのは >おかしいと思います。 まあそのへんは要件次第で、エラーログならstaticでよいという考え方もあるでしょう (Boardが持つのは「おかしい」と言われると、それは何故かと聞きたくなりますが)。 ええと、しかも、「コンストラクタかセッターに『ファイル名を』渡す」んですか? 棋譜をファイルに吐かず、こっちの画面に出したい、とかの場合はどうするんですか? もともとLoggerの話は、SEさんの[1269]における http://kmaebashi.com/bbs/list.php?boardid=kmaebashibbs&from=1269&range=1 >これを次のように変更します。1行で済みます。 とか、 [1273]における http://kmaebashi.com/bbs/list.php?boardid=kmaebashibbs&from=1273&range=1 >遠くの所でnewした特有の処理の入ったクラスを、引数で使い回すのは、 >構造化のスタンプ結合的で、オブジェクト指向的には良くない設計です。 とかの話から出てきたものです。Loggerを引数で引き回そうが、staticで保持しようが、 遠いところでnewされたオブジェクトを、その実際のクラスがわからない状態で 使用するということに変わりはありません。そのとき、うまく使えばポリモルフィズムで 動きが変えられるというのがよく言われるオブジェクト指向の利点です。 その点、SEさんのUpperStackは、使う側がUpperStackであることを意識して使わなければ ならない(リスコフの置換原則を破っている)のでダメだ、と言っているわけです。 CばっかりずっとやってきたプログラマにJavaで設計させると、機能単位でクラス分割は するものの、 (1)何もかもstaticフィールドとメソッドで作ってしまう。 (2)staticメソッドにしない代わりに、毎回オブジェクトをnewして、いくつか  メソッドを呼んだら使い捨てにしてしまう。 このどちらかの設計にしてしまうことがあります。 正直なところ、SEさんはこの(2)のタイプの人に見えてしょうがないんですが。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1306] Re:>(ぱ)こと管理人さん
投稿者:こくぼ
2009/05/28 18:55:50

>つまり私の言いたいのは、 >オブジェクト指向の >利点は「再利用性が高まる事」=「変更がしやすい、変更しても壊れにくい」。 >本質は「抽象化」 >だと言う事です。 >利点は「見通しの良さ」 >本質は「マルチプルインスタンス」 >ではないと思います。 本質は抽象化だと仰っているのにSEさんが出してるスタックの例はまったく 抽象化されていないような気がするのですが…。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1305] Re:オブジェクト指向の概念の発明者は誰ですか?
投稿者:こくぼ
2009/05/28 18:42:42

>まるで3つのオブジェクト指向があるように思えますが、実質的にはオブジェクト指向は2です。 >1はメッセージが焦点になっていますが、本質はオブジェクトで2と同様です。 1の本質はオブジェクトではなくてメッセージだと書いてあるはずですが…。 #Smalltalkの文法やクラスやオブジェクトといった概念もおまけでしかない、とアランケイはのたまっています >もし初心者が見たら混乱するだけだと思います。2の説明だけあればいいと思います。 きちんと分類して書いてあるから少なくとも混乱することはないと思いますけどね。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1304] Re:>(ぱ)こと管理人さん
投稿者:yuya
2009/05/28 16:49:04

クラスの階層構造のおかげで、モジュール化も適切な階層構造で行いやすくなる、ってことでしょうか。 少なくとも私自身は、そんなメリットを実感したこと、一度もないなぁ。 Cで「単位を合わせて」モジュール化する困難さと、クラスの階層構造を適切に設計する困難さは、 あまり違いがないように思うんですが、人によるのかな。 無地のノートより罫線の引いてあるノートのほうが書きやすい、ぐらいの違いはあるかもしれないけど。 Cで適切な階層構造のモジュール化が行えない人が、オブジェクト指向言語でクラス設計したところで、 (しかも実装継承で組んだりしたら)余計ぐちゃぐちゃになっちゃうような気がするんですが。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1303] Re:>(ぱ)こと管理人さん
投稿者:SE
2009/05/28 15:24:23

>関連する操作やデータをまとめる、というのは普通にモジュール化であって、 >私が「疑りぶかい~」で書いたオセロの例の、Cでstaticで隠蔽を行った >board.cで達成していることでは? ここが重要です。 構造化プログラミングの「モジュール化」は基本的にモジュール化した所でしか有効ではありません。 1つの関数で考えた場合は分かりにくいかと思いますが、関連する複数の関数での場合を考えてください。 つまり拡張を見越して単位を合わせてモジュール化しておく必要があると言う事です。 オブジェクト指向の場合はクラス単位でモジュール化されているような物であると言う事です。 つまり末端のクラスから上位のクラスまで、全ての単位でモジュール化されているため、 あらゆる単位で変更が可能だと言う事です。 つまり私の言いたいのは、 オブジェクト指向の 利点は「再利用性が高まる事」=「変更がしやすい、変更しても壊れにくい」。 本質は「抽象化」 だと言う事です。 利点は「見通しの良さ」 本質は「マルチプルインスタンス」 ではないと思います。 >いや、「世間のCプログラマはstaticで実装を隠蔽するような気の効いたことは >していない。だからお前の認識はズレているのだ」ということならそうなのかも >しれませんけど(1ソースファイル1関数、という規約のプロジェクトとかって、 >今でもあるんでしょうか)。 774RRさんの言う通り、「対象読者層が異なる」というだけの話のようです。 つまり「インスタンスが複数あっていい」というあたりを理解していないプログラマ向けの文書で、 私の指摘は「インスタンスが複数あるのは当たり前」と理解しているプログラマの視点という事です。 >うーん、Loggerくらいならstaticでもかまわないとは確かに思いますけれど、 >私ならアプリケーションのインスタンスのフィールドに持ちますね。 >オセロの例なら、Boardクラスで障害発生時とかのログを残すとして、Loggerは >Boardに持たせます。名人戦のBoardだけ障害発生時の対応が違ったりするかも >知れませんし。よって、BoardのコンストラクタかsetLogger()メソッドの >引数でLoggerを渡すことになります。 棋譜をセーブデータとして残すために、コンストラクタかセッターにファイル名を渡すと 言うならボードクラスに入れるのはいいと思いますが、 名人戦の障害発生対応が違うかもしれないので、エラーログクラスを受け渡すと言うのは おかしいと思います。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1302] Re:オブジェクト指向の概念の発明者は誰ですか?
投稿者:SE
2009/05/28 14:39:32

>>>これもひどい内容ですね。 > >とSEさんがおしゃるのか、さっぱりわからないんですけど。 1.メッセージ指向 2.クラス指向 3.手続き抽象化 のまるで3つのオブジェクト指向があるように思えますが、実質的にはオブジェクト指向は2です。 1はメッセージが焦点になっていますが、本質はオブジェクトで2と同様です。 3は少なくとも私は知りませんし、一般的ではないと思います。HP筆者の独自解釈では? もし初心者が見たら混乱するだけだと思います。2の説明だけあればいいと思います。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1301] 管理者により削除されました
2009/05/29 00:42:36

テスト投稿らしいものだったので、削除しました。 テスト投稿はテスト用掲示板にお願いします。
[この投稿を含むスレッドを表示]
[1298] Re:オブジェクト指向の概念の発明者は誰ですか?
投稿者:(ぱ)こと管理人
2009/05/27 02:24:13

>#自分も特にSmalltalkに思い入れがあるわけではありません^^; ありゃ、そうですか。了解です。 全然完璧に関係ないですが、大昔、fjに高木浩光さんが 「Smalltalk原理主義者を殲滅せよ」なんてことを書いていて(もちろんネタですが)、 今これを探そうとしてGoogleグループを見てみたのですが…Googleグループって、 NewsGroupの検索ができるのだと思っていましたが、いつのまに2ch検索エンジンに?
[この投稿を含むスレッドを表示] [この投稿を削除]
[1297] Re:オブジェクト指向の概念の発明者は誰ですか?
投稿者:こくぼ
2009/05/26 08:58:11

>こくぼさんには「Smalltalkが不憫で仕方ありません」と言われそうですが、 >職業プログラマである我々が、現状、仕事でSmalltalkを使うことはまあまずないわけで、 >JavaやC++やC#を使うのに「メッセージ」がどうこう言われたら誤解を招く、というのは >わかります。 Smalltalkが不憫っていうのは、SEさんが紹介している説明を見ると まるでSmalltalkが悪いせいでオブジェクト指向が理解されてない みたいな書き方をされてるせいです。 #自分も特にSmalltalkに思い入れがあるわけではありません^^; >とSEさんがおしゃるのか、さっぱりわからないんですけど。 ですよね。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1296] Re:コード生成部分について
投稿者:
2009/05/25 19:44:20

見ていただきありがとうございます。 >要点は、文字列以外はコンスタントプールを使わずに、直接定数を >バイトコードの中に埋め込むようにした、ということですよね。 はい >効率を考えてバイトコードではなくワードコード)中に埋め込んでいるそうです。 管理面とスピードを考えて、コードに埋め込みましたが問題なさそうでよかった。 >あと、もしシステムグローバル変数がDVM_Valueを保持しているのなら、 コード生成が一応落ち着いたのでVM部分を見ました。計算スタックはDVM_Value なんですね。VMを複数スレッド起動させるので、VMは極力最小にしようと思って います。その為に、省ける分はがさがさ省いていっています。コンスタントプール も、まさに、文字列を詰め込んだ配列とそのアクセスポインタテーブルのみです。 それと、GCは不要なシステムになります。INT用とdouble用の固定長プール、そして 文字列はstringに任せてしまうのでVMとしてのGCは無くなりました。この部分は VM管理システムで一括管理する予定。コード生成もそうでしたが、必要機能のた めに実行部分は最小に、その結果管理部分が大きくなっています。  新しく組み込んでいる部分をあいまいに表現して申し訳ありません。なにぶん 出来てみないとなんとも言えなくて、絵に描いたもちを説明するのも気が引けて。 その部分はある程度完成するまでお待ちください。構想したものを組み込んで、 自身が確認しないとなんとも^^;  追記、目的ターゲットでは、細かい文字列操作は多量にあると思いますが、長い 文字列は無いと思われますので、stringの管理でも問題は無いと思っています。 しかし、実際やってみての部分は有ります。その時は専用の文字列だけを管理する 処理を組み込む予定です。その場合も文字列だけなのでGCは不要で出来ます。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1295] Re:コード生成部分について
投稿者:(ぱ)こと管理人
2009/05/25 01:16:56

> {"push_int_4byte", "i", 1}, // 直接持に変更 > {"push_double_8byte", "d", 1}, // 直接持に変更 要点は、文字列以外はコンスタントプールを使わずに、直接定数を バイトコードの中に埋め込むようにした、ということですよね。 Diksamは、JVMを真似したのと、将来的にバイトコードをファイルに 吐き出すことを考えてコンスタントプールを持ちましたが、 たとえばYARVでは、効率を考えて定数をバイトコード(ていうかこれも 効率を考えてバイトコードではなくワードコード)中に埋め込んでいるそうです。 http://www.atdot.net/yarv/yarvarch.ja.html > {"push_sysval_int", "s", 1}, // システムグローバル変数アクセス用 > {"push_sysval_double", "s", 1}, // > {"push_sysval_str", "s", 1}, // > {"pop_sysval_int", "s", -1}, // > {"pop_sysval_double", "s", -1}, // > {"pop_sysval_str", "s", -1}, // あと、もしシステムグローバル変数がDVM_Valueを保持しているのなら、 実はpush_sysval_intやpush_sysval_doubleのようにインストラクションを 型ごとに分ける必要はありません。 Diksamの場合、スタックはDVM_Valueの配列のくせにこのインストラクションを 分けているのは、将来的にint型ローカル変数は4バイトしか消費しないようにする、 といった改善を入れるときのためです。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1294] コード生成部分について
投稿者:
2009/05/24 19:18:12

 コード生成部分を作っています。基本部以外がほとんど新たなプログラムに なっています。下にバイトコードの変更およびコードのディスアセンブラです。  もしお時間が有りましたら見て、何か気になる点が有りますでしょうか? --- 修正したバイトコード ------------ {"push_int_4byte", "i", 1}, // 直接持に変更 {"push_double_8byte", "d", 1}, // 直接持に変更 // 今考えると、リアル値を持つのはまずい? --- 追加したバイトコード ------------ {"push_sysval_int", "s", 1}, // システムグローバル変数アクセス用 {"push_sysval_double", "s", 1}, // {"push_sysval_str", "s", 1}, // {"pop_sysval_int", "s", -1}, // {"pop_sysval_double", "s", -1}, // {"pop_sysval_str", "s", -1}, // -------------------------------------------------------- int main(int p1,int p2) { string[] msg = { "asd","qwe","zzz"}; int[] i1 = {1,2,65537}; double d1; d1 =3.1; } --------------------------------------------------------   ↓ コード生成後のダンプ   ↓   ↓ 上のコード修正で、constデータは文字列だけになりました。 -------------------------------------------------------- 1:*** 関数情報ダンプ ****************** 1:--- int main(int p1, int p2) 1:*** ローカル変数の表示 no = 3 *** 1: 0:string [] msg 1: 1:int [] i1 1: 2:double d1 1:*** 文字列定数 数 = 3 *** 1: 0: "asd" 1: 1: "qwe" 1: 2: "zzz" 1:*** 使用予定のスタックサイズ = 10 1:*** 関数コードのディスアセンブラ size = 45 1: 0 push_string_ptr 0 1: 3 push_string_ptr 1 1: 6 push_string_ptr 2 1: 9 new_array_literal_object 3 1: 12 pop_stack_object 2 1: 15 push_int_1byte 1 1: 17 push_int_1byte 2 1: 19 push_int_4byte 65537 1: 24 new_array_literal_int 3 1: 27 pop_stack_int 3 1: 30 push_double_8byte 3.100000e+000 1: 39 pop_stack_double 4 1: 42 push_int_1byte 0 1: 44 return 1:*** 行情報 数 = 5 *** 1: 3: from 0 size 15 1: 4: from 15 size 15 1: 6: from 30 size 12 1: 8: from 42 size 2 1: 7: from 44 size 1 1:*** end of main() -------------- --------------------------------------------------------
[この投稿を含むスレッドを表示] [この投稿を削除]
[1293] Re:>(ぱ)こと管理人さん
投稿者:(ぱ)こと管理人
2009/05/23 13:51:39

>デザインパターンと言うのは、世の中にある数多くのOOで組まれたプログラムの中から、 >共通性のある物を抜き出して分類し、その特徴や利点/欠点を解析する学問的な物です。 >重要なのは解析する能力を付ける事です。 なるほど、「学問的な物です」というのはよくわかりませんが、 おっしゃりたいことはだいたいわかったように思います。 >誰かの分類したパターンと特徴を暗記しても意味はありません。 しかしこれを「意味はありません」と言い切っちゃうのはどうかと。 kitさんが既に書いておられますが、デザインパターンはパターンに名前をつけて プログラマ間のコミュニケーションに使うことに意味があるわけですから。 >ITproのHPの人も言っていますが、「言語」→「実践」→「デザパタ」と進むのが >いいと思います。実践無しでデザパタを見たら、大抵の人は勘違いすると思います。 ここに異論はありません。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1292] Re:>(ぱ)こと管理人さん
投稿者:(ぱ)こと管理人
2009/05/23 13:47:59

SEさんが何をおっしゃりたいのかますますわからなくなっていくのですが、 >ちなみに簡単に変更できた例は、 >メモリ上で頻繁に検索するデータが100件から6万件に変わった時の事でした。 >検索にキャッシュやヒストリー機能などあらゆる機能を組み込み高速化しましたが、 >修正したクラスは1つです。もしCの構造化で組んでいたら、修正箇所と影響範囲を >調べるだけで嫌になっていたと思います。 関連する操作やデータをまとめる、というのは普通にモジュール化であって、 私が「疑りぶかい~」で書いたオセロの例の、Cでstaticで隠蔽を行った board.cで達成していることでは? http://kmaebashi.com/programmer/object/othello.html 「疑りぶかい~」を書いたときの私の認識は、 「Cなどでプログラムを書いている普通のプログラマは、staticで情報隠蔽するような  モジュール化は普通に行っているだろう。でもそれは、オブジェクト指向ではない。  オブジェクト指向(C++流の)といえばカプセル化、継承、ポリモルフィズムと言われるけれど、  カプセル化は普通のCプログラマも理解していそうだし、継承やポリモルフィズムに  至る前にマルチプルインスタンスを理解しなければいけないのに、世間にあふれる  オブジェクト指向の説明からはそこがすっぽり抜けている。  多くの人がここで引っかかるように思うので、このミッシングリンクは埋めておく  べきではないか」 というものです。 この認識がズレている、という批判ならお受けしますけれども。 マルチプルインスタンスのさらに手前の事例を持ってきて、オブジェクト指向の 成果だと言われても…… 継承の話はどこにいったんでしょうか。 いや、「世間のCプログラマはstaticで実装を隠蔽するような気の効いたことは していない。だからお前の認識はズレているのだ」ということならそうなのかも しれませんけど(1ソースファイル1関数、という規約のプロジェクトとかって、 今でもあるんでしょうか)。 >普通のLoggerは、staticのフィールド変数として作成して直接使用するため、Logger自体を >メソッドの引数にして使用する事は少ないと思います。 うーん、Loggerくらいならstaticでもかまわないとは確かに思いますけれど、 私ならアプリケーションのインスタンスのフィールドに持ちますね。 オセロの例なら、Boardクラスで障害発生時とかのログを残すとして、Loggerは Boardに持たせます。名人戦のBoardだけ障害発生時の対応が違ったりするかも 知れませんし。よって、BoardのコンストラクタかsetLogger()メソッドの 引数でLoggerを渡すことになります。 >敢えてLoggerを例にするとすると、 >void write(Logger l){} >なら、 >class Logger{ >  void write(){} >} >にすべきと言う事です。 ええと、write()メソッドがログを吐くメソッドなら、 >class Logger{ >  void write(){} >} となるのは当たり前だと思うんですが……
[この投稿を含むスレッドを表示] [この投稿を削除]
[1291] Re:オブジェクト指向の概念の発明者は誰ですか?
投稿者:(ぱ)こと管理人
2009/05/23 12:26:48

件名変えました。 >アランケイの「メッセージ指向」は、C++の登場した当たりから軽視されるようになっていて、 >現在のオブジェクト指向の実装や環境から考えると、誤解しやすい物になっているからです。 >(ぱ)さんも「ただの関数呼び出し」と言っていますが、私もそう思います。 こくぼさんには「Smalltalkが不憫で仕方ありません」と言われそうですが、 職業プログラマである我々が、現状、仕事でSmalltalkを使うことはまあまずないわけで、 JavaやC++やC#を使うのに「メッセージ」がどうこう言われたら誤解を招く、というのは わかります。 で、当のsumimさんのページにはまさにそういうことが書いてあるわけで、 >なお、この文脈の「オブジェクト指向」において、メッセージングはぜんぜん関係ない >無用のもの and/or 動的性実現のための(仮想関数より効率の悪い)実装のひとつに >過ぎない…ということを強く意識する必要があります。ケイの影響で「オブジェクト >指向=メッセージ」と脳に染みついている人には酷かもしれませんが、いっそ排除して >考えたほうがすっきりしますし、可能な限りそうすべきです。 >しがらみのない初学者へのレクチャーに際しては、ぜひとも「オブジェクトにメッセー >ジを送って…」とか「世の中のあらゆるものを(ry」なんて説明は後々無用な混乱を >招くだけなので、やめて欲しいと思います。 なぜこのページについて >これもひどい内容ですね。 とSEさんがおしゃるのか、さっぱりわからないんですけど。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1289] Re:>(ぱ)こと管理人さん
投稿者:SE
2009/05/22 16:57:12

デザインパターンと言うのは、世の中にある数多くのOOで組まれたプログラムの中から、 共通性のある物を抜き出して分類し、その特徴や利点/欠点を解析する学問的な物です。 重要なのは解析する能力を付ける事です。 誰かの分類したパターンと特徴を暗記しても意味はありません。 ただ私もGoFのパターンは見ました。学者的で実務に使えるのは2割程度だと思いましたが。 ITproのHPの人も言っていますが、「言語」→「実践」→「デザパタ」と進むのが いいと思います。実践無しでデザパタを見たら、大抵の人は勘違いすると思います。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1288] Re:>(ぱ)こと管理人さん
投稿者:こくぼ
2009/05/22 16:36:27

>アランケイの「メッセージ指向」は、C++の登場した当たりから軽視されるようになっていて、 >現在のオブジェクト指向の実装や環境から考えると、誤解しやすい物になっているからです。 >(ぱ)さんも「ただの関数呼び出し」と言っていますが、私もそう思います。 >歴史に関してはウィキペディアに詳しく記載されています。 あぁ…。抽象データ型のオブジェクト指向が現代のオブジェクト指向だと解釈されているのですね。 そこらへんの各人のオブジェクト指向への認識の違いを理解していただくことも含めて sumimさんの説明ページへとリンクしたつもりでしたが伝わってないみたいで…。 #Wikipediaの説明も見ましたがあれではSmalltalkが不憫で仕方ありません >オブジェクト指向自体の話ではありませんが、オブジェクト指向の間違いやすい所に関しては、 >以下の記載がかなりいい所をついていると思います。(全て賛成できる訳ではありませんが) >http://itpro.nikkeibp.co.jp/article/COLUMN/20060921/248617/?ST=develop&P=1 ザッと見ました。 このページを見る限りではSEさんが例示しておられる 実装継承を使ったオブジェクト指向プログラミングを推奨しているわけではなさそうですね。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1287] Re:>(ぱ)こと管理人さん
投稿者:SE
2009/05/22 16:25:01

>関数等に切り出されて一箇所にまとめられていれば修正するのは一箇所です。 >ここまではオブジェクト指向は関係ありません。 ここがミソです。1つの関数を考えた場合はそうですが、関数群で考えると違います。 例えばファイル操作を考えてみましょう。 クラスなら以下のようになるとします。 class File{   public void open(){}   public void read(){}   public void write(){}   public void close(){} } これなら明確です。ファイルからメモりに変わっても簡単に変更できるでしょう。 しかしCの構造化なら関数同士の関連はありません。 そのため、もしかしたらread()は業務ロジックに組み込まれ関数化されていないかもしれませんし、 write()は3つに分割されているかもしれません。例がファイルなのでそんな簡単な間違いは しないと言うかもしれませんが、もしこれが業務ロジックなら簡単に判断出来ないかもしれません。 これが関数化(プロセス中心アプローチ(POA)または、データ中心アプローチ(DOA))と、 クラス化(オブジェクト中心アプローチ(OOA))の違いです。 POA、DOA、OOAの特徴と違いについては、以下のサイトがよく分かります。 (分かりにくい表現もありますが) http://itpro.nikkeibp.co.jp/article/COLUMN/20061019/251255/ ちなみに簡単に変更できた例は、 メモリ上で頻繁に検索するデータが100件から6万件に変わった時の事でした。 検索にキャッシュやヒストリー機能などあらゆる機能を組み込み高速化しましたが、 修正したクラスは1つです。もしCの構造化で組んでいたら、修正箇所と影響範囲を 調べるだけで嫌になっていたと思います。 Loggerのようないわゆる「横断的関心事」はOOに適さないので例としては良くないと思いますが、 普通のLoggerは、staticのフィールド変数として作成して直接使用するため、Logger自体を メソッドの引数にして使用する事は少ないと思います。 敢えてLoggerを例にするとすると、 void write(Logger l){} なら、 class Logger{   void write(){} } にすべきと言う事です。 >
[この投稿を含むスレッドを表示] [この投稿を削除]
[1286] Re:>(ぱ)こと管理人さん
投稿者:SE
2009/05/22 15:27:15

>どこがひどいと思われるのでしょうか? >「この当たりの話は知っています」と書かれていることから類似のWebページなどをご存知なのでしょうか。 >できればその情報のソースを教えていただきたいです。 >(自分的にこの手の情報はsumimさんの日記くらいしか知らないので) アランケイの「メッセージ指向」は、C++の登場した当たりから軽視されるようになっていて、 現在のオブジェクト指向の実装や環境から考えると、誤解しやすい物になっているからです。 (ぱ)さんも「ただの関数呼び出し」と言っていますが、私もそう思います。 歴史に関してはウィキペディアに詳しく記載されています。 >#できれば他にもSEさんが比較的マシだと思ってる本やWebページを >#いろいろ教えていただきたいところですが オブジェクト指向自体の話ではありませんが、オブジェクト指向の間違いやすい所に関しては、 以下の記載がかなりいい所をついていると思います。(全て賛成できる訳ではありませんが) http://itpro.nikkeibp.co.jp/article/COLUMN/20060921/248617/?ST=develop&P=1
[この投稿を含むスレッドを表示] [この投稿を削除]
[1285] Re:>(ぱ)こと管理人さん
投稿者:yuya
2009/05/22 11:47:06

懐かしいお名前がいっぱいでうれしくなりました。 kitさんも >でも、そもそもデザインパターンの多くは、それなりのプログラマーだったら、 >自分で似たようなものを必要に応じて考えて既に使っているものですよね。 と書かれていますが、SEさんのご意見が、 「天下りに与えられたパターンを憶える(=学習する?)んじゃなくて、 自分で同じものを作ってみるなりしてきちんと理解する(=解析する?)べきだ」、 ということならば、賛成ですけどね。 議論の行く末が気になるので、SEさんにはまた登場していただきたいです。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1284] Re:>(ぱ)こと管理人さん
投稿者:kit
2009/05/22 10:49:48

>ちょっと穿って解釈すると、 > > ちなみにデザインパターンは学習(に値)する(ような)物ではなく、 > (こんなものを調子こいて使ってしまうとソースが読みにくくなって > 必死に)解析する(ハメになるような)物です。 > >という意味なんでしょうか。 > >そういう趣旨ならわからなくはないし、部分的には賛同しないでもないのですが、 なるほど。 勉強したばかりで調子にのって *必要ないのに* 使いすぎると、問題は問題ですね。 でも、そもそもデザインパターンの多くは、それなりのプログラマーだったら、 自分で似たようなものを必要に応じて考えて既に使っているものですよね。 各種パターン本の意義は、そういうものにきちんと名前をつけて、いちいち説明 しなくても意思の疎通を可能にするという側面が大きいわけです。これにはソース 中の名前づけを標準化して、可読性を高めることを含みます。 したがって、経験のあるプログラマーにとって、デザインパターンの学習という のは、既知の設計手法について、規範となる名前を学習するという意味になります。 また、デザインパターンとして標準化された名前を使うことによって、ソース等を 解析することなく (すなわち、名前を見ただけで) モジュールの役割を理解する ことが可能になります。 また、もちろん初学者にとっては、設計パターンを自分で一から考える手間を省く という学習の意義があります。 というわけで、もしそういう意味だったとしても、やっぱり賛成できませんねえ。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1283] Re:疑い深い・・・
投稿者:(ぱ)こと管理人
2009/05/22 02:16:37

横から口を出しますけど、 >>そもそも OO (というか継承-派生というシステム) のおいしいところは >>・「基底クラスを使う人」と「派生クラスを作る人」が分離できる >>・基底クラス(のメンバー)を使う人は、派生クラスについて知らなくていい >>・派生クラスを作る人は、基底クラス側で期待している動作(=契約)に反しない限り、 >> 自動的に正しく使ってもらえる、と判断してよい >これが利点ですか?ちょっと他人に説明するのが難しいです。 前回私が例に出したLoggerクラスで考えると、 >>・「基底クラスを使う人」と「派生クラスを作る人」が分離できる 「Loggerクラスを使う人」は、logger.write()のようなメソッドを単に呼べばよく、 「ログをファイルに出力するFileLoggerクラスを作る人」と分離できる。 >>・基底クラス(のメンバー)を使う人は、派生クラスについて知らなくていい 「Loggerクラスを使う人」は、logger.write()のようなメソッドを単に呼べばよく、 FileLoggerクラスについては知らなくていい。 >>・派生クラスを作る人は、基底クラス側で期待している動作(=契約)に反しない限り、 >> 自動的に正しく使ってもらえる、と判断してよい 「FileLoggerクラスを作る人」は、基底クラス側で期待している動作(=契約)に 反しない限り、自動的に正しく使ってもらえる、と判断してよい わけで、私から見れば、774RRさんはごく普通にオブジェクト指向の利点を 挙げていると思うんですけど。 もちろん、何にでも利点と欠点はあるものですし、その重み付けは用途によって 変わります。SEさんの過去の業務で実装継承がすごく役に立ったのなら、 それはそれで興味深いことです。 だからこそ、実際に役に立ちそうな現実的な例を挙げていただきたいと思いますし、 上記774RRさんが挙げられたような利点をあまり重視しておられないように見える割に、 [1260]のUpperStackにおいて、getUpper()のようなメソッドを作らずにget()を オーバーライドしていたり、 [1270]で >>「要素をgetする側は、大文字が欲しいとき、そのことを意識しないで済む」 >>ということにしたいのでしょうか? という問いに対して >そうです。 と答えていたり、 同じく[1270]で new LinkedHashMap<String, String>()の戻り値を Map<String, String>型の変数に代入したりしている 意図がさっぱりわからないわけです。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1282] Re:>(ぱ)こと管理人さん
投稿者:(ぱ)こと管理人
2009/05/22 01:53:22

kitさん、おひさしぶりです。 >>>ちなみにデザインパターンは学習する物ではなく、解析する物です。 >> >>?? >>すみません、仰っておられる意味がわかりません…。 > >素直に解釈すると、SEさんは GoF本や PofEAA あたりも読んだことがないって >ことになります (こういった本を読むこと == デザインパターンを学習すること >ですから)。 私にもSEさんのおっしゃる意味はよくわからないのですが、ちょっと穿って解釈すると、  ちなみにデザインパターンは学習(に値)する(ような)物ではなく、  (こんなものを調子こいて使ってしまうとソースが読みにくくなって  必死に)解析する(ハメになるような)物です。 という意味なんでしょうか。 そういう趣旨ならわからなくはないし、部分的には賛同しないでもないのですが、 もしそういう意図なら、もっとわかりやすく書いていただきたいです……
[この投稿を含むスレッドを表示] [この投稿を削除]
[1281] Re:疑りぶかいあなたのための「オブジェクト指向再入門」を読んで
投稿者:
2009/05/21 21:05:59

>こちらの返信が遅くなってしまいました。 いえいえ、お返事いただけるだけで嬉しいので、気にしないでゆっくりして下さい。 >(私の感覚では)かなり実用的な問題でして。 了解しました >また、ヘッダファイルの依存関係が漏洩するという問題もあるでしょう。 >あるライブラリがウインドウに絵を描いたりするのでprivateメンバで >windows.hで定義されている型などを使っていたりすると、それを使う人にまで >もれなくwindows.hがプレゼントされ名前空間が汚染されてしまったりとか。 賛同です。これは問題ですね。OOP以前C言語の時は、それはキッチリとヘッダーが きれいに分割され必要な所だけが#includeされていたのですが。OOPになって、 必要も無いようなヘッダーが次から次へと#includeされているのを見るのは、 正直止めてほしいと思っています。特にVCはひどい、プリコンパイルヘッダーを 作ったのは苦肉の策ではないかと疑ってしまうほどです。  しかし、現実に自身が作っている内容でも、結局多くのヘッダーが#include してしまっているのを見るにつけ、何かの対策がほしいと思います。 >これを問題と思わない人が多かったようなので、私のような心配をするのは >少数派なのかもしれませんけれども。 私もそうですが、目をつぶっているだけなのかも知れません。  ちょっと真剣に考えて見ます。軽はずみな返事をしたくないと思っているので ちょっと期間をくださ。今は、作っている言語仕様に頭がいっぱいなんです。 いま佳境に入ってて、最近はプログラムではなく仕様書の書き込み書き直しばか りしています。楽しくもあり苦しくもある時間です。  いやほんと、こんな仕様を発表したら、けちょんけちょんにけなされっるので はないかとか、本当に良いんだろうかとか、でも当面第1弾はこれしかないよな~ とか、悩んだりしています。   今作っている言語そしてシステムの最大の目的は。   「簡単なルールを持った言語で、いかに複雑な処理を簡単に書けるか」 なので、熟練のプログラマーのほうが抵抗が大きいのではないかと…  プログラミング言語というものは論理的に整然と矛盾が無く、どんな形でも 記述可能であり。その中においてさえ、書きやすくセーフティーな環境を提供し 見やすさを追求している、と私は思っています。でも、私が目指しているのは。 記述目的を限定することで、自由が無くなる分、普通では考えられないような 記述で複雑なものを簡単に記述すシステムを出してみたい。  大風呂敷はこのへんで終わって、早く実物が出来るようにがんばります。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1280] Re:>(ぱ)こと管理人さん
投稿者:kit
2009/05/21 10:32:18

>>ちなみにデザインパターンは学習する物ではなく、解析する物です。 > >?? >すみません、仰っておられる意味がわかりません…。 素直に解釈すると、SEさんは GoF本や PofEAA あたりも読んだことがないって ことになります (こういった本を読むこと == デザインパターンを学習すること ですから)。 そう解釈していいんですかね?
[この投稿を含むスレッドを表示] [この投稿を削除]
[1279] Re:疑りぶかいあなたのための「オブジェクト指向再入門」を読んで
投稿者:(ぱ)こと管理人
2009/05/21 01:45:56

SEさんとの議論がアツいので、こちらの返信が遅くなってしまいました。 > カプセル化という言葉に対して、きっちりとした完全な意味を求めてるのだ >ろうと思いますが、私はそこまでのことを意識してこの言葉を使っていません。 ええと、用語定義の問題と言うよりは、(私の感覚では)かなり実用的な問題でして。 > 必要なこと意外一切情報を出さないほうがいいのか。内部がある程度想像 >できるほうがいいのか?Cはたとえ使えなくともクラスのデータやメソッドが見 >える。これが良いか悪いかでしょう。私は後者のほうが気分的には良いです。 チームで開発するとき、ライブラリとそれを使うアプリケーションがあったとして、 これらを平行して開発することがあります。そういう場合、ライブラリの ヘッダファイルだけ先に作ってしまえばアプリケーション側のコンパイルが通せますが、 その時、空実装のメソッドを暫定で書いて後で差し替えるような作業は バージョン管理が面倒になるので避けたい。また、ヘッダファイルはドキュメント的な 性格も大きいですから、ここに実装やprivateメンバを書いてごちゃごちゃして しまうのも避けたい。 また、ヘッダファイルの依存関係が漏洩するという問題もあるでしょう。 あるライブラリがウインドウに絵を描いたりするのでprivateメンバで windows.hで定義されている型などを使っていたりすると、それを使う人にまで もれなくwindows.hがプレゼントされ名前空間が汚染されてしまったりとか。 ……という話題が昔JavaHouseであったとき、 http://java-house.jp/ml/archive/j-h-b/048357.html#body http://java-house.jp/ml/archive/j-h-b/048360.html#body これを問題と思わない人が多かったようなので、私のような心配をするのは 少数派なのかもしれませんけれども。 > 言語の設計において、理想的なものを作っていくのもあります。私の場合は >目的が実現できれば簡単なものでいいと思って設計しています。その代表が >#defineです。古い仕様で問題点も内包しますが、実に使いやすく融通が利きます。 >今では#defineはあまり良くないとされていますが、私は利点を選びました。 これは同意です。「わかって使う」分には、#defineは便利ですよね。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1278] Re:>(ぱ)こと管理人さん
投稿者:(ぱ)こと管理人
2009/05/21 00:40:14

>大文字小文字の例が悪かったのか、話がそこから進まないようです。 では、よい例を出してもらえませんか。具体的な例なしでこの手の話をしても 意味がありません。 774RRさんへの返信に >例えば総合試験で性能目標に達しなかった場合、従来の方法では普通は大変更に >なりますが、オブジェクト指向の場合、一部のクラスの取得処理を変更しただけで >修正できた例もあります。 とありますが、これも具体的にどういうケースだったのかわかりません。 普通に考えて、どこかの処理がボトルネックになっていたのなら、そこだけ 書き直せば速くなるでしょう。もちろん、その処理がプログラムのあっちこっちに コピペされていれば大変更になるでしょうが、関数等に切り出されて一箇所に まとめられていれば修正するのは一箇所です。ここまではオブジェクト指向は 関係ありません。 オブジェクト指向であったがゆえにうまくいった、とのことなので、 関数化ではうまくいかないケースだったのでしょう。どういう理由で、関数化では うまくいかず、オブジェクト指向(実装継承?)でうまくいったのでしょうか。 仕事のソースをここに貼ることができないのはわかっていますが、概要だけでも 教えてもらえませんか。興味深いので。 >遠くの所でnewした特有の処理の入ったクラスを、引数で使い回すのは、 >構造化のスタンプ結合的で、オブジェクト指向的には良くない設計です。 オブジェクト指向の最大の特徴のひとつであるポリモルフィズムは、遠いところで newしたオブジェクトのメソッドを呼ぶと、呼ぶ側が意識しなくても、 そのオブジェクトに応じたメソッドが呼び出される、というものですよね? デザインパターンなどでは生成に関するパターンだけでいくつもあって、 うちいくつかは、具体的なクラスが何であるかを意識させないようにするための ものですし、DI(Dependency Injection)なんかも考え方はそっち方面です。 まあ、この手のことは、当面用途もないのに調子に乗って柔軟性を求めると ソースが追えなくなってしまうので、私はあまり好きではないのですけれど。 ありがちな例では、たとえばログを出力するLoggerクラスをabstractクラスもしくは interfaceとして作って、それを継承またはimplementsしてファイルに吐くLoggerや syslogに吐くLoggerを作ったりしますが、これは、遠く離れたところでnewした Loggerを引数等で持って回ることになると思うんですが。 >オブジェクト指向の場合は処理は関連するデータと共にクラスに >まとめられるため、その引数を必要とするメソッドを、引数のクラス内 >に実装できるか検討すべきです。 意味がわかりません。 さっきのLoggerの例で言えば、Loggerクラスを引数として受け取るメソッドは Loggerを使うアプリケーションですが、アプリケーションのメソッドを Loggerクラスの中に作れ、という主張……ではないですよね。 >>ひとつ伺いたいのですが、SEさんはどんな本でオブジェクト指向の勉強をされたの >>でしょうか。 こくぼさんからも質問が出ていますが、私もSEさんが「比較的マシ」だと思ってる 本やWebページを教えていただきたいです。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1277] Re:>(ぱ)こと管理人さん
投稿者:こくぼ
2009/05/20 18:32:43

>ちなみにデザインパターンは学習する物ではなく、解析する物です。 ?? すみません、仰っておられる意味がわかりません…。 >これもひどい内容ですね。 詳しく教えていただきたいのですが、 どこがひどいと思われるのでしょうか? 「この当たりの話は知っています」と書かれていることから類似のWebページなどをご存知なのでしょうか。 できればその情報のソースを教えていただきたいです。 (自分的にこの手の情報はsumimさんの日記くらいしか知らないので) >これならまだ「ウィキペディア」の「オブジェクト指向プログラミング」の >方がマシです。 >一度読んでみてはいかがですか? ありがとうございます。 読んでみます。 #できれば他にもSEさんが比較的マシだと思ってる本やWebページを #いろいろ教えていただきたいところですが
[この投稿を含むスレッドを表示] [この投稿を削除]
[1276] Re:>(ぱ)こと管理人さん
投稿者:SE
2009/05/20 15:47:40

>デザインパターンを学習されているなら継承を使う機会は減ると思うんですけど。 >#減るというか注意深くなるというか デザインパターンは知っています。 ちなみにデザインパターンは学習する物ではなく、解析する物です。 >ちなみにこのページはオブジェクト指向を学ぶうえにおいてとても参考になります。 >一読してみてください。 >http://d.hatena.ne.jp/sumim/20040525/p1 これもひどい内容ですね。 この当たりの話は知っていますが、参考にするのはまずいでしょう。 これならまだ「ウィキペディア」の「オブジェクト指向プログラミング」の 方がマシです。 一度読んでみてはいかがですか?
[この投稿を含むスレッドを表示] [この投稿を削除]
[1275] Re:疑い深い・・・
投稿者:SE
2009/05/20 15:31:59

>俺も (ぱ) 氏ももっとマクロな=大規模プログラムでの応用の話をしているわけです。 >そういうレベルでは、提示のコードのような派生はうまくいきません。 なぜ大規模プログラムでうまくいかないのかが分かりません。 実際、大規模プログラムで使用していますが、効果が出ています。 例えば総合試験で性能目標に達しなかった場合、従来の方法では普通は大変更に なりますが、オブジェクト指向の場合、一部のクラスの取得処理を変更しただけで 修正できた例もあります。 オブジェクト指向ではオブジェクト単位であるため、大きいレベルから小さいレベル まで対応できるのが特徴です。 >そもそも OO (というか継承-派生というシステム) のおいしいところは >・「基底クラスを使う人」と「派生クラスを作る人」が分離できる >・基底クラス(のメンバー)を使う人は、派生クラスについて知らなくていい >・派生クラスを作る人は、基底クラス側で期待している動作(=契約)に反しない限り、 > 自動的に正しく使ってもらえる、と判断してよい これが利点ですか?ちょっと他人に説明するのが難しいです。 私の例では、処理に大修正が入った場合(例えばDB変更や、ローカルファイルから 通信を使ったリモートファイルへの変更)、これだけの修正で済みますなどと 言えますが、上記の場合はどう説明しますか? >んで、マルチプルインスタンスの件のほうはもういいのでしょうか? >俺としては既に書いたとおり「対象読者層が異なる」というだけの話だと思っております。 了解しました。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1274] Re:>(ぱ)こと管理人さん
投稿者:こくぼ
2009/05/20 14:40:28

スタックの例とかあんまり細かく見ずにコメントしますが…。 >それぞれ用途が違いますが、オブジェクト指向特有で強力なのが2,3です。 >別に全て2でやれと言っているわけではなく、2の使い方が出来るのが >利点だと言っている訳です。 >... >つまり、分かりやすいとか間違えやすいとか言う話は別として、 >4種類の変更方法を選択できるため、再利用性が高いと言っている訳です。 そもそも継承というメカニズムを使うのが間違いのもとになっちゃうような。 デザインパターンを学習されているなら継承を使う機会は減ると思うんですけど。 #減るというか注意深くなるというか >本は色々読みましたが、全てが同意できる物はありません。 となると、ここで力説されていらっしゃる実装継承を使ったOOP をどこから学ばれたのか興味深いですね。 ちなみにこのページはオブジェクト指向を学ぶうえにおいてとても参考になります。 一読してみてください。 http://d.hatena.ne.jp/sumim/20040525/p1
[この投稿を含むスレッドを表示] [この投稿を削除]
[1273] Re:>(ぱ)こと管理人さん
投稿者:SE
2009/05/20 13:42:06

大文字小文字の例が悪かったのか、話がそこから進まないようです。 修正方法には以下の4つがあります。 ----------------------------------------------------------- 1.別名でメソッド追加  別々の処理として追加したい場合に使用 2.継承  関連処理をまとめて変更したい場合に使用 3.分割して親クラスを継承  関連処理をグループ化して、片方のグループを変更したい場合に使用 4.staticメソッドを作成  関連のない任意の場所で使用したい場合に使用 ----------------------------------------------------------- それぞれ用途が違いますが、オブジェクト指向特有で強力なのが2,3です。 別に全て2でやれと言っているわけではなく、2の使い方が出来るのが 利点だと言っている訳です。 間違いやすいとか分かりにくいと言うのは、実装者のスキルの話で、 よく見て追えば分かるし、変な設計をすれば分かりにくくなります。 遠くの所でnewした特有の処理の入ったクラスを、引数で使い回すのは、 構造化のスタンプ結合的で、オブジェクト指向的には良くない設計です。 オブジェクト指向の場合は処理は関連するデータと共にクラスに まとめられるため、その引数を必要とするメソッドを、引数のクラス内 に実装できるか検討すべきです。 つまり、分かりやすいとか間違えやすいとか言う話は別として、 4種類の変更方法を選択できるため、再利用性が高いと言っている訳です。 >ひとつ伺いたいのですが、SEさんはどんな本でオブジェクト指向の勉強をされたの >でしょうか。 本は色々読みましたが、全てが同意できる物はありません。 殆どが、オブジェクト指向と言いつつ、デザインパターンの説明本や、UMLの説明本、 プログラミング言語の小技本、翻訳がおかしい本、中にはWEBアプリケーションの 作り方本もありました。 WEBサイトも同意できる物もあれば、出来ない物もあり、半々ぐらいです。 オブジェクト指向関係の書籍のひどさは、(ぱ)さんもご存じだと思います。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1272] Re:疑い深い・・・
投稿者:774RR
2009/05/20 11:17:08

# 題名にハンドル入れるのやめてほしい > SE 氏 変えちゃいました # [1269] に返信してもよかったんだけどこっちにつなぐことにする [1269] > これを次のように変更します。1行で済みます。 ものすごく近視眼的コメントがついていて思わず苦笑してしまったのだけど、 *** そういう範囲でしか変更がありえない **** のであれば [1260] [1269] で提示のような修正もまぁあり、の範疇に収まります。 が、実世界においてはそういう局所な話ですまないことのほうが多く、 俺も (ぱ) 氏ももっとマクロな=大規模プログラムでの応用の話をしているわけです。 そういうレベルでは、提示のコードのような派生はうまくいきません。 そもそも OO (というか継承-派生というシステム) のおいしいところは ・「基底クラスを使う人」と「派生クラスを作る人」が分離できる ・基底クラス(のメンバー)を使う人は、派生クラスについて知らなくていい ・派生クラスを作る人は、基底クラス側で期待している動作(=契約)に反しない限り、  自動的に正しく使ってもらえる、と判断してよい という点にあるのであって、 決して「ソースの再利用のためのテクニック」ではないのです。 http://kmaebashi.com/bbs/list.php?boardid=kmaebashibbs&thread=270 このへんとか。 基底クラスを使っている側にとって 基底クラス側が本来期待している挙動と異なる動きをするような派生クラス というのはまずいのです。 しかも、基底クラスユーザと派生クラス作者はたいてい別人なのです。 基底クラスを使うソースファイルと派生クラスを作るソースファイルも別ファイルなのです。 [あたかも便利そうに見える] [が、正しく設計されているとは必ずしも言い切れない] 派生クラスを安直に作り、使ってしまうと 異なる開発者がいて、複数のファイルから構成されていて、各プログラマは自分の担当範囲しか理解しきれない という大規模開発では見えにくい/直しにくいバグの元となります。 LSP (Liskov Substitution Principle) という概念も、この辺から来ています。 んで、マルチプルインスタンスの件のほうはもういいのでしょうか? 俺としては既に書いたとおり「対象読者層が異なる」というだけの話だと思っております。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1271] Re:>(ぱ)こと管理人さん
投稿者:(ぱ)こと管理人
2009/05/20 03:49:06

# どうもサーバの調子が悪いようで…… まずSEさんにお願いですが、投稿に返信を付ける際には各投稿の右上にある 「返信」リンクを使ってください。そうすることでスレッドがつながりますので [この投稿を含むスレッドを表示]をクリックすると関連する投稿をまとめて 読むことができます。 この掲示板の上のほうにある「スレッド順インデックス」をクリックすると、 他の投稿はちゃんとスレッドがつながっているのに、SEさんの投稿だけ 切り離されていることがわかるでしょう。 http://kmaebashi.com/bbs/thread.php?boardid=kmaebashibbs >>まあ、オセロの例で注記したように、マルチプロセスにはオブジェクト指向と似た面は >>ありますけど。「その論理で行くと」の「その論理」がどういう論理か、教えて >>いただきたいです。 >「マルチプルインスタンスがオブジェクト指向」と言う論理です。 >マルチプルインスタンスと言うのが何を指すのがよく分かりませんが、 >状態(内部の変数の値)の違う複数の処理群(クラス)と解釈しました。 「状態(内部の変数の値)の違う複数の"オブジェクト"」ですよね? まあ、クラスベースのオブジェクト指向ではオブジェクトの生成の雛形として クラスを使うわけで、「疑りぶかい~」ではクラスベースのオブジェクト指向の 話しかしていないわけですけれども。 実のところオブジェクト指向という用語は定義などないも同然なのですが、 「状態(内部の変数の値)の違う複数の"オブジェクト"を持てること」が たいていのオブジェクト指向の定義の必要条件である、ぐらいのことはたぶん 言ってもよいでしょう。 で、そうするとなぜ「マルチプロセスやマルチスレッドはオブジェクト指向になる」 のですか? 「DOSを乗っけたPCを2台もってこれば同時に複数のプログラムを動かせるので、 DOSはマルチプロセスだ!」という主張は誰もしないと思いますけど。 >>・Stackが引数かなにかで渡されたとき、本家StackなのかUpperStackなのかわからなくて危険。 >引数の型を見れば分かると思います。 void hoge(Stack s) { …… } というメソッドがあったとき、sがStackなのかUpperStackなのかは 「わからない」と思いますが? >>・別の誰かがLowerStackを作ったら、いつかマージするの? >もし別機能として作るなら、Stackを継承してLowerStackを作ります。 >例えば大文字にした後に先頭に0を付加するような、UpperStackの処理結果に追加する物なら、 >UpperStackを継承して作ります。 >すでにLowerStackが出来てしまっているならマージしません。 で、同一インスタンスのスタックに放り込んだデータについて、ある場所では 大文字で取り出したいし、ある場所では小文字で取り出したい、という場合、 どのクラスを使えばよいのですか? >>「要素をgetする側は、大文字が欲しいとき、そのことを意識しないで済む」 >>ということにしたいのでしょうか? >そうです。 だとすれば比較対象にget(boolean up)を持ってきているのはおかしいですね。 get(boolean up)を使う人は、大文字が欲しいとき、意識して引数にtrueを 渡さなければならないからです。 774RRさんへの返信に >ダウンキャストでなく、newするときに新しいクラスを使うと考えてください。 とありますが、(かなり離れた場所でnewされたかもしれない)Stackが UpperStackなのかStackなのかを意識しなければ、UpperStackのget()を 便利に使うことはできません。SEさんの主張は矛盾しています。 >>この改修により、プログラムにUpperStackという「異物」が実行時に紛れ込むわけで、 >>「Stackにputしたんだから、当然同じものがgetできるだろう」と思い込んでいる >>既存コード(Stackそのものを含む)にはおもいっきり影響を与えます。 >既存コードはソースに手を入れないので、影響はないと思いますが。 既存コードに引数でUpperStackを渡したら、入れたものを勝手に大文字に 変換するおかしなStackが紛れ込むことになります。ここではそういうことを 書いています。 >もう少し分かりやすい例をあげます。 Javaのコレクションクラスライブラリは、StackがVectorを継承していたりして いろいろトホホなので、「良い例」として出せるものではないと思います。 現実的に許容範囲内の例ではあるかもしれませんけど。 で、LinkedHashMapやTreeMapですが、これらがHashMapを継承してしまったために、 ・同じコレクションに対し、ある時は入力順に表示したいし、ある時は ソートして表示したい、という場合どうすればよいのか? (要件としてはすごくありそうだと思いますけれども) ・サブクラスにアクセスさせるために、HashMapのフィールドであるtableが  パッケージアクセスになってしまっているがこれはカプセル化の破壊では  ないのか。 (protectedにしなかったのはSunのエンジニアの良識だと思います) ・ていうかLikedHashMapではaddEntryとかcreateEntryとかパッケージアクセスの メソッドをばんばんオーバーライドしているけれど大丈夫か(スーパークラスの 実装に強く依存している)。 といった問題があるわけです。 それでもまあなんとか「現実的に許容範囲」なのは、オーバーライドした メソッドが、スーパークラス側のメソッドに対し「最低限同等の責務を果たす」と いうオーバーライドにおける大原則を守っているからでしょう。 その点においてもSEさんのUpperStackはだめです。同じget()でありながら、 勝手に大文字に変換してしまうためです。 で、 >Map<String, String> mp = new LinkedHashMap<String, String>(); ここでMapに代入しているのはなぜですか? 入力順に出てくることを期待するのなら、LinkedHashMapのまま持ち歩くほうが 安全です。あるMapがLinkedHashMapのつもりだったのに実はそうでなかった、 というケースは、プログラムが大きくなって、newする場所と使う場所が離れれば 離れるほどいくらでも発生することです。そうなってしまえば、入力順に 取り出せないのですから致命的な上、コンパイルエラーどころか実行時のエラーも出ず、 黙って間違った順番でデータを吐き続けることになります。 これを避けるには、ダウンキャストするか、instanceofでクラスを確認する 必要があるでしょう。危険ですけれども。774RRさんがおっしゃっているのは そういうことです。 Mapに代入するメリットと言えば、たとえばMapの中身をダンプする void dumpMap(Map m);というメソッドに対し、LinkedHashMapを渡せば 入力順に表示されるしTreeMapを渡せばソートして表示される、という動きを 期待したいときでしょう。でもこれは、dumpMap()という既存メソッドに 新たに開発したオブジェクトを混入させることに他ならず、それでうまく 動くかどうかは保証の限りではありません。『「異物」が実行時に紛れ込む』と 書いたのはそういうことです。 # これをうまく動かすためには、やはり先ほどの「オーバーライドにおける大原則」 # を守る必要があるわけです。 で、 >ひとつ伺いたいのですが、SEさんはどんな本でオブジェクト指向の勉強をされたの >でしょうか。 これについては答えていただけないのでしょうか。ぜひ書名を教えて欲しいのですけれども。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1270] >(ぱ)こと管理人さん
投稿者:SE
2009/05/19 16:21:52

>まあ、オセロの例で注記したように、マルチプロセスにはオブジェクト指向と似た面は >ありますけど。「その論理で行くと」の「その論理」がどういう論理か、教えて >いただきたいです。 「マルチプルインスタンスがオブジェクト指向」と言う論理です。 マルチプルインスタンスと言うのが何を指すのがよく分かりませんが、 状態(内部の変数の値)の違う複数の処理群(クラス)と解釈しました。 >そこでわざわざ継承してクラスを作ったって、以下のような問題が起きるだけです。 >・Stackが引数かなにかで渡されたとき、本家StackなのかUpperStackなのかわからなくて危険。 引数の型を見れば分かると思います。 >・別の誰かがLowerStackを作ったら、いつかマージするの? もし別機能として作るなら、Stackを継承してLowerStackを作ります。 例えば大文字にした後に先頭に0を付加するような、UpperStackの処理結果に追加する物なら、 UpperStackを継承して作ります。 すでにLowerStackが出来てしまっているならマージしません。 >「要素をgetする側は、大文字が欲しいとき、そのことを意識しないで済む」 >ということにしたいのでしょうか? そうです。 >この改修により、プログラムにUpperStackという「異物」が実行時に紛れ込むわけで、 >「Stackにputしたんだから、当然同じものがgetできるだろう」と思い込んでいる >既存コード(Stackそのものを含む)にはおもいっきり影響を与えます。 既存コードはソースに手を入れないので、影響はないと思いますが。 新たに作るコードはどちらを使うか意識する必要はありますが。 >上のほうで『実のところ「要素を大文字に変換して返すスタック」がどんな時に >役に立つのか想像できません』と書きましたが、結城浩さんが「例は嘘をつかない」 >と書いておられるように、こういうところで現実のプログラムに即した適切な例が >出てこないなら、おそらくそれは考え方のほうが間違っています。 もう少し分かりやすい例をあげます。 --------------------------------------------------------------------- Map<String, String> mp = new HashMap<String, String>(); mp.put("aa", "11"); mp.put("cc", "33"); mp.put("bb", "22"); for(String key : mp.keySet()){   System.out.println(key); } --------------------------------------------------------------------- 入力した順番に表示したい場合 --------------------------------------------------------------------- Map<String, String> mp = new LinkedHashMap<String, String>(); mp.put("aa", "11"); mp.put("cc", "33"); mp.put("bb", "22"); for(String key : mp.keySet()){   System.out.println(key); } --------------------------------------------------------------------- ソート表示したい場合 --------------------------------------------------------------------- Map<String, String> mp = new TreeMap<String, String>(); mp.put("aa", "11"); mp.put("cc", "33"); mp.put("bb", "22"); for(String key : mp.keySet()){   System.out.println(key); } ---------------------------------------------------------------------
[この投稿を含むスレッドを表示] [この投稿を削除]
[1269] >774RRさん
投稿者:SE
2009/05/19 15:22:44

>あえて言わせていただくと、提示例はやっちゃダメな「実装継承」の典型例であって >俺の後輩君がこんなコードかいてたら0点つけるですよ。 大文字変換は何かしらの処理の例として出したので、getで何かの処理を行った結果を返すと考えてください。 >これは、実体が Stack であるインスタンスに対して UpperStack にダウンキャストして使う、としか読めない。 >そんな危険なことをさせるわけにはいかないと思うのだが。 ダウンキャストでなく、newするときに新しいクラスを使うと考えてください。 --------------------------------------------------------------------- Stack st = new Stack(); st.put("aa"); st.put("bb"); st.put("cc"); System.out.println(st.get()); System.out.println(st.get()); System.out.println(st.get()); --------------------------------------------------------------------- これを次のように変更します。1行で済みます。 --------------------------------------------------------------------- UpperStack st = new UpperStack(); st.put("aa"); st.put("bb"); st.put("cc"); System.out.println(st.get()); System.out.println(st.get()); System.out.println(st.get()); ---------------------------------------------------------------------
[この投稿を含むスレッドを表示] [この投稿を削除]
[1268] Re:状況その4
投稿者:
2009/05/18 20:59:24

Kmyaccを使用していましたが、エラー復帰がうまくいかず。1回の構文エラーで yaccが終了してしまう問題を抱えてしまいました。いろいろ調査したが、どう にも情報が見つからなかったため、Bisonに変更。問題なくエラー処理および エラー復帰が出来るようになりました。堅牢なシステムへまた1歩です。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1267] Re:疑りぶかいあなたのための「オブジェクト指向再入門」を読んで
投稿者:
2009/05/18 18:28:11

>これなんですが、C++だと、privateなメンバ変数とかは、外から参照すれば >コンパイラにエラーで怒られるとはいうものの、.hファイル中には記述されて >しまいますよね。  カプセル化という言葉に対して、きっちりとした完全な意味を求めてるのだ ろうと思いますが、私はそこまでのことを意識してこの言葉を使っていません。 問題は。  必要なこと意外一切情報を出さないほうがいいのか。内部がある程度想像 できるほうがいいのか?Cはたとえ使えなくともクラスのデータやメソッドが見 える。これが良いか悪いかでしょう。私は後者のほうが気分的には良いです。 使わない情報が見えたとしても、実質的にカプセル化されていれば問題ないと 考えます。  言語の設計において、理想的なものを作っていくのもあります。私の場合は 目的が実現できれば簡単なものでいいと思って設計しています。その代表が #defineです。古い仕様で問題点も内包しますが、実に使いやすく融通が利きます。 今では#defineはあまり良くないとされていますが、私は利点を選びました。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1266] Re:疑りぶかいあなたのための「オブジェクト指向再入門」を読んで
投稿者:(ぱ)こと管理人
2009/05/17 20:50:06

> 私にとってOOPを使う最大の理由は。 > > 「カプセル化により見透視のよさ!」これに尽きます。 これなんですが、C++だと、privateなメンバ変数とかは、外から参照すれば コンパイラにエラーで怒られるとはいうものの、.hファイル中には記述されて しまいますよね。Javaだとメソッドの実装も書くことになるのでもっと深刻です。 これでは利用者側の再コンパイルが必要になりますし、ライブラリの実装が 終わる前にアプリケーションを作り始めたいという場合にも困る、ということで、 (Javaで言えば)インタフェースのみ公開してHogeImplみたいなクラスを作る、 なんてパターンが知られています。 私にはこれは必須に思えるので、Diksamではもうちょっと言語で積極的に サポートしたかったんですけどね。うまい文法が思いつかずにJavaと同等に なってしまっています。うーん、いつかそのうち。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1265] Re:疑りぶかいあなたのための「オブジェクト指向再入門」を読んで
投稿者:(ぱ)こと管理人
2009/05/16 22:40:50

>その論理で行くと、マルチプロセスやマルチスレッドはオブジェクト指向になると >思いますが、 ならないと思いますが…… まあ、オセロの例で注記したように、マルチプロセスにはオブジェクト指向と似た面は ありますけど。「その論理で行くと」の「その論理」がどういう論理か、教えて いただきたいです。 >例えばこれを修正して、大文字に変換して返す物を使いたいとします。 >----------------------------------------------------------- >public class UpperStack extends Stack { >  public String get(){ >    return super.get().toUpperCase(); >  } >} >----------------------------------------------------------- 774RRさんがすでに書いていますけど、これは典型的な「ダメな実装継承の例」でしょう。 # 「実装継承」でGoogleしてみることをお勧めします。 実のところ「要素を大文字に変換して返すスタック」がどんな時に役に立つのか 想像できませんが、それはまあ、「あくまで例だから」ということにしても、 このケースは、 「要素をgetする側は、大文字が欲しいとき、そのことを意識している」 のでしょうか。 意識しているのであれば、そもそも「stack.get().toUpperCase();」で済む話です。 大文字に変換する、という単純な処理でないのなら、ユーティリティメソッドを 作ればよいでしょう。 そこでわざわざ継承してクラスを作ったって、以下のような問題が起きるだけです。 ・Stackが引数かなにかで渡されたとき、本家StackなのかUpperStackなのか  わからなくて危険。 ・別の誰かがLowerStackを作ったら、いつかマージするの? ・ユーティリティメソッドではprivateメンバにアクセスできないが、  継承なら、protectedにしておけばサブクラスからアクセスできる、というのが  趣旨なら、それはカプセル化の破壊以外の何者でもない。 ところで、SEさんの例では、get()メソッドがオーバーライドされています。 「要素をgetする側は、大文字が欲しいとき、そのことを意識している」のであれば、 仮に継承を使うとしても、getUpper()メソッドをつけることでしょう。 オーバーライドしているということは、 「要素をgetする側は、大文字が欲しいとき、そのことを意識しないで済む」 ということにしたいのでしょうか? # それにしては、get(boolean up)と対比しているのでよくわかりませんが。 もしそうなら、 >そのため、変更により以前の機能のまま使用したい場所には影響がありません。 というわけにはいきません。 この改修により、プログラムにUpperStackという「異物」が実行時に紛れ込むわけで、 「Stackにputしたんだから、当然同じものがgetできるだろう」と思い込んでいる 既存コード(Stackそのものを含む)にはおもいっきり影響を与えます。 しかも、get(boolean up)とは違い、実際に動かしてみなければ検出できない バグになりますからさらにタチが悪いです。 上のほうで『実のところ「要素を大文字に変換して返すスタック」がどんな時に 役に立つのか想像できません』と書きましたが、結城浩さんが「例は嘘をつかない」 と書いておられるように、こういうところで現実のプログラムに即した適切な例が 出てこないなら、おそらくそれは考え方のほうが間違っています。 ひとつ伺いたいのですが、SEさんはどんな本でオブジェクト指向の勉強をされたの でしょうか。 いまどきこんなバリバリの実装継承でオブジェクト指向を説明している教科書は そうそうないと思っていたので、もし新しい本にそういうことが書いてあったのなら 興味があります。ぜひ書名を教えてください。 ところで、私が現在作っているクラスベースオブジェクト指向言語Diksamでは、 「concreteクラスは継承できない」ということにしてしまっています。これは 実装の手抜きではなく、意図して行っています。 ここまでやってしまうと異論はあるかもしれませんが、Effective Javaとか GoFのデザパタ本とかで、かなり昔から、散々「抽象クラス以外は継承するな」と 言われてますし、SEさんのような誤解を防止するためにもこの方がよいのではないかと。 http://java-house.jp/ml/archive/j-h-b/050862.html
[この投稿を含むスレッドを表示] [この投稿を削除]
[1264] [業務連絡]掲示板が復旧したようです
投稿者:(ぱ)こと管理人
2009/05/16 21:47:05

原因は不明ですが、しばらくこの掲示板が投稿できない状態になっていました。 閲覧は通常通り可能でしたが、送信ボタンを押してもプレビュー画面に遷移しない、という状態でした。 それでしばらくテスト掲示板で様子を見ていましたが、どうも直ったようです。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1263] 状況その3
投稿者:
2009/05/15 18:56:21

 yacc,lecの修正とプリプロセッサの作成が終わりました。ファイルの多重#includeと 多重の#define宣言を処理できるようになりました。  次の3つのファイルをt001.dkmで起動すると。 --ファイルt001.dkm--------------------------- // aaaaaaaa #include "t001-01.dkm" #define DEF1 DEF2 + "def1 " // aa int main() { string str; str = DEF1; str = DEF2; str = DEF3; } --ファイルt001-01.dkm------------------------ //ssssssssssss #define DEF2 DEF3 + "def2 " // bb #include "t001-02.dkm" //aaaa int print (string str); --ファイルt001-02.dkm------------------------ //ssssssssssss #define DEF3 "def3 " // cc int printnl(string str) { print(str + "\n"); } -------------------------------------   ↓  プリプロセッサ   ↓ ------------------------------------- int printnl (string str ) { print (str +"\n"); } int print (string str ); int main () { string str ; str ="def3 "+"def2 "+"def1 " ; str ="def3 "+"def2 " ; str ="def3 " ; } -------------------------------------  になってコンパイラに渡されます。もちろんメモリ渡し、エラーもファイル名+行番号で出さ れます。コメントやインデントは内部的に不要なので無くなっています。  最上位の制御構造がマルチスレッドを意識した構造を作りこみ、コンパイラは単独で動作する 構造になりつつあります。ジェネレータは関数単位で実行される予定です。  これでようやく中断前に戻れます。  関数のリンクは総て動的リンクにする予定です。最初の1回だけ動的リンクが行われ、その後 コンパイラが起動されるか、中間コードが破棄された時のみ再度動的リンク試験が行われます。 これでほとんどの関数コールは、直接起動されることになり。スピード的に問題ないと思って います。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1262] Re:疑りぶかいあなたのための「オブジェクト指向再入門」を読んで
投稿者:
2009/05/15 18:53:09

 私にとってOOPを使う最大の理由は。  「カプセル化により見透視のよさ!」これに尽きます。  継承や多態化はそのサポートのために。再利用性は設計の問題であり。OOとは 関係が薄い場合がある。ただし、OOを使っても見透視の悪いコードはいくらでも かける。が、よく整理されたクラスの見透視の良さは、OOが無い言語に比べて 格段にいい。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1261] Re:疑りぶかいあなたのための「オブジェクト指向再入門」を読んで
投稿者:774RR
2009/05/15 14:56:25

「再入門」のそのあたりの記述は、そもそも「インスタンスが複数あっていい」というあたりを理解していないプログラマ向けの文書。 SE氏の指摘は「インスタンスが複数あるのは当たり前」と理解しているプログラマの視点なわけで。 そういう意味で、対象読者層が異なるだけのことだと思う。 あえて言わせていただくと、提示例はやっちゃダメな「実装継承」の典型例であって 俺の後輩君がこんなコードかいてたら0点つけるですよ。 > そして、大文字で取得したい場所では、このUpperStackを使うようにします。 これは、実体が Stack であるインスタンスに対して UpperStack にダウンキャストして使う、としか読めない。 そんな危険なことをさせるわけにはいかないと思うのだが。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1260] 疑りぶかいあなたのための「オブジェクト指向再入門」を読んで
投稿者:SE
2009/05/15 14:06:45

疑りぶかいあなたのための「オブジェクト指向再入門」を読みました。 部分的に同意できる所もありますが、オブジェクト指向の「本質」はマルチプル インスタンスだと言うのは全く違うと思います。 その論理で行くと、マルチプロセスやマルチスレッドはオブジェクト指向になると 思いますが、これらはオブジェクト指向云々以前から存在する、別の話だと思います。 オブジェクト指向プログラミングの利点は、 「変更がしやすい」事と「変更しても以前の機能が失われない」事です。 簡単に説明します。 先入れ後出し形式のデータ(スタック)をクラス化したとします。 エラー処理を考慮しなければ、大体以下のようになるでしょう。 ----------------------------------------------------------- public class Stack {   private String[] data = new String[100];   private int index = 0;   public Stack(){   }   public void put(String val){     data[index] = new String(val);     index++;   }   public String get(){     String ret = "";     index--;     ret = data[index];     return ret;   } } ----------------------------------------------------------- 例えばこれを修正して、大文字に変換して返す物を使いたいとします。 ----------------------------------------------------------- public class UpperStack extends Stack {   public String get(){     return super.get().toUpperCase();   } } ----------------------------------------------------------- そして、大文字で取得したい場所では、このUpperStackを使うようにします。 ここで重要なのは、基のクラスのStackには全く修正が入らない事です。 そのため、変更により以前の機能のまま使用したい場所には影響がありません。 ちなみに、Stackに別名の大文字で返すメソッドを追加すると言う方法もありますが、 基のソースに修正が入るため、デグレートの危険が発生します。 やたらに継承をしたくない場合は、それでも構いませんが、以下の方式はダメです。 ----------------------------------------------------------- public class Stack {   private String[] data = new String[100];   private int index = 0;   public Stack(){   }   public void put(String val){     data[index] = new String(val);     index++;   }   public String get(boolean up){     String ret = "";     index--;     if(up){       ret = data[index].toUpperCase();     }else{       ret = data[index];     }     return ret;   } } ----------------------------------------------------------- なぜダメかは、構造化プログラミングを行っていて、度重なる修正で スパゲッティープログラム化しているのを見た事のある人なら分かるでしょう。 これを使用している所で、変更の必要ない既存部分にも手が入り、処理にも分岐が 入って複雑化するためです。 適切にオブジェクト指向プログラミングされていれば、修正が入っても劣化せず、 むしろ抽象化され使いやすいクラスになっていきます。 オブジェクト指向プログラミングの目的はこれだけです。 カプセル化、継承や多態化もこれを実現するための手段に過ぎません。 そのため「オブジェクト指向の目的は、再利用性を高める事」は正しいです。 しかしこの場合の再利用性は、関数化などの話ではなく、変更の時の使いやすさを 指しています。 新人が誤解するので「オブジェクト指向はマルチプルインスタンス」と言う記述は 修正か注意書きをしてほしいです。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1259] Re:状況(日記?)
投稿者:(ぱ)こと管理人
2009/05/12 02:16:16

>> 見間違いかもしれないけど、0.2.0はメモリーストレージを使ってないような・・・ >見間違いかと思います (^^; >了解しました、構文解析の所を今見た所確かにそうです。失礼いたしました。 >しかし、以前メモリートラブルでと話したとき、いつもmallocの中でこけてた >んです。 補足ですが、構文解析部分はMEM_Storageを使用してまとめて開放していますが、 コンパイルにより作られるDVM_Executableは各オブジェクトを個々にMEM_malloc()して 作っています。こちらは、配列のオーバーランなどすると、次のmalloc()で こける可能性が高いと思います(いまどきはそうでもないかも)。 malloc()で確保した領域を配列のオーバーランで壊したことを検出するために、 MEMではアプリケーションに渡す領域の前後を0xCDで埋めていて、これをチェックする 関数MEM_check_all_blocks()を用意しています。実際これでバグを見つけたことも 多いのですが、最近はLinux環境ではとっととvalgrindを使っていたりします。 Windowsで、フリーなvalgrind相当品があるかどうかは不勉強にて知りません。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1257] Re:状況(日記?)
投稿者:
2009/05/10 23:54:32

>見間違いかと思います (^^; 了解しました、構文解析の所を今見た所確かにそうです。失礼いたしました。 しかし、以前メモリートラブルでと話したとき、いつもmallocの中でこけてた んです。それで思い違いをしたかな、結局追いきれなくてあきらめたんですけ ど。いや、相当粘ったんですよこれでも… >fix_tree.cでは主にTypeSpecifierを解析木に付加しますが、おっしゃるとおり、 >たとえばある式がintのTypeSpecifierを持っていて、それにマイナス演算子を適用した >このへんのことは以下にちょっとだけ書いてありました。 了解しました、と言うかまとめて開放だから無問題です。単に私がちょっとfixtree で手間取ったのが、それが理由だったんです。結局、メモリー監視デバックルーチ ンが、shared_ptrのような機能を持ってメモリー管理になってしまいましたんです。 もともとスマートポインターは重いからやめようと思ってた矢先の出来事で。 ええ、Boostのpoolに変えます… >「一番外側のブロック」ではなく、その名のとおり「現在のブロック」です。 了解しました。実はコメントを書き換えなおすの忘れてた。昔のままだった。 何も考えずに、有るのそのままコピペしてました。 >> ST_MemberExpression member_expression; // 使用していない? >クラスを導入していないver.0.2では確かに使っていませんね。 了解しました。ありがとうございます。これなんだろう?調べなきゃと思っていました。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1256] Re:状況(日記?)
投稿者:(ぱ)こと管理人
2009/05/10 19:05:32

> 見間違いかもしれないけど、0.2.0はメモリーストレージを使ってないような・・・ 見間違いかと思います (^^; create.cで解析木のノードを確保する際も、fix_tree.cで主にTypeSpecifierを 確保する際も、最終的にはdkc_malloc()を呼んでいますし、dkc_malloc()は コンパイラが保持してるMEM_Storageを使用してメモリ確保しています。 http://kmaebashi.com/programmer/devlang/diksam_src_0_2/S/11.html#22 > 実は、構文解析で構文ツリーが出来た時点では、TOPのCT_Compilerのオブジェクトを >deleteすればディストラクタ繋がりできれいに総てのメモリーを解放できたのですが >Fixtreeを作ってみると、多重リンクはするはリンクが切れてフリーが山ほど出てくる >はで。 fix_tree.cでは主にTypeSpecifierを解析木に付加しますが、おっしゃるとおり、 たとえばある式がintのTypeSpecifierを持っていて、それにマイナス演算子を適用した ような場合には、マイナス演算子の式のTypeSpecifierは、その子ノードのものを 直接使用していたはずです(多重リンク)。また、[]演算子を適用するとTypeDeriveが 1段階外されますが、この時、[]演算子のノードのTypeSpecifierは、TypeDeriveの 連結リストの途中のノードを指します(その下のノードでは根元を参照していますが)。 このへんのことは以下にちょっとだけ書いてありました。 http://kmaebashi.com/programmer/devlang/diksam_0_1_comp.html | コンパイル時のTypeSpecifierは、なにしろ解析木のすべての式のノードに | 割り当てられます。たとえば「a + 1」という式がありaがint型の時、 | intを表現するためのTypeSpecifierが(「a」と「1」と「a + 1」のために) | (現状の実装では)3つ確保されています。でもよく考えれば「a + 1」のノードの | TypeSpecifier は左辺か右辺かどっちかのを直接参照してもよいはずで、 | 実際マイナス演算子ではそうしています。 | このように、TypeSpecifier構造体は、誰が所有者なのかわけがわからんような | こんがらがった参照で保持されているので、解析木の他の部分同様、 | コンパイル終了時に(MEM_Storageの機能を使用して)一括で破棄しています。 >class CT_Compiler : public CBase >{ >public: > CT_Block * current_block; // 一番外側のブロック 微妙に気になるのですが、current_blockは、少なくとも元のソースでは、 「一番外側のブロック」ではなく、その名のとおり「現在のブロック」です。 create.cにおいてBlockを生成する際に、親のブロックへの参照をセットするために 使用しています。 >class CT_Expression : public CBase >{ ... > union { > ST_MemberExpression member_expression; //    使用していない? これは、オブジェクトのメンバを参照するためのノードですが、 クラスを導入していないver.0.2では確かに使っていませんね。 ていうかソースには一応入っていたことに私の方が驚きました。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1255] Re:状況(日記?)
投稿者:
2009/05/09 22:51:48

お疲れ様です。返事をもらえると嬉しいのですが、ごゆっくりどうぞ。  ↓のクラスを見てわかるとおりに、ほとんどstructをクラスにしたままです。内部 データが少し変わっていますが、structの全体接続構造はほとんどそのままです。  私も意味もなくポリモルフィズムするのは好きではないし。本来の目的は クラスでパッキングして見通しを良くしよう。そして、書くことによる自身の 理解、そして必要機能の追加のためです。それと、diksamもほぼ同じ量のメモリー 確保をしていますよ。  見間違いかもしれないけど、0.2.0はメモリーストレージを使ってないような・・・ class CT_Compiler : public CBase { public: int function_count; // 関数の数 CT_FunctionDefinition * function_list; // 関数のリスト CT_DeclarationList * declaration_list; // トップの宣言リスト CT_StatementList * statement_list; // トップのステートメントのリスト CT_Block * current_block; // 一番外側のブロック //== 式のツリーノード =========================================== class CT_Expression : public CBase { public: CT_TypeSpecifier *type; // E_ExpressionKind kind; // 式の種類 int line_number; union { E_Boolean boolean_value; // boolデータ リテラル int int_value; // intデータ リテラル double double_value; // doubeデータ リテラル string *string_value; // stringデータ リテラル ST_IdentifierExpression identifier; // 関数又は宣言文の識別子 ST_CommaExpression comma; // カンマ(,)式 ST_AssignExpression assign_expression; // 代入式 ST_BinaryExpression binary_expression; // 演算式 CT_Expression *minus_expression; // マイナス式 CT_Expression *logical_not; // 論理否定式 ST_FunctionCallExpression function_call_expression; // 関数式 ST_MemberExpression member_expression; //    使用していない? CT_ExpressionList *array_literal; // 配列データ リテラル ST_IndexExpression index_expression; // 配列の添え字式 ST_IncrementOrDecrement inc_dec; // ++,--,式 ST_CastExpression cast; // キャスト演算式 ST_ArrayCreation array_creation; // 配列生成式 } u;  実は、構文解析で構文ツリーが出来た時点では、TOPのCT_Compilerのオブジェクトを deleteすればディストラクタ繋がりできれいに総てのメモリーを解放できたのですが Fixtreeを作ってみると、多重リンクはするはリンクが切れてフリーが山ほど出てくる はで。メモリー監視・チェック・報告のデバックプログラムが、一躍メモリー管理 プログラムに昇格して、多重リンクや放置されたメモリーを管理して、きれいに掃除 することになりました。思わぬ副作用が・・・  今大改造中で動かせなかったのですが、構文解析時点で5千数百のnewをしていました。  実は、ジェネレータとVM部分を始めていたのですが、ほしい仕様のための変更部分が 目立って見えてきたため、yacc,lex部分から大きく改造を始めてしまいました。 いま、#include #define 構文の追加と最外枠のステートメント禁止、main()関数起動 を組み込み始めました。そして上の二つの構文のためにプリプロセッサを書いています。 だから、コンパイルは+1増えて4ステージになりました。#includeは単に外部ファイルを 同一ファイルとしてコンパイルできる普通の機能です。でも、その為にライン数管理が ファイル名+ライン数になってその部分が全体的改造に。  本当は、一通り終わるまで新機能は入れないつもりでしたが、チョコチョコ変えている 時点で、もう全体変更しようと思ってしまった。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1254] Re:状況(日記?)
投稿者:(ぱ)こと管理人
2009/05/09 02:35:53

世間では連休で私も会社は休みだったはずですが何かとどたばたしてまして お返事が遅れましてすみません。 > ちなみに、test.dkmで最高6800ぐらいnewします。 これで速度低下しないかと心配して、crowbarやDiksamではMEMモジュールを作って MEM_storage_malloc()を使ったのですが、C++でクラスを使おうとすると単純に 置き換えはできませんね(newのオーバーロードで置き換えはできますが、私には、 演算子のオーバーロード自体相当に腰が引けます。boostのように、汎用的で 一般的に知られたライブラリを使うのなら、だいぶ軽減されると思いますけど)。 ところで、DiksamをC++で書き直し、fix_tree.cppでたくさんnewが起きるということは、 DiksamでのExpressionやStatementの構造体をクラスにしておられるのだと思いますが、 これはやっぱり、fix_tree.cppではfix()、generate.cppではgenerate()という メンバ関数を作って、クラスごとにポリモルフィズムで呼び出しているのでしょうか? オブジェクト指向の教科書にはそう書いてありますが、実際にやってみると クラスごとに細かい制御ができなかったりモデルにロジックが侵食したりして あまりうまくいかない、と経験上思っておりますので。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1253] 状況(日記?)
投稿者:
2009/05/07 19:00:06

 fix_treeのところで多少手間取っていますが一応終了。トータルの結合 試験で多分たくさんのがバグが・・・  少し長いプログラムを読み込ませるだけで、細かいサイズのメモリーを 7千ぐらい、newとdeleteしているのを見るにつけ、これは結構システムに 負担ではないと思いつつ、区切りが出来たらboostの高速メモリー管理poolに 変えようとかと考えています。一括削除が可能だし。また、メモリー上のトラ ブルが起こったら追うだけでも大変だと思う、今のところそのトラブルには 遭遇していないのが救いです。バグは当たり前のようにありますが・・・  ちなみに、test.dkmで最高6800ぐらいnewします。  特に新しいところがなく日記的なので、不要だったら削除してください。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1252] Re:関数実装について
投稿者:
2009/05/04 22:30:19

>Diksam ver.0.4以降だと、ファイルをrequireしておけば、 >呼ぶ際は普通の関数呼び出しですけれど、 そうなんですか、同じものを再発明しそうですね。 >Emacs Lispはダイナミックロードですが、私としては初回呼び出しのタイムラグは >気にならないと思っているので、まあ問題ないと思っているのですけれども。 私の場合、スレッドが必要だと思うほどクリティカルな部分を意識しているので やはり、利用者がコンパイラ起動を意識したほうがいいかなと思っています。 >ということはDVMはひとつでグローバル変数とヒープ領域は共有ですね。 >結構ロックが大変そうな気はします。  この辺はまだ希望的観測の部分が多いので、実際に作りこんでみないと なんともいえない感じです。  今現在はfix_tree部分を作っていますが、途中でnew、deleteが頻発するので 思わず。new、deleteに被せて、newのアドレスとサイズをコンテナMAPに総て入れ、 deleteで検証する監視プログラムやサポ-トプログラムばかり作ってて脱線気味 です。目的プログラム70%残り30%は監視やデバックプログラムです・・・ 文字列リテラルも、wchar_tを使ってもポータビリティーが上がらないのでstring に変えてしまったし、diksam言語部分だけでも一通り動くようになるのはまだまだ 先です。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1251] Re:関数実装について
投稿者:(ぱ)こと管理人
2009/05/04 19:33:38

> 言語仕様から見ると、Aプログラムの内部からBファイル内にある関数B1を普通に >コールすることです。当初は、ファイル名.関数名();で起動しようか、関数プロ >タイプ宣言で"ファイル名":関数名();で内部的には普通の関数記述と思いましたが。 Diksam ver.0.4以降だと、ファイルをrequireしておけば、 呼ぶ際は普通の関数呼び出しですけれど、 >いつ重いコンパイラが走るかコントロール出来ないので、 .dkhにシグニチャ宣言だけ書いて.dkmに実装を書くと、関数呼び出し時にコンパイラが 動きますから、状況によって問題になるかもしれません(実装まで.dkhに書いてしまえば いいわけですけど)。 Emacs Lispはダイナミックロードですが、私としては初回呼び出しのタイムラグは 気にならないと思っているので、まあ問題ないと思っているのですけれども。 >スレッド起動の仕様 >普通に関数名(P1,,,Pn);を書くと戻ってくるまでコール元は待ちます。 >start(関数名,起動P,,,Pn);と書くとスレッド起動となります。 ということはDVMはひとつでグローバル変数とヒープ領域は共有ですね。 結構ロックが大変そうな気はします。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1250] 関数実装について
投稿者:
2009/05/02 18:30:12

>これは、CからDiksamの関数を関数名を指定して呼び出すということですよね。 内部的に見るとそうです。  言語仕様から見ると、Aプログラムの内部からBファイル内にある関数B1を普通に コールすることです。当初は、ファイル名.関数名();で起動しようか、関数プロ タイプ宣言で"ファイル名":関数名();で内部的には普通の関数記述と思いましたが。 いつ重いコンパイラが走るかコントロール出来ないので、プログラムファイル読込 み関数と破棄関数(中間コードリソースの破棄)を作ることにしました。  この仕様でVMの変更が発生します。それは、1ファイル内の関数コールはコンパ イラで関数アドレスを生成しますが。ファイル外の場合、関数アドレスではなく関 数名を持って、実行時リンクして関数コールする仕様が追加になります。 (最外枠ブロックの実行構文はなくなり、ファイル名起動ではmain()が実行) 中間コードの構造は。 親 ファイル1  ファイル親ー>子    ファイルn ↓   |----------¬    |----------¬ 子   関数1 ・・・・・・ 関数n  関数1 ・・・・・・ 関数n  の様に、階層構造の親子関係で関数置きに分離した中間コードになる予定です。 この、ファイルnの部分が必要時にコンパイルされ中間コードに追加される感じです。  この構造はちょうど関数単位のマルチスレッドに適応できます。 スレッド起動の仕様 普通に関数名(P1,,,Pn);を書くと戻ってくるまでコール元は待ちます。 start(関数名,起動P,,,Pn);と書くとスレッド起動となります。 例   thread_ID1 = start(fnc1,,,);   thread_ID2 = start(fnc1,,,);   thread_ID3 = start(fnc1,,,); と書くとメインスレッドと3つのfnc1スレッドが同時に動きます。 関数については、この様な仕様を組込みたいと考えています。 また、グローバルシステム変数とスレッド起動された関数は一般的なCのグローバ ル変数やスレッドとは、かなり性格が違ったものになります。でも、この点は実物 のめどが出来そうなときにでも、評価していただければ嬉しいと思っています。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1249] Re:その後の状況
投稿者:(ぱ)こと管理人
2009/05/02 03:39:28

訂正します。 >と思って見ていたらbaseが初期化されていない >ことに気付きました。またバグです。すみません (_o_) いくらなんでもこれじゃ動かないよな、と思ってよく考えると baseはローカル変数の参照に使うので関数内でしか使用されず、 関数を読んだ際にセットされるので問題ありませんでした。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1248] Re:その後の状況
投稿者:(ぱ)こと管理人
2009/05/02 03:14:14

>追加したい機能 >・関数指定起動、スクリプトファイル名と関数名を指定して起動 > (スクリプトファイル間の連携したプログラミングのために) これは、CからDiksamの関数を関数名を指定して呼び出すということですよね。 特定の関数を実行するには、dvm/execute.cのexecute()関数を、 http://kmaebashi.com/programmer/devlang/diksam_src_0_2/S/18.html#544 ・事前にdvmのcurrent_executableとcurrent_functionとpcを設定して  (プログラムカウンタは関数ごとなのでpcは0に設定)、 ・execute()関数を、適切な引数で呼び出す ことで可能なはずです。 ただ、実際にはDiksamからネイティブ関数を呼び出して そのネイティブ関数からさらにDiksamの関数を呼び出す、というケースも あるので、スタックポインタを設定の上、execute()関数のローカル変数 baseも引数で渡してやらないと… と思って見ていたらbaseが初期化されていない ことに気付きました。またバグです。すみません (_o_) gccの-Wallでは当てにならないですし、山さんがされたようにVisual Studioでも コンパイルしたいのですがなかなか時間が取れない状態です。明日からは連休ですが、 連休は連休でまた色々と… 編集さんはゲラを発送されたとのことですし(ん?) >その結果、diksam0.2.0の系譜をもつ別の言語になってしまいます。 >なので、言語名は別のものになります。そこでお聞きしたいので >す。diksam0.2.0の系譜をもつ別のものを作ることになりましたが、 >ここでお話しすることは可能でしょうか? まったく問題ありません。 > ぶちゃけて言います。気分を害したりしませんか?>< それはないです(^^) Diksamベースで新しい言語ができるのであれば、 どこをどう直されるのか興味深いです。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1247] その後の状況
投稿者:
2009/05/01 07:40:30

 各種機能を追加しようとdiksam0.2.0を解析修正をトライしていましたが、メモリ破壊トラブル に数回遭遇しメモリーダンプ解析を行う状態になってしまいました。さすがにこれは私の手に負え る状態ではないと感じ、diksam0.2.0を元にOOで新たに言語を作るほうが早いと思い、現在作成し ています。今は構文解析ツリーの生成まで終了しています。 ちなみに、yaccはkmyaccを使用、lex部分は自作です。 追加したい機能 ・グローバルシステム変数への透過的アクセス ・関数指定起動、スクリプトファイル名と関数名を指定して起動  (スクリプトファイル間の連携したプログラミングのために) ・関数単位でのスレッドセーフなマルチスレッド起動 ・関数単位でのスレッドセーフな通信 ・#define構文の追加(別名定義のみ)  等の、APとして必要な要件を組み込む必要がありました。その結果、diksam0.2.0の系譜をもつ 別の言語になってしまいます。なので、言語名は別のものになります。そこでお聞きしたいので す。diksam0.2.0の系譜をもつ別のものを作ることになりましたが、ここでお話しすることは可能 でしょうか?  ぶちゃけて言います。気分を害したりしませんか?><
[この投稿を含むスレッドを表示] [この投稿を削除]
[1246] Re:日本語対応diksam
投稿者:(ぱ)こと管理人
2009/04/28 00:49:20

>ちなみにlex.zz.cを見ればわかりますが >トークンを漢字に変えると、なでしこのようにすぐになってしまいます。 それだけだと、ぴゅう太の日本語BASICとか http://labs.yaneu.com/20090401/ 年刊Ah!SKI第1号のアレみたいなのになりそうです。 トシがばれますねえ。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1245] Re:日本語対応diksam
投稿者:
2009/04/27 19:56:19

>ただ、書くのはともかく、読むほうは「あそこまで日本語化」したほうが >よいというニーズはあるかと思います。 なでしこのHP見に行きましたが、結構すごいことになっていますね。 私のイメージが古かった。ちなみにlex.zz.cを見ればわかりますが トークンを漢字に変えると、なでしこのようにすぐになってしまいます。 それが良いか悪いかは別の話ですが。  言語の意味合いをもう少し膨らませて、len.zzで「if」と「もし」を同じ 意味にして、プログラムを日本語変換するソフトを作ると・・・ 日本語英語両用自由自在のなでしこをこ・・・ げほんげほん  今は目的を先に
[この投稿を含むスレッドを表示] [この投稿を削除]
[1244] Re:日本語対応diksam
投稿者:(ぱ)こと管理人
2009/04/26 23:24:49

>なでしこは知っていますが、あそこまで日本語化するのは反対の立場です。 確かに。わかります (^^; ただ、書くのはともかく、読むほうは「あそこまで日本語化」したほうが よいというニーズはあるかと思います。 >>よろしければPXU00211@nifty.ne.jpまで送付ください。 >送りました。内容はメールにて書いています。 受け取りました。ありがとうございます。 さっそく購入以来数度しか使っていないVisual Studio2005でビルドしてみました。 includeパスが絶対指定されていましたが、相対に直したらビルドできました。 >>(例外処理機構がないため)exit()以外に選択肢がなく、実用上問題が出るかも >>しれません。 >この辺が今の課題の一つです、 ver.0.4系だと例外処理機構があるのですが、ビルドが難航しているわけですよね。 >手を着けていないものに、「初期値が設定されていない変数が使われています」が >数十出ています。 これがそんなに出るようではいけないわけですが… こちらでも調べてみたほうがよさそうです。 >コンパイラも何かあるとexitで落ちてしまいます。 ダイナミックリンクである以上確かにこれも問題です。 実用に使い始める前にコンパイルエラーぐらいは取ってくれるだろう、と思うので、 優先度は下げているのですけれども。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1243] Re:diksam0.4.03のトラブル
投稿者:
2009/04/25 22:27:43

ご返答ありがとうございます。  う~~ん、ある程度予測をして、場所を下に移すも等いろいろやってはいたのですが・・・  うまく動かずにここに書き込みました。しかし、いまだにdiksam4.0.3はトラブル で落ちてしまいます。VC++への移植にミスがあると思うのですが。エラーが数百近く 出たのを端からつぶしていったのに問題があるのかもしれません、いまだにワーニン グエラーはたくさん残っています。手を着けていないものに、「初期値が設定されて いない変数が使われています」が数十出ています。対処しないといけないのですがい まだにそこまでは。  やはり、4.0は一時保留にして、いまは2.0で問題なく動いています。2.0ソースの 拡張子を.cから.cppに総て変えて、ワーニングも総てつぶして、diksam内部からclass を扱えるようにしました。私が使用しているデバッククラスも使えるようになったの で、多少楽になりました。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1242] Re:diksam0.4.03のトラブル
投稿者:(ぱ)こと管理人
2009/04/25 19:56:21

>1.argcの中身は初期化されていません。 これは明らかにおかしいですね。ご指摘ありがとうございます。 argcによる判定は、parse_parameter()実行後に行うべきことです。 今までは偶然動いてしまっていたようです…… >2.GetCommandLine();は何もやっていない・・・ GetCommandLine()はコマンドライン引数を取得するWindowsの関数です。 http://msdn.microsoft.com/ja-jp/library/cc429108.aspx これの戻り値はワイド文字列なので、 >3.DVM_wcstombs(command_line_wc);のcommand_line_wcはアドレスなのですが・・・ DVM_wcstombs()により、マルチバイト文字列に変換し、parse_parameter()で 引数列に分解しています。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1241] diksam0.4.03のトラブル
投稿者:
2009/04/24 22:22:17

再度、diksam0.4.03のコンパイルを試していますが。 どう見てもWinmMainがおかしいように思います。 WINAPI WinMain(HINSTANCE hInstance , HINSTANCE hPrevInstance , PSTR lpCmdLine , int nCmdShow ) { DKC_Compiler *compiler; FILE *fp; DVM_ExecutableList *list; DVM_VirtualMachine *dvm; int argc; char **argv; DVM_Char *command_line_wc; char *command_line_mb; if (argc < 2) { fprintf(stderr, "usage:%s filename arg1, arg2, ...", argv[0]); exit(1); } command_line_wc = GetCommandLine(); command_line_mb = DVM_wcstombs(command_line_wc); argv = parse_parameter(command_line_mb, &argc); MEM_free(command_line_mb); 1.argcの中身は初期化されていません。 2.GetCommandLine();は何もやっていない・・・ 3.DVM_wcstombs(command_line_wc);のcommand_line_wcはアドレスなのですが・・・ やはり、私には手に余りそうです。何をしたいのかわからないので対処が出来そうに ありません。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1240] Re:日本語対応diksam
投稿者:
2009/04/24 19:41:03

追記、ソースはタブ4スペースできれいに見えます。タブ8だとがたがたに・・・ 上に出したソースもがたがただった。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1239] Re:日本語対応diksam
投稿者:
2009/04/24 19:35:33

>ご存知かと思いますが、日本語プログラミング言語としては「なでしこ」が有名です。 >http://nadesi.com/ なでしこは知っていますが、あそこまで日本語化するのは反対の立場です。わざと やっているのではないかと思うぐらい読みづらいです。日本語の中にも和製英語が かなりたくさん入っています。それが当たり前に使われている現状を考えてみるに、- なでしこは、古文を読むような感じで現代的では有りません。日本語プログラミン グにおいても、和英混合で問題がないと私は思っています。 >よろしければPXU00211@nifty.ne.jpまで送付ください。 送りました。内容はメールにて書いています。 >http://kmaebashi.com/programmer/devlang/diksam_src_0_1_01/S/20.html ありがとうございます。意外と簡単に組み込めそうです。 >(例外処理機構がないため)exit()以外に選択肢がなく、実用上問題が出るかも >しれません。 この辺が今の課題の一つです、コンパイラも何かあるとexitで落ちてしまいます。 堅牢なシステムを作る予定なのでこの改善が必要です。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1238] Re:日本語対応diksam
投稿者:(ぱ)こと管理人
2009/04/24 03:22:22

>うわぁ、これはなかなか破壊力がありますね。ずっと半角英数でプログラムを書いてきた >ロートルな私などからするとかなり違和感がありますが、メールとかで「Windows」 >みたいに書くおじさんは実際いましたから、需要はあるかもしれません。 >ていうかプロポーショナルフォントのおかげで全角と半角の区別がつきにくくなったのは >よいことなのか悪いことなのか… 投稿後にちょっと考えたのですが、 私の世代の感覚からすると、全角英数字と半角英数字の区別がつかないのは コンピュータリテラシの欠けたおっさんであり、そもそも全角英数字なんか いらんだろ、ぐらいに思っているのですが、 そんなふうに思うこと自体、端境期のおっさんの戯言かもしれませんねえ。 http://onisci.com/802.html
[この投稿を含むスレッドを表示] [この投稿を削除]
[1237] Re:日本語対応diksam
投稿者:(ぱ)こと管理人
2009/04/24 03:12:38

> 下記のような半角全角入り混じったようなプログラムも意味的に言語仕様と有って >いれば動くようになりました。 うわぁ、これはなかなか破壊力がありますね。ずっと半角英数でプログラムを書いてきた ロートルな私などからするとかなり違和感がありますが、メールとかで「Windows」 みたいに書くおじさんは実際いましたから、需要はあるかもしれません。 ていうかプロポーショナルフォントのおかげで全角と半角の区別がつきにくくなったのは よいことなのか悪いことなのか… そういえば、失敗プロジェクトとして名高い「Σプロジェクト」はUNIXベースのOSだった のですが、全角で「ls」とか書いても通ったという話を聞いたことがあります。 裏は取っていませんが。 なお、せっかくの(数少ない)Diskamユーザをなくしたくはないですし有名なので ご存知かと思いますが、日本語プログラミング言語としては「なでしこ」が有名です。 http://nadesi.com/ >ソース必要でしたらVCのソリューションごと送りましょうか? 私はロートルプログラマなので本体に取り込むことはないと思いますが、 一般公開してよいものでしたら、興味を持つ方がいるかもしれません。 よろしければPXU00211@nifty.ne.jpまで送付ください。 > 次は関数の組み込みおよびVMのスレッドセーフ化かな。関数の組み込みの仕方を >習得したら、本格的にdiksamを組み込んだアプリケーションの作成に入れます。 ネイティブ関数の自作についてであれば、dvm/native.cが参考になるかと思います。 http://kmaebashi.com/programmer/devlang/diksam_src_0_1_01/S/20.html ただ、ver.0.1ベースだと、引数に変な値が渡されたりしたときに (例外処理機構がないため)exit()以外に選択肢がなく、実用上問題が出るかも しれません。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1236] 日本語対応diksam
投稿者:
2009/04/23 19:29:57

 下記のような半角全角入り混じったようなプログラムも意味的に言語仕様と有って いれば動くようになりました。もちろん総て全角で書いても動きます。付属の test.dkmも問題なく動作しました。 ------------------------------------------------- int print (string str); string 今時; int 時間;  今時="朝"; 挨拶(今時);  今時="昼"; 挨拶(今時);  今時="夜"; 挨拶(今時);  今時="わからん"; 挨拶(今時); int 挨拶(string 今 ) { print("パラメータ 今=" + 今 + "\n"); if(今=="朝")  { print("------ おはようございます\n"); }elsif(今=="昼")  { print("------ こんにちは\n"); }elsif(今=="夜")  { print(”------ こんばんは¥n”); }else  { print ( "------ おいすー\n" ) ;  } } ---(注:デバック用に故意に半角全角入り乱れています)------------- lex部分を独自に書くことで問題がないようです。ソース必要でしたらVCのソリュー ションごと送りましょうか? VC++2005で書かれてSJIS専用になっています。またdiksam1.0対応のみです。  次は関数の組み込みおよびVMのスレッドセーフ化かな。関数の組み込みの仕方を 習得したら、本格的にdiksamを組み込んだアプリケーションの作成に入れます。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1235] Re:VM間排他制御について
投稿者:
2009/04/22 22:41:02

>これなんですが、「誰にとって」簡単であることを目指しているのでしょうか。  う~~ん、正直言いまして、私の方法論もいいのか悪いのか、わからない結果となりました。やっぱり聞いてみて正解です。したがってアプリがある程度で来た時点で両方を実装して実際に使ってみてから判断がよさそうであると考えました。だいぶ先になるかもしれませんが、実装して使ってみて感想・批評・訂正・修正・駄目押し、ぜひよろしくお願いします。  この他にも、いろいろ、単純に出来るのではないかと構想しています。なにぶん逆の目から見た発想なので実際に実装してみるまでは評価は難しいのかもしれません。複雑なことを意識せずに複雑な操作をプログラムするアプリケーションなので、お暇がありましたらお付き合いください。特に言語の構造に深くかかわる可能性もあります。よろしくお願いいたします。  また、現在字句解析が7割ほどかけました。書き終わった後接続試験です。ifもifも10も10も123400も受け付ける字句解析は結構大変です。漢字を受け付ける以上、10と10は同じ意味なのでやはり数字リテラルとして処理しなければ^^;
[この投稿を含むスレッドを表示] [この投稿を削除]
[1234] Re:VM間排他制御について
投稿者:(ぱ)こと管理人
2009/04/22 02:53:50

>私の目的は、最も簡単な方法だけを提供しそれ以上のことは出来ない、 >知らなくていい、とても初期の段階のプログラミングを想定しています。 これなんですが、「誰にとって」簡単であることを目指しているのでしょうか。 VMを作る山さんの立場からすれば、ネイティブスレッドを相手に共有変数の整合性を 保持しようと思ったら、結局、セマフォというかミューッテクスによるロックが 必要であるように思います。 それにより、個々の変数が任意の時点で正しい値を持つことが保証されるなら、 アプリケーションを作成するユーザの立場からすれば、困らないように思います。 あるいはもし、複数の変数の整合性まで保証しなければならないのであれば (たとえば点の座標をx, yのふたつの共有変数で持つとき、点を(10, 10)から (20, 20)に移動させる際、(10, 20)のようなハンパな状態を見せてはいけないとか)、 これはトランザクションになりますから、トランザクションの終了を宣言する 方法が必要になると思うのですが…… >それは「Diksam言語仕様自体が複雑ではないのか?」と、実は利用者に説明するのは、 >関数と計算式とif,thin,elseif,else,while,continue,break。以外は使わないようにと >説明します。 そうそう、この程度の機能でも、組み込み言語が使えれば便利な局面は多々ありますよね。 Diksamやcrowbarは少なからずこういう用途を想定しているので、使っていただけることは 作者としては嬉しいです。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1233] Re:VM間排他制御について
投稿者:(ぱ)こと管理人
2009/04/22 02:25:43

>新プログラミング言語「BF-BASIC(ここの上カンマ)n」 >上の(ここの上カンマ)の半角記号があると書き込めませんでした。 えっ? ……これはつまりSQLインジェクションが可能なわけで、重大なセキュリティー ホールです。修正しました。ご指摘ありがとうございました。 以下、経緯です。 この掲示板は、↓の注記とか、 http://kmaebashi.com/programmer/bbs_dev/index.html こことかにも書いたとおり、 http://kmaebashi.com/programmer/bbs_dev/newbbs.html PHPのmagic quotesの機能を使用しています。 そして、私が借りているレンタルサーバでは、magic quotesはずっとonに なっていました。 少なくとも今年の1月の時点でシングルクオートを含む投稿に成功しています。 http://kmaebashi.com/bbs/list.php?boardid=kmaebashibbs&from=1195&range=1 これがいつの間にかoffにされていたようです。 http://kmaebashi.com/test.php サーバ業者からのお知らせはなかったと思います。以前、PHPを5に上げるという 連絡はありましたがそれもなんだかうやむやになったような(現に今、4で動いてますし)。 # もちろんそれ自体、私を含めてちょっとどうかという話ではありますが。 magic quotesについては、私自身やり方として間違ってるよなあと思いつつ、 郷に入れば郷に従え精神で利用「してしまった」わけですが、当時の私が無知で バカでアホで軽率であったことは認めるとしても、それを前提としたスクリプトは たくさんあるはずで、告知なしにoffにされてはたまったものではないです。 ここはJoe'sウェブホスティングから借りていて、今までさほど大きな問題は なかったと思うのですが、今回の件で過去最大の不信感を持ちました。 ご指摘ありがとうございました。重ねて御礼いたします > 山さん
[この投稿を含むスレッドを表示] [この投稿を削除]
[1232] Re:VM間排他制御について
投稿者:
2009/04/21 10:39:48

SQL障害のため書き込めませんでした、どの部分が問題か調べるために2度のテスト書き込みと削除をしています。お騒がせして申し訳ありません。障害点は下記の部分。 新プログラミング言語「BF-BASIC(ここの上カンマ)n」 上の(ここの上カンマ)の半角記号があると書き込めませんでした。 お騒がせしました。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1231] Re:VM間排他制御について
投稿者:
2009/04/21 10:34:28

説明不足で申し訳ありません。 >だとすると、配列やオブジェクトのような参照型ではどうなるのでしょう。 配列やオブジェクトのような参照渡しはしないです。と言うかその点をまったく説明していませんでした。非同期の単一のデーターのみを対象にしていす。複数のデータを渡したい場合は、string変数に、","区切りでと考えていました。申し訳ありません。もちろん、パラメータを簡単に構築分解する関数を用意します。非同期渡しなので、送るほうが3回変数を書き換えても、受けは1回か2回しか読めない場合もあります。もし間違いなく渡したい場合は、スレッドセーフなキューシステムを、完全な同期をしたい場合は、それ様のシステムがいりますが。私の目的は、最も簡単な方法だけを提供しそれ以上のことは出来ない、知らなくていい、とても初期の段階のプログラミングを想定しています。 C++熟練者にとっては、最小高速なセマフォーがあればほぼ何でも出来ます。しかしプログラム間で正しく通信するための必要知識は膨大なものが必要です。(それを補間するために、いろいろなライブラリーが作られているが、それがまた複雑さを・・・) まさに「新プログラミング言語「BF-BASIC n」を作ろう」的な構想のアプリケーションです。だから、スレッドセーフな最小限の一方通行情報伝達だけを意識せずに提供できればいいのではないだろうか?との発想で書いています。これで本当に足りるのかは、アプリがある程度出来てこない事には想像がつきません。 決まり事を極力最小にして、複雑さはシステムで吸収できるよう設計したい。そんな目標が有ります。ここで1つ疑問が沸くと思います。それは「Diksam言語仕様自体が複雑ではないのか?」と、実は利用者に説明するのは、関数と計算式とif,thin,elseif,else,while,continue,break。以外は使わないようにと説明します。それ以外は、トラブルがあっても自分で対処回避できる人のみ「Diksam言語仕様」を見てくださいと言う予定です。  当初は独自で言語を作りはじめましたが、「俺が作りたいのは言語じゃない!!!」との思いが強くなり。いろいろなコンパイラーやインタープリタを調査した結果、Diksamに当たりました。特にしっかりとした言語仕様とVM部分がいいです。この上で複雑さをどれだけ吸収出来るものが作れるのか、がんばってみたいです。  まだまだ説明不足な点が多々あると思いますが、懲りずによろしくお願いいたします。 >>もっと簡単にしてグローバルは1VM内でのみ有効であるとして、 >>VM間変数と言う特殊な変数を作って、セマフォー処理をしてもいいと思う。 >山さんの投稿を見て私が最初にイメージしたのはこれだったのですが… はい、これがあれば一般的なプログラミングが可能です。しかし複雑な制御知識が必要になってしまいます。なのであえて上記のようなシステムを考えています。 >「変数の値取得用の関数」 変数の形をした、まさにこれなんです。説明不足申し訳ありません。ただ、関数にしてしまうと何度も読んでしまうミスを防げないので、あえて1回のみとしてシステム側で制限を加えたわけです。なぜこうしたかは、出来るだけ問題点をシステム側で見つけ出せるか?(目標)です。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1228] Re:VM間排他制御について
投稿者:(ぱ)こと管理人
2009/04/21 02:07:14

>4.2回目を読みたい時は、変数更新の関数を呼びまた1回のみ読める。 あ、この「変数更新の関数」を呼んでから、変数を読み出すまでの間、 配布元VMでは変数の変更を禁止する(待つ)、ということでしょうか? だとすれば、余計な処理を間に挟めないように、「変数の値取得用の関数」を 用意したほうがよさそうにも思いますが…
[この投稿を含むスレッドを表示] [この投稿を削除]
[1227] Re:VM間排他制御について
投稿者:(ぱ)こと管理人
2009/04/21 01:50:42

>以下が私の考える見えない排他制御です すみません、いまいちよくわかりません。 まず前提として、山さんの案では、複数のVMが、別々のネイティブスレッドで 動作するんですよね? だとしたら、いずれにせよ共有の変数を読み書きする際は きっちりスレッド間でロックの取り合いをしなければならないわけで、この案で どこが簡素化できるのかがどうもよくわからないです。 >1.システム変数は1つのVMのみ読み書きが出来る、配布元VMとする。 また、この「システム変数」は、ユーザプログラムがこれを利用して同期を取るための ものではなく、まさにユーザプログラムがデータとして共有したいものなんですよね? だとすると、配列やオブジェクトのような参照型ではどうなるのでしょう。 int[] a = {1, 2, 3, 4}; という配列を共有したかったとして、 int[] tmp = a; // aを1回だけ読み出し 以後、tmp経由で配列aの中身は触り放題なわけですが、これでよいのでしょうか? >もっと簡単にしてグローバルは1VM内でのみ有効であるとして、 >VM間変数と言う特殊な変数を作って、セマフォー処理をしてもいいと思う。 山さんの投稿を見て私が最初にイメージしたのはこれだったのですが…
[この投稿を含むスレッドを表示] [この投稿を削除]
[1226] VM間排他制御について
投稿者:
2009/04/20 20:09:57

以下が私の考える見えない排他制御です 1.システム変数は1つのVMのみ読み書きが出来る、配布元VMとする。 2.他の受信VMは1回のみ変数を読むことが出来る。  (ローカル変数に代入し各種処理をする) 3.2回目を読もうとすると実行時エラーとなる。 4.2回目を読みたい時は、変数更新の関数を呼びまた1回のみ読める。  これで意識しない排他制御が可能になると考えています。 (変数更新を毎回呼んだら意味はありませんが・・・) これが私が実装しようとするスレッド間セーフなシステム変数です。 もしよろしければ、ご意見をお聞かせください。 diksamでスレッドセーフのVMが出来ても、グローバル変数が可能な方法があります。それは、セマフォーグローバル変数を宣言するとともに、ロックとフリーの関数を提供します。C++などでは、変数の排他管理は自分でしろと最小高速なセマフォーがあります。これと同じものを提供すれば、スレッドセーフなVM間の通信制御も可能になります。もちろん、もっと簡単にしてグローバルは1VM内でのみ有効であるとして、VM間変数と言う特殊な変数を作って、セマフォー処理をしてもいいと思う。もしお暇でありましたら、スレッドセーフなVMもご検討ください。 (なにぶんVMもほとんど知らないのに適当なことを言っているのかもしれません、その時は申し訳ありません)
[この投稿を含むスレッドを表示] [この投稿を削除]
[1225] Re:ライセンスというか使用許諾というかについて
投稿者:
2009/04/20 18:09:44

>ここですが、現状のVMでも、DVM_VirtualMachine構造体は複数生成できると >思いますので(試してませんが)、yieldのような予約語を入れて中断できるように >すれば「複数起動され個々がいつでも中断再開できる」という用途は達成できそうに >思います。 はい、まだVM部分はざくっとしか見ていないので、内容のアドバイス大変にうれしいです。イメージ的には複数スレッドでVMが動くを目指しています。なおかつ中断状態をディスクに書き込み、読み出し再開を目指しています。(ちょっと無茶な仕様ですが^^;) Diksam上でのグローバル変数は禁止します。システムが固有に持っているグローバル変数を用いてVM間のコミュニケーションをする予定です。この変数へのアクセスは、理想的にはDiksamの変数と同等に扱えればいいのですが、当面はアクセス関数からのアクセスかな。このシステム変数を使うことでスレッド間排他制御を自動でやりたいと思っています。利用者は排他制御を意識できない、しないレベルにしたい。(目標) >そうではなくて、VMはあくまでひとつで、グローバル変数やヒープを共有し、 >複数のスレッドというかコルーチンというかファイバーというかを立ち上げられる >ようにしようと思ったら、DVM_VirtualMachineのpcやらcurrent_executableやら >current_pcやらをもうすこし整理する必要がありそうです。 今一番簡単にVMを考えるなら、総ての変数領域を、クラスの中にパックしてしまえばグローバル変数がないという条件で、完全なスレッドセーフのVMになるのではないかと思います。その場合、ヒープ領域も指定して持つと言う富豪プログラミングです。 私はまだVMもちらりとしか見ていないので、上記構想がどんなものかの評価が出来ていません。こうしたほうがよりよい等アドバイスが有りましたらよろしくお願いします。 ここ数日、Diksam0.4.01をVC++2005上で動作させることをトライしていましたが、多くのエラーとトラブルに遭遇し、まだ内容もわからずに修正するのは早計であった為、今現在はDiksam0.1を、VC++上に移植して作業をはじめています。0.1は少しの修正で移植できました。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1224] Re:ライセンスというか使用許諾というかについて
投稿者:(ぱ)こと管理人
2009/04/20 01:30:57

そちらのソースを見たわけでもなく、私が趣旨を誤解している可能性もありますので あくまでご参考としてですが、 >また、VM部分はひとつのclassに入るように修正しようと思っています。 >使用上複数起動され個々がいつでも中断再開できる用途を考えているので、 >1つのまとまりとしてクラス化をして1パッケージで扱えるためにと。 ここですが、現状のVMでも、DVM_VirtualMachine構造体は複数生成できると 思いますので(試してませんが)、yieldのような予約語を入れて中断できるように すれば「複数起動され個々がいつでも中断再開できる」という用途は達成できそうに 思います。 そうではなくて、VMはあくまでひとつで、グローバル変数やヒープを共有し、 複数のスレッドというかコルーチンというかファイバーというかを立ち上げられる ようにしようと思ったら、DVM_VirtualMachineのpcやらcurrent_executableやら current_pcやらをもうすこし整理する必要がありそうです。 また、スレッドを分けるなら、MEMがstaticであるのはそれなりに問題になりそうに 思います。 >いつ完成するかはわかりませんが、何かありましたら必ずここでご報告いたします。 >ある程度めどが出来ましたら、フリーで公開するプログラムになります。 楽しみにしています。 >最後に1つ、「Diksam言語仕様 ver.0.4.01 」のページをパッケージに添付す >ことになると思いますが、その時はよろしくお願いいたします。 これについてもまったく問題ありません(明記しておくべきですね…)。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1223] Re:ライセンスというか使用許諾というかについて
投稿者:
2009/04/19 18:09:47

>Diksamについてですが、mycalc, crowbarと同じで結構です。 とてもありがとうございます。 簡素に現状をご報告いたします。字句解析については日本語関数や日本語の定義や変数を使いたいために、独自で書いています。スピードもそれほど要らない部分ですから。また、VM部分はひとつのclassに入るように修正しようと思っています。使用上複数起動され個々がいつでも中断再開できる用途を考えているので、1つのまとまりとしてクラス化をして1パッケージで扱えるためにと。(私がクラス好きなんでつ)ヒープとGCはまったく別の形でなくすかもしれません。なにぶん趣味で作っているものなので、いつ完成するかはわかりませんが、何かありましたら必ずここでご報告いたします。ある程度めどが出来ましたら、フリーで公開するプログラムになります。 最後に1つ、「Diksam言語仕様 ver.0.4.01 」のページをパッケージに添付すことになると思いますが、その時はよろしくお願いいたします。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1222] Re:ライセンスというか使用許諾というかについて
投稿者:(ぱ)こと管理人
2009/04/19 13:56:13

>はじめまして、山と言うもので。 はじめまして。 >このページでは、mycalc, crowbar共に、商用、非商用を問わず、自由に複製、改変、 >とプログラム名を指定して記入してあります。私どもは、Diksamを改変し、プログラムの中に組み込もうと思っていますが。ライセンス条項がどこにも見当たりません。 光栄です。 Diksamについてですが、mycalc, crowbarと同じで結構です。このライセンス条件を 書いた時点でDiksamは公開前だったのですが、追加を忘れていました。 さっそくDiksamを追記しておきました。ご指摘ありがとうございます。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1221] ライセンスというか使用許諾というかについて
投稿者:
2009/04/18 22:54:38

はじめまして、山と言うもので。 ライセンスというか使用許諾というかについてお聞き致します。 このページでは、mycalc, crowbar共に、商用、非商用を問わず、自由に複製、改変、 とプログラム名を指定して記入してあります。私どもは、Diksamを改変し、プログラムの中に組み込もうと思っていますが。ライセンス条項がどこにも見当たりません。 よろしければどの様なライセンス条項であるかお聞かせ願えませんでしょうか? 当初は、同一であると思って作業を進めていましたが、よくよく見るとDiksamの名前がありませんでした。まことに不注意ではあったのですが、よろしくお願いいたします。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1220] Re:リンク変更
投稿者:(ぱ)こと管理人
2009/04/04 10:11:46

こんにちは。 >C言語 FAQ 日本語訳 >http://www.kouno.jp/home/c_faq/ 情報ありがとうございます。修正しておきました。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1219] リンク変更
投稿者:時々訪れる人
2009/04/01 19:18:16

C言語 FAQ 日本語訳 http://www.kouno.jp/home/c_faq/ リンクが変わっているかも?? 上が正しい?
[この投稿を含むスレッドを表示] [この投稿を削除]
[1218] Re:読みました
投稿者:(ぱ)こと管理人
2009/03/29 12:53:07

はじめまして。書き込みありがとうございます。 最近かなり忙しく返信が遅くなりましてすみません。 >PHP掲示板の勉強をしてみようとぐぐり、(ぱ)さんのページを見つけました。 今にして思うと、言い訳しながらmagic_quote使うくらいなら使うな、とか、 テーブルのレコードには作成日時のフィールドぐらいデフォルトで入れとけ、 とか、ツッコミどころはあるのですが、役に立てたようなら何よりです。 >BF Basic笑いました。 ありがとうございます。 もうじきエイプリルフールですが、今年はネタを仕込むヒマもないなあ…
[この投稿を含むスレッドを表示] [この投稿を削除]
[1217] 読みました
投稿者:bourbon
2009/03/26 08:57:42

PHP掲示板の勉強をしてみようとぐぐり、(ぱ)さんのページを見つけました。 テクニカルでかつ気ままな仕様書は読み物としても秀逸。 知りたいこともちゃんと読みとれました。 ありがとうございました。 BF Basic笑いました。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1215] Re:windowsでpthread
投稿者:tos
2009/02/24 09:30:36

返信、ありがとうございます。 Boostとかいうライブラリに関しても調べてみたのですが、 こちらも優先順位の設定が出来なそうに見えました。 (間違っていたら、すみません)
[この投稿を含むスレッドを表示] [この投稿を削除]
[1214] Re:windowsでpthread
投稿者:(ぱ)こと管理人
2009/02/24 02:23:36

> pthreadを使用し、Windows上でスレッド優先順位を指定するには、 >どのようにすれば良いのでしょうか? または、そんなことは出来ないのでしょうか? 長々と放置しましてすみません。 私はpthreadは使ったことがないので、有効な助言はできないかと思います。 # ざっとぐぐってみた範囲では、やはり管理者権限がないと優先順位の設定は # できないように思えるのですが。 詳しい方からの情報をお待ちしております。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1213] windowsでpthread
投稿者:tos
2009/02/19 18:46:36

皆さんこんにちは、tosです。 現在、Windows XPにてpthread-win32 libraryを使用した プログラムの変更を行なっています。 あるスレッドの優先順位を変更する必要があるため調べたところ、 「優先度は、スケジューリングポリシーが SCHED_OTHER の時には意味を持たず、 リアルタイムポリシー SCHED_RR と SCHED_FIFO に対してのみ有効である。」 とのことでした。 スケジューリングポリシーは「SCHED_OTHER」であったため、「SCHED_FIFO」 に変更しようとしたところ、 「リアルタイムスケジューリングポリシーである SCHED_RR と SCHED_FIFO は、 スーパーユーザ権限のプロセスに限って使用できる。」 とのことで、「SCHED_FIFO」を指定することが出来ません。 pthreadを使用し、Windows上でスレッド優先順位を指定するには、 どのようにすれば良いのでしょうか? または、そんなことは出来ないのでしょうか?
[この投稿を含むスレッドを表示] [この投稿を削除]
[1210] Win << Mac::GUI (継承)
投稿者:つよし
2009/01/25 21:00:18

>「WindowsのGUIの悪いところは全部Macが起源だ」的な記事を > はてなの日記にでも書こうと思ってました。 楽しみに待っています。 前橋さんは、プログラミングの基礎の構築はバリバリlinuxを使ってるのですね!
[この投稿を含むスレッドを表示] [この投稿を削除]
[1208] Re:os
投稿者:(ぱ)こと管理人
2009/01/25 03:19:20

>前橋さん >は、Winndowsな人ですね!? 私も以前はアンチWindows的なことを言ってたこともありますが、2000あたりからはまあ不満はないですね。 今まさにここに書き込んでいるのはWindows(Vista)です。Web閲覧やメールは基本的にWindowsです。このVistaの上に、VMWare playerでUbnutuが入っています。 crowbarやDiksamはもともとUbuntuで作りました。今でも言語本体はUbuntuで作っています。本の原稿やら何やらもLinux上でLaTeXで書いています。エディタはEmacs、かな漢字変換はSKKです。 会社に入ってほぼ最初の仕事がX Window上だったこともあり、私自身は、WindowsのAPIで画面にウインドウを出したり線を引いたりするより、Xlibの方が経験は多いです(WindowsのAPIはほとんど今回勉強しながらやっています。以前、ちょとだけMFCとかを使ったことはありますが)。 >オープンソースlinuxなUFOゲームは、作れないのかな!? Diksamのdiksam.windowパッケージのXlib版を作ることはできるでしょうし、それでUFOゲーム程度なら作れるでしょうが、あるレベル以上のものはクライアントサーバモデルのXでは辛いでしょうねえ。 >MacOSXのインターフェースは、Windouseの比では、ありません。 私はMacは10年以上前(Windows95以前)に仕事で使っていたきり、ほとんど触っていません。なので今のMacのUIについては、何を語る資格もないですが、最近、ちょうど「WindowsのGUIの悪いところは全部Macが起源だ」的な記事をはてなの日記にでも書こうと思ってました。 (1)フォルダの中身の閲覧が、デフォルトでアイコンであるとか、  →少なくとも私の周囲では、みんな一覧表示に切り替えています。このへん   VistaになってさらにクソになりましたがこれはさすがにMacの責任ではない。 (2)そのアイコンをドラッグすると、デフォルトで(コピーではなく)移動になるとか、  →移動よりコピーの方がずっと使用頻度高くないですかね。 (3)デスクトップにファイルが置けるとか。  →これは反論ありそうですが、これを認めることで、結果的にファイルシステムが   循環した複雑怪奇なものになってしまっています。Windows3.1時代の   ファイルマネージャではいかんのか。 上記のような特徴は確かに初心者にはとっつきやすいのかもしれませんが、とっつきやすいだけで実用には向かないんじゃないかと。 >前橋言語で金儲け考えていないのであれば、Linuxでどうぞ! 金儲けは考えてないですが、かけられる時間が限られているので、やっぱり一番ユーザ層が厚いところを、と思いWindowsを選んだわけですが。 いざそうしてみたら、掲示板に、つよしさんといいたろうさんといいMacな人ばかりが書き込んでいるという…… 私が思うよりずっと、最近はMacユーザが増えているのかもしれませんね。私もMacBook Airが出た時にはかなり心を動かされました。まあお金に困っているわけじゃなし1台Macを買ってもいいけど、使う時間が……
[この投稿を含むスレッドを表示] [この投稿を削除]
[1207] Re:os
投稿者:つよし
2009/01/24 23:10:30

前橋さん は、Winndowsな人ですね!? オープンソースlinuxなUFOゲームは、作れないのかな!? ちなみに、web閲覧位にしか使いませんが 僕は、linux,macosxな人です。 オープンソースでは、ありませんが MacOSXのインターフェースは、Windouseの比では、ありません。 windows,osの2バージョン位 進んでいます。 対応アプリは、windowsが圧倒しています。 macのハード1社独占は、いかがなものか(麻生節) オープンソース Linux の UFO 期待します。 前橋言語で金儲け考えていないのであれば、Linuxでどうぞ! いま、酒飲んでます。自身:醒めたらこの文どうかんじるかなぁ
[この投稿を含むスレッドを表示] [この投稿を削除]
[1206] Re:os
投稿者:(ぱ)こと管理人
2009/01/11 00:25:15

>ここが解せないんですよ。たとえば >int >dvm_mbstowcs_len(const char *src) >{ > return mbstowcs(NULL, src, 0); >} >で良い筈なので、繰り返しは必要ないと思うんですが... やったのがかなり昔のことなのでもはや覚えていないのですが、 考えられる原因としては、以下のようなものが考えられます。 (1)Windowsでは、mbsrtowcs()だけでなくてmbstowcs()も動かなかった。  →当時はXPだったのですが、今Vistaで試したらあっさり両方動いてしまったので   検証不能です… (2)mbstowcs()なら動いたが、rがついていないのでよろしくない関数だと  思い込んでいた。  →この使い方なら、mbstowcs()側に状態を覚えさせないので、問題ないと   思いますが。 (3)mbstowcs()の第1引数にNULLを渡すと変換を行わない、という仕様を知らなかった。  →実のところ現在は完璧に忘れていました。当時はちゃんとマニュアル読んだので、   知らなかったということはないと思うのですが…
[この投稿を含むスレッドを表示] [この投稿を削除]
[1205] Re:os
投稿者:kit
2009/01/09 12:50:45

>で、manの続きを読むと、 > > This representation is recommended over --all-locates one, > due being the system wide supported values. > >(超訳)この(SUPPORTEDファイルの)表現は、locale -a で出てくるヤツより推奨される。 >なぜならシステム全体でサポートされてるものだから。 > >なんて書かれていて、それなりのポリシーはあるようですが……。 >歴史的ないざこざがあったのでしょうなぁ。 まあ Linux の世界に限れば、 http://web.archive.org/web/20040114120121/http://www.openi18n.org/docs/text/LocNameGuide-V11.txt という標準が決まっているので、ja_JP.EUC-JP の方が正式と言えば正式です。 しかし、この標準を決めた時点で、既に Linux を含む全ての UNIX 系 OS で ja_JP.eucJP が使える状態にあり、互換性のためには当然 ja_JP.eucJP を 引き続きサポートする必要もあったわけで、実質的には混乱の種を増やした だけだったと私は思ってます。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1204] Re:os
投稿者:kit
2009/01/09 12:10:51

>また、mbstowcs()とかは引数にlenを取りますが、実際の文字列長に上限を >置くわけにはいかないので、どうせ繰り返し呼ぶなら1文字ずつやるほうが >(効率を考えなければ)楽なこと、 ここが解せないんですよ。たとえば int dvm_mbstowcs_len(const char *src) { return mbstowcs(NULL, src, 0); } で良い筈なので、繰り返しは必要ないと思うんですが... (第一引数が NULL の場合、mbstowcs() は第三引数を無視します。) dvm_mbstowcs() の方は len 用に引数が一つ増えてしまいますが、呼び出し側では 当然 len は分かっている筈なので、それでも構わないというか、今時のコーディング スタイル的にもその方が良いんじゃないでしょうか? (len が分かってないのに dvm_mbstowcs() を呼ぶなんていうのは、設計上の誤りな わけですから)
[この投稿を含むスレッドを表示] [この投稿を削除]
[1203] Re:os
投稿者:yuya
2009/01/09 10:03:05

>ただ、Ubuntuだとxdmで文字コードが選べるのですが、そこでEUCを選んだ >時のデフォルトのLANGはやっぱりja_JP.EUC-JPなんですよね… 私もUbuntu使っていますが、localeのmanページに FILES: /usr/share/i18n/SUPPORTED List of supported values とあり、ファイルを覗くと ja_JP.EUC-JP がエントリーされていますね。 で、manの続きを読むと、 This representation is recommended over --all-locates one, due being the system wide supported values. (超訳)この(SUPPORTEDファイルの)表現は、locale -a で出てくるヤツより推奨される。 なぜならシステム全体でサポートされてるものだから。 なんて書かれていて、それなりのポリシーはあるようですが……。 歴史的ないざこざがあったのでしょうなぁ。 あと、前回の投稿で、他人のマシンでsudoを試させるような書き方をしてしまい、すみませんでした。 (locale -a の結果は ja_JP.ccb となります。)
[この投稿を含むスレッドを表示] [この投稿を削除]
[1202] Re:os
投稿者:(ぱ)こと管理人
2009/01/09 01:53:16

>>標準の mbstowcs() や wcstombs() を使わずに、dvm_mbstowcs() や >>dvm_mbstowcs_len() を用意している理由も良く分かりませんでした。 > >これらは、現状ではmbstowcs()とかの単なるラッパ関数です。 訂正です。dvm_mbstowcs()等に関しては単なるラッパではないですね。 理由のひとつは、昔 http://kmaebashi.com/programmer/devlang/regexp.html にちょっと書いたのですが、少なくとも当時の私には、Windowsで mbsrtowcs()を動かすことができなかったため(rなしの方は動いたんだったかな)、 また、mbstowcs()とかは引数にlenを取りますが、実際の文字列長に上限を 置くわけにはいかないので、どうせ繰り返し呼ぶなら1文字ずつやるほうが (効率を考えなければ)楽なこと、 あたりが理由だったと思います。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1201] Re:os
投稿者:(ぱ)こと管理人
2009/01/09 00:06:34

こんにちは。いつもお世話になります。 >ja_JP.eucjp と設定しても動きます。 本当だ。今試したところ動きました。 前に試したときは動かなかったと思うのですが、なにかミスしていたようです。 >日本語EUC locale 名としては ja_JP.eucJP を使うのが最も一般性があり、 >Linux に限らず、多くの UNIX 系 OS で通用するので、そちらを勧めます。 ただ、Ubuntuだとxdmで文字コードが選べるのですが、そこでEUCを選んだ 時のデフォルトのLANGはやっぱりja_JP.EUC-JPなんですよね… >#include <limits.h> して MB_LEN_MAX を使わないのはなぜなんでしょう? これは単純に知りませんでした。毎度ながらご指摘ありがとうございます。 >標準の mbstowcs() や wcstombs() を使わずに、dvm_mbstowcs() や >dvm_mbstowcs_len() を用意している理由も良く分かりませんでした。 これらは、現状ではmbstowcs()とかの単なるラッパ関数です。 わざわざ1枚かぶせている理由ですが、たとえばどこかのタイミングで 独自の変換テーブルを持つようにする、といった改修を行う可能性はあると 思っています。実際、今回こうやっていくつかの環境で動かないのを 目の当たりにすると、内部コードなんかユニコード固定でいいし 日本語以外に対応しなくてもいいから、全部自前でやりたい、という気にも なりますです……
[この投稿を含むスレッドを表示] [この投稿を削除]
[1200] Re:os
投稿者:yuya
2009/01/07 15:49:13

ごぶさたしています。今年もよろしくお願いします。 >そもそも私の環境でも >ja_JP.eucjp >は出ても、 >ja_JP.EUC-JP >は出ないんですよね。 % sudo localedef -i ja_JP -f euc-JP ja_JP.C-C-B とでも入れてみて、懐かしのバンド名を使ったダミーのロケールを作り、すぐ消そうとしても % sudo localedef --delete-from-archive ja_JP.C-C-B locale "ja_JP.C-C-B" not in archive あれ?と思って % locale -a とすると……。kitさんのおっしゃるとおり、変態的であることを垣間見ることができますね。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1199] Re:os
投稿者:kit
2009/01/07 13:57:56

>>Debian(etch) にて >>上の方にある同じ abort エラーがでました. この etch のエラーは、日本語EUC localeがインストールされてないため出ている エラーでしょう。Debian でのやり方は知りませんが、日本語 EUC locale をイン ストールすれば直るのでは? つまりdiksamではなく、利用環境の側の問題だと思います。 >>% printenv LANG >>ja_JP.EUC-JP >>% locale -a >>locale: Cannot set LC_CTYPE to default locale: No such file or directory >>locale: Cannot set LC_MESSAGES to default locale: No such file or directory >>locale: Cannot set LC_COLLATE to default locale: No such file or directory >>C >>POSIX >>ja_JP.utf8 > >locale -aで出てこないものをLANGにセットしても無駄だ、というのが >マニュアル的な解釈だと思うのですが、 そうです。したがって、locale -a で ja_JP.eucjp が表示されるような環境設定が必須です。 >そもそも私の環境でも > >ja_JP.eucjp > >は出ても、 > >ja_JP.EUC-JP > >は出ないんですよね。でも、LANGやsetlocaleで効くのはja_JP.EUC-JPのほうで、 >ja_JP.eucjpではないという。 ja_JP.eucjp と設定しても動きます。 Linux の locale 名解釈ルーチンは変態的で、ja_JP.EUC-JP, ja_JP.eucjp, ja_JP.eucJP を全て同一視します。こんな動作をするUNIX系OSは、知る限り Linuxだけです。 日本語EUC locale 名としては ja_JP.eucJP を使うのが最も一般性があり、 Linux に限らず、多くの UNIX 系 OS で通用するので、そちらを勧めます。 あと、 #define MULTIBYTE_CHAR_SIZE_MAX (6) というのは良くないコーディングスタイルだと思うんですが、 #include <limits.h> して MB_LEN_MAX を使わないのはなぜなんでしょう? (Linux の場合でも MB_LEN_MAX は 16、NetBSD あたりだと MB_LEN_MAX は 32 です。) 標準の mbstowcs() や wcstombs() を使わずに、dvm_mbstowcs() や dvm_mbstowcs_len() を用意している理由も良く分かりませんでした。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1198] Re:os
投稿者:(ぱ)こと管理人
2009/01/05 01:36:22

>Debian(etch) にて >上の方にある同じ abort エラーがでました. 情報提供ありがとうございます。 >status. -1. errno=84: Invalid or incomplete multibyte or wide character >[28] src=不正なマルチバイト文字です。 >status. -1. errno=84: Invalid or incomplete multibyte or wide character >len=-1 >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. >Abort これは、現象としては、明らかにerror_message.c内の日本語エラーメッセージを マルチバイト文字列に変換しようとしているところで失敗していることに起因する エラーです。詳細な情報ありがとうございます。 ……と、ここまではすぐにわかるのですが、原因のほうは私にはさっぱりです。 >% printenv LANG ja_JP.EUC-JP >% locale -a >locale: Cannot set LC_CTYPE to default locale: No such file or directory >locale: Cannot set LC_MESSAGES to default locale: No such file or directory >locale: Cannot set LC_COLLATE to default locale: No such file or directory >C >POSIX >ja_JP.utf8 locale -aで出てこないものをLANGにセットしても無駄だ、というのが マニュアル的な解釈だと思うのですが、そもそも私の環境でも ja_JP.eucjp は出ても、 ja_JP.EUC-JP は出ないんですよね。でも、LANGやsetlocaleで効くのはja_JP.EUC-JPのほうで、 ja_JP.eucjpではないという。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1197] Re:os
投稿者:つよし
2009/01/04 14:15:52

Vine4.2で試行しました。 OK!!です。 $ sh test.sh test array class01 class02 class03 method cast classmain downcast instanceof super exception shapemain throws nullpointer array_ex else_ex test switch final do_while enum delegate rename こちらのMacOSXは、開発環境がうまくインストール出来ているか疑問です? 他の人の追試を、、、、。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1196] Re:os
投稿者:つよし
2009/01/04 14:05:11

MacOSXで試行しました。 $ sh test.sh test 276,277c276,277 < str[0]..26085 < str[1]..26412 --- > str[0]..50940 > str[1]..52188 279c279 < str[2]..35486 --- > str[2]..47340 array class01 class02 class03 method cast classmain downcast instanceof super exception shapemain throws nullpointer array_ex else_ex test switch final do_while enum delegate rename
[この投稿を含むスレッドを表示] [この投稿を削除]
[1195] Re:os
投稿者:(ぱ)こと管理人
2009/01/04 09:23:39

昨日は帰省してネットから切り離された上、風邪で実家で寝込んでまして、 すっかり遅くなりましてすみません。 >>(2)725~728行目のみをコメントアウト … >----上の変更を加えて sh test.sh を実行 これでかなり原因が絞れました。ありがとうございます。 最近追加した文字リテラル関連でバグを入れてしまったかな、と思い、 追求したところ、怪しいところがあっさり見つかりました… compiler以下のstring.cの中に、以下の関数があります(59行目)。 int dkc_close_character_literal(void) { DVM_Char buf[1]; ここの 誤) DVM_Char buf[1]; を 正) DVM_Char buf[2]; に直してコンパイル/実行を試していただけますか。 # mainの下でmakeするだけではここのコンパイルは通らないので、 # compilerの下でいったんmakeしてからmainの下でもmakeするか、 # mainの下で touch main.c してからmainの下でmakeしてください。 ここは文字リテラル(「'本'」のような1文字の定数)の値を抽出しているところで、 1文字であることはその前後の判定で明らかなので、1文字分のバッファを取っておけば よいかと思っていたのですが、 dvm_mbstowcs(st_string_literal_buffer, buf); 実際に変換しているこの関数では、末尾にL'\0'を補っているので、 領域破壊が起きていました。末尾ナル文字分を忘れるとは初心者並みのポカでした。 4バイトかそこらのスタック領域の破壊だと、(現にうちの環境で動いていたように) たまたま動いてしまう場合も多く、つよしさんのところでこの現象で死んでいるか どうかはわかりませんが、可能性は高いと思います。 いろいろと情報いただきありがとうございました。送球に修正してリリースします。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1194] diksam テスト中
投稿者:つよし
2009/01/04 08:33:15

前橋さんの言語 diksam のテスト中です。 どなたか検証お願いします。(前橋さんに変わって書き込み??) EUC-jpの環境 http://kmaebashi.com/programmer/devlang/diksam_0_4_02_unix.tgz UTF-8の環境 http://kmaebashi.com/programmer/devlang/diksam_0_4_02_unix_utf8.tgz コンパイルは、UNIX版は上記ソースを展開したディレクトリの mainフォルダの下でmake!! また、その下の test ディレクトリで sh test.sh を実行して結果を教えてください!! お願いします。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1193] Re:os
投稿者:つよし
2009/01/03 11:52:41

・Linux(Vine Linux 4.2)  →utf-8では正常動作  →EUCでは、××× ・MacOS  →utf-8では、×××  →EUCでは、×××
[この投稿を含むスレッドを表示] [この投稿を削除]
[1192] Re:os
投稿者:つよし
2009/01/03 11:21:55

>・MacOS > →utf-8では正常動作 最近のMacOSXのデフォルトの文字コードは、何なのかわかりません。 10.3.9のデフォルトの文字コードは、EUC-jpですが、ターミナルでUTF-8に設定して 実行するとdiffが差分を出します。 sh test.shの結果 test 1,279c1 < hoge piyo < \nabc < abccde < 0x123..291 < 3 + 5..8 < 3 - 5..-2 < 3 + -5..-2 < 3 * 5..15 < 3 / 5..0 < 10 % 3..1 < 3.0 + 5.0..8.000000 < 3.0 - 5.0..-2.000000 < 3.0 + -5.0..-2.000000 < 3.0 * 5.0..15.000000 < 3.0 / 5.0..0.600000 < 10.0 % 3.0..1.000000 < 3 + 5.0..8.000000 < 3 - 5.0..-2.000000 < 3 + -5.0..-2.000000 < 3 * 5.0..15.000000 < 3 / 5.0..0.600000 < 10 % 3.0..1.000000 < 3.0 + 5..8.000000 < 3.0 - 5..-2.000000 < 3.0 + -5..-2.000000 < 3.0 * 5..15.000000 < 3.0 / 5..0.600000 < 10.0 % 3..1.000000 < 1 & 3..1 < 1 | 2..3 < 1 ^ 3..2 < ~5..-6 < 3 + 5..8 < 3 - 5..-2 < 3 + -5..-2 < 3 * 5..15 < 3 / 5..0 < 10 % 3..1 < 3.0 + 5.0..8.000000 < 3.0 - 5.0..-2.000000 < 3.0 + -5.0..-2.000000 < 3.0 * 5.0..15.000000 < 3.0 / 5.0..0.600000 < 10.0 % 3.0..1.000000 < 3 + 5.0..8.000000 < 3 - 5.0..-2.000000 < 3 + -5.0..-2.000000 < 3 * 5.0..15.000000 < 3 / 5.0..0.600000 < 10 % 3.0..1.000000 < 1 & 3..1 < 1 | 2..3 < 1 ^ 3..2 < ~5..-6 < 3.0 + 5..8.000000 < 3.0 - 5..-2.000000 < 3.0 + -5..-2.000000 < 3.0 * 5..15.000000 < 3.0 / 5..0.600000 < 10.0 % 3..1.000000 < 1 < 3..true < 3 < 1..false < 1 <= 3..true < 3 <= 1..false < 1 == 1..true < 1 == 3..false < 1 != 3..true < 3 != 3..false < 1 >= 3..false < 3 >= 1..true < 3 > 1..true < 1 > 3..false < 1.0 < 3..true < 3 < 1.0..false < 1.0 <= 3..true < 3 <= 1.0..false < 1.0 == 1.0..true < 1.0 == 3..false < 1 != 3.0..true < 3.0 != 3.0..false < 3.0 >= 1..true < 1 >= 3.0..false < 3.0 > 1..true < 1 > 3.0..false < 1 < 3..true < 3 < 1..false < 1 <= 3..true < 3 <= 1..false < 1 == 1..true < 1 == 3..false < 1 != 3..true < 3 != 3..false < 1 >= 3..false < 3 >= 1..true < 3 > 1..true < 1 > 3..false < 1.0 < 3..true < 3 < 1.0..false < 1.0 <= 3..true < 3 <= 1.0..false < 1.0 == 1.0..true < 1.0 == 3..false < 1.0 != 3..true < 3 >= 1.0..true < 1.0 >= 3.0..false < 3 > 1.0..true < 1.0 > 3..false < == good. < != good. < < good. < <= good. < <= good. < >= good. < >= good. < == good. < != good. < < good. < <= good. < <= good. < >= good. < >= good. < int_val..5 < int_val..3 < int_val..9 < int_val..3 < int_val..1 < double_val..5.000000 < double_val..3.000000 < double_val..9.000000 < double_val..3.000000 < double_val..1.000000 < str_val..strhoge3 < int_val..3 < double_val..0.000000 < a..3, b..4.000000 < no_arg < a + b..28 < a + b + c..10.000000 < boolean_func..true < int_func..3 < double_func..3.000000 < string_func..hoge < ********** recursive call ********** < a..10 a..9 a..8 a..7 a..6 a..5 a..4 a..3 a..2 a..1 a..0 < a..0 a..1 a..2 a..3 a..4 a..5 a..6 a..7 a..8 a..9 a..10 < boolean_value..true < !boolean_value..false < true < boolean_value || false < true == true good < true != false good < ! operator good. < true_value == true good < true_value != false good < ! operator good. < true < good < good < good < ********** while statement ********** < i..0 i..1 i..2 i..3 i..4 i..5 i..6 i..7 i..8 i..9 < i..0 i..1 i..2 i..3 i..4 i..5 i..6 < ********** for statement ********** < i..0 i..1 i..2 i..3 i..4 i..5 i..6 < i..0 i..1 i..2 i..3 i..4 i..5 i..6 i..7 i..8 i..9 < ********** break with label in while ********** < i..0, j..0 < i..0, j..1 < i..0, j..2 < i..0, j..3 < i..0, j..4 < i..0, j..5 < ********** break with label in for ********** < i..0, j..0 < i..0, j..1 < i..0, j..2 < i..0, j..3 < i..0, j..4 < i..0, j..5 < ********** continue in while ********** < i..5 i..6 i..7 i..8 i..9 i..10 < i..10 < ********** continue in for ********** < i..5 i..6 i..7 i..8 i..9 < i..10 < ********** continue with label in while ********** < i..1 j..0, i..2 j..0, i..3 j..0, < i..3 j..0 < ********** continue with label in for ********** < i..0 j..0, i..1 j..1, i..2 j..2, < i..3 j..3 < *** i..0*** < i == 0 < i != 3 < i != 2 && i != 3 < *** i..1*** < i == 1 < i != 3 < i != 2 && i != 3 < *** i..2*** < i == 2 < i != 3 < i == 2 || i == 3 < i == 2 && j == 3 < *** i..3*** < i == else < i == 2 || i == 3 < *** i..4*** < i == else < i != 3 < i != 2 && i != 3 < i..11 < ii = 10..10 < array[3][0]..10 < 1 2 3 4 5 6 7 8 9 < 2 4 6 8 10 12 14 16 18 < 3 6 9 12 15 18 21 24 27 < 4 8 12 16 20 24 28 32 36 < 5 10 15 20 25 30 35 40 45 < 6 12 18 24 30 36 42 48 54 < 7 14 21 28 35 42 49 56 63 < 8 16 24 32 40 48 56 64 72 < 9 18 27 36 45 54 63 72 81 < array2[0]..1 < array2[1]..2 < array2[2]..3 < array2[3]..4 < array2[4]..5 < 1 2 3 4 5 6 7 8 9 < 2 4 6 8 10 12 14 16 18 < 3 6 9 12 15 18 21 24 27 < 4 8 12 16 20 24 28 32 36 < 5 10 15 20 25 30 35 40 45 < 6 12 18 24 30 36 42 48 54 < 7 14 21 28 35 42 49 56 63 < 8 16 24 32 40 48 56 64 72 < 9 18 27 36 45 54 63 72 81 < darray[0]..0.000000 < darray[1]..1.000000 < darray[2]..2.000000 < darray[3]..3.000000 < darray[4]..4.000000 < darray[5]..5.000000 < darray[6]..6.000000 < darray[7]..7.000000 < darray[8]..8.000000 < darray[9]..9.000000 < darray[0]..1.000000 < darray[1]..2.000000 < darray[2]..3.000000 < darray[3]..4.000000 < darray[4]..5.000000 < darray[5]..6.000000 < sarray[0]..str0 < sarray[1]..str1 < sarray[2]..str2 < sarray[3]..str3 < sarray[4]..str4 < sarray[5]..str5 < sarray[6]..str6 < sarray[7]..str7 < sarray[8]..str8 < sarray[9]..str9 < sarray[0]..1 < sarray[1]..2 < sarray[2]..3 < sarray[3]..4 < null_str..null < abcnull < null < OK < OK < OK < OK < 日本語 < str[0]..26085 < str[1]..26412 < 本 < str[2]..35486 --- > test.dkm:726:文字リテラルが2文字以上あります。 array 6,7c6,7 < len..6 < substr..eほげほ --- > len..10 > substr..eほ class01 class02 class03 method cast classmain downcast instanceof super exception shapemain throws nullpointer array_ex else_ex test switch final do_while enum delegate rename
[この投稿を含むスレッドを表示] [この投稿を削除]
[1191] Re:os
投稿者:つよし
2009/01/03 10:59:30

>Vine Linuxにて、以下の修正を実施して、../diksam test.dkmで実行して、 >セグメンテーション違反が出るかどうか、よければ試してみてください。 > >(1)test.dkmの720行目以降をコメントアウト(Diksamでは/* */で囲んでコメントアウト) >/* >println("日本語"); > >string str = "日本語"; >for (i = 0; i < str.length(); i++) { > println("str[" + i + "].." + str[i]); > if (str[i] == '本') { > println("本"); > } >} > >exit(1); >println("これは出ない"); >*/ ----上の変更を加えて sh test.sh を実行 $ sh test.sh test 275,279d274 < 日本語 < str[0]..26085 < str[1]..26412 < 本 < str[2]..35486 array class01 class02 class03 method cast classmain downcast instanceof super exception shapemain throws nullpointer array_ex else_ex test switch final do_while enum delegate rename $ > >(2)725~728行目のみをコメントアウト >string str = "日本語"; >for (i = 0; i < str.length(); i++) { > /* > println("str[" + i + "].." + str[i]); > if (str[i] == '本') { > println("本"); > } > */ >} > >exit(1); >println("これは出ない"); > >また、うちのPCでは動かなかった、という方は他にいらっしゃらないでしょうか。 >情報募集中です (_o_) ----上の変更を加えて sh test.sh を実行 $ sh test.sh test 276,279d275 < str[0]..26085 < str[1]..26412 < 本 < str[2]..35486 array class01 class02 class03 method cast classmain downcast instanceof super exception shapemain throws nullpointer array_ex else_ex test switch final do_while enum delegate rename $
[この投稿を含むスレッドを表示] [この投稿を削除]
[1190] Re:os
投稿者:まりーえ
2009/01/02 23:40:43

>また、うちのPCでは動かなかった、という方は他にいらっしゃらないでしょうか。 >情報募集中です (_o_) Debian(etch) にて 上の方にある同じ abort エラーがでました. printf デバッグを行って, <<---------------------------------------- --- diksam_unix.org/share/wchar.c 2008-12-08 08:57:15.000000000 +0900 +++ diksam_unix/share/wchar.c 2009-01-02 23:31:16.000000000 +0900 @@ -1,4 +1,5 @@ #include <stdio.h> +#include <errno.h> #include <string.h> #include <wchar.h> #include "DBG.h" @@ -44,10 +45,12 @@ int status; mbstate_t ps; +printf("[%d] src=%s\n", strlen(src), src); memset(&ps, 0, sizeof(mbstate_t)); for (src_idx = dest_idx = 0; src[src_idx] != '\0'; ) { status = mbrtowc(NULL, &src[src_idx], MULTIBYTE_CHAR_SIZE_MAX, &ps); if (status < 0) { +printf("status. %d. errno=%d: %s\n", status, errno, strerror(errno)); return status; } dest_idx++; >>---------------------------------------- [6] src=日本語 status. -1. errno=84: Invalid or incomplete multibyte or wide character [28] src=不正なマルチバイト文字です。 status. -1. errno=84: Invalid or incomplete multibyte or wide character len=-1 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. Abort ------- % printenv LANG ja_JP.EUC-JP % locale -a locale: Cannot set LC_CTYPE to default locale: No such file or directory locale: Cannot set LC_MESSAGES to default locale: No such file or directory locale: Cannot set LC_COLLATE to default locale: No such file or directory C POSIX ja_JP.utf8 ------- こんな EUC になりきれていない環境です.
[この投稿を含むスレッドを表示] [この投稿を削除]
[1189] Re:os
投稿者:(ぱ)こと管理人
2009/01/02 19:47:50

状況を整理してみます。 ・Linux(Ubuntu 4.1.2-Oubuntu4)←私のところ  →utf-8, EUCともに正常動作 ・Linux(Vine Linux 4.2)  →utf-8では正常動作  →EUCでは、test.dkmにてセグメンテーション違反 その他のスクリプトは、日本語を扱うarray.dkmのようなものを含め、 正常動作。 ・MacOS  →utf-8では正常動作  →EUCでは、以下の現象が発生  ・test.dkmの726行目の'本'という文字リテラルについて、ワイド文字に変換したら   2文字以上と解釈された。  ・array.dkmの46行目の「"hogeほげ".length()」が6を返している。   また、47行目の「"hogeほげほげ".substr(3, 4)」が「eほ&#65533;」を返している。 念のため確認ですが、 ・EUCで動かすときは、「diksam_0_4_02.unix.tgz」をダウンロードして、  これをtar xvzfで展開したフォルダにて、コンパイル、実行をしていますよね?  文字コードの変換等はしていないですよね? ・test.dkmやarray.dkmは、エディタ等で日本語部分を含めちゃんと読めていますよね?  その際、文字コードがEUCであることも、確認できていますよね? MacOSの方はともかくとして、Vine Linuxではarray.dkmの日本語 関連の処理が正常に動いているので、実は文字コード云々は関係 なかった、というオチも考えたのですが、UTF-8版が正常動作して いるなら、やはり何らかの文字コード関係の問題のようです。 うちには今遊んでいるPCはないので、Vineの環境はすぐには作れません。 お手数ですがそちらで以下のテストは可能でしょうか? Vine Linuxにて、以下の修正を実施して、../diksam test.dkmで実行して、 セグメンテーション違反が出るかどうか、よければ試してみてください。 (1)test.dkmの720行目以降をコメントアウト(Diksamでは/* */で囲んでコメントアウト) /* println("日本語"); string str = "日本語"; for (i = 0; i < str.length(); i++) { println("str[" + i + "].." + str[i]); if (str[i] == '本') { println("本"); } } exit(1); println("これは出ない"); */ (2)725~728行目のみをコメントアウト string str = "日本語"; for (i = 0; i < str.length(); i++) { /* println("str[" + i + "].." + str[i]); if (str[i] == '本') { println("本"); } */ } exit(1); println("これは出ない"); また、うちのPCでは動かなかった、という方は他にいらっしゃらないでしょうか。 情報募集中です (_o_)
[この投稿を含むスレッドを表示] [この投稿を削除]
[1188] os
投稿者:つよし
2009/01/02 05:58:45

前橋さん vine linux 4.2 な環境では、再現できませんか? 遊んでいるパソコンあれば環境作れそうですが、むり??
[この投稿を含むスレッドを表示] [この投稿を削除]
[1187] 試行
投稿者:つよし
2009/01/02 05:53:15

>main/main.cの26行目あたりに >setlocale(LC_CTYPE, ""); >という行があるはずですが、これを、 >setlocale(LC_ALL, "ja_JP.EUC-JP"); >に変更し、再コンパイルするとどうなるでしょうか? エラーが出ます。 ------------------vine: sh test.sh test.sh: line 1: 2490 セグメンテーション違反です ../diksam test.dkm >test_.result 2>&1 test 1,279d0 < hoge piyo < \nabc < abccde < 0x123..291 < 3 + 5..8 < 3 - 5..-2 < 3 + -5..-2 < 3 * 5..15 < 3 / 5..0 < 10 % 3..1 < 3.0 + 5.0..8.000000 < 3.0 - 5.0..-2.000000 < 3.0 + -5.0..-2.000000 < 3.0 * 5.0..15.000000 < 3.0 / 5.0..0.600000 < 10.0 % 3.0..1.000000 < 3 + 5.0..8.000000 < 3 - 5.0..-2.000000 < 3 + -5.0..-2.000000 < 3 * 5.0..15.000000 < 3 / 5.0..0.600000 < 10 % 3.0..1.000000 < 3.0 + 5..8.000000 < 3.0 - 5..-2.000000 < 3.0 + -5..-2.000000 < 3.0 * 5..15.000000 < 3.0 / 5..0.600000 < 10.0 % 3..1.000000 < 1 & 3..1 < 1 | 2..3 < 1 ^ 3..2 < ~5..-6 < 3 + 5..8 < 3 - 5..-2 < 3 + -5..-2 < 3 * 5..15 < 3 / 5..0 < 10 % 3..1 < 3.0 + 5.0..8.000000 < 3.0 - 5.0..-2.000000 < 3.0 + -5.0..-2.000000 < 3.0 * 5.0..15.000000 < 3.0 / 5.0..0.600000 < 10.0 % 3.0..1.000000 < 3 + 5.0..8.000000 < 3 - 5.0..-2.000000 < 3 + -5.0..-2.000000 < 3 * 5.0..15.000000 < 3 / 5.0..0.600000 < 10 % 3.0..1.000000 < 1 & 3..1 < 1 | 2..3 < 1 ^ 3..2 < ~5..-6 < 3.0 + 5..8.000000 < 3.0 - 5..-2.000000 < 3.0 + -5..-2.000000 < 3.0 * 5..15.000000 < 3.0 / 5..0.600000 < 10.0 % 3..1.000000 < 1 < 3..true < 3 < 1..false < 1 <= 3..true < 3 <= 1..false < 1 == 1..true < 1 == 3..false < 1 != 3..true < 3 != 3..false < 1 >= 3..false < 3 >= 1..true < 3 > 1..true < 1 > 3..false < 1.0 < 3..true < 3 < 1.0..false < 1.0 <= 3..true < 3 <= 1.0..false < 1.0 == 1.0..true < 1.0 == 3..false < 1 != 3.0..true < 3.0 != 3.0..false < 3.0 >= 1..true < 1 >= 3.0..false < 3.0 > 1..true < 1 > 3.0..false < 1 < 3..true < 3 < 1..false < 1 <= 3..true < 3 <= 1..false < 1 == 1..true < 1 == 3..false < 1 != 3..true < 3 != 3..false < 1 >= 3..false < 3 >= 1..true < 3 > 1..true < 1 > 3..false < 1.0 < 3..true < 3 < 1.0..false < 1.0 <= 3..true < 3 <= 1.0..false < 1.0 == 1.0..true < 1.0 == 3..false < 1.0 != 3..true < 3 >= 1.0..true < 1.0 >= 3.0..false < 3 > 1.0..true < 1.0 > 3..false < == good. < != good. < < good. < <= good. < <= good. < >= good. < >= good. < == good. < != good. < < good. < <= good. < <= good. < >= good. < >= good. < int_val..5 < int_val..3 < int_val..9 < int_val..3 < int_val..1 < double_val..5.000000 < double_val..3.000000 < double_val..9.000000 < double_val..3.000000 < double_val..1.000000 < str_val..strhoge3 < int_val..3 < double_val..0.000000 < a..3, b..4.000000 < no_arg < a + b..28 < a + b + c..10.000000 < boolean_func..true < int_func..3 < double_func..3.000000 < string_func..hoge < ********** recursive call ********** < a..10 a..9 a..8 a..7 a..6 a..5 a..4 a..3 a..2 a..1 a..0 < a..0 a..1 a..2 a..3 a..4 a..5 a..6 a..7 a..8 a..9 a..10 < boolean_value..true < !boolean_value..false < true < boolean_value || false < true == true good < true != false good < ! operator good. < true_value == true good < true_value != false good < ! operator good. < true < good < good < good < ********** while statement ********** < i..0 i..1 i..2 i..3 i..4 i..5 i..6 i..7 i..8 i..9 < i..0 i..1 i..2 i..3 i..4 i..5 i..6 < ********** for statement ********** < i..0 i..1 i..2 i..3 i..4 i..5 i..6 < i..0 i..1 i..2 i..3 i..4 i..5 i..6 i..7 i..8 i..9 < ********** break with label in while ********** < i..0, j..0 < i..0, j..1 < i..0, j..2 < i..0, j..3 < i..0, j..4 < i..0, j..5 < ********** break with label in for ********** < i..0, j..0 < i..0, j..1 < i..0, j..2 < i..0, j..3 < i..0, j..4 < i..0, j..5 < ********** continue in while ********** < i..5 i..6 i..7 i..8 i..9 i..10 < i..10 < ********** continue in for ********** < i..5 i..6 i..7 i..8 i..9 < i..10 < ********** continue with label in while ********** < i..1 j..0, i..2 j..0, i..3 j..0, < i..3 j..0 < ********** continue with label in for ********** < i..0 j..0, i..1 j..1, i..2 j..2, < i..3 j..3 < *** i..0*** < i == 0 < i != 3 < i != 2 && i != 3 < *** i..1*** < i == 1 < i != 3 < i != 2 && i != 3 < *** i..2*** < i == 2 < i != 3 < i == 2 || i == 3 < i == 2 && j == 3 < *** i..3*** < i == else < i == 2 || i == 3 < *** i..4*** < i == else < i != 3 < i != 2 && i != 3 < i..11 < ii = 10..10 < array[3][0]..10 < 1 2 3 4 5 6 7 8 9 < 2 4 6 8 10 12 14 16 18 < 3 6 9 12 15 18 21 24 27 < 4 8 12 16 20 24 28 32 36 < 5 10 15 20 25 30 35 40 45 < 6 12 18 24 30 36 42 48 54 < 7 14 21 28 35 42 49 56 63 < 8 16 24 32 40 48 56 64 72 < 9 18 27 36 45 54 63 72 81 < array2[0]..1 < array2[1]..2 < array2[2]..3 < array2[3]..4 < array2[4]..5 < 1 2 3 4 5 6 7 8 9 < 2 4 6 8 10 12 14 16 18 < 3 6 9 12 15 18 21 24 27 < 4 8 12 16 20 24 28 32 36 < 5 10 15 20 25 30 35 40 45 < 6 12 18 24 30 36 42 48 54 < 7 14 21 28 35 42 49 56 63 < 8 16 24 32 40 48 56 64 72 < 9 18 27 36 45 54 63 72 81 < darray[0]..0.000000 < darray[1]..1.000000 < darray[2]..2.000000 < darray[3]..3.000000 < darray[4]..4.000000 < darray[5]..5.000000 < darray[6]..6.000000 < darray[7]..7.000000 < darray[8]..8.000000 < darray[9]..9.000000 < darray[0]..1.000000 < darray[1]..2.000000 < darray[2]..3.000000 < darray[3]..4.000000 < darray[4]..5.000000 < darray[5]..6.000000 < sarray[0]..str0 < sarray[1]..str1 < sarray[2]..str2 < sarray[3]..str3 < sarray[4]..str4 < sarray[5]..str5 < sarray[6]..str6 < sarray[7]..str7 < sarray[8]..str8 < sarray[9]..str9 < sarray[0]..1 < sarray[1]..2 < sarray[2]..3 < sarray[3]..4 < null_str..null < abcnull < null < OK < OK < OK < OK < 日本語 < str[0]..26085 < str[1]..26412 < 本 < str[2]..35486 array class01 class02 class03 method cast classmain downcast instanceof super exception shapemain throws nullpointer array_ex else_ex test switch final do_while enum delegate rename ------------------vine: sh test.sh ------------------macosx: sh test.sh test 1,279c1 < hoge piyo < \nabc < abccde < 0x123..291 < 3 + 5..8 < 3 - 5..-2 < 3 + -5..-2 < 3 * 5..15 < 3 / 5..0 < 10 % 3..1 < 3.0 + 5.0..8.000000 < 3.0 - 5.0..-2.000000 < 3.0 + -5.0..-2.000000 < 3.0 * 5.0..15.000000 < 3.0 / 5.0..0.600000 < 10.0 % 3.0..1.000000 < 3 + 5.0..8.000000 < 3 - 5.0..-2.000000 < 3 + -5.0..-2.000000 < 3 * 5.0..15.000000 < 3 / 5.0..0.600000 < 10 % 3.0..1.000000 < 3.0 + 5..8.000000 < 3.0 - 5..-2.000000 < 3.0 + -5..-2.000000 < 3.0 * 5..15.000000 < 3.0 / 5..0.600000 < 10.0 % 3..1.000000 < 1 & 3..1 < 1 | 2..3 < 1 ^ 3..2 < ~5..-6 < 3 + 5..8 < 3 - 5..-2 < 3 + -5..-2 < 3 * 5..15 < 3 / 5..0 < 10 % 3..1 < 3.0 + 5.0..8.000000 < 3.0 - 5.0..-2.000000 < 3.0 + -5.0..-2.000000 < 3.0 * 5.0..15.000000 < 3.0 / 5.0..0.600000 < 10.0 % 3.0..1.000000 < 3 + 5.0..8.000000 < 3 - 5.0..-2.000000 < 3 + -5.0..-2.000000 < 3 * 5.0..15.000000 < 3 / 5.0..0.600000 < 10 % 3.0..1.000000 < 1 & 3..1 < 1 | 2..3 < 1 ^ 3..2 < ~5..-6 < 3.0 + 5..8.000000 < 3.0 - 5..-2.000000 < 3.0 + -5..-2.000000 < 3.0 * 5..15.000000 < 3.0 / 5..0.600000 < 10.0 % 3..1.000000 < 1 < 3..true < 3 < 1..false < 1 <= 3..true < 3 <= 1..false < 1 == 1..true < 1 == 3..false < 1 != 3..true < 3 != 3..false < 1 >= 3..false < 3 >= 1..true < 3 > 1..true < 1 > 3..false < 1.0 < 3..true < 3 < 1.0..false < 1.0 <= 3..true < 3 <= 1.0..false < 1.0 == 1.0..true < 1.0 == 3..false < 1 != 3.0..true < 3.0 != 3.0..false < 3.0 >= 1..true < 1 >= 3.0..false < 3.0 > 1..true < 1 > 3.0..false < 1 < 3..true < 3 < 1..false < 1 <= 3..true < 3 <= 1..false < 1 == 1..true < 1 == 3..false < 1 != 3..true < 3 != 3..false < 1 >= 3..false < 3 >= 1..true < 3 > 1..true < 1 > 3..false < 1.0 < 3..true < 3 < 1.0..false < 1.0 <= 3..true < 3 <= 1.0..false < 1.0 == 1.0..true < 1.0 == 3..false < 1.0 != 3..true < 3 >= 1.0..true < 1.0 >= 3.0..false < 3 > 1.0..true < 1.0 > 3..false < == good. < != good. < < good. < <= good. < <= good. < >= good. < >= good. < == good. < != good. < < good. < <= good. < <= good. < >= good. < >= good. < int_val..5 < int_val..3 < int_val..9 < int_val..3 < int_val..1 < double_val..5.000000 < double_val..3.000000 < double_val..9.000000 < double_val..3.000000 < double_val..1.000000 < str_val..strhoge3 < int_val..3 < double_val..0.000000 < a..3, b..4.000000 < no_arg < a + b..28 < a + b + c..10.000000 < boolean_func..true < int_func..3 < double_func..3.000000 < string_func..hoge < ********** recursive call ********** < a..10 a..9 a..8 a..7 a..6 a..5 a..4 a..3 a..2 a..1 a..0 < a..0 a..1 a..2 a..3 a..4 a..5 a..6 a..7 a..8 a..9 a..10 < boolean_value..true < !boolean_value..false < true < boolean_value || false < true == true good < true != false good < ! operator good. < true_value == true good < true_value != false good < ! operator good. < true < good < good < good < ********** while statement ********** < i..0 i..1 i..2 i..3 i..4 i..5 i..6 i..7 i..8 i..9 < i..0 i..1 i..2 i..3 i..4 i..5 i..6 < ********** for statement ********** < i..0 i..1 i..2 i..3 i..4 i..5 i..6 < i..0 i..1 i..2 i..3 i..4 i..5 i..6 i..7 i..8 i..9 < ********** break with label in while ********** < i..0, j..0 < i..0, j..1 < i..0, j..2 < i..0, j..3 < i..0, j..4 < i..0, j..5 < ********** break with label in for ********** < i..0, j..0 < i..0, j..1 < i..0, j..2 < i..0, j..3 < i..0, j..4 < i..0, j..5 < ********** continue in while ********** < i..5 i..6 i..7 i..8 i..9 i..10 < i..10 < ********** continue in for ********** < i..5 i..6 i..7 i..8 i..9 < i..10 < ********** continue with label in while ********** < i..1 j..0, i..2 j..0, i..3 j..0, < i..3 j..0 < ********** continue with label in for ********** < i..0 j..0, i..1 j..1, i..2 j..2, < i..3 j..3 < *** i..0*** < i == 0 < i != 3 < i != 2 && i != 3 < *** i..1*** < i == 1 < i != 3 < i != 2 && i != 3 < *** i..2*** < i == 2 < i != 3 < i == 2 || i == 3 < i == 2 && j == 3 < *** i..3*** < i == else < i == 2 || i == 3 < *** i..4*** < i == else < i != 3 < i != 2 && i != 3 < i..11 < ii = 10..10 < array[3][0]..10 < 1 2 3 4 5 6 7 8 9 < 2 4 6 8 10 12 14 16 18 < 3 6 9 12 15 18 21 24 27 < 4 8 12 16 20 24 28 32 36 < 5 10 15 20 25 30 35 40 45 < 6 12 18 24 30 36 42 48 54 < 7 14 21 28 35 42 49 56 63 < 8 16 24 32 40 48 56 64 72 < 9 18 27 36 45 54 63 72 81 < array2[0]..1 < array2[1]..2 < array2[2]..3 < array2[3]..4 < array2[4]..5 < 1 2 3 4 5 6 7 8 9 < 2 4 6 8 10 12 14 16 18 < 3 6 9 12 15 18 21 24 27 < 4 8 12 16 20 24 28 32 36 < 5 10 15 20 25 30 35 40 45 < 6 12 18 24 30 36 42 48 54 < 7 14 21 28 35 42 49 56 63 < 8 16 24 32 40 48 56 64 72 < 9 18 27 36 45 54 63 72 81 < darray[0]..0.000000 < darray[1]..1.000000 < darray[2]..2.000000 < darray[3]..3.000000 < darray[4]..4.000000 < darray[5]..5.000000 < darray[6]..6.000000 < darray[7]..7.000000 < darray[8]..8.000000 < darray[9]..9.000000 < darray[0]..1.000000 < darray[1]..2.000000 < darray[2]..3.000000 < darray[3]..4.000000 < darray[4]..5.000000 < darray[5]..6.000000 < sarray[0]..str0 < sarray[1]..str1 < sarray[2]..str2 < sarray[3]..str3 < sarray[4]..str4 < sarray[5]..str5 < sarray[6]..str6 < sarray[7]..str7 < sarray[8]..str8 < sarray[9]..str9 < sarray[0]..1 < sarray[1]..2 < sarray[2]..3 < sarray[3]..4 < null_str..null < abcnull < null < OK < OK < OK < OK < 日本語 < str[0]..26085 < str[1]..26412 < 本 < str[2]..35486 --- > test.dkm:726:文字リテラルが2文字以上あります。 array 6,7c6,7 < len..6 < substr..eほげほ --- > len..8 > substr..eほ&#65533; class01 class02 class03 method cast classmain downcast instanceof super exception shapemain throws nullpointer array_ex else_ex test switch final do_while enum delegate rename ------------------macosx: sh test.sh
[この投稿を含むスレッドを表示] [この投稿を削除]
[1186] Re:UTFをEUCへ:実行 Vine
投稿者:(ぱ)こと管理人
2009/01/02 02:42:57

情報ありがとうございます。 >Vine4.2 (EUC-jpな環境)において >(1) EUC-jp->tar zxvf->--------------コンパイル->sh test.sh->の結果 と >(2) UTF-8-->tar zxvf->EUC-jpへ変換->コンパイル->sh test.sh->の結果 は 現在の、EUC/UTF-8の配布パッケージは、プログラムは同じで単に文字コードが 違うだけですから、これが同じ結果になるのはわかります。 しかし、当方では、つよしさんのところと同じ現象は今のところ再現しません。 main/main.cの26行目あたりに setlocale(LC_CTYPE, ""); という行があるはずですが、これを、 setlocale(LC_ALL, "ja_JP.EUC-JP"); に変更し、再コンパイルするとどうなるでしょうか?
[この投稿を含むスレッドを表示] [この投稿を削除]
[1185] Re:UTFをEUCへ:実行 Vine
投稿者:つよし
2009/01/01 20:50:27

試したことを書きます。 Vine4.2 (EUC-jpな環境)において (1) EUC-jp->tar zxvf->--------------コンパイル->sh test.sh->の結果 と (2) UTF-8-->tar zxvf->EUC-jpへ変換->コンパイル->sh test.sh->の結果 は 1行目のエラーメッセージだけ、一部違いました。 < test.sh: line 1: 17811 セグメンテーション違反です ../diksam test.dkm >test_.result 2>&1 --- > test.sh: line 1: 17754 セグメンテーション違反です ../diksam test.dkm >test_.result 2>&1
[この投稿を含むスレッドを表示] [この投稿を削除]
[1184] UTFをEUCへ:実行 Mac
投稿者:つよし
2009/01/01 20:36:55

前橋さん 試したことを書きます。 MacOSX10.3.9(EUC-jpな環境)において (1) EUC-jp->tar zxvf->--------------コンパイル->sh test.sh->の結果 と (2) UTF-8-->tar zxvf->EUC-jpへ変換->コンパイル->sh test.sh->の結果 は   100% 一致しました。 文字コードは、すべて EUC-jp で実行?しました。 diksam うまくコンパイルできていないのか?
[この投稿を含むスレッドを表示] [この投稿を削除]
[1183] Re:EUC環境 Mac Vine
投稿者:(ぱ)こと管理人
2009/01/01 17:51:37

>vine4.2 >test.sh: line 1: 3405 セグメンテーション違反です ../diksam test.dkm こちらは単に死んでしまっているので、ちょっとわからないですが、 >MacOSX10.3.9 >> test.dkm:726:文字リテラルが2文字以上あります。 >array >6,7c6,7 >< len..6 >< substr..eほげほ >--- >> len..8 >> substr..eほ&#65533; こちらを見ると、 ・test.dkmの726行目の'本'という文字リテラルについて、ワイド文字に変換したら  2文字以上と解釈された。 ・array.dkmの46行目の「"hogeほげ".length()」が6を返している。  また、47行目の「"hogeほげほげ".substr(3, 4)」が「eほ&#65533;」を返している。 ということがわかります。マルチバイト文字列の変換に関する問題のようです。 確認ですが、test.dkmやarray.dkmの文字コードは何になっていますか? EUCモードで実行する際は、.dkmファイルもEUCでなければなりません。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1182] EUC環境 Mac Vine
投稿者:つよし
2009/01/01 16:23:16

EUCな環境 MacOSX10.3.9 と vine4.2 での $ sh test.sh の結果です。 長いです。 -------------------------------------- vine4.2 test.sh: line 1: 3405 セグメンテーション違反です ../diksam test.dkm >test_.result 2>&1 test 1,279d0 < hoge piyo < \nabc < abccde < 0x123..291 < 3 + 5..8 < 3 - 5..-2 < 3 + -5..-2 < 3 * 5..15 < 3 / 5..0 < 10 % 3..1 < 3.0 + 5.0..8.000000 < 3.0 - 5.0..-2.000000 < 3.0 + -5.0..-2.000000 < 3.0 * 5.0..15.000000 < 3.0 / 5.0..0.600000 < 10.0 % 3.0..1.000000 < 3 + 5.0..8.000000 < 3 - 5.0..-2.000000 < 3 + -5.0..-2.000000 < 3 * 5.0..15.000000 < 3 / 5.0..0.600000 < 10 % 3.0..1.000000 < 3.0 + 5..8.000000 < 3.0 - 5..-2.000000 < 3.0 + -5..-2.000000 < 3.0 * 5..15.000000 < 3.0 / 5..0.600000 < 10.0 % 3..1.000000 < 1 & 3..1 < 1 | 2..3 < 1 ^ 3..2 < ~5..-6 < 3 + 5..8 < 3 - 5..-2 < 3 + -5..-2 < 3 * 5..15 < 3 / 5..0 < 10 % 3..1 < 3.0 + 5.0..8.000000 < 3.0 - 5.0..-2.000000 < 3.0 + -5.0..-2.000000 < 3.0 * 5.0..15.000000 < 3.0 / 5.0..0.600000 < 10.0 % 3.0..1.000000 < 3 + 5.0..8.000000 < 3 - 5.0..-2.000000 < 3 + -5.0..-2.000000 < 3 * 5.0..15.000000 < 3 / 5.0..0.600000 < 10 % 3.0..1.000000 < 1 & 3..1 < 1 | 2..3 < 1 ^ 3..2 < ~5..-6 < 3.0 + 5..8.000000 < 3.0 - 5..-2.000000 < 3.0 + -5..-2.000000 < 3.0 * 5..15.000000 < 3.0 / 5..0.600000 < 10.0 % 3..1.000000 < 1 < 3..true < 3 < 1..false < 1 <= 3..true < 3 <= 1..false < 1 == 1..true < 1 == 3..false < 1 != 3..true < 3 != 3..false < 1 >= 3..false < 3 >= 1..true < 3 > 1..true < 1 > 3..false < 1.0 < 3..true < 3 < 1.0..false < 1.0 <= 3..true < 3 <= 1.0..false < 1.0 == 1.0..true < 1.0 == 3..false < 1 != 3.0..true < 3.0 != 3.0..false < 3.0 >= 1..true < 1 >= 3.0..false < 3.0 > 1..true < 1 > 3.0..false < 1 < 3..true < 3 < 1..false < 1 <= 3..true < 3 <= 1..false < 1 == 1..true < 1 == 3..false < 1 != 3..true < 3 != 3..false < 1 >= 3..false < 3 >= 1..true < 3 > 1..true < 1 > 3..false < 1.0 < 3..true < 3 < 1.0..false < 1.0 <= 3..true < 3 <= 1.0..false < 1.0 == 1.0..true < 1.0 == 3..false < 1.0 != 3..true < 3 >= 1.0..true < 1.0 >= 3.0..false < 3 > 1.0..true < 1.0 > 3..false < == good. < != good. < < good. < <= good. < <= good. < >= good. < >= good. < == good. < != good. < < good. < <= good. < <= good. < >= good. < >= good. < int_val..5 < int_val..3 < int_val..9 < int_val..3 < int_val..1 < double_val..5.000000 < double_val..3.000000 < double_val..9.000000 < double_val..3.000000 < double_val..1.000000 < str_val..strhoge3 < int_val..3 < double_val..0.000000 < a..3, b..4.000000 < no_arg < a + b..28 < a + b + c..10.000000 < boolean_func..true < int_func..3 < double_func..3.000000 < string_func..hoge < ********** recursive call ********** < a..10 a..9 a..8 a..7 a..6 a..5 a..4 a..3 a..2 a..1 a..0 < a..0 a..1 a..2 a..3 a..4 a..5 a..6 a..7 a..8 a..9 a..10 < boolean_value..true < !boolean_value..false < true < boolean_value || false < true == true good < true != false good < ! operator good. < true_value == true good < true_value != false good < ! operator good. < true < good < good < good < ********** while statement ********** < i..0 i..1 i..2 i..3 i..4 i..5 i..6 i..7 i..8 i..9 < i..0 i..1 i..2 i..3 i..4 i..5 i..6 < ********** for statement ********** < i..0 i..1 i..2 i..3 i..4 i..5 i..6 < i..0 i..1 i..2 i..3 i..4 i..5 i..6 i..7 i..8 i..9 < ********** break with label in while ********** < i..0, j..0 < i..0, j..1 < i..0, j..2 < i..0, j..3 < i..0, j..4 < i..0, j..5 < ********** break with label in for ********** < i..0, j..0 < i..0, j..1 < i..0, j..2 < i..0, j..3 < i..0, j..4 < i..0, j..5 < ********** continue in while ********** < i..5 i..6 i..7 i..8 i..9 i..10 < i..10 < ********** continue in for ********** < i..5 i..6 i..7 i..8 i..9 < i..10 < ********** continue with label in while ********** < i..1 j..0, i..2 j..0, i..3 j..0, < i..3 j..0 < ********** continue with label in for ********** < i..0 j..0, i..1 j..1, i..2 j..2, < i..3 j..3 < *** i..0*** < i == 0 < i != 3 < i != 2 && i != 3 < *** i..1*** < i == 1 < i != 3 < i != 2 && i != 3 < *** i..2*** < i == 2 < i != 3 < i == 2 || i == 3 < i == 2 && j == 3 < *** i..3*** < i == else < i == 2 || i == 3 < *** i..4*** < i == else < i != 3 < i != 2 && i != 3 < i..11 < ii = 10..10 < array[3][0]..10 < 1 2 3 4 5 6 7 8 9 < 2 4 6 8 10 12 14 16 18 < 3 6 9 12 15 18 21 24 27 < 4 8 12 16 20 24 28 32 36 < 5 10 15 20 25 30 35 40 45 < 6 12 18 24 30 36 42 48 54 < 7 14 21 28 35 42 49 56 63 < 8 16 24 32 40 48 56 64 72 < 9 18 27 36 45 54 63 72 81 < array2[0]..1 < array2[1]..2 < array2[2]..3 < array2[3]..4 < array2[4]..5 < 1 2 3 4 5 6 7 8 9 < 2 4 6 8 10 12 14 16 18 < 3 6 9 12 15 18 21 24 27 < 4 8 12 16 20 24 28 32 36 < 5 10 15 20 25 30 35 40 45 < 6 12 18 24 30 36 42 48 54 < 7 14 21 28 35 42 49 56 63 < 8 16 24 32 40 48 56 64 72 < 9 18 27 36 45 54 63 72 81 < darray[0]..0.000000 < darray[1]..1.000000 < darray[2]..2.000000 < darray[3]..3.000000 < darray[4]..4.000000 < darray[5]..5.000000 < darray[6]..6.000000 < darray[7]..7.000000 < darray[8]..8.000000 < darray[9]..9.000000 < darray[0]..1.000000 < darray[1]..2.000000 < darray[2]..3.000000 < darray[3]..4.000000 < darray[4]..5.000000 < darray[5]..6.000000 < sarray[0]..str0 < sarray[1]..str1 < sarray[2]..str2 < sarray[3]..str3 < sarray[4]..str4 < sarray[5]..str5 < sarray[6]..str6 < sarray[7]..str7 < sarray[8]..str8 < sarray[9]..str9 < sarray[0]..1 < sarray[1]..2 < sarray[2]..3 < sarray[3]..4 < null_str..null < abcnull < null < OK < OK < OK < OK < 日本語 < str[0]..26085 < str[1]..26412 < 本 < str[2]..35486 array class01 class02 class03 method cast classmain downcast instanceof super exception shapemain throws nullpointer array_ex else_ex test switch final do_while enum delegate rename -------------------------------------- MacOSX10.3.9 test 1,279c1 < hoge piyo < \nabc < abccde < 0x123..291 < 3 + 5..8 < 3 - 5..-2 < 3 + -5..-2 < 3 * 5..15 < 3 / 5..0 < 10 % 3..1 < 3.0 + 5.0..8.000000 < 3.0 - 5.0..-2.000000 < 3.0 + -5.0..-2.000000 < 3.0 * 5.0..15.000000 < 3.0 / 5.0..0.600000 < 10.0 % 3.0..1.000000 < 3 + 5.0..8.000000 < 3 - 5.0..-2.000000 < 3 + -5.0..-2.000000 < 3 * 5.0..15.000000 < 3 / 5.0..0.600000 < 10 % 3.0..1.000000 < 3.0 + 5..8.000000 < 3.0 - 5..-2.000000 < 3.0 + -5..-2.000000 < 3.0 * 5..15.000000 < 3.0 / 5..0.600000 < 10.0 % 3..1.000000 < 1 & 3..1 < 1 | 2..3 < 1 ^ 3..2 < ~5..-6 < 3 + 5..8 < 3 - 5..-2 < 3 + -5..-2 < 3 * 5..15 < 3 / 5..0 < 10 % 3..1 < 3.0 + 5.0..8.000000 < 3.0 - 5.0..-2.000000 < 3.0 + -5.0..-2.000000 < 3.0 * 5.0..15.000000 < 3.0 / 5.0..0.600000 < 10.0 % 3.0..1.000000 < 3 + 5.0..8.000000 < 3 - 5.0..-2.000000 < 3 + -5.0..-2.000000 < 3 * 5.0..15.000000 < 3 / 5.0..0.600000 < 10 % 3.0..1.000000 < 1 & 3..1 < 1 | 2..3 < 1 ^ 3..2 < ~5..-6 < 3.0 + 5..8.000000 < 3.0 - 5..-2.000000 < 3.0 + -5..-2.000000 < 3.0 * 5..15.000000 < 3.0 / 5..0.600000 < 10.0 % 3..1.000000 < 1 < 3..true < 3 < 1..false < 1 <= 3..true < 3 <= 1..false < 1 == 1..true < 1 == 3..false < 1 != 3..true < 3 != 3..false < 1 >= 3..false < 3 >= 1..true < 3 > 1..true < 1 > 3..false < 1.0 < 3..true < 3 < 1.0..false < 1.0 <= 3..true < 3 <= 1.0..false < 1.0 == 1.0..true < 1.0 == 3..false < 1 != 3.0..true < 3.0 != 3.0..false < 3.0 >= 1..true < 1 >= 3.0..false < 3.0 > 1..true < 1 > 3.0..false < 1 < 3..true < 3 < 1..false < 1 <= 3..true < 3 <= 1..false < 1 == 1..true < 1 == 3..false < 1 != 3..true < 3 != 3..false < 1 >= 3..false < 3 >= 1..true < 3 > 1..true < 1 > 3..false < 1.0 < 3..true < 3 < 1.0..false < 1.0 <= 3..true < 3 <= 1.0..false < 1.0 == 1.0..true < 1.0 == 3..false < 1.0 != 3..true < 3 >= 1.0..true < 1.0 >= 3.0..false < 3 > 1.0..true < 1.0 > 3..false < == good. < != good. < < good. < <= good. < <= good. < >= good. < >= good. < == good. < != good. < < good. < <= good. < <= good. < >= good. < >= good. < int_val..5 < int_val..3 < int_val..9 < int_val..3 < int_val..1 < double_val..5.000000 < double_val..3.000000 < double_val..9.000000 < double_val..3.000000 < double_val..1.000000 < str_val..strhoge3 < int_val..3 < double_val..0.000000 < a..3, b..4.000000 < no_arg < a + b..28 < a + b + c..10.000000 < boolean_func..true < int_func..3 < double_func..3.000000 < string_func..hoge < ********** recursive call ********** < a..10 a..9 a..8 a..7 a..6 a..5 a..4 a..3 a..2 a..1 a..0 < a..0 a..1 a..2 a..3 a..4 a..5 a..6 a..7 a..8 a..9 a..10 < boolean_value..true < !boolean_value..false < true < boolean_value || false < true == true good < true != false good < ! operator good. < true_value == true good < true_value != false good < ! operator good. < true < good < good < good < ********** while statement ********** < i..0 i..1 i..2 i..3 i..4 i..5 i..6 i..7 i..8 i..9 < i..0 i..1 i..2 i..3 i..4 i..5 i..6 < ********** for statement ********** < i..0 i..1 i..2 i..3 i..4 i..5 i..6 < i..0 i..1 i..2 i..3 i..4 i..5 i..6 i..7 i..8 i..9 < ********** break with label in while ********** < i..0, j..0 < i..0, j..1 < i..0, j..2 < i..0, j..3 < i..0, j..4 < i..0, j..5 < ********** break with label in for ********** < i..0, j..0 < i..0, j..1 < i..0, j..2 < i..0, j..3 < i..0, j..4 < i..0, j..5 < ********** continue in while ********** < i..5 i..6 i..7 i..8 i..9 i..10 < i..10 < ********** continue in for ********** < i..5 i..6 i..7 i..8 i..9 < i..10 < ********** continue with label in while ********** < i..1 j..0, i..2 j..0, i..3 j..0, < i..3 j..0 < ********** continue with label in for ********** < i..0 j..0, i..1 j..1, i..2 j..2, < i..3 j..3 < *** i..0*** < i == 0 < i != 3 < i != 2 && i != 3 < *** i..1*** < i == 1 < i != 3 < i != 2 && i != 3 < *** i..2*** < i == 2 < i != 3 < i == 2 || i == 3 < i == 2 && j == 3 < *** i..3*** < i == else < i == 2 || i == 3 < *** i..4*** < i == else < i != 3 < i != 2 && i != 3 < i..11 < ii = 10..10 < array[3][0]..10 < 1 2 3 4 5 6 7 8 9 < 2 4 6 8 10 12 14 16 18 < 3 6 9 12 15 18 21 24 27 < 4 8 12 16 20 24 28 32 36 < 5 10 15 20 25 30 35 40 45 < 6 12 18 24 30 36 42 48 54 < 7 14 21 28 35 42 49 56 63 < 8 16 24 32 40 48 56 64 72 < 9 18 27 36 45 54 63 72 81 < array2[0]..1 < array2[1]..2 < array2[2]..3 < array2[3]..4 < array2[4]..5 < 1 2 3 4 5 6 7 8 9 < 2 4 6 8 10 12 14 16 18 < 3 6 9 12 15 18 21 24 27 < 4 8 12 16 20 24 28 32 36 < 5 10 15 20 25 30 35 40 45 < 6 12 18 24 30 36 42 48 54 < 7 14 21 28 35 42 49 56 63 < 8 16 24 32 40 48 56 64 72 < 9 18 27 36 45 54 63 72 81 < darray[0]..0.000000 < darray[1]..1.000000 < darray[2]..2.000000 < darray[3]..3.000000 < darray[4]..4.000000 < darray[5]..5.000000 < darray[6]..6.000000 < darray[7]..7.000000 < darray[8]..8.000000 < darray[9]..9.000000 < darray[0]..1.000000 < darray[1]..2.000000 < darray[2]..3.000000 < darray[3]..4.000000 < darray[4]..5.000000 < darray[5]..6.000000 < sarray[0]..str0 < sarray[1]..str1 < sarray[2]..str2 < sarray[3]..str3 < sarray[4]..str4 < sarray[5]..str5 < sarray[6]..str6 < sarray[7]..str7 < sarray[8]..str8 < sarray[9]..str9 < sarray[0]..1 < sarray[1]..2 < sarray[2]..3 < sarray[3]..4 < null_str..null < abcnull < null < OK < OK < OK < OK < 日本語 < str[0]..26085 < str[1]..26412 < 本 < str[2]..35486 --- > test.dkm:726:文字リテラルが2文字以上あります。 array 6,7c6,7 < len..6 < substr..eほげほ --- > len..8 > substr..eほ&#65533; class01 class02 class03 method cast classmain downcast instanceof super exception shapemain throws nullpointer array_ex else_ex test switch final do_while enum delegate rename --------------------------------------
[この投稿を含むスレッドを表示] [この投稿を削除]
[1181] Re:あけましておめでとうございます!
投稿者:(ぱ)こと管理人
2009/01/01 13:08:26

>EUC な環境をにわかに準備して test.sh を実行しました。 ... >diff が差分を吐き出します。 まず、[1178]につよしさんが貼ってくださった実行結果は、正常に動いています。 UTF-8版は正しく動いたが、EUC版は正しく動かなかった、ということでしょうか? うちではUTF-8版もEUC版も、test.shは流して正常動作を確認しています。 つよしさんのところで動かなかったのだとしたら、そのdiffが吐いた差分を 貼っていただかないと何がおきているのかわからないです。さすがに。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1180] あけましておめでとうございます
投稿者:(ぱ)こと管理人
2009/01/01 13:04:37

あけましておめでとうございます。 今年もよろしくお願いいたします。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1179] あけましておめでとうございます!
投稿者:つよし
2009/01/01 00:53:29

前橋さん 2009年 平成21年 1月 1日 元日 さっそく仕事始めです=嘘です。 EUC な環境をにわかに準備して test.sh を実行しました。 実は、 このパソコンは、メモリテストでエラーが出ますがVine4.2をインストールできました。 なぜかエラーは出ません。見かけはだいじょうぶ? このようなパソコンで test.sh を実行するのは、正常な精神ではありませんが、、笑い。 diff が差分を吐き出します。 前橋さん 追試をお願いします。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1178] Re:Linuxコンパイルエラー
投稿者:つよし
2008/12/31 23:14:34

前橋さん 今年もあとわずか!!来年も発展を願います!! アップ試しました。 気持ちよく実行できました。 ありがとうございます。 $ sh test.sh test array class01 class02 class03 method cast classmain downcast instanceof super exception shapemain throws nullpointer array_ex else_ex test switch final do_while enum delegate rename $ ># いまどきEUCは時代錯誤か…… 確かに。 > 個人的には、EUCな環境の方を使っていた時間が長いですが!!
[この投稿を含むスレッドを表示] [この投稿を削除]
[1177] Re:Linuxコンパイルエラー
投稿者:(ぱ)こと管理人
2008/12/31 02:25:31

>というわけで、あわせて修正した版をもうじきUPします。 UPしました。 私のところではこれで動いています。 test.dkm以外のサンプルプログラムは、テスト用シェルスクリプトtest.shを使って、 % sh ./test.sh のようにすればまとめて実行できます。これで、test以下の.dkmのファイル名から 拡張子を除いたものの名前だけがずらずらと出れば成功、diffが相違を検出したら なにか問題が起きてます。 なにかあれば教えてください。 いろいろと報告ありがとうございました > つよしさん # いまどきEUCは時代錯誤か…… 確かに。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1176] Re:Linuxコンパイルエラー
投稿者:(ぱ)こと管理人
2008/12/31 01:45:36

>$ cd test/ >$ echo $LANG >ja_JP.UTF-8 >$ find . -type f -exec nkf -w --overwrite {} \; すみません、見落としていましたが(前回の投稿のコマンドプロンプトのところに 形跡がありました…)、この変換はmain/test以下でやっていたのですね。 Diksamは、エラーメッセージを日本語で出します(これはこれでどうかという 人もいそうですが)。また、そのエラーメッセージは、compilerとdvm以下の error_message.cに埋め込まれています。 現在ダウンロードできるDiksamのソースでは、error_message.cの文字コードが EUCになっています。以下のエラーは、これをDiksamの内部文字コード(wchar_t)に 変換しようとして失敗しているために発生しています。 >$ ../diksam test.dkm >Assertion failure (wc_format != NULL) file..error.c line..92 >wc_format is null. よって、LANGがja_JP.UTF-8な環境で動かすには、コンパイル前に、 error_message.cをUTF-8に変換しなければなりません。 それだけで動くかと思って試してみたところ、share/wchar.cの中に 1文字分のマルチバイト文字列が2文字までであることを想定しているところが あって、UTF-8だと1文字が3バイトになるのでそこでもエラーが出ました。 というわけで、あわせて修正した版をもうじきUPします。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1175] Re:Linuxコンパイルエラー
投稿者:つよし
2008/12/30 23:58:09

前橋さん こんばんは 初心者なので最初からやり直しました。 端末のコピーアンドペースとです。 ここから $ tar zxvf diksam_0_4_01_unix.tgz $ cd diksam_unix/main/ $ make <省略> cc ../compiler/compiler.o ../compiler/builtin/builtin.o ../dvm/dvm.o ../share/share.o ../memory/mem.o ../debug/dbg.o ./main.o -o diksam -lm $ cd test/ $ echo $LANG ja_JP.UTF-8 $ find . -type f -exec nkf -w --overwrite {} \; $ ../diksam test.dkm 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. アボートしました $ ここまで。。。 一つ前の前橋さんの書き込みすべて理解できていません。 僕にできるのは、こんな感じです。いじょう~ debian lenny
[この投稿を含むスレッドを表示] [この投稿を削除]
[1174] Re:Linuxコンパイルエラー
投稿者:(ぱ)こと管理人
2008/12/30 22:47:03

>utf-8 なコードを diksam は受け付けない >ということですか?! >utf な環境は、多いです!! Diksamを作り始めた頃は、まだUTF-8が主流ではなかった、ような気がしているの ですが(私が遅れていただけかもしれません)、最近は確かにUTF-8な環境がかなり 多くなっていますね。 >@~/Desktop/diksam_unix/main/test$ find . -exec nkf -w -overwrite {} \; >で utf-8 に変換し実行するとエラーになります。 ところでこれですが、この時、$LANGは何になっていたでしょうか? >Assertion failure (wc_format != NULL) file..error.c line..92 >wc_format is null. これを見る限り、error_message.c内の日本語文字列(UTF-8に変換されている)を ワイド文字列に変換しようとして失敗しているようです。 Diksamは、現在のデフォルトエンコーディングでマルチバイト文字列をワイド文字列に 変換しようとします(main.cに「setlocale(LC_CTYPE, "");」と書いてあります)。 よって、現在の$LANGがja_JP.EUC-JP等になっていれば、正しく変換できません。 >utf-8 なコードを diksam は受け付けない >ということですか?! で、この件ですが、ソースを確認してみたところ、error_message.cをUTF-8に 変換してコンパイルされており、環境も正しくUTF-8になっていれば、UTF-8を 受け付けるのではないかと思います(まだ試せていません)。 先の投稿でUTF-8に未対応、ということを書きましたが、本来、普通に8bitを 通しさえすれば、UTF-8は文字列リテラル等に問題なく使えるはずです(UTF-8という のはそういうことを意図したエンコーディングです)。にも関わらず、crowbarで UTF-8対応がわざわざ必要になったのは、Shift-JIS対応のため特定のバイトの次の バイトを特別扱いする、という対応をしているためで、Diksamをよく見てみたら、 そもそもShift-JISの対応が入っていませんでした… というわけで、現在のWindows版のDiksamは、ソースがShift-JISであることを 期待しているにもかかわらず、「表」等の文字を文字列リテラルに入れると エラーになります(いわゆる0x5C問題)。Diksam on Windowsとか言っときながらこれは さすがにまずいので、早急に対応します。 >他 少し試しましたが セグメンテーションエラーとか いろいろ、、、 さすがの私もtest.shくらいは流してから出してますので、testディレクトリ以下の ものが動かないなら、何らかの環境に依存する問題かと思います。 できれば詳細を教えてください。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1173] ./test/*
投稿者:つよし
2008/12/30 22:20:22

前橋さん >$ ../diksam rand.dkm は、実行確認できました。 >他 少し試しましたが セグメンテーションエラーとか いろいろ、、、 他、いくつか実行出来ました。 エラーが出るのは、引数とか?与えないといけないのかな? $ ../diksam mathtest.dkm ok!! $ ../diksam downcast.dkm ok!! etc...
[この投稿を含むスレッドを表示] [この投稿を削除]
[1172] Re:Linuxコンパイルエラー
投稿者:つよし
2008/12/30 21:59:16

前橋さん ありがとうございます。 @~/Desktop/diksam_unix/main/test$ find . -exec nkf -w -overwrite {} \; で utf-8 に変換し実行するとエラーになります。 @~/Desktop/diksam_unix/main/test$ ../diksam test.dkm 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. アボートしました @~/Desktop/diksam_unix/main/test$ そもそも utf-8 なコードを diksam は受け付けない ということですか?! utf な環境は、多いです!! $ ../diksam rand.dkm は、実行確認できました。 他 少し試しましたが セグメンテーションエラーとか いろいろ、、、
[この投稿を含むスレッドを表示] [この投稿を削除]
[1171] Re:Linuxコンパイルエラー
投稿者:(ぱ)こと管理人
2008/12/30 21:22:01

>../diksam test.dkm > >と実行してみるのはどうでしょうか。 追記ですが、 このtest.dkmは日本語を含みますが、文字コードはEUCです。 現時点のLinux版diksamはEUCのソースしか受け付けないので、UTF-8な環境では 環境の設定を変えるか日本語部分を削ったほうがよいかもしれません。 # crowbarの最新版(未公開)ではUTF-8にも対応しているので、 # 同じ修正をDiksamにも入れようと思いつつ忘れてました…
[この投稿を含むスレッドを表示] [この投稿を削除]
[1170] Re:Linuxコンパイルエラー
投稿者:(ぱ)こと管理人
2008/12/30 15:25:44

>diksam がうまく動くか 試したいのですが? mainディレクトリの下にtestディレクトリがあります。 その下で ../diksam test.dkm と実行してみるのはどうでしょうか。 同じディレクトリにあるシェルスクリプト「test.sh」は、そこにある テストスクリプトを一括実行し、正しい結果とdiffを取ります。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1169] Re:Linuxコンパイルエラー
投稿者:つよし
2008/12/30 15:21:44

前橋さん ありがとうございます。 $ sudo aptitude install bison $ sudo aptitude install flex $ pwd /home/tntn/Desktop/diksam_unix/main $ make 以上で diksam を作成できました。 diksam がうまく動くか 試したいのですが?
[この投稿を含むスレッドを表示] [この投稿を削除]
[1168] Re:Linuxコンパイルエラー
投稿者:(ぱ)こと管理人
2008/12/30 13:31:04

つよしさん、はじめまして。 >debian lenny でコンパイルエラーになります。 >何が足りないのでしょうか? >gcc は、4.3 ヴァージョンをインストールしました。 >$ make … >make[1]: yacc: コマンドが見つかりませんでした 見てのとおり、yaccが入っていません。 Debianなら、bisonをパッケージインストールすれば、シンボリックリンクを 勝手に作って、「yacc」で実行できるようになったような気がします。 gccやyaccが標準で入っていない環境なら、おそらくlexも入っていないでしょうから、 flexも入れる必要がありそうです。 もし、bisonやflexは入れたけれど「yacc」や「lex」としては実行できない、 ということなら、compilerディレクトリ以下のMakefileを修正し、 yacc -dv diksam.y となっているところ(2箇所)を、 bison --yacc -dv diksam.y に、 lex diksam.l となっているところを flex diksam.l にしてください。 それはそれとして、 >(Linux版では、Uフォーは、ダメですか?:入門者) 残念ながらダメです……
[この投稿を含むスレッドを表示] [この投稿を削除]
[1167] Linuxコンパイルエラー
投稿者:つよし
2008/12/30 01:33:32

前橋さま debian lenny でコンパイルエラーになります。 何が足りないのでしょうか? gcc は、4.3 ヴァージョンをインストールしました。 (Linux版では、Uフォーは、ダメですか?:入門者) $ make cd ../compiler; make; make[1]: ディレクトリ `/home/tntn/Desktop/diksam_unix/compiler' に入ります yacc -dv diksam.y make[1]: yacc: コマンドが見つかりませんでした make[1]: *** [y.tab.h] エラー 127 make[1]: ディレクトリ `/home/tntn/Desktop/diksam_unix/compiler' から出ます make: *** [../compiler/compiler.o] エラー 2 $
[この投稿を含むスレッドを表示] [この投稿を削除]
[1166] Diksam on Windows
投稿者:つよし
2008/12/30 01:21:04

前橋さま ウィンドウズ版Diksamの公開おめでとうございます。 Uフォーの絵 見ました。それが動いたりするのですか?すごい!! Linuxから書き込んでいますが、Linuxでは、Uフォーは出来ないのかな?
[この投稿を含むスレッドを表示] [この投稿を削除]
[1164] Re:前橋言語:on MacOSX
投稿者:(ぱ)こと管理人
2008/11/12 02:00:49

こんにちは。 >前橋言語の作例は、ありませんか? すみません、今のところサンプルプログラムとしては配布ディレクトリの compiler/test以下にあるものぐらいしかないです。 >パズルとか電卓とか? >前橋さんの電卓ネタを前橋言語で書き換えるとか? Diksam用のyaccはないので、再帰下降パーサを手書きすれば電卓ぐらいは 作れそうではありますが、文字列処理の手段がsubstr()しかなくて、 もちろんそれでもできますけれど効率が悪いので、"abc"[2]で'c'が取れるように したりとか、当然同時に文字リテラルも必要になって、とか、 いずれにしてもライブラリがこれではたいした物は作れないのでライブラリを 補強して、とか、やりたいことはいくつもありますし実現も難しくないのですが、 何をするにも時間が不足しております。 ライブラリの方は現在追加してまして、近々、何かしらちょっとは楽しいプログラムが 作れるようにしようとは思っているのですが。 すみません、Macユーザのたろうさんには大変申し訳ないのですが、今度追加される ライブラリ部分は当面Windows専用になります…
[この投稿を含むスレッドを表示] [この投稿を削除]
[1163] Re:前橋言語:on MacOSX
投稿者:たろう
2008/11/11 15:40:20

管理人(前橋)さま 前橋言語の作例は、ありませんか? パズルとか電卓とか? 前橋さんの電卓ネタを前橋言語で書き換えるとか?
[この投稿を含むスレッドを表示] [この投稿を削除]
[1162] Re:前橋言語:on MacOSX
投稿者:(ぱ)こと管理人
2008/11/08 13:23:28

>>$(CC) $(CFLAGS) -o $@ -I../../include builtin_conv.c $(CONV_OBJS) >> ↑ >> >>としてやればうまくいくのではないでしょうか。 > >前橋さん >コンパイル通りました。 情報ありがとうございます。次回リリースからは、Makefileを修正しておきます。 Macでも動いたということで、嬉しいです。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1161] Re:前橋言語:再帰
投稿者:たろう
2008/11/08 02:24:05

再帰も出来ますね!あたりまえ? 何か使えそうな気配です!! $ vi saiki int fact(int n) { if (n==0) { return 1; } else { return n*fact(n-1); } } println(fact(3)); println(fact(4)); println(fact(5)); println(fact(10)); $ diksam saiki 6 24 120 3628800 $
[この投稿を含むスレッドを表示] [この投稿を削除]
[1160] Re:前橋言語:on MacOSX
投稿者:たろう
2008/11/08 01:21:37

> >ここでこういうエラーが出ているということは、diksamの展開ディレクトリ以下の、 >compiler/builtinディレクトリのMakefileの20行目の > >$(CC) $(CFLAGS) -o$@ -I../../include builtin_conv.c $(CONV_OBJS) > >の「-o$@」の「-o」と「$@」の間に空白を入れ、 > >$(CC) $(CFLAGS) -o $@ -I../../include builtin_conv.c $(CONV_OBJS) > ↑ > >としてやればうまくいくのではないでしょうか。 前橋さん コンパイル通りました。 感謝、感激です。 ありがとうございます。 試してみました。 スキル不足でこんなのでいい? ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ $ vi ppp.dk println("hello, たろう."); int s = 0; int i; for (i=1; i<=10; i=i+1) { s += i; print(i); println(" たろう"); } $ diksam ppp.dk hello, たろう. 1 たろう 2 たろう 3 たろう 4 たろう 5 たろう 6 たろう 7 たろう 8 たろう 9 たろう 10 たろう $ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 以上。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1159] Re:前橋言語:on MacOSX
投稿者:(ぱ)こと管理人
2008/11/08 00:41:46

こんにちは。 > マックosx で、コンパイルしたいのですが可能ですか? >powerpc g3 インテルマックでは、ありません。 (略) >ld: unknown flag: -obuiltin_conv MacOS XのCコンパイラがどんなコンパイラなのか私は知らないのですが、 「-obuiltin_conv」というオプションはないよ、というエラーを出しています。 ここは、「-o」というフラグで実行形式の名前を指定しているところで、 私の知っているたいていのコンパイラでは、-oの後ろに空白を入れても入れなくても OKでした。 ここでこういうエラーが出ているということは、diksamの展開ディレクトリ以下の、 compiler/builtinディレクトリのMakefileの20行目の $(CC) $(CFLAGS) -o$@ -I../../include builtin_conv.c $(CONV_OBJS) の「-o$@」の「-o」と「$@」の間に空白を入れ、 $(CC) $(CFLAGS) -o $@ -I../../include builtin_conv.c $(CONV_OBJS) ↑ としてやればうまくいくのではないでしょうか。 確証はありませんが >ld -r -o mem.o memory.o storage.o このへんでは-oオプションがちゃんと効いているところからすると可能性は 高いと思います。 実際に試してくださった方がいらっしゃると励みになります。ありがとうございました。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1158] 前橋言語:on MacOSX
投稿者:たろう
2008/11/07 20:04:47

diksam_0_4_unix.tgz 前橋さま  マックosx で、コンパイルしたいのですが可能ですか? powerpc g3 インテルマックでは、ありません。 makeの実行画面を示します。 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ $ tar zxf diksam_0_4_unix.tgz $ ls diksam_0_4_unix.tgz diksam_unix/ $ cd diksam_unix/compiler/ $ make yacc -dv diksam.y lex diksam.l cc -c -g lex.yy.c -I/usr/local/include -I../include cc -c -g y.tab.c -I/usr/local/include -I../include cc -c -g -Wall -ansi -Wswitch-enum -DDEBUG main.c -I/usr/local/include -I../include cc -c -g -Wall -ansi -Wswitch-enum -DDEBUG interface.c -I/usr/local/include -I../include cc -c -g -Wall -ansi -Wswitch-enum -DDEBUG create.c -I/usr/local/include -I../include cc -c -g -Wall -ansi -Wswitch-enum -DDEBUG fix_tree.c -I/usr/local/include -I../include cc -c -g -Wall -ansi -Wswitch-enum -DDEBUG generate.c -I/usr/local/include -I../include cc -c -g -Wall -ansi -Wswitch-enum -DDEBUG string.c -I/usr/local/include -I../include cc -c -g -Wall -ansi -Wswitch-enum -DDEBUG wchar.c -I/usr/local/include -I../include cc -c -g -Wall -ansi -Wswitch-enum -DDEBUG util.c -I/usr/local/include -I../include cc -c -g -Wall -ansi -Wswitch-enum -DDEBUG error.c -I/usr/local/include -I../include cc -c -g -Wall -ansi -Wswitch-enum -DDEBUG error_message.c -I/usr/local/include -I../include cc -c -g -Wall -ansi -Wswitch-enum -DDEBUG builtin/builtin.c -I/usr/local/include -I../include cd ../dvm; make; cc -c -g -DDEBUG -Wall -ansi -Wswitch-enum -I../include execute.c cc -c -g -DDEBUG -Wall -ansi -Wswitch-enum -I../include load.c cc -c -g -DDEBUG -Wall -ansi -Wswitch-enum -I../include heap.c cc -c -g -DDEBUG -Wall -ansi -Wswitch-enum -I../include native.c cc -c -g -DDEBUG -Wall -ansi -Wswitch-enum -I../include nativeif.c cc -c -g -DDEBUG -Wall -ansi -Wswitch-enum -I../include wchar.c cc -c -g -DDEBUG -Wall -ansi -Wswitch-enum -I../include util.c cc -c -g -DDEBUG -Wall -ansi -Wswitch-enum -I../include error.c cc -c -g -DDEBUG -Wall -ansi -Wswitch-enum -I../include error_message.c ld -r -o dvm.o execute.o load.o heap.o native.o nativeif.o wchar.o util.o error.o error_message.o cd ../share; make; cc -c -g -I../include -DDEBUG -Wall -ansi -Wswitch-enum -I../include dispose.c cc -c -g -I../include -DDEBUG -Wall -ansi -Wswitch-enum -I../include opcode.c cc -c -g -I../include -DDEBUG -Wall -ansi -Wswitch-enum -I../include disassemble.c cc -c -g -I../include -DDEBUG -Wall -ansi -Wswitch-enum -I../include wchar.c cc -c -g -I../include -DDEBUG -Wall -ansi -Wswitch-enum -I../include util.c ld -r -o share.o dispose.o opcode.o disassemble.o wchar.o util.o cd ../memory; make; cc -c -g -DDEBUG -Wall -I../include memory.c cc -c -g -DDEBUG -Wall -I../include storage.c ld -r -o mem.o memory.o storage.o cd ../debug; make; cc -c -g -Wall -DDBG_NO_DEBUG -I../include debug.c ld -r -o dbg.o debug.o cd ./builtin; make; cc -g -DDEBUG -Wall -ansi -Wswitch-enum -obuiltin_conv -I../../include builtin_conv.c ../../memory/memory.o ../../debug/debug.o ld: unknown flag: -obuiltin_conv make[1]: *** [builtin_conv] Error 1 make: *** [diksam] Error 2 $ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
[この投稿を含むスレッドを表示] [この投稿を削除]
[1157] Re:業務連絡
投稿者:(ぱ)こと管理人
2008/10/29 01:47:37

ローカルにPHP5の環境を作ったのですが、デフォルトのphp.iniの設定が違いすぎていて、まだ一部動かせていません。 magic_quotes_gpcはOffだわ(これは正しいのですが)、asp_tagsはOffだわ、short_open_tagもOffだわで、これではサーバがPHP5に移行した際、どんな設定になっているかが問題のように思います。 ……と思っていたら、どうもPHPの移行には混在期間があって、当面は今のままで動くようです(PHP5にしたければ拡張子を変えろと)。なので今日はもう寝ます。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1156] 業務連絡
投稿者:(ぱ)こと管理人
2008/10/27 02:12:04

この掲示板(を含むうちのWebページ一式)をホスティングしてくれている会社から、 以下の通知が来ました。 >この度、Zend社のPHP4サポート終了の告知を受けまして、サーバーシステムの >保全のため、PHP5へのアップデートを行います。全共用サーバーにおきまして、 >PHP4のご利用ができなくなります。至急設置スクリプトの対応状況をご確認、 >更新をお願いいたします。 この通知が来たのはだいぶ前のことなのですが、いろいろあって放置しているうちに、 変更の期日が10/29に迫ってしまいました。 この掲示板を作った時点の環境は当時のPCが壊れた時点で失われていて、 今現状のLet's Noteの環境にPHPとApacheを入れてみたのですが、まだPHPが 動かせていないようです。 もうちょっといじってみるつもりですが、10/29の時点でこの掲示板が動かなく なっていたら、それが原因とお考えくださいませ。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1155] Re:プログラミングコンテスト
投稿者:(ぱ)こと管理人
2008/10/27 01:25:13

>(ぱ)さんが、賞金1万円出して >(ぱ)さんが作ったOSで、プログラミングコンテストをする。 OSを作った覚えはないので、プログラミング言語ですかね。 1万円というと、いにしえのBASICマガジンの原稿料がそれぐらいだったと思います。 ベーマガ相当のプログラムが集まるのなら、最優秀賞に1万円くらい出すのは 惜しくないですが、結局ほとんど集まらず、hello, worldに1万円出すハメに なったりして。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1154] プログラミングコンテスト
投稿者:つんつん
2008/10/26 19:02:23

(ぱ)さんが、賞金1万円出して (ぱ)さんが作ったOSで、プログラミングコンテストをする。 無責任な書き込みでした。本気!
[この投稿を含むスレッドを表示] [この投稿を削除]
[1153] Re:makeファイル中のリダイレクト
投稿者:tos
2008/08/28 17:32:49

今回実行していた「app.exe」が処理が成功しているにもかかわらず、 '1'を返していたため、makeが その戻り値を検出し、処理を停止してしまって いたようです。 ('-'を付加することにより逃げました。) 774RRさんありがとうございました。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1152] Re:makeファイル中のリダイレクト
投稿者:tos
2008/08/28 15:01:40

返信、ありがとうございます。 >なので app.exe target.dat 0<source.dat は本質的に正しい入力であって、 なるほど、そうなんですか。 >なので 0< となるのは「実行できない」の原因ではないと思われまっする。 >「実行できない」の詳細について記載がないのでこれ以上の判断は出来ません。 >本体プログラム側のバグを疑ってください。 今回実行したい「app.exe」が特にエラーメッセージを表示せず、 何故実行できないのかわからなかったため、この'0'が付加することによるのかな と想像してしまいました。 仰るとおり、本体プログラム側を疑って調査してみます。 ありがとうございました。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1151] Re:makeファイル中のリダイレクト
投稿者:774RR
2008/08/28 13:29:05

標準入力のリダイレクトは < で行うのですがこれは本来 0< の略記なのです。 http://itpro.nikkeibp.co.jp/article/COLUMN/20060228/231093/ たとえば un*x のコンソール上では $ cat hoge.txt Hoge! $ cat 0<hoge.txt Hoge! $ // と、このように同じ動作をするのが正常な動きでありんす。 んで XP/2000 のコマンドプロンプトである cmd.exe もこの表記を受け付けます。 D:\MYWORK>cat 0<hoge.txt Hoge! D:\MYWORK> なので app.exe target.dat 0<source.dat は本質的に正しい入力であって、 期待したとおりに動くはずです。実際俺のところでは cmd.exe bash.exe の両方で このように0<と手入力しても期待通りの正しい動きをします。 さてここまで納得していただけたでしょうか。この例の場合、バッチファイル中には < としか書いていないリダイレクト記号を、誰かが勝手に (make がやっているのか cmd.exe がやっているのか、他の誰かかは不明) 0< と置換しているわけです(実害ないけど妙なことをやってるよね・・・) 0< となっていても俺んとこでは期待通り動作しています。 なので 0< となるのは「実行できない」の原因ではないと思われまっする。 「実行できない」の詳細について記載がないのでこれ以上の判断は出来ません。 本体プログラム側のバグを疑ってください。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1150] Re:makeファイル中のリダイレクト
投稿者:tos
2008/08/28 10:00:12

cygwin をインストールして確認しましたが、 やはり、Borlandのmakeと同じ結果でした。 確認方法は、下記のようなmakefile及び バッチファイルを用意して、 (ダミーの"source.dat"と"app.exe"も用意して) --- makefile -------------------- target.dat : source.dat test.bat --------------------------------- --- test.bat -------------------- app.exe target.dat < source.dat --------------------------------- cygwin上?でmakeを実行しました。 すると、やはり'<'の前に'0'が付加されます。 --------------------------------- $ make test.bat app.exe target.dat 0<source.dat ~ --------------------------------- 何故でしょうか? 環境は、下記です。 GNU make 3.81 Windows XP Professional Version 2002 Service Pack 2
[この投稿を含むスレッドを表示] [この投稿を削除]
[1149] Re:makeファイル中のリダイレクト
投稿者:tos
2008/08/26 14:25:45

>file1.hoge ではなく hoge1.txt みたいに8文字ドット3文字以下の >過去互換性重視なファイル名に変えてみると良いかもしれん、ということぢゃ >直るかもしれんし、直らんかもしれん。どっとはらい。 理解できました。ありがとうございました。 引き続き試してみます。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1148] Re:makeファイル中のリダイレクト
投稿者:774RR
2008/08/26 13:51:52

ちなみに GNU make はソースコード提供なので開発環境がないと作れない make 自体は開発環境の一部であり、これがうまく動かないのではコンパイルできない という自己矛盾の状況に陥るわけだ。 cygwin 開発環境一式持ってくるほうが結局面倒が無いかも知れんっす。 そーすると gcc コンパイラ自体も入手できちゃうので某の出番は無い可能性が・・・ 掲示板のスペースで cygwin の解説など不可能っぽいので http://journal.mycom.co.jp/special/2002/cygwin/index.html
[この投稿を含むスレッドを表示] [この投稿を削除]
[1147] Re:makeファイル中のリダイレクト
投稿者:774RR
2008/08/26 13:42:30

むかしむかし、あるところに MS-DOS というものがあってのぉ MS-DOS ではファイル名に「8文字以下 ドット 3文字以下」しか使えなかったのぢゃ その関係でなぁ、 Win95 以後のソフトでも8文字ドット3文字のファイル名しか 扱えないような、そーいう過去互換性重視なモノもあったのぢゃよ # 某の make がそういう過去互換重視なものかどうかは知らんがのぉ hoge.exe は4文字ドット3文字だから問題ない file1.txt は5文字ドット3文字だから問題ない のぢゃが file1.hoge や file2.piyo は5文字ドット4文字なのでな、 過去互換性重視なソフトに取っては非互換なファイル名なのぢゃよ file1.hoge ではなく hoge1.txt みたいに8文字ドット3文字以下の 過去互換性重視なファイル名に変えてみると良いかもしれん、ということぢゃ 直るかもしれんし、直らんかもしれん。どっとはらい。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1146] Re:makeファイル中のリダイレクト
投稿者:tos
2008/08/26 12:45:39

返信ありがとうございます。 GNU makeで試してみます。 ただ、 >俺の Makefile のように 8.3 コンパチなファイル名で試してみること推奨 この意味がわかりませんので、よろしければ教えてください。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1145] Re:makeファイル中のリダイレクト
投稿者:774RR
2008/08/26 12:26:34

cat > Makefile <<EOF file1.txt: file2.txt hoge <tab>./hoge file1.txt < file2.txt hoge: hoge.c EOF ということで GNU make で試したけど無問題っす (HPUX11.11 と cygwin) borland の make ではなく GNU make で試してみませう 某の make がどうしてもいい、ってことなら 俺の Makefile のように 8.3 コンパチなファイル名で試してみること推奨
[この投稿を含むスレッドを表示] [この投稿を削除]
[1144] makeファイル中のリダイレクト
投稿者:tos
2008/08/26 10:27:15

皆さんこんにちは、tosです。 makeファイル中で以下のように リダイレクトを要求するexeを実行したいのですが、 正常に実行できません。 ------------------------------------------- FILE1.HOGE : FILE2.PIYO Hoge.exe FILE1.HOGE < FILE2.PIYO ------------------------------------------- 「正常に実行できません」の内容は、最初エラー メッセージのみでわからなかったんですが、 ためしに、上記の2行目をBAT呼び出しにしたところ、 下記のように何故かリダイレクト起動に前に'0'が 付加されていました。 ------------------------------------------- Hoge.exe FILE1.HOGE 0<FILE2.PIYO ------------------------------------------- この'0'は何故付加されるのでしょうか? ちなみに、makeは「BorlandのVersion 5.2」 を使用しています。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1143] Re:テストBBSが
投稿者:(ぱ)こと管理人
2008/08/02 14:09:00

どうもです。遅くなりましてすみません。 774RRさん: >テストBBSが広告だらけですが、どうせテストだし管理しない方針でしょうか? >ほげほげ認証だけでもつければまた違いそうですが すみません、面倒なので放置しています。 表掲示板とテスト掲示板は同じプログラムで、GETパラメタで動きを変えている だけなので、ほげほげ認証はテスト掲示板にも付いています。 ほげほげ認証導入以後、日本語以外のspamはまったくないようなので、 人力で書いているんですかね。 yuyaさん: >というわけでテスト板見ようとしたんですが、Firefoxでは >>「テスト書き込みの類はテスト用掲示板にどうぞ。」 >のリンクが効いておらず見に行けませんでした。 このメッセージははD/Bに入っていて、掲示板作成用のWeb画面は作ったものの 更新画面がなくて、放置してしまっていました。すみません。 今、手でSQLを書いて更新したのですが… センタリングを忘れました。 これから出かけるのですみませんがひとまずこの状態で。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1142] Re:テストBBSが
投稿者:yuya
2008/08/01 12:17:14

>テストBBSが広告だらけですが、どうせテストだし管理しない方針でしょうか? >ほげほげ認証だけでもつければまた違いそうですが というわけでテスト板見ようとしたんですが、Firefoxでは >「テスト書き込みの類はテスト用掲示板にどうぞ。」 のリンクが効いておらず見に行けませんでした。 ソース見ると、<a>タグに文法ミスがありますね。 IEだと善意に解釈されてリンクしてるんですが。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1141] テストBBSが
投稿者:774RR
2008/08/01 11:37:38

テストBBSが広告だらけですが、どうせテストだし管理しない方針でしょうか? ほげほげ認証だけでもつければまた違いそうですが
[この投稿を含むスレッドを表示] [この投稿を削除]
[1139] Re:電卓:コンパイル出来ません:MacOSX
投稿者:つんつん
2008/07/15 00:00:45

前橋さま コンパイル通りました。 $ ./mycalc >9; >>9 >1+2+3+4+5+6+7+8+9+10; >>55 > mycalc も実行できます。行編集もできます。 ありがとうございます。感謝感謝!!です。 言われますように次ぎの通り修正しました。 $ cat -n Makefile <略> 14 INCLUDES = -I/opt/local/include 15 16 $(TARGET):$(OBJS) 17 $(CC) $(OBJS) -o $@ -L/opt/local/lib -lreadline -lfl -lm <略>
[この投稿を含むスレッドを表示] [この投稿を削除]
[1138] Re:電卓:コンパイル出来ません:MacOSX
投稿者:(ぱ)こと管理人
2008/07/14 23:42:14

>13: CFLAGS = -c -g -Wall -I/opt/local/include >14: INCLUDES = \ >15: >16: $(TARGET):$(OBJS) >17: $(CC) $(OBJS) -o -L/opt/local/include $@ -lreadline -lfl -lm まず、-Lの指定は間違っています。 ・-oオプションはできあがる実行形式の名前を指定するオプションですし、  makeでは、$@がターゲットの名前を指します。よって「-o $@」で組なので  その間に-Lを入れてはいけません。 ・/opt/local/includeは、その名のとおり#includeするファイルを置くところだと  思うので、ライブラリは別のところにあるはずです。  MacOSのディレクトリ構造は知りませんが、おそらく/opt/local/libあたりに、  libreadline.aとかlibreadline.soなんとかというファイルがありませんか?  だとすれば、 >17: $(CC) $(OBJS) -o $@ -L/opt/local/lib -lreadline -lfl -lm でいいと思います。 ただ、エラーメッセージが今でも >cc -c -g lex.yy.c >calc.l:6:31: readline/readline.h: No such file or directory こうだというのなら、-Iも失敗しているようです。 …そう思ってMakefileを見直して気付きました。 CFLAGSはlex.yy.cの規則のところでは使っていませんでした。すみませんこちらのミスです (_o_) 14行目の INCLUDES = \ を、 INCLUDES = -I/opt/local/include としてみてください。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1137] Re:電卓:コンパイル出来ません:MacOSX
投稿者:つんつん
2008/07/14 19:54:56

すいません 忙しく今bbsを見ました。 積極的にアプローチしてませんが、 電卓を勉強したい人が、スムーズに電卓に入っていけるようになったらなーとも思います。 >とのことなので、もうreadlineを動かしたいとは強くは思っていないように思いますし、 >それなら外野がとやかく言うこともないかな、とも思いますし。 13: CFLAGS = -c -g -Wall -I/opt/local/include 14: INCLUDES = \ 15: 16: $(TARGET):$(OBJS) 17: $(CC) $(OBJS) -o -L/opt/local/include $@ -lreadline -lfl -lm 13: と 17: を変更しました。 ./memory/ と ./debug/ で make は成功します。 mycalc/ で make すると $ make bison --yacc -dv calc.y flex calc.l cc -c -g lex.yy.c calc.l:6:31: readline/readline.h: No such file or directory calc.l: In function `tty_input': calc.l:87: warning: assignment makes pointer from integer without a cast make: *** [lex.yy.o] Error 1 $ お願いします。-Ldir の記述例もお教えください。僕の-Ldirは的を外していると思います。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1136] Re:電卓:コンパイル出来ません:MacOSX
投稿者:(ぱ)こと管理人
2008/07/13 20:17:03

>まず、どういう指定をしたか、具体的に書きましょう。 一般的にはそうですけど、今回について言えば、つんつんさんは >readline 使っていない方のサイトで 勉強したいと思います。 とのことなので、もうreadlineを動かしたいとは強くは思っていないように思いますし、 それなら外野がとやかく言うこともないかな、とも思いますし。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1135] Re:電卓:コンパイル出来ません:MacOSX
投稿者:kit
2008/07/13 19:41:31

>現状:: >readline.h は  /opt/local/include/readline/readline.h です。 >-L も指定したつもりですが、あっているか分かりません。 まず、どういう指定をしたか、具体的に書きましょう。 エスパーじゃないんですから、「-L も指定したつもり」とだけ書かれても、 実際に何をどう指定したのか、つんつんさん以外にはさっぱり分かりません。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1134] Re:電卓:コンパイル出来ません:MacOSX
投稿者:つんつん
2008/07/13 09:55:41

前橋さま まだエラーになります。 現状:: readline.h は  /opt/local/include/readline/readline.h です。 -L も指定したつもりですが、あっているか分かりません。 ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー EasyPackage というパーケージ管理でreafline をインストールすると 標準 /usr/local にインストールされます。 その状態では、mycalcのコンパイル成功します。 しかし、複数のパッケージ管理を使いたくないので EasyPackage の readline は、アンインストールしました。 ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー パッケージ管理 MacPorts で /opt/local/include/readline/readline.h に インストールした状態で、mycalcをコンパイルすることは、難しいです。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1133] Re:電卓:コンパイル出来ません:MacOSX
投稿者:(ぱ)こと管理人
2008/07/13 00:23:25

>readline は、/opt/local/include/readline/ にインストールされていました。 … >「コンパイラの-Iオプション」に加えるということが分かりませんので >readline 使っていない方のサイトで 勉強したいと思います。 了解です。 まあ一応書いておくと、今回の例ならトップディレクトリのMakefileに CFLAGS = -c -g -Wall という行がありますが(13行目)、ここに CFLAGS = -c -g -Wall -I/opt/local/include のように-Iを追加すればコンパイルは通るようになると思います。 インクルードのパスが通ってない以上、リンクのパスも通っていない可能性が ありますが、その場合は17行目の $(CC) $(OBJS) -o $@ -lreadline -lfl -lm ここに-Lオプションを加えるとかします。 詳細はこのへんを参照してください。 http://www.asahi-net.or.jp/~wg5k-ickw/html/online/gcc-2.95.2/gcc_2.html#SEC14
[この投稿を含むスレッドを表示] [この投稿を削除]
[1132] Re:リンク切れ
投稿者:(ぱ)こと管理人
2008/07/13 00:12:50

>「C言語 体当たり学習徹底入門」正誤表に載っている「ほげを考えるページ」へのリンクがniftyのURLのままです。 ご指摘ありがとうございます。 ポインタ完全制覇、体当たり学習、Java謎+落とし穴すべてについて 新URLへのリンクを付けておきました。 どの本も移転前だったんだなあ… (遠い目)
[この投稿を含むスレッドを表示] [この投稿を削除]
[1131] Re:電卓:コンパイル出来ません:MacOSX
投稿者:つんつん
2008/07/12 23:56:17

>もし入っているのであれば、コンパイラの-Iオプションにそこを加えれば >よいですし、入っていないのであれば拾ってきて入れることになります。 前橋さま ありがとうございます。 readline は、/opt/local/include/readline/ にインストールされていました。 MacOSX では、readline : いろいろなインストール方法により /opt/local や /sw/local ? や /usr/local にインストールされるみたいです。 「コンパイラの-Iオプション」に加えるということが分かりませんので readline 使っていない方のサイトで 勉強したいと思います。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1130] リンク切れ
投稿者:piyo
2008/07/12 23:19:19

「C言語 体当たり学習徹底入門」正誤表に載っている「ほげを考えるページ」へのリンクがniftyのURLのままです。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1129] Re:電卓:コンパイル出来ません:MacOSX
投稿者:(ぱ)こと管理人
2008/07/12 13:27:01

こんにちは。 >MacOSX で電卓使いたいとコンパイルしたのですが、エラーになります。 … >cc -c -g lex.yy.c >calc.l:6:31: readline/readline.h: No such file or directory このエラーメッセージは、readline.hというファイルが見つからないと言っている わけですから、GNU readlineがインストールされていないのでしょう。 MacOSはよく知りませんが、デフォルトでは入ってなくても無理ない気がします。 実は入っていて、#includeのパスが通ってないだけかもしれませんが。 もし入っているのであれば、コンパイラの-Iオプションにそこを加えれば よいですし、入っていないのであれば拾ってきて入れることになります。 このページからダウンロードできるようです。 http://tiswww.case.edu/php/chet/readline/rltop.html インストールの方法はここにありました。 http://tiswww.case.edu/php/chet/readline/INSTALL GNUのソフトらしく、 ./configure make make install でインストールできるようです。 ただ、電卓を作るための勉強用なら、こちらの方が簡単でよいかと思います。 GNU readlineも使っていませんし。 http://kmaebashi.com/programmer/devlang/yacclex.html
[この投稿を含むスレッドを表示] [この投稿を削除]
[1128] 電卓:コンパイル出来ません:MacOSX
投稿者:つんつん
2008/07/12 05:40:50

その4 「電卓を作ってみよう」 MacOSX で電卓使いたいとコンパイルしたのですが、エラーになります。 前橋さまの電卓試したいのですが、ご教授よろしくお願いします。 $ tar zxvf mycalc.tgz $ cd mycalc $ cd memory/ $ make cc -c -g -Wall memory.c cc -c -g -Wall storage.c ld -r -o mem.o memory.o storage.o $ cd ../debug/ $ make cc -c -g -Wall -I../ debug.c ld -r -o dbg.o debug.o $ cd .. ーーーーーーーーーーーーーーーーここまでは、エラーでませんが $ make bison --yacc -dv calc.y flex calc.l cc -c -g lex.yy.c calc.l:6:31: readline/readline.h: No such file or directory calc.l: In function `tty_input': calc.l:87: warning: assignment makes pointer from integer without a cast make: *** [lex.yy.o] Error 1 $ ーーーーーーーーーーーーーーーーここで、エラーになりました。どうして???
[この投稿を含むスレッドを表示] [この投稿を削除]
[1127] Re:メンバーズホームページ
投稿者:(ぱ)こと管理人
2008/07/11 01:15:43

>以前から告知されていましたが、niftyのメンバーズホームページはリンクのサービスも停止してしまいましたね。 ありがとうございます。まったく気付いていませんでした。変更しておきました。 ずいぶん長いこと転送してくれていましたから、まあ文句は言えませんね。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1126] メンバーズホームページ
投稿者:yuya
2008/07/10 13:47:23

トップページ > kmaebashi.comに直接飛ぶように設定できるようになっていたことが判明。今はそのように設定しています。 以前から告知されていましたが、niftyのメンバーズホームページはリンクのサービスも停止してしまいましたね。 トップページの口上が現状と合致しなくなったので、(おせっかいながら)指摘しておきます。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1122] Re:なぜわからなくなってしまうのか?の本質(笑)
投稿者:774RR
2008/06/24 08:33:37

もいちど駄レスしておくと オブジェクト指向な設計、というものはあっても 非オブジェクト指向な設計の元にオブジェクト指向なプログラム、ってのはありえない わけで、「基礎設計したことがないプログラマ」ではOOがわからなくて当然。 メタ度が違うっちぅことで。 俺も、基礎設計が気に入らなくなったという理由で、50%くらい作ったプログラムを 全部捨てて最初から再設計したなんて経験が何度もある。 ただ「実装するだけ」のOOでは意味が無いと思うのココロ そーいう人に限って「スーパークラスがごみ置き場」になるわけだ。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1121] Re:なぜわからなくなってしまうのか?の本質(笑)
投稿者:sumim
2008/06/22 14:19:36

>リスコフというと「え、ええと置換原則の人?」程度の私はまだまだ勉強が >必要のようです。 リスコフは「抽象データ型」とか「カプセル化」を考えた(言い出した)人です。 >新しいほうの3系統 >http://d.hatena.ne.jp/sumim/20080415/p1 > >は大変腑に落ちます。 それはよかった。ご紹介痛み入ります。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1120] Re:なぜわからなくなってしまうのか?の本質(笑)
投稿者:(ぱ)こと管理人
2008/06/22 13:43:45

>新人はさしたる仕事もなく、昨日もオブジェクト指向のサイトを転々としておりました。 ああ、それはうらやましい。 戦力として配置されるとだんだん勉強の時間も削られてくるものですし、 さらに年を食うとろくにコードも書かせてもらえなくなるのがこの業界ですので。 > 継承:共通処理(親)をベースとして差分を子に付け加える。ライブラリを > includeするのと逆の発想。 うーん、これはまさに(最近評判があまりよろしくない)実装継承ですよね。 以前、この辺のスレッドで議論したことがあります。 http://kmaebashi.com/bbs/list.php?boardid=kmaebashibbs&thread=270 この中で出ているoo-squareのリンクは、現在切れていますがこっちです。 http://www.ogis-ri.co.jp/otc/hiroba/oosquare-ml/Archive/200501.month/thread.html よく使うメソッドをスーパークラスに置いて、なんてことをやっていると、 http://www.ogis-ri.co.jp/otc/hiroba/oosquare-ml/Archive/200501.month/4468.html | 継承は確たる「設計思想」が無い場合、スーパークラスが単なる「ごみ置き場」 | と化していることが多いようです。 なんてことになってしまう。それよりはむしろ、 http://kmaebashi.com/bbs/list.php?boardid=kmaebashibbs&from=276&range=1 | 「ほらほら、『使うほう』はその実体が具体的に何であるか気にしなくていいんだよ」 のほうが実際の使いどころに合っていると思いますが、こうなるとインタフェースと 一緒になっちゃうんですよね。実際、「継承なんかどうでもよくてインタフェースこそが 本質なのだ」と言う人もいますし。 じゃあ継承なんかなくていいのかというとそうでもなくて、実際私も使うというのが ややこしいところ。「継承とインタフェースのどっちを使えばいいんですか?」というのは FAQですが、私はこれはもう単純に ・データメンバがメインの構造体的なクラスにフィールドを追加するなら継承を、 ・それ以外はインタフェース でいいんじゃないかな、と思っています。 > 隠蔽:見せたくない処理はlocal変数、local関数にて実装する。 これは実態としてまさにそうだと思います。 よく「その『オブジェクト』だけが知っていればよいことはprivateにするんだ」と オブジェクトごとに丸を描いたりして「カプセル化」としている説明がありますが、 言いたいことはよくわかるものの、C++でもJavaでも実はprivateは 「別のクラスから見えない」だけで「別のオブジェクトから見えない」のでは ないんですよね。 これを、単にC++(およびその派生言語)が腐っているとか実用上の妥協だとか 言うことも可能ですが、私はこれを「privateというのは他の『プログラマ』に 対する隠蔽なのだ」と考えてしまってよいと思っています。 > 多態性:引数に基づき、サブルーチン側でif~elseで処理分岐する。 > またはincludeを変える。 「またはincludeを変える」のほうは良くわかりませんが、1行目は、用途としては そのとおりです。よくある図形(Shape)の描画ルーチンの例のように、 ポリモルフィズムを使うことで、プログラムからswitch caseを排除できます。 Cにはそれがないばかりに巨大なswitch caseを書いてる例: http://kmaebashi.com/programmer/devlang/diksam_src_0_2/S/7.html#693 ポリモルフィズムにおいて、一見単なる実装詳細に見えるけど実は結構重要なのは、 サブクラスを追加しても、呼び出し素(switch caseに相当する部分)再コンパイルの 必要がない、ということですね。だからAppletを継承したクラスを作れば すぐにブラウザで実行できるわけで。 > マルチプルインスタンス:サブルーチンをメインの実行状況によって任意に > (動的に)増やせる。 うーん、これはどうなんでしょう。オセロの例で言えば、Boardをいくつnewしても、 put()というルーチンは増えないと思うのですが… 「メソッドはインスタンスに付属している」というイメージからすると、 一緒に増えると考えることもできるのかもしれませんが。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1119] Re:なぜわからなくなってしまうのか?の本質(笑)
投稿者:(ぱ)こと管理人
2008/06/22 13:12:16

こんにちは、sumimさん。(いろいろなところで)いつもお世話になってます。 >すみません(汗)。 いえそんな(大恐縮) >当時はまだリスコフの抽象データ型(カプセル化)について理解があさく、 >ユーザー定義型に手続きを含むか、含まないかで、それぞれを OOP(あるいは、 >手続きによる抽象化。PDA)とするか、ADT(クック独自定義の抽象データ型) >とするかという分類はとてもクールに思えて必要以上に持ち上げてしまいました。 リスコフというと「え、ええと置換原則の人?」程度の私はまだまだ勉強が 必要のようです。 新しいほうの3系統 http://d.hatena.ne.jp/sumim/20080415/p1 は大変腑に落ちます。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1118] Re:なぜわからなくなってしまうのか?の本質(笑)
投稿者:Glory
2008/06/21 16:41:02

返信下さった皆さん、ありがとうございます。興味深く読ませて頂きました。 新人はさしたる仕事もなく、昨日もオブジェクト指向のサイトを転々としておりました。 やはり「猫」の例はヘンですよね。現実世界を模しているならば「鳴けとメッセージを送ると 鳴く」というよりは「腹が減ると鳴く」の方がピッタリでしょう。つまり完全自律型、プログラムで いったら暴走に近いかも・・・。 プログラミングは少々かじったことがあるのですが(学校の実習レベルです)、無理矢理 現実世界に例えるよりはこんな感じの説明の方がイメージに合っていると思います。  継承:共通処理(親)をベースとして差分を子に付け加える。ライブラリをincludeするのと逆の発想。  隠蔽:見せたくない処理はlocal変数、local関数にて実装する。  多態性:引数に基づき、サブルーチン側でif~elseで処理分岐する。またはincludeを変える。  マルチプルインスタンス:サブルーチンをメインの実行状況によって任意に(動的に)増やせる。  オブジェクト指向:これら個々の処理を分離して薄皮でくるみ、モノとして捉える。 わかってないとお叱りを受けそうですが、「犬・猫」よりはそれっぽい(笑)気がします。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1117] Re:なぜわからなくなってしまうのか?の本質(笑)
投稿者:sumim
2008/06/21 15:48:56

># 以前何度か読んで、そのたびに「手続きによる抽象化」について調べようと思いつつ ># 忘れていたらいつの間にか追記がついていた。あれ? すみません(汗)。 当時はまだリスコフの抽象データ型(カプセル化)について理解があさく、 ユーザー定義型に手続きを含むか、含まないかで、それぞれを OOP(あるいは、 手続きによる抽象化。PDA)とするか、ADT(クック独自定義の抽象データ型) とするかという分類はとてもクールに思えて必要以上に持ち上げてしまいました。 その後、リスコフは、手続きを型に含むか含まないかは抽象データ型の実現方法の バリエーションにすぎない(それぞれにメリット・デメリットがある…)と書いてある のを見つけて、追記にように認識を改めた次第です。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1116] Re:なぜわからなくなってしまうのか?の本質(笑)
投稿者:(ぱ)こと管理人
2008/06/21 02:55:11

>オブジェクト指向のごちゃごちゃが気になったら、とりあえずこのページを見ておくと良いと思います。 >http://d.hatena.ne.jp/sumim/20040525/p1 ページの紹介ありがとうございます。 # 以前何度か読んで、そのたびに「手続きによる抽象化」について調べようと思いつつ # 忘れていたらいつの間にか追記がついていた。あれ? というわけで、Javaの勉強をするのなら、「メッセージ」という言葉を多用している 入門書はひとまず避けておけ、と(ぉぃ 逆に言えばうちのページ http://kmaebashi.com/programmer/object/index.html はC++/Java流OO限定ですね。そういうわけで当時の掲示板でのバトルの末 「言語としてはJavaを使用します。」という文言を先頭のページに持ってきた、 という経緯はあるんですが、もうちょっとでかでかと書いてもよかったかも。 まあ当時は依怙地になっていたかと思います。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1115] Re:なぜわからなくなってしまうのか?の本質(笑)
投稿者:(ぱ)こと管理人
2008/06/21 02:48:48

>新人君 (大学では情報技術をやってなかった君) を見ていると >やはり[マルチプルインスタンス]にてつまづいているようだ。 >http://kmaebashi.com/programmer/object/othello.html この「マルチプルインスタンス」という言葉は別に私の造語ではなく、 http://kmaebashi.com/programmer/object/intro.html にも書いたようにC++ FAQにあった言葉を使ったのですが、上のページを私が書いた 時点では、「マルチプルインスタンス オブジェクト指向」でGoogleしても 0件でした。 それが今では258件だか出ます(私のページやそれに対する言及も多いですが)。 うちのページの影響だと思っても、自意識過剰じゃないですよね。きっと。たぶん。 プロトタイプベースまで含めるとまた話がややこしくなりますが、 クラスベースのOOに関する限り、複数のインスタンスが作れるという概念は 基本だと思うんですよね。あまりに基本すぎるせいか、入門書とかでは 飛ばされてしまっていたわけですが。 新人君がなにもかもstaticなプログラムを書いたら「オブジェクト指向的じゃない!」 と怒るくせに。 >マルチプルインスタンスが理解できても static という罠が待ち構えている。 しかもJavaの場合実行がすべてpublic static void main()から始まるために、 本当の入門者がいきなり罠にはまるという…
[この投稿を含むスレッドを表示] [この投稿を削除]
[1114] Re:なぜわからなくなってしまうのか?の本質(笑)
投稿者:(ぱ)こと管理人
2008/06/21 02:32:07

Gloryさん、こんにちは。 >例題は「車」・・・このサイトの予想通り。ご多分に漏れずなかなか >理解できずにいます。 車ですか…これもよく使われる例かと思いますが、やっぱりたとえ話はよくないと 思います。 >そのうえ更に「よくある○○という説明は間違い、誤解をうむ、 >オブジェクト指向ではない」などと説明されると、卓袱台を引っくり返された >ような感覚すら。 >結局どれが”正”なんだ?と。お互いに自分の説明こそが正しいという立場で主張する >わけですから(当たり前ですが)、初心者は余計に混乱し、根気がないと挫折します。 すみません、一部加担しています。(_o_) >オブジェクト指向に対する根本的なモノの考え方は同じなのかもしれませんが、 >投稿・掲示板でも意見が分かれるように、統一見解がないことこそが >”なぜわからなくなってしまうのか?”の一番の原因なのかもしれません。 [1111]でこくぼさんが挙げておられるページのように、また、 http://practical-scheme.net/trans/reesoo-j.html こちらでも「オブジェクト指向というものが動く標的であるため、オブジェクト指向の 熱心な支持者はこのメニューのうちの適当なサブセットを気まぐれに選んで、 それを以って他の言語はオブジェクト指向ではないと説得しようとする。 」 と言われているように、定義がちゃんと定まったものではないとは思います。 >本当は誰もが認めるバイブル的な教本があるとよいのですがねぇ・・・。 たとえばBertrand MeyerさんのOOSC(Object-Oriented Software Construction)は かなり多くの人がバイブルと認めると思いますが(少なくとも静的型OO支持者であれば)、 それでも「あの本の継承の使い方は…」という留保をつける人が多いんじゃないかと 思います。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1113] 昨晩は
投稿者:(ぱ)こと管理人
2008/06/20 08:29:06

昨晩はちょっと早めに帰宅して、   ↓ 掲示板を確認し、ゴミ投稿を消して、   ↓ どうお返事しようかなあ、と考えながらベッドにごろんと   ↓ 気付いたら朝 ←いまここ というわけで、今しばらくお待ちくださいませ。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1111] Re:なぜわからなくなってしまうのか?の本質(笑)
投稿者:こくぼ
2008/06/19 19:26:57

オブジェクト指向のごちゃごちゃが気になったら、とりあえずこのページを見ておくと良いと思います。 http://d.hatena.ne.jp/sumim/20040525/p1
[この投稿を含むスレッドを表示] [この投稿を削除]
[1110] Re:なぜわからなくなってしまうのか?の本質(笑)
投稿者:774RR
2008/06/19 16:56:11

新人君 (大学では情報技術をやってなかった君) を見ていると やはり[マルチプルインスタンス]にてつまづいているようだ。 http://kmaebashi.com/programmer/object/othello.html 同じ種類のモノが、複数個!という概念が理解できた後でないと 同じ性質だけど、違う種類! (基底クラス→派生クラス) の理解は危うい。 と思うのであった。 マルチプルインスタンスが理解できても static という罠が待ち構えている。 Java の Double クラスの public static Double valueOf(String s) が ああ、そういうことねーと納得できるかどうか こりゃいったいなにがいいたいんぢゃろと困るか その辺にわかるわからないの境目がありそうな気がする俺ちゃんであった
[この投稿を含むスレッドを表示] [この投稿を削除]
[1109] なぜわからなくなってしまうのか?の本質(笑)
投稿者:Glory
2008/06/19 15:17:39

管理人さん&読者の皆さん、こんにちは。 この前、会社の新人研修でオブジェクト指向(Java)を学びました。 例題は「車」・・・このサイトの予想通り。ご多分に漏れずなかなか理解できずにいます。 いろいろなオブジェクト指向関連のサイトや本を読みあさって勉強していると、筆者それぞれに 思い入れがあって、解説の仕方や考え方が異なることに気付きます。「実は簡単」とか「これだけ 覚えればOK」という内容をよく目にしますが、私のような初心者にとっては、それでさえ 理解できなかったりします。そのうえ更に「よくある○○という説明は間違い、誤解をうむ、 オブジェクト指向ではない」などと説明されると、卓袱台を引っくり返されたような感覚すら。 結局どれが”正”なんだ?と。お互いに自分の説明こそが正しいという立場で主張するわけですから (当たり前ですが)、初心者は余計に混乱し、根気がないと挫折します。 オブジェクト指向に対する根本的なモノの考え方は同じなのかもしれませんが、投稿・掲示板でも 意見が分かれるように、統一見解がないことこそが”なぜわからなくなってしまうのか?”の一番の 原因なのかもしれません。研修の講師の方も仰っていました。「わからないときは先輩に 訊いた方がよい、ただしその相手を間違えるとヘンな設計になる(笑)」。なんとなく分かるような 気がします。どうもベテランのJava開発者=オブジェクト指向を理解している人ではないようです。 本当は誰もが認めるバイブル的な教本があるとよいのですがねぇ・・・。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1108] Re:とあるGのつくプロジェクト
投稿者:こくぼ
2008/06/18 02:14:42

>まあ、仕事のプロジェクトについてここであんまり書くわけにもいきませんから >このへんにしときます。 ですよね。 失礼しましたm(_ _)m
[この投稿を含むスレッドを表示] [この投稿を削除]
[1107] Re:とあるGのつくプロジェクト
投稿者:(ぱ)こと管理人」
2008/06/16 02:45:13

>自分も何の因果か、巡り巡って今はGのつくプロジェクトにどっぶり漬かっています。 >#お客さんとコネのあるベンダーなので面倒がないというか、大変というか…^^; >#(前会社で働いてたときよりも待遇も給料も良いので全然良いんですけどね) あの会社にGのつくプロジェクトはいくつかありますが、あのGであれば、 お会いする機会は今後もあるかもしれません。 まあ、仕事のプロジェクトについてここであんまり書くわけにもいきませんから このへんにしときます。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1106] Re:とあるGのつくプロジェクト
投稿者:こくぼ
2008/06/15 16:27:00

>ええと、それならおそらく私です。 やっぱりそうでしたか。お会いできるチャンスを逃してしまって残念です^^; >ただ、現在私は1階にコーヒー屋があるビルの向かいのビルにはいません。 ># 会社自体変わったような変わってないような。 そうなんですか…! >超巨大企業の子会社の、Gのつくプロジェクトの人たちも現在はコーヒー屋がある >ビルではないビルに移っているはずです(全員ではないはずですが)。 今年末くらいに駅近くの新しくできるビルに移るって話は聞いてますが、今はまだ大部分はそこのビルにあると思います。 >月日は過ぎ人は去り状況は刻々と変わっているようです。諸行無常といいますか。 自分も何の因果か、巡り巡って今はGのつくプロジェクトにどっぶり漬かっています。 #お客さんとコネのあるベンダーなので面倒がないというか、大変というか…^^; #(前会社で働いてたときよりも待遇も給料も良いので全然良いんですけどね)
[この投稿を含むスレッドを表示] [この投稿を削除]
[1105] Re:とあるGのつくプロジェクト
投稿者:(ぱ)こと管理人」
2008/06/15 01:18:40

こんにちは。 >自分は名古屋の伏見にある某企業で働いてるのですが、2年ほど前(2006年の3月末) >にとある会社(超巨大企業の子会社)の名簿みたいなやつに前橋さんのお名前を見かけ >ました。 ええと、それならおそらく私です。 >おそらく前橋さんの会社からすぐ近くの1階にコーヒー屋があるビルなのですが、 ただ、現在私は1階にコーヒー屋があるビルの向かいのビルにはいません。 # 会社自体変わったような変わってないような。 超巨大企業の子会社の、Gのつくプロジェクトの人たちも現在はコーヒー屋がある ビルではないビルに移っているはずです(全員ではないはずですが)。 月日は過ぎ人は去り状況は刻々と変わっているようです。諸行無常といいますか。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1104] とあるGのつくプロジェクト
投稿者:こくぼ
2008/06/13 18:56:48

はじめまして、こんにちは。 ポインタ本を6年くらい前(?)に読んでから、前橋さんのファンです。 自分は名古屋の伏見にある某企業で働いてるのですが、2年ほど前(2006年の3月末)にとある会社(超巨大企業の子会社)の名簿みたいなやつに前橋さんのお名前を見かけました。 (ちょうど自分が3月末までその会社に派遣されてまして) おそらく前橋さんの会社からすぐ近くの1階にコーヒー屋があるビルなのですが、あのとき見た名前が本当に前橋さんなのか今でも気になっています。 迷惑でなければ、教えてくださいm(_ _)m
[この投稿を含むスレッドを表示] [この投稿を削除]
[1103] Re:本について
投稿者:(ぱ)こと管理人」
2008/05/12 01:24:58

はじめまして。おほめいただきありがとうございます。 >よくわからない宣言は避けて、使わないようにしていたのですが >それが理解できると途端に使えるものが増えて、世界が広がったような気がしました 本にも書いたとおり、あまり複雑な宣言を使うのはおすすめできませんが、読むときには読めないと困りますし、わからないからとvoid*に逃げるのもよろしくないですから、宣言の読み方はわかっているほうがよいですよね。 お役に立てたようで何よりです。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1102] 本について
投稿者:sironote
2008/05/11 04:00:43

C言語ポインタ完全制覇の本を読ませていただきました 細部まで説明してくれるこういう本は本当にありがたかったです よくわからない宣言は避けて、使わないようにしていたのですが それが理解できると途端に使えるものが増えて、世界が広がったような気がしました 良い本を出してくれて感謝致します
[この投稿を含むスレッドを表示] [この投稿を削除]
[1101] Re:まだまだ現役ですね!
投稿者:(ぱ)こと管理人
2008/04/03 03:00:44

はじめまして。書き込みありがとうございます。 >で、今回は、面白いページがありましたので、ご紹介致します。(既に知っていらっしゃるかもしれませんが・・・) >http://builder.japan.zdnet.com/sp/c-programming-language/story/0,3800083430,20370255-2,00.htm?p=3&mode=all#block_comment 某筋から聞いて知っていました。4/1にかこつけてこんなのを書いちゃったくらいで (^^; http://d.hatena.ne.jp/kmaebashi/20080401 >しかし、簡単なポインタが分からない人は、表舞台(雑誌とか、本とか)から絶滅したと思っていましたが、まだまだ現役なんですね :-p C自体、うちの会社では使っている部署はどんどん減っているのですが、まだCの記事に需要があるようですね(この記事の出来はさておき)。 「C言語 ポインタ完全制覇」は今度第11刷が出ます(奥付は5月11日)。皆様のおかげです。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1100] まだまだ現役ですね!
投稿者:なかなか
2008/04/02 11:52:14

前橋さんのファンです。一度は書き込んでみたいと思っておりました。(^^;) で、今回は、面白いページがありましたので、ご紹介致します。(既に知っていらっしゃるかもしれませんが・・・) http://builder.japan.zdnet.com/sp/c-programming-language/story/0,3800083430,20370255-2,00.htm?p=3&mode=all#block_comment 最初は単純ミスかとも思いましたが、直せば直すほど馬脚を現していく有様を見ていると、これは「真性」だと思います。 しかし、簡単なポインタが分からない人は、表舞台(雑誌とか、本とか)から絶滅したと思っていましたが、まだまだ現役なんですね :-p
[この投稿を含むスレッドを表示] [この投稿を削除]
[1099] Re:オブジェクト指向でないのは
投稿者:(ぱ)こと管理人
2008/03/20 22:11:43

>JAVAを使っていてわざわざ1クラスのなかに全プログラムを記述するような >ことをせず、クラスに分割していけば自動的にオブジェクト指向になっていく >のではないでしょうか。 Javaで1クラスの中に全プログラムを記述するようなことをする人はめったに いないと思いますが、Cで、関数を複数の.cファイルに分類して書いていった ところで、「オブジェクト指向になっている」とは言わないでしょう。普通は。 そういうことを下記ページに書きました。 http://kmaebashi.com/programmer/object/othello.html、 | しかし、現状では、カプセル化は実現できていても、オブジェクト指向に | はなっていません。なぜならここにはオブジェクトがいないからです。 >そこで、JAVAのプログラマーであるのに、オブジェクト指向でない >プログラミングの例を示して解説していただければうれしいです。 >ただし初心者や技術不足が原因のしょうもない例ではなくお願いします。 いまどきJavaといえばWebアプリケーションの開発に使うことが多いと思いますが、 たとえばStrutsとJDBCを使うとして、UIの階層はStrutsが提供するクラスを 継承したりして作るかもしれませんが、そこから呼び出されるビジネスロジックの 階層を「staticメソッドの集合体」にするケースは結構あると思いますよ。 それでもJDBCが提供するinterfaceを使っているからオブジェクト指向だ、とか、 UI層ではActionを継承して作っているからオブジェクト指向だ、と主張する のであれば別に止めませんが。 いわゆる業務アプリケーションの開発において、継承やらインタフェースやらを 多用したクラス階層を自分で設計してプログラムを書いていく場面は実はかなり 少ないです。 以前この掲示板ではこんな議論がありました。 http://kmaebashi.com/bbs/list.php?boardid=kmaebashibbs&thread=693 この中で紹介されているhappieさんの意見に、私は大筋で賛成です。 http://happiese.exblog.jp/3127241/
[この投稿を含むスレッドを表示] [この投稿を削除]
[1098] オブジェクト指向でないのは
投稿者:はら
2008/03/19 16:23:20

オブジェクト指向について分かりやすい説明ありがとうございました。CとJAVAの違いで説明されているところで感じたのですが、もともとJAVAでプログラミングしていれば自然にオブジェクト指向になるのではないでしょうか。JAVAを使っていてわざわざ1クラスのなかに全プログラムを記述するようなことをせず、クラスに分割していけば自動的にオブジェクト指向になっていくのではないでしょうか。私の疑問は、JAVAのプログラマーでありながら、オブジェクト指向でないプログラミングをするということの方が難しいのではないかということです。 そこで、JAVAのプログラマーであるのに、オブジェクト指向でないプログラミングの例を示して解説していただければうれしいです。ただし初心者や技術不足が原因のしょうもない例ではなくお願いします。しょうもない例というのは、Newのタイミングを間違えるとかそういう例です。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1097] Re:「体当たり学習」について
投稿者:(ぱ)こと管理人
2008/02/25 01:41:53

>結果として、このプログラムは一見正常に動きますが、 >再入力の場合に限り字数チェックが行なわれない、という奇妙な仕様になっています。 ご指摘ありがとうございます。コーディングの方針とかスタイルとか そういう話ではなく、再入力のときBOOK_NAME_LEN等より長い文字列を 入力すると領域破壊を起こしますから、これは致命的ですね。 こういうバグが入った経緯はさすがに思い出せませんが、正誤表に追加しておきました。 えー、他にもまだあるようでしたら(と書くのも怖いのですが、間違いは間違いとして 正誤表に載せておきたいと思いますので)
[この投稿を含むスレッドを表示] [この投稿を削除]
[1096] Re:「体当たり学習」について
投稿者:yuya
2008/02/21 18:14:31

ご確認ありがとうございました。 > (まだあるようでしたらぜひお願いします)。 というお言葉に甘えて、連投ヒンシュク覚悟で……。 【7】 蔵書管理プログラム配列版(p243~のList5-12)において、 「再入力機能」のコード(reinput系統の関数)に納得しかねる点があります。 input_string() と input_number() とは、文字列と数値の違いこそあれ、 ともに「新規入力処理」として並立した存在です。 両者の冒頭には共通の一行入力処理(+α)が fgets() を使って書かれており、 これらはのちに input_line() として切り出されることになります。 そして、この2者に再入力機能(つまり改行だけが入力された場合の処理)を付け加えたものが それぞれ reinput_string() と reinput_number() であるはずですよね。 しかし、再入力に際して input_line() 相当の処理を書くべきところには、ともに input_string(buf, 1024, stdin); と書かれています。これは不合理ではないでしょうか? 配列版での文字列入力は字数制限を伴うため、 新規入力では input_data() が input_string() に上限を渡してチェックさせています。 一方、再入力では reinput_data() がいったん reinput_string() を呼び出し、 その中で上限を1024にして input_string() を呼び出しており、不可解です。 そもそも reinput_string() 自体が上限を引数にとらないので、 reinput_data() から渡せなくなっていますね。 結果として、このプログラムは一見正常に動きますが、 再入力の場合に限り字数チェックが行なわれない、という奇妙な仕様になっています。 全くの憶測ですが、以下のような経緯は考えられないでしょうか? | 配列版を執筆している段階では、まだ再入力機能は無かった。 | 動的メモリ確保版に入り、再入力機能を持たせた。 | この機能を配列版でも使えるように、List5-12(p243~)にさかのぼって、 | reinput_string() 、reinput_number() 、および reinput_data() を付け加えた。 | このとき、配列版特有の字数制限への対応を行なわなかった。 | また、reinput_string() 、reinput_number() では input_line() を呼び出す必要があるが、 | 配列版ではこの関数をまだ切り出していなかったので、関数名だけ reinput_string() に置き換えた。 見当はずれだったら赤っ恥ですが(^^;)
[この投稿を含むスレッドを表示] [この投稿を削除]
[1095] Re:「体当たり学習」について
投稿者:(ぱ)こと管理人
2008/02/19 01:51:20

お返事が大変遅くなりまして申し訳ありません。 >【6】 >3-3の detab.c についてなのですが、p141に (中略) >do{ > putchar(' '); > char_count++; >} while(char_count % TABSTOP != 0); > >で済ませてしまうと思います。 う。これは確かにこれで動きますし、こちらの方がシンプルですね。 「体当たり学習」のサンプルソースがなぜああなっているかについてですが、単純に思いつかなかったのかもしれません。ひょっとすると「出力すべきスペースの数を算出する」→「その数のスペースを出力する」と段階を追って考えたほうがわかりやすいのでは、と思った、という可能性はありますが… いずれにせよすでに記憶の彼方です。すみません。 なお、限りなく手抜きな対応ですみませんが、ここでのやり取りを、下記補足ページに転記させていただきました。 http://kmaebashi.com/taiatari/hosoku.html いろいろとご指摘いただきありがとうございました(まだあるようでしたらぜひお願いします)。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1094] 管理者により削除されました
2008/02/19 01:33:56

この2008/02/18 19:16:57の投稿は、 意味不明の投稿だったので削除しました。
[この投稿を含むスレッドを表示]
[1093] Re:「体当たり学習」について
投稿者:yuya
2008/02/16 18:21:13

丁寧にお返事いただき、ありがとうございます。 【2】 > 私は、習慣的にマクロで値を定義するときは括弧で囲んでいます。 > 演算子等を含むと括弧が必要だったりしますから常に入れているというだけで、 > この場合は実用的な意味はあまりないですが。 了解しました。ただ、括弧のない箇所もたくさんあったので(p111など)、 統一性の観点から指摘させていただきました。 【4】 > たしかに対象読者を考えると厳しい気がします。 私自身、初心者に毛が生えた程度なわけですが、 率直に言って、この部分を見たとき、頭がこんがらかっちゃったんですよね。 「何をやっているか」は分かったものの、 「これで万事うまくいく」という確信がすぐには持てませんでした。 なんでスッと頭に入らなかったのか考えてみると、 (ア) ファイルを開く→書き込む→閉じるという順番でしかモノが考えられない(私が) (イ) 「初め」の処理だけ特別扱いされている の2点が原因になっているように思います。 (ア)な初心者としては、下のような手順が素朴に思い浮かびます。 ------------------------------------------------------------------ while(){ 書きかけの出力ファイルがなければ、新しいファイルを開く 文字を書き込む 出力ファイルが一杯になったら、ファイルを閉じる } 最後の出力ファイルが中途半端なサイズで終わっていたら、それを閉じる ------------------------------------------------------------------ つまり、 FILE *out_fp = NULL; while((ch = getc(in_fp)) != EOF){ if(out_fp == NULL){ out_fp = fopen(......); ...... } putc(ch, out_fp); total_size++; if(total_size % OUT_FILE_SIZE == 0){ fclose(out_fp); out_fp = NULL; } } if(out_fp != NULL){ /* ここでは入力ファイルが空の場合だけでなく、 出力ファイルのキリのいいところで終わったときも NULLになる */ fclose(out_fp); } てな構成にすれば、(イ)も自然に解消されるのではないでしょうか。 ……と思って上のソースを見直すと、whileループの末尾と(次の回の)先頭で、 ほとんど同じ条件判断を行っていて非効率ですね(^^;) ほかにも私の気づいていない問題点があるかもしれません。 【5】 > 動くか動かないかという点では動きますし、出力用のファイルポインタと > 読み込み用のファイルポインタを比べると、読み込み用の方がfclose()しなくても > 害が少ないわけですが(書きかけで異常終了すると変なファイルができる可能性が > 高いですが、読み込みならまず大丈夫)行儀としては閉じた方がよいかと思います。 > # ただ、このレベルなら、やっぱり実用上「どっちでもいい」と言ってしまいそうです。 > # 私の場合。 こちらもよく理解できました。ありがとうございます。 風邪をひかれているのに申し訳ないのですが、もう一点、よろしいでしょうか。 【6】 3-3の detab.c についてなのですが、p141に > タブストップが8の時、タブは、「その行の出力文字の総数が8の倍数になるまで」空白を出力します。 とあり、まさにタブの動作はこれで言い尽くされていると思います。 私の場合、単純にこれをそっくりそのままコードに翻訳することを考えてしまうわけですが、 そうすると例えば do{ putchar(' '); char_count++; } while(char_count % TABSTOP != 0); で済ませてしまうと思います。 これも素人ゆえの感想かもしれませんが、「出力すべきスペースの数を算出する」という方法は、 なんだか必要以上に事を複雑にしているように映ってしまうのですが、いかがでしょうか。 どうも勝手なことばかり長々と書き散らしてすみません。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1092] Re:「体当たり学習」について
投稿者:(ぱ)こと管理人
2008/02/13 02:18:02

どうもです。いろいろご指摘ありがとうございます。 >【1】第1章の本文に「BMI指数」という表現がありますが、 >body mass indexの「index」は「指数」なので、 >単に「BMI」でいいのではないでしょうか? そうですね。「IT技術」的なことをやってしまっています。 >【2】p105・List2-8(my_sort5.c)・4行目および >p180・List4-2(my_sort6.c)・4行目が > >#define SCORE_ARRAY_SIZE (100) > >となっていますが、この「100」を囲む括弧は意図されたものでしょうか? 私は、習慣的にマクロで値を定義するときは括弧で囲んでいます。 演算子等を含むと括弧が必要だったりしますから常に入れているというだけで、 この場合は実用的な意味はあまりないですが。 >【3】正誤表 >http://kmaebashi.com/taiatari/seigo.html >のp102およびp103に言及している箇所で、ともに >「1手順ごとに『ソートずみの範囲』はひとつづつ増えていきます。」 >という、全く同じ注釈が付いています。 >これは本来p102のほうだけに付けることを意図していた、 という可能性はないでしょうか? これはp102の方のHTMLを書いてから、それをコピペしてp103の方を作って、 消し忘れたようです。 >| 最後に開いた出力ファイルを閉じる。 >| ただし入力ファイルが空で、いきなりEOFに出くわして >| whileループを一度も回さずに脱出したときだけは、閉じるべき出力ファイルがない。 >| このときはout_fpが(10行目の定義によって)NULLに初期化されたままのはず。 >| よって、out_fp != NULL のときのみ、クローズ処理を行う。 > >という解釈でよいのでしょうか? >コメントがないと対象読者には分かりにくいような気もしますが……。 37行の「さっきまでオープンしていたファイルを閉じる」というコメントから、 while () { さっきまでオープンしていたファイルを閉じて、  次のファイルを開く } 最後に開いたファイルを閉じる という構造になっているのはわかってほしいと…あとは、どういう場合に out_fpがNULLでループを抜けるかですが、ループの中(しかもif文の中)で 閉じて開いている以上、NULLでここに落ちてくる可能性には直感で気づいてほしい… という気はしますが、たしかに対象読者を考えると厳しい気がします。 >【5】p148の本文で、「使い終わったファイルはクローズしておいたほうがよい」とあります。 >p158~p159・List3-7(my_split.c)やp168・List3-10(textdump.c)などでは >読み込み用に開いたファイルのクローズ処理が書かれていませんが、別に構わないでしょうか? 動くか動かないかという点では動きますし、出力用のファイルポインタと 読み込み用のファイルポインタを比べると、読み込み用の方がfclose()しなくても 害が少ないわけですが(書きかけで異常終了すると変なファイルができる可能性が 高いですが、読み込みならまず大丈夫)行儀としては閉じた方がよいかと思います。 # ただ、このレベルなら、やっぱり実用上「どっちでもいい」と言ってしまいそうです。 # 私の場合。 今日は遅いですし私は現在風邪ひきですのでアレですが、後日何らかの形で Web上で対応させていただきます。 いろいろご指摘ありがとうございました。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1091] 「体当たり学習」について
投稿者:yuya
2008/02/12 18:06:29

こんにちは。 「C言語体当たり学習徹底入門」を読み返しています。 お手数ですが、いくつか確認させてください。 【1】第1章の本文に「BMI指数」という表現がありますが、 body mass indexの「index」は「指数」なので、 単に「BMI」でいいのではないでしょうか? 【2】p105・List2-8(my_sort5.c)・4行目および p180・List4-2(my_sort6.c)・4行目が #define SCORE_ARRAY_SIZE (100) となっていますが、この「100」を囲む括弧は意図されたものでしょうか? 【3】正誤表 http://kmaebashi.com/taiatari/seigo.html のp102およびp103に言及している箇所で、ともに 「1手順ごとに『ソートずみの範囲』はひとつづつ増えていきます。」 という、全く同じ注釈が付いています。 これは本来p102のほうだけに付けることを意図していた、 という可能性はないでしょうか? 【4】p159・List3-7(my_split.c)・55~57行目の if(out_fp != NULL){ fclose(out_fp); } は、 | 最後に開いた出力ファイルを閉じる。 | ただし入力ファイルが空で、いきなりEOFに出くわして | whileループを一度も回さずに脱出したときだけは、閉じるべき出力ファイルがない。 | このときはout_fpが(10行目の定義によって)NULLに初期化されたままのはず。 | よって、out_fp != NULL のときのみ、クローズ処理を行う。 という解釈でよいのでしょうか? コメントがないと対象読者には分かりにくいような気もしますが……。 【5】p148の本文で、「使い終わったファイルはクローズしておいたほうがよい」とあります。 p158~p159・List3-7(my_split.c)やp168・List3-10(textdump.c)などでは 読み込み用に開いたファイルのクローズ処理が書かれていませんが、別に構わないでしょうか?
[この投稿を含むスレッドを表示] [この投稿を削除]
[1089] はじめまして
投稿者:hrkn
2008/02/10 05:37:23

検索から来ました。参考になります!
[この投稿を含むスレッドを表示] [この投稿を削除]
[1088] Re:変数の宣言
投稿者:(ぱ)こと管理人
2008/02/07 03:36:22

>http://www.atmarkit.co.jp/fjava/rensai2/javaent04/javaent04.html >などを読むと、意識すると理解がより深まるのかなぁ、なんて最近思っています。 おおっ、これはっ! 前後を見ると、「制御構造」もやらないうちからいきなりメモリの話かよ、と思うわけで、説明の方法としては(私の感覚では)同意しかねますが、継承を説明するのにメモリ上の配置から入るのは合理的なんじゃないかと私は思っています。私が継承を理解したのは、Cで無理やり継承を実現したXtがきっかけでしたから。 http://kmaebashi.com/programmer/c_yota/inherit.html yuyaさんもおっしゃるように、具体的な方から攻めていかないと理解できないことは多いと思います。私も「人間、誰だって、低レベルな概念の方が理解が早い」とあちこちに書いています。 と思って今Googleしてみたら http://d.hatena.ne.jp/yaneurao/20060511 | 私はもともとコンパイラやそういう低レベルの実装の話が好きだから | そういう勉強の仕方をするのだが、このへんはあまり共感が得られないかも知れない。 あれ? いやまあコンパイラは置いといて、メモリモデルについては、ちょっとプログラミングをかじった人はなんとなく頭にあって、だからこそ、仮想メモリとかを教えるとびっくりする、という認識があったのですが…
[この投稿を含むスレッドを表示] [この投稿を削除]
[1087] Re:変数の宣言
投稿者:yuya
2008/02/06 00:53:43

>大学生に教える機会が多いのですが、何をどの程度教えればよいか、 >こんなことを気に留めながら、試行錯誤しています。 イマサラな意見で恐縮ですが……。 抽象的なことを理解するには、やっぱり具体的なものを ほんの一部でもいいので徹底的に解剖してみて、 そのあとで再び抽象化する、という過程を踏まないと、 きちんと理解できない(少なくとも私は理解した気になれない)と思います。 「木を見て森を見ず」は確かに良くないけれど、 一本も木を見たことのない人がそれを言っても説得力がないなぁ、というところでしょうか。 具体例を経験した後は、こんどはその経験が足枷にならないように 抽象化(文字通り、対象のエッセンスを抽出する)しないといけないのが難しいところですが。 前橋さんの[1085]の解説は、 Cの規格上は必ずしもそのように実装しなければならないわけではない、ということを承知の上で、 あえて一般的な実装(具体例)の詳細にまで踏み込んでいらっしゃる、 という点に、ひげおやじさんは留意しておかれるとよいと思います。 # あ、今年もよろしくお願いします。 > 皆様
[この投稿を含むスレッドを表示] [この投稿を削除]
[1086] Re:変数の宣言
投稿者:ひげおやじ
2008/02/06 00:19:01

たいへん丁寧なご説明ありがとうございます。感謝しております。 未だ「処理系の実装」を想像できるほど物を知っているわけでは ないのですが、理解を深めるのに意識しながら今後勉強して行きたいと 思います。 ちなみに、メモリを意識せずにプログラミングを自力で作成できるように なるのが良いのかもしれませんが、Javaでの継承がメモリモデルを使って 解説してある記事 http://www.atmarkit.co.jp/fjava/rensai2/javaent04/javaent04.html などを読むと、意識すると理解がより深まるのかなぁ、なんて最近思っています。 大学生に教える機会が多いのですが、何をどの程度教えればよいか、 こんなことを気に留めながら、試行錯誤しています。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1085] Re:変数の宣言
投稿者:(ぱ)こと管理人
2008/02/04 01:35:25

>>このへんから、 >>・静的型言語 >>・実行時に型を持つ言語 >>・アセンブラみたいな、本当に型のない言語 >>あたりの対比につながると面白いのかな、と思いつつ、 ええと、すみません、そんなたいした話ではないのですが。 たとえばCで、 int a; という(定義を兼ねた)宣言があったとき、これは >(1)変数xの内容を読んだり書いたりするときには、型Tに合った メモリの使い方に従います。 >(2)(1)、かつ、変数xのメモリ領域を型Tに対応するサイズだけ確保する。 この(1), (2)の両方を意味しますが、(1)の意味で効いてくるのはコンパイル時であり、(2)は実行時なんですよね(細かく言えば、staticでないローカル変数なら関数突入時、グローバル変数なら実行開始時)。 もちろんCではintとdoubleとでは普通はサイズが違いますから、「型Tに対応するサイズだけ確保する」ためには型を知らなければならないように思いますが、実際には「intのローカル変数ふたつ」であっても「doubleのローカル変数ひとつ」であっても、実行時の機械語コードは「スタックに領域を8バイト分確保する」となっている(※1)だけで、細かい型までは意識していません。 構造体定義にしても、 typedef struct { double x; double y; } Point; と書いたとして、Cでは、この型定義の情報はコンパイルされた機械語コードには残っていません。Point型の変数pがあったとき、p.yという記述は、「pの先頭アドレスから8バイト(※1)ずれたところを参照する」という機械語コードに変換されるのであって、「メンバyを参照する」ということは実行時には意識していません。 Javaあたりだと微妙に話が違って、リフレクション用にクラスの情報を保持しておく必要はありますし、バイトコード中に「メンバy」という情報は残っていますが、「メンバy」という情報はロード時にオフセット参照に変換されるはずです(JITがなかったとしても)。 静的型言語だとこんな感じですが、型なし言語であるRubyとかcrowbarでは、 a = 10; で変数が宣言されます。JavaScriptなら var a; でしょうか。これはひげおやじさんのおっしゃるところの(2)を、実行時に行っています(※2)。ただし「a = 10;」の実行のあとで「a = "abc";」と書くのも許されます。これは、整数型も文字列型も(変数aのレベルでは)同じサイズで表現されるためです。また、オブジェクトのメンバを参照するためa.yと書いてあったとき、aの型は実行時までわかりません(aにyというメンバがあるかどうかさえも)。よってひげおやじさんがおっしゃるところの(1)は、aという変数が宣言されたさらに後、まさにその変数を使うときに判定されるわけです。 「アセンブラみたいな、本当に型のない言語」は、例としてはたとえば(Cの前身である)Bなんかがそうでしょう。Bでは auto a; で変数が宣言できるようですが(※3)、なにしろBには型がないというか、intとポインタ(アドレス)は同じ型でそれ以外の型はなかったわけですから、「auto a;」は(2)の意味しか持ち得ません。 ……ええと、なんというかあまり面白い話にはならなかった気がしますが、ひげおやじさんもおそらく哲学論議がしたいわけではないと思いますから、ここはひとつ「言語を作ってみる」…とまではいかなくても処理系の実装を想像してみる、というのはいかがでしょうか(と、「プログラミング言語を作る」の宣伝につなげてみる)。 とか言いつつ、静的言語であるDiksamは、いまだにクラス部分が公開できてないわけですが。秋ごろから一応クラスやポリモルフィズムは動いていて、ただいろいろな意味で中身がぐちゃぐちゃで、作業時間が全然(本当に全然)取れないので進んでいないのですが。 ※1)intが4バイト、doubleが8バイトの処理系を想定しています。 ※2)Rubyの変数の宣言は厳密には「代入文が実行されたとき」ではないのですが、ここでは置いておきます。 ※3) http://cm.bell-labs.com/cm/cs/who/dmr/kbman.html
[この投稿を含むスレッドを表示] [この投稿を削除]
[1084] Re:変数の宣言
投稿者:ひげおやじ
2008/02/02 15:56:57

ご返答ありがとうございます。 >なんというか、ご質問は、その指すところが曖昧で、(失礼ながら)初心者がワケわかんなくなった上での質問のように一見すると見えて、「774RRさんいきなりそんな話をされても」とか書くべきかと酔っ払った頭で一瞬思ったのですが。 まさにその初心者で、自分で頭の整理ができなくて質問してしまったようなところです。 結局は、変数の「宣言」と「定義」の違いをきちんと認識するのが不足していた と自分では省みています。(質問にもその認識不足がにじみでていたな、とも。) それだけではないのかもしれませんが・・・。 >ヒントになるかもしれないこととしては、 > >typedef struct { > double x; > double y; >} Point; > >と書いたとき、これだけでは単なる型宣言なのでメモリはまったく確保しませんが、上記(1)で言うところの型Tを定義する意味は持っているわけですよね。 これって、Javaのabstract class や interfaceなどでも同じことが当てはまるんでしょうか。浅はかな知識だけで、この質問も曖昧かもしれなく、すいません。 >このへんから、 >・静的型言語 >・実行時に型を持つ言語 >・アセンブラみたいな、本当に型のない言語 >あたりの対比につながると面白いのかな、と思いつつ、 可能ならば、この続きを教えていただければと存じます、触りだけでも。 宜しくお願い致します。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1083] Re:変数の宣言
投稿者:(ぱ)こと管理人
2008/02/02 05:43:38

どうもです。 >プログラムで、変数を宣言する文は、プログラムを実行した >ときのパソコンのどんな動作に対応するのでしょうか。 なんというか、ご質問は、その指すところが曖昧で、(失礼ながら)初心者がワケわかんなくなった上での質問のように一見すると見えて、「774RRさんいきなりそんな話をされても」とか書くべきかと酔っ払った頭で一瞬思ったのですが。 >(1)変数xの内容を読んだり書いたりするときには、型Tに合った >メモリの使い方に従います。 >(2)(1)、かつ、変数xのメモリ領域を型Tに対応するサイズだけ確保する。 この(1)と(2)は、変数の宣言の二面性をかなり明確に意識しているように思います(だからこそ774RRさんのご回答がこの区分にきっちり一致しているわけで)。 今は酔っ払っているので頭回ってませんが、ヒントになるかもしれないこととしては、 typedef struct { double x; double y; } Point; と書いたとき、これだけでは単なる型宣言なのでメモリはまったく確保しませんが、上記(1)で言うところの型Tを定義する意味は持っているわけですよね。 このへんから、 ・静的型言語 ・実行時に型を持つ言語 ・アセンブラみたいな、本当に型のない言語 あたりの対比につながると面白いのかな、と思いつつ、すみませんもう寝ますおやすみなさい。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1082] Re:変数の宣言
投稿者:774RR
2008/02/01 22:20:46

>また、言語によって違ったりするんでしょうか。 世の中にはプログラミング言語など星の数ほどあるので、違ったりするだろうな それだと答えに困るので、とりあえず C C++ の類に限定すると メモリ という言葉をより広義の「記憶域」と読み替えて (1) Yes (2) 宣言が同時に定義となる場合には Yes 変数は狭義の「メモリ」つまり、俗に言う RAM に置かれるとは限らなくて もっと高速にアクセスできる「レジスタ」に置かれる場合もあるわけだ。 レジスタとメモリ(とその他変数に使えそうなもの)を称して記憶域という (1)(2)のあわせ技から以下のようなバグが発生することがあるので注意だな 「定義にならない宣言」と「定義になる宣言」が矛盾する場合におかしなことになる ---a.c--- extern int wrong_declared_variable; // declaration without definition ... wrong_declared_variable=0; // may destroy other variables ---b.c--- char wrong_declared_variable; // declaration with definition
[この投稿を含むスレッドを表示] [この投稿を削除]
[1081] 変数の宣言
投稿者:ひげおやじ
2008/01/31 20:39:14

お世話になります。 プログラムで、変数を宣言する文は、プログラムを実行した ときのパソコンのどんな動作に対応するのでしょうか。 変数xをある型Tで宣言するのは、次のいずれかなんじゃないかなぁ、 なんて自分では推測しているのですが。 (1)変数xの内容を読んだり書いたりするときには、型Tに合った メモリの使い方に従います。 (2)(1)、かつ、変数xのメモリ領域を型Tに対応するサイズだけ確保する。 (3)(1)、(2)以外。 どれが正解なんでしょう。それとも正解はないんですかね(^_^; また、言語によって違ったりするんでしょうか。 どなたかご教授いただければ幸いです。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1079] Re:「ほげほげ認証」てすと
投稿者:(ぱ)こと管理人
2008/01/11 01:16:12

>本日は晴天なり すみません、純粋なテスト投稿であればできるだけテスト用掲示板 http://kmaebashi.com/bbs/list.php?boardid=testbbs の方にお願いします。テスト用掲示板にもほげほげ認証は付いています。 …が、今見てみたら、テスト用掲示板にはspamが来てるじゃないですか! 人間がアルバイトで投稿しているのかなあ。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1078] 「ほげほげ認証」てすと
投稿者:
2008/01/10 19:09:28

本日は晴天なり
[この投稿を含むスレッドを表示] [この投稿を削除]
[1077] Re:業務連絡:「ほげほげ認証」を実装しました
投稿者:(ぱ)こと管理人
2008/01/03 09:35:50

>では早速テスト投稿などしてみませう どうも、おひさしぶりです。 # おひさしぶりになってしまったのは掲示板が壊れていたためですね…すみません。 >はたして cgi 君はうまくうごくのであろうか PHPだからcgiではないです、というツッコミはありでしょうか。 ところで、昨日は一晩で14通のspamが来たことを考えると、「ほげほげ認証」は それなりに効果があると思ってよさそうです。もうちょっと続けてみないと なんとも言えませんが。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1076] Re:業務連絡:「ほげほげ認証」を実装しました
投稿者:774RR
2008/01/02 18:56:17

では早速テスト投稿などしてみませう はたして cgi 君はうまくうごくのであろうか
[この投稿を含むスレッドを表示] [この投稿を削除]
[1075] 業務連絡:「ほげほげ認証」を実装しました
投稿者:(ぱ)こと管理人
2008/01/02 16:37:11

掲示板を直したところspamがひどいので、 以下のページで紹介されている「ほげほげ認証」を導入しました。 http://diary.noasobi.net/2006/07/diary_060728a.html お手数をおかけしますが、今後投稿する際は、投稿欄の下のテキストボックスに 「ほげほげ」と入力してください。 こんなのは固定パスワードですし、画面に堂々と出るわけですし、 本来であればCAPTCHAか何かを導入すべきかもしれませんが、 ロボット相手ならそれなりに効果があるんじゃないかなあ、ということで 手抜き実装です。 投稿される方にはひと手間増えて申し訳ありませんが、よろしくお願いいたします。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1074] Re:あけましておめでとうございます(兼業務連絡)
投稿者:(ぱ)こと管理人
2008/01/02 07:33:44

>max(serialid)に置き換えて修復しました。 > >どうりで長いこと投稿がなかったわけだ… で、直したとたんスパム14連発かよ。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1073] あけましておめでとうございます(兼業務連絡)
投稿者:(ぱ)こと管理人
2008/01/01 16:37:06

今年もよろしくお願いいたします。 ……と投稿しようと思ったら、SQLがエラーを吐きました。 スクリプトを見直したら、掲示板ごとの連番を取得するところでcount(*)を使っており、 少し前の広告削除で空き番ができるような物理削除をしていたのでcount(*)で取得した 連番が重複エラーを出していました。センスの悪いSQLを書いてましたね。 max(serialid)に置き換えて修復しました。 どうりで長いこと投稿がなかったわけだ…
[この投稿を含むスレッドを表示] [この投稿を削除]
[1072] Re:ソースコードの単純な誤植
投稿者:(ぱ)こと管理人
2007/10/08 17:32:28

>以下のような文章が出てきます。 >(下2行はいらないでしょうが、一応載せておきますね。) >----- >i686-apple-darwin8-gcc-4.0.1 (GCC) 4.0.1 (Apple Computer, Inc. build 5367) >Copyright (C) 2005 Free Software Foundation, Inc. >This is free software; see the source for copying conditions. There is NO >warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 情報ありがとうございます。 うちのUbuntu Linuxの gcc (GCC) 4.1.2 20060928 (prerelease) (Ubuntu 4.1.1-13ubuntu5) とやらではこの警告は出ないので、4.x系なら出るのかというとそういうわけでも なさそうですね。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1069] Re:ソースコードの単純な誤植
投稿者:cocoatomo
2007/10/08 12:03:36

>gcc --versionで表示されるgccのバージョンは何でしょうか? 以下のような文章が出てきます。 (下2行はいらないでしょうが、一応載せておきますね。) ----- i686-apple-darwin8-gcc-4.0.1 (GCC) 4.0.1 (Apple Computer, Inc. build 5367) Copyright (C) 2005 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. -----
[この投稿を含むスレッドを表示] [この投稿を削除]
[1067] Re:ソースコードの単純な誤植
投稿者:(ぱ)こと管理人
2007/10/08 04:08:04

>----- >mycalc.y:64: warning: incompatible implicit declaration of built-in function 'exit' >----- >と警告が出てしまいます。 「of built-in function 'exit'」つまりexit()を組み込み関数とした上で 警告を出してくれるわけですね。 すみません、よろしければ教えていただきたいのですが、 gcc --versionで表示されるgccのバージョンは何でしょうか? うちのMinGW(gcc (GCC) 3.4.2 (mingw-special))ではこの警告は 出ないようです。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1065] Re:ソースコードの単純な誤植
投稿者:cocoatomo
2007/10/07 06:42:35

はじめまして。 前回の投稿で挨拶をしていなくて、すみませんでした。 >>8行目 >>"}" → "};" >>"union" の宣言の終わりのセミコロンが無い。 > >これですが、ここはもともとセミコロンは不要ではないでしょうか >(bisonで試したところあってもなくても通りましたが)。 はい、自分のところで試してみたところ、セミコロン無しでも通りました。 エラーメッセージを読み間違えたのだと思います。 >>64行目 >>"exit()" を使用しているのに、"stdlib.h" が include されていない。 > >こちらは修正いたしました。 >gccだとexit()は組み込み関数になっていて、-Wallを付けても、stdlib.hをinclude >していない状態でコンパイルエラーにならなくて… というのは言い訳ですね。 私の環境(MacOSX v10.4.10 Darwin 8.10.1?)で gcc -o mycalc y.tab.c lex.yy.c を実行すると ----- mycalc.y:64: warning: incompatible implicit declaration of built-in function 'exit' ----- と警告が出てしまいます。 なので、一応神経質になって include してみた次第です。 # こういう仔細な状況を書き忘れないようにしようとは思うのですが、 # 忘れてしまいます。すみません。 お早い返信ありがとうございました。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1064] Re:ソースコードの単純な誤植
投稿者:(ぱ)こと管理人
2007/10/07 01:26:20

はじめまして。ご報告ありがとうございます。 >8行目 >"}" → "};" >"union" の宣言の終わりのセミコロンが無い。 これですが、ここはもともとセミコロンは不要ではないでしょうか (bisonで試したところあってもなくても通りましたが)。 NUTSHELLの本でも、以下のサンプルでもセミコロンは付いていませんし。 http://www.linux.or.jp/JF/JFdocs/Lex-YACC-HOWTO-6.html#ss6.3 >64行目 >"exit()" を使用しているのに、"stdlib.h" が include されていない。 こちらは修正いたしました。 gccだとexit()は組み込み関数になっていて、-Wallを付けても、stdlib.hをinclude していない状態でコンパイルエラーにならなくて… というのは言い訳ですね。 実は現在公開しているcrowbarやDikamでも同様の問題があり、最近ようやく -ansiオプションを付けました。次バージョンから修正します。 >私は2行目と3行目の間に "#include <stdlib.h>" という行を挿入したのですが、 >これでいいのでしょうか? それでOKです。 ご報告いただきありがとうございました。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1063] ソースコードの単純な誤植
投稿者:cocoatomo
2007/10/06 02:25:44

リンクされているページのソースコード"mycalc.y"に誤りがありましたので、報告いたします。 8行目 "}" → "};" "union" の宣言の終わりのセミコロンが無い。 64行目 "exit()" を使用しているのに、"stdlib.h" が include されていない。 私は2行目と3行目の間に "#include <stdlib.h>" という行を挿入したのですが、これでいいのでしょうか?
[この投稿を含むスレッドを表示] [この投稿を削除]
[1062] 管理者により削除されました
2007/10/04 12:46:19

広告なので削除。 管理者削除がたまってきたのでそろそろDBから物理削除します。
[この投稿を含むスレッドを表示]
[1061] 管理者により削除されました
2007/10/04 12:45:20

意味不明の投稿につき削除
[この投稿を含むスレッドを表示]
[1060] 管理者により削除されました
2007/09/24 04:57:51

エロ系SPAMにつき削除
[この投稿を含むスレッドを表示]
[1059] 管理者により削除されました
2007/09/24 04:57:25

エロ系SPAMにつき削除
[この投稿を含むスレッドを表示]
[1058] 管理者により削除されました
2007/09/19 08:08:21

広告なので削除しました
[この投稿を含むスレッドを表示]
[1056] 管理者により削除されました
2007/09/12 23:12:53

エロ系SPAMだったので削除しました。
[この投稿を含むスレッドを表示]
[1055] Re:externと「外部結合」
投稿者:yuya
2007/09/06 15:20:34

> Rationaleを見ても、このへんに関する記述は以下の箇所くらいのようです。 > http://www.lysator.liu.se/c/rat/c1.html#3-1-2-2 rationaleにこんな記述があったのですね。ありがとうございます。 > extern int i3 = 3; > これも不可解ですが、これはcommonモデルの方を引き継いだのでしょうかね。 該当箇所をよく読んでみると、列挙されたモデルの4つ目にinitializionモデルというのがあり、 「定義になるかどうか」を初期化子の有無だけで判断するものがあったようですね。 さらにその後には、 (訳) >規格で採用されたモデルは、strict ref/defモデルとinitializationモデルの特徴を組み合わせたものとなっている。 >(略) >しかし、外部定義として働くのは、「初期化」あるいは「記憶域クラス指定子のない特定の宣言」のいずれでもよい。 >このような混合アプローチが選択されたのは、さまざまな環境と既存の実装に可能な限り広範囲に適応するためである。 とあります。これを読む限り、 extern int i3 = 3; の挙動はinitializationモデルを引き継いだ可能性もありそうです。 同モデルの説明のところにはexternの扱いは明記されていないので、少し話がずれているかもしれませんが。 有用な資料の箇所を指し示してくださってありがとうございました。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1054] Re:externと「外部結合」
投稿者:774RR
2007/09/03 15:52:21

C/C++ の予約語に関しては D&E で Stroustrup も書いているんだけど 「新しいキーワードを増やすことは激論を招く」pp.191 C/C++ では同じ予約語を文脈によって異なる意味に使うことで、増やさない選択をした。 違和感の原因はこの辺にありそう。 > 特に「紹介状」は使わせてもらっていいでしょうか。 どーぞご自由に。 <前橋様>すんません、勝手に盛り上がってしまっております。 本来こー言う[俺はこう思う]論は自分で blog 等立てるのが筋なんですが 小心者ですので web は「使う側」に回らせてもらっております。 もう少し掲示板スペースをお貸しください</前橋様>
[この投稿を含むスレッドを表示] [この投稿を削除]
[1053] Re:externと「外部結合」
投稿者:yuya
2007/09/03 14:29:41

▼ > 要するに言語仕様上の extern と、英語の単語 external の不一致に違和感がある > っつーことでっか そうです。すでに決まっちゃったものに文句を言っても仕方ないですが、 「説明するときに名前との関連を前面に出すか、抑えるか」という選択肢は残されています。 そもそも結合は定義サマが決めるのが筋なのであって、 定義でない宣言がいくら結合を声高に主張しても、 「定義との食い違いを処理系に見つけてもらおう」というのでない限り無意味ですよね。 int hoge = 1; static int hoge; でエラーを出してくれるならまだしも、未定義動作ですし。 それならば、「参照に(ほぼ)特化した、結合に関してはオールマイティな」 externのようなキーワードが用意されているのは合理的だと思いますが、 なにもそんな名前じゃなくても良かろう、と思うわけです。 # externは実は外部宣言(external declaration)から来ているのかも、というオチは……。 ▼ > プログラム言語のキーワードをいちいち英語とつき合わせていると違和感ありですな。 > 俺的に一番違和感があるのは const であります。 > const ではなく readonly にしてくれると **俺的には** 解消です。 私もまったく同じように思います。というか、 「文字通りではないことに気付いているかどうか」によって、 理解度が測れてしまうこと自体(Cはこんなのばっかり)、なんて不健全な状況なんだ(^^;) #define INTERN static #define READONLY const ... ▼レベル別教授法はとても参考になりました。 特に「紹介状」は使わせてもらっていいでしょうか。 「エキスパートCプログラミング」には「(定義でない宣言は)税関の申告のようなものだ」とあり、 初めて読んだときは???でしたが。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1052] Re:externと「外部結合」
投稿者:774RR
2007/09/03 11:26:05

ふむー 要するに言語仕様上の extern と、英語の単語 external の不一致に違和感がある っつーことでっか プログラム言語のキーワードをいちいち英語とつき合わせていると違和感ありですな。 俺的に一番違和感があるのは const であります。 const ではなく readonly にしてくれると **俺的には** 解消です。 言語規格書は古い非推奨な書き方してる既存のコードが invalid にならないように 過去との互換性維持のためだけの文言・機能も含んでいるので、そーいうところは 初心者・中級者むけクラスでは一切教えない。教える必要も無い。隠しておくべし。 たとえばいまさら「関数原型宣言にならない関数宣言」など教える必要は一切無い。 「extern があると先行する宣言に従う」はまさにこの黒歴史の部分。初心者に教えるな! # 知っておいて隠しておくのと知らないままでいるのとでは大きく違うのだがね。 extern に関して俺が後輩諸氏に説明するならばレベルに応じ 初心者向け(厳密に宣言を必ず先行させる新しいスタイルのみ教える) ・ヘッダファイル中において変数を宣言する場合には必ず extern を書くべし  →宣言とは他人/自分が [その名前] を使えるようにするものである  →他人の作った未知の関数や変数は使いたくないだろ。だから最低限素性がわからないと困るんだ   だから、ヘッダファイル中には[名前]と「紹介状」を書くべし(=これが宣言) ・他人/自分がその変数を使えるようにするために、定義を1つ .c 中に書くべし  →定義とは [その名前] の変数や関数を作って提供することである  →「紹介状」と実際の人物像が異なると困るだろ、だから紹介状を書く側には責任がある   人間の目でなくコンパイラでチェックできるよう、自作ヘッダは自作ソース中で #include しろ   そーすれば機械が不一致を検出してくれる  →紹介状は複数人で回覧することができる (宣言は複数回あっていい) が、   実際の人物は1人しかいないわけだから定義は1つ。 宣言と定義の簡易解説は必要。詳細解説までは不要。 結合や記憶域期間や可視性、等の詳細については説明不要 (消化不良になるだけ) 中級者向け(旧式の非推奨な書き方してるソースコードには触らせない) ・宣言と定義の詳細解説 ・内部結合と外部結合と無結合の違い  →「原則として」と前置きして extern は外部結合・定義にならない宣言となると解説  (変数宣言に extern があっても定義になりうると話しても混乱を招くだけなので説明しない)  →「原則以外は?」と問われたら上級者向け解説を実施 関数の場合の話を問われたら ・関数宣言と関数定義はソースコード上の記述形式が明確に異なるので区別できるから  extern/static は結合の決定にのみ使われるとフォローし ・static が明記されていない場合は extern が省略されていると解説 (X3010:1993 に準拠) ・これは変数の場合と挙動が異なるぞ、ともフォロー 上級者向け(既存のソースコードのダークサイドまで全部面倒見る人向け) ・言語規格書の章番号+解説 ・相手に興味がありそうで時間もあれば既に書いた俺妄想による Rationale をフォロー
[この投稿を含むスレッドを表示] [この投稿を削除]
[1051] Re:externと「外部結合」
投稿者:yuya
2007/09/02 16:34:38

774RRさん、(ぱ)さん、ありがとうございます。 たくさんコメントをいただいたので、[1045]~[1050]へのリプライは こちらにまとめさせていただきます。 [1048]774RRさん; > ながながと書いたけど結局のところ yuya さんの疑問点は > extern 記憶域指定子はなぜに (6.2.2) のようなヘンな振る舞いをするのか、その根拠やいかに > ということでよろしいのだろうか? [1049](ぱ)さん; >>static int i2 = 2; // 定義,内部結合 >>extern int i2 ; // 内部結合をもつ前の定義を参照する > > この「extern int i2;」の挙動が不可解だということですよね。 > 私にも不可解に見えます。そもそもキーワードの名前が「extern(al)」なのに! 6.2.2のexternの振る舞いが奇妙に映るのは、(ぱ)さんのおっしゃるとおり、 `extern'という、外部結合(external linkage)を想起させる名前によるところが大きいと思います。 いったん名前のことを忘れて、単に 「(翻訳単位内外にかかわらず)どこかで定義されている(かもしれない)変数・関数を参照する」 という機能が主眼だと考えれば、6.2.2の結合の定まり方は、 「可能な限り状況に合わせて結合を決定する」という、ある意味ではきわめて合理的な、 悪く言えば御都合主義的な仕様になっています。 その背景には[1048]・[1050]で774RRさんが書いてくださったような事情があった可能性が高いと思います。 現在の目から見て、初心者に「結局のところexternって何をするんですか?」と聞かれたとき、 最も正しい答えは[1046]でまとめていただいたように規格書の該当箇所を指し示すことだと思いますし、 最終的には本人にそこまで行き着いてもらわないといけないわけですが、 やはり(自分自身の頭を整理するためにも)「何が原則で、何が例外か」という観点で整理したくなり、 できるだけ普遍的な原則・少ない例外で理解できる方法はないだろうか、と思ってしまうわけです。 その過程の中で、歴史的経緯を知ることが原則を抽出する助けになることも多いと思います。 もちろん規格書には「これが原則、これが例外」などということは書かれていませんから、 注意しないと私が陥ったように勝手な行間解釈や俺俺用語を生んでしまうわけですが……。 で、実際にexternに対してそのような整理を試みたとき、ポイントとなる切り口は [1047]でご指摘のとおり「結合は何か」「定義になるかどうか」です。 ここでexternという名前を尊重して、「結合指定」を原則に据えると、 内部結合になるケースを例外と捉え、「定義になるかどうか」は別途論じることになります。 これに対して、「定義にならない」ことを原則に据えると、 (a); 結合は上記のように状況に合わせて定まる。 (b); 何も付けなくても初めから外部結合のブロック外定義になっているもの (関数定義や初期化子つきのブロック外変数定義)だけは、externをつけても定義とみなされる。 extern int hoge = 1; /* 外部結合のブロック外定義 */ と整理することができ、(b)が昔はコンパイルエラーになっていたとなれば、 例外として扱うことへの抵抗が小さくなります。 結局のところ、Cの振る舞いを統一的に理解することなど追求すべきでないのかも知れず、 [1045]774RRさんの > なんか難しく考えすぎなのではないかと思ってきた・・・ が最も正しいような気がしてきました。自覚はあるんですけど(^^;)
[この投稿を含むスレッドを表示] [この投稿を削除]
[1050] Re:externと「外部結合」
投稿者:774RR
2007/09/02 08:31:11

>最初期のCではexternはあってもなくても同じだったらしい 「最初期」をどのくらいまで遡るか次第、だけど 俺妄想だと Kerningham/Ritchie が作った直後のCには、たぶん extern はまったく無かったのだろうと思う。 なおかつリンカーが bss combine を勝手に行ってしまう都合上 ODR は実装したくても実装するすべが無かった。 ----aaa.c---- static int i1; // internal linkage, definition int i2; // external linkage, definition ----bbb.c---- static int i1; // internal linkage, definition, another instance of aaa.c!i1 double i2; // external linkage, definition, different decl of aaa.c!i2 ----bss in a.out--- aaa.c!i1; bbb.c!i1; common!i2; // combined together, uses maximum size bss combine 機能が無いリンカーをもつ処理系に移植する際に困ったので 後付で extern を追加したが、そのときにはすでに extern を持たないCで書かれた ソースコードがたくさんあったので、互換性を維持するには?と考えた結果が今の仕様 あと初期化子の有無で挙動が異なるのも、リンカーの都合 (非0の)初期化子がある=bss に置けない=bss combine が効かない って、これも妄想 歴史家なら、黒歴史を追及するのもまあお仕事ですし、実際面白そうだけど 1ユーザとしては今ある仕様を理解するほうが建設的かなーって思うのであった
[この投稿を含むスレッドを表示] [この投稿を削除]
[1049] Re:externと「外部結合」
投稿者:(ぱ)こと管理人
2007/09/02 00:26:07

えー、一応管理人としては何か言うべきところなんでしょうが、正直、 私にはわかりません。 >6.9.2 外部オブジェクト定義 例1(抜粋) > >static int i2 = 2; // 定義,内部結合 > int i2 ; // 前に内部結合をもつ定義があるため、 > // 結合の不一致が生じ、6.2.2によって > // 動作は未定義となる >extern int i2 ; // 内部結合をもつ前の定義を参照する この「extern int i2;」の挙動が不可解だということですよね。 私にも不可解に見えます。そもそもキーワードの名前が「extern(al)」なのに! Rationaleを見ても、このへんに関する記述は以下の箇所くらいのようです。 http://www.lysator.liu.se/c/rat/c1.html#3-1-2-2 これはこれで興味深いのですが(最初期のCではexternはあってもなくても同じだった らしい)、yuyaさんの疑問の回答にはならないように思います。 Relaxed Ref/Defモデルのところには、 | The appearance of the keyword extern (whether it is used outside of the | scope of a function or not) in a declaration indicates a pure reference | (ref), which does not define storage. (超訳) >externはどっかの定義の参照を意味し、記憶領域の定義ではない。 とあるので、そのモデル(UNIX Cのモデル)を引き継ぐとそういう考え方になるのかなあ、 と思いましたが… UNIX Cにおいてexternが内部結合の定義を参照するような 実装があったのでしょうか。 externは定義にはならない、と考えると extern int i3 = 3; これも不可解ですが、これはcommonモデルの方を引き継いだのでしょうかね。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1048] Re:externと「外部結合」
投稿者:774RR
2007/09/01 23:18:11

ながながと書いたけど結局のところ yuya さんの疑問点は extern 記憶域指定子はなぜに (6.2.2) のようなヘンな振る舞いをするのか、その根拠やいかに ということでよろしいのだろうか? 根拠 (Rationale) は規格書採択の際の委員会議事録などをさがせば出てくるんだろう。 でも俺は規格策定委員でもなんでもないただの1ユーザなのですだ。 そういう議事録みたいなのが公開されていれば誰か探してみてほしい。 まずは検証可能な事実を指摘: この「結合」の振る舞いは JIS X3010:1993 (ISO/IEC 9899:1990) の時点から ほとんど変わっていない。(一部些細な変更があるが今の議論には関係ないところ) 言語規格書ってのは、理想を追求するあまりに今あるユーザー・処理系を無視する わけにはいかない代物なわけだ。 したがって当時1990年頃に書かれていた「一般的なソースコードがすべて不適合」に なるような文言てのは採用するわけには行かない。理想と現実の落としどころが重要になる。 以下は俺の妄想: ヘッダファイルを多重に #include していて include-guard がうまく効いていない、 あるいは、同一大域変数の宣言を複数の別ヘッダファイルが行っている、 そんなソースコードでできたプログラムがあるとして。 #include の結果として、 翻訳単位中に extern の無い大域変数宣言 (要するに外部定義) が先に現れ、 後から extern のある大域変数宣言 (いわゆる変数宣言) が現れる、ような場合であっても うまいことコンパイル&リンクができるようにする必要があった。 すなわち extern 記憶域指定子の振る舞いは JIS X3010:1993 なら 6.1.2.2 JIS X3010:2003 なら 6.2.2 のように定めると都合がよかった。 そーいう話だと思って勝手にコメントしてみたけど、 いや、ずれてる!ということならまたよろしく。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1047] Re:externと「外部結合」
投稿者:774RR
2007/09/01 22:50:45

> そもそもリンケージが翻訳単位外に及ぶ(つまり外部結合)、というのと、 > 宣言が定義を探しに行く範囲が翻訳単位外に及ぶ(extern宣言)、というのは > 分けて考えるべきだと思うのですが、皆様のご意見はいかがでしょうか? この文章の意味が俺には解釈が難しいんだけど、つまるところ規格書が主張してるのは ・extern があれば外部結合になる (6.2.2) ・extern があっても外部結合であるとは限らない(6.2.2) ・extern があれば外部定義にならない(6.7+6.9.2) ・extern があっても外部定義になりうる場合がある(6.9.2) ・プログラム全体の中で現れる、外部結合をもつ同一識別子は、  そのすべての宣言において、同じものを表す (6.2.2) ということ。それ以上でも以下でもなくて、勝手に行間を読んではいけない。 extern 宣言なんて用語は言語規格書には無いわけで、あえて言うなら 「宣言に extern 指定子がある場合」と呼ぶべき。そして、解釈すべきは 「その宣言が同時に定義になるか否か」「その宣言の持つ結合は何か」 だけ。余計なことを考えずに素直に規格書通りにプログラムを読むだけでいい。 俺俺用語を勝手に作ってはいかん。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1046] Re:externと「外部結合」
投稿者:774RR
2007/09/01 22:25:46

このコメントは yuya さんむけというわけではなくて、第三者読者様の参考分として <結合の規則> 6.2.2 識別子の結合 オブジェクトの宣言の場合 (関数には適用されない) ・記憶域クラス指定なし=外部結合 ・static 指定あり=内部結合 ・extern 指定あり  「すでに宣言があって、その宣言で外部結合または内部結合が指定されている」   →その既存の宣言と同じ結合をもつ  「すでに宣言があって、その宣言で無結合が指定されている」または「宣言が無い」   →外部結合 </結合の規則> <宣言> ・無結合の識別子の宣言が同一スコープ内に2つ以上あってはならない </宣言> ということは、外部結合の宣言が2つあってもよいということ。 6.9.2 の例 int i4; // 宣言、外部結合の仮定義 int i4; // 宣言、外部結合の仮定義 extern int i4; // 宣言、既出の結合を採用、この場合は外部結合 static int i5; // 宣言、内部結合の仮定義 extern int i5; // 宣言、既出の結合を採用、この場合は内部結合 6.9.2 に出てない例 (外部定義にならないのでわざと出していない) extern int i6; // 宣言、既出の宣言が無いので外部結合、外部定義にならない (*136) 脚注のとおり、識別子を使わなければ定義は無くてよい
[この投稿を含むスレッドを表示] [この投稿を削除]
[1045] Re:externと「外部結合」
投稿者:774RR
2007/09/01 22:03:00

なんか難しく考えすぎなのではないかと思ってきた・・・ 言語規格書は書いてあるとおりに読めばよくて、勝手に行間を解釈しては誤るよ。 <[外部定義かそうでないか]の解釈> JISX3010:2003 6.9.2 外部オブジェクト定義、で述べられている内容は要約すると ・オブジェクトの外部定義=ファイル有効範囲と初期化子をもつ場合 ・初期化子がなく、記憶域クラスなしか static があるとき=仮定義 ・仮定義が1つ以上あって外部定義が無い場合は、翻訳単位の終了時点で  仮定義を =0 という初期化子を持つ外部定義と読み替える。 以上。 よってここに書いてないものは外部定義ではないっつーことだ。 記憶域クラス指定 extern をもつ宣言についてはここ 6.9.2 では記載が無いので、 外部オブジェクト定義ではない。 > 私は定義ではなく、ただの宣言である。 ここまでは正しい。というか「外部定義にならない宣言である」というべきかな。 > 定義はほかにある そんな勝手な行間を読んではいけない。これに関しては別に規定がきっちりある。 6.9 外部定義、において ・外部結合で宣言した識別子を使用している場合、プログラム全体の中でその識別子に  対する外部定義がちょうど1つなければならない。 ・使用していない場合、1つ以下でなければならない (*136) (*136) 外部結合で宣言した識別子を使用しない場合、その外部定義は必要ない </[外部定義かそうでないか]の解釈>
[この投稿を含むスレッドを表示] [この投稿を削除]
[1044] Re:externと「外部結合」
投稿者:yuya
2007/08/31 10:38:45

774RRさん、ありがとうございます。 0. C限定の話です。 1. はい、ご紹介くださったものと同じものを入手しています(保存も……)。 2. 変数のextern宣言について[1043]で成り立つことは、 関数原型宣言(externをつけてもつけなくても同じですが)についても成り立つと思うので、関数も含む話です。 3. 処理系準拠限定の話です。[1043]の末尾の非準拠の話は、歴史的経緯の手がかりになるかも、と思って付け加えました。 で、この議論に関係する条項は JISX3010:2003 6.2.2 識別子の結合 6.9 外部定義(とくに 6.9.2 外部オブジェクト定義) になると思います。 [1043]の投稿は、[1025]に774RRさんが書かれた > extern の意味するところは[1020]で書いたとおり、結合指定 > (略) > 厳密なところは自分で JIS 言語規格書を参照してもらうとして、簡単に言うなら > extern:外部結合を指定、static:内部結合を指定 というところを読んで、その意味を考えたのがきっかけです。 確かに6.2.2にはextern宣言された識別子の結合が場合分けされて書かれていますが、 よく読むと回りの定義状況に合わせた定まり方になっており、私には(ごく自然な) *結果* と映ります。 だとすると、extern宣言はどんな「結合指定」を担っているのだろう?と疑問に思ったのです。 特に、初期化子のない外部(ブロック外)変数定義・宣言の場合、 externをつけないほうがむしろ積極的に「外部結合」を指定しているように思います。 内容は前回の繰り返しになりますが、規格書で言えば 6.9.2 外部オブジェクト定義 例1(抜粋) static int i2 = 2; // 定義,内部結合 int i2 ; // 前に内部結合をもつ定義があるため、 // 結合の不一致が生じ、6.2.2によって // 動作は未定義となる extern int i2 ; // 内部結合をもつ前の定義を参照する が該当します。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1043] Re:externと「外部結合」
投稿者:774RR
2007/08/30 20:56:28

詳しい議論(重箱の隅ともいう)に入る前に確認事項をいくつか 0.この話は C 限定か?それとも C++ 限定か? 1.言語規格書は読みましたか?今手元にありますか? (C89 なら JIS X3010:1993 ないし ISO/IEC 9899:1990) (C99 なら JIS X3010:2003 ないし ISO/IEC 9899:1999) (C++ なら JIS X3014:2003 ないし ISO/IEC 14882:2003) 2.変数の話限定か?それとも関数も含むか? 3.規格非準拠の処理系の話も含むか?規格書採択前を含むか? 規格非準拠の処理系の話ならパスします(きりがないので) C/C++ 言語規格書が無いのであればお話にならないです。げっちゅしてください。 http://www.jisc.go.jp/ から*閲覧*が可能です (小細工すれば保存もゲフゲフ) 検索が効かないので役に立ちませんが、無いよりは無限大にマシです。 んで、疑問に思われる/わからないところを具体的に条項番号を挙げて話してください。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1042] externと「外部結合」
投稿者:yuya
2007/08/30 16:42:41

別スレッドを立てました。 externと「外部結合」については以前から私の悩みの種で、 現時点で以下のように理解しているのですが、問題がないかどうか、よろしければご意見をお聞かせください。 以下、すべてブロック外の話で、「宣言」とは「定義でない宣言」を指すとします。 extern宣言は、同一翻訳単位内にすでに定義があれば、その結合に従った宣言となります。 定義がなければ他の翻訳単位に定義があるだろうと仮定して、 それに対応する宣言になろうとします(この場合には、状況から外部結合しかあり得ません)。 このようにextern宣言の振る舞いを見ると、externは 「近いところから順に定義を探し、状況に合わせて(きわめて自然に)結合が定まる」 宣言であると考えられます。 もちろん、実際にはほとんどのケースで外部結合になり、 内部結合になるのは同一翻訳単位内にstatic定義がある場合だけですが、 これを「例外」と捉えるよりも、上記のように結合が定まると考えたほうが良いように思います。 初期化子のない変数定義・宣言を考えたとき、記憶クラス指定子をつけなければ外部結合の仮定義になりますが、 これが(他に定義があるために)宣言に成り下がった場合でも、外部結合であることは動きません。 したがって、 static int hoge = 1; /* 定義(内部結合) */ int hoge; /* 仮定義(外部結合)、ここでは宣言になるが、結合指定が定義と矛盾する */ は未定義動作になります。これに対し、2行目にexternをつけた static int hoge = 1; /* 定義(内部結合) */ extern int hoge; /* 宣言(結合は状況に応じる)、ここでは定義に従い内部結合となる */ は問題ありません(ソースを比較すると、後者のほうが「問題あり」に見えてしまいますが)。 これを「結合」という観点から見ると、「絶対に外部結合」だったものが、 externを付けることで「結合は状況に合わせる」に変わっています。 ではexternの実際の機能は何かというと、 「私は定義ではなく、ただの宣言である。定義はほかにある」ことを明示することにあります。 [1024]ひげおやじさんの > 「別のところにあるのを宣言する」ってのはexternの本質を表していないのですね。 において、「別のところ」というのが「翻訳単位外」を指しているならば、確かに誤りです。 しかし、その「誤りである理由」は、「外部結合が『翻訳単位内も含む』概念だから」ではなく、 「externが(結合とは無関係に)翻訳単位内外両方に定義を探しに行くから」ではないでしょうか。 そもそもリンケージが翻訳単位外に及ぶ(つまり外部結合)、というのと、 宣言が定義を探しに行く範囲が翻訳単位外に及ぶ(extern宣言)、というのは 分けて考えるべきだと思うのですが、皆様のご意見はいかがでしょうか? なお、ブロック外において明らかに定義と分かるもの(関数定義や、初期化子の付いた変数定義)に externが付いた場合、外部結合になりますね(付けなくても同じですが)。 この場合はexternが文字通り「外部結合」を意味していると考えられますが、 ANSI以前はコンパイルエラーになっていたと聞いたことがあります。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1041] 管理者により削除されました
2007/08/30 03:03:40

引用のみの投稿だったため削除しました。
[この投稿を含むスレッドを表示]
[1040] 管理者により削除されました
2007/08/30 03:04:15

引用のみの投稿だったため削除しました。 …ていうか何の嫌がらせよ。
[この投稿を含むスレッドを表示]
[1039] Re:externについて
投稿者:(ぱ)こと管理人
2007/08/29 00:34:30

>この小細工を施したヘッダを『すでに定義を書いてあるファイル』に >インクルードしているようなソースが世の中に(けっこう)存在する > >という大前提がありますよね。 えっ? …と読み返したら、yuyaさんの[1034]には確かにそう書いてありました。 (すみません、よく読んでませんでした) この小細工を使うときには、.cにはそもそも定義を書かないと思います。 .cに定義を書いたらメリットがまったくありませんので。 >>・この小細工は、(1)の問題の解決には役に立たない >えーと、これは「小細工を施してもコンパイラはチェックしてくれない」と >いう意味ではなく、「チェックしてくれるのは小細工のおかげではない」と >いう意味ですよね? そうです。 小細工を行わないとき、方法はふたつあって、[1037]で言うところの a)defvar.cに定義を書き、extern.hに宣言を書く。  defvar.cではextern.hを#includeする。 b)defvar.cに定義を書き、extern.hに宣言を書く。  defvar.cではextern.hを#includeしない。 a)なら型チェックが効きますが、b)では効きません。 774RRさんがおっしゃるような、 >この小細工はexternとは同一翻訳単位外のものを取り扱うものだと >「誤解したプログラマ なら、a)はそもそも書けないと思い込んでいるから、型チェックのため 小細工を行った、というのが、私が書いた 「(1)を問題視したプログラマがこの小細工を使った」 の意図です。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1038] Re:externについて
投稿者:yuya
2007/08/28 07:16:42

どうも自分が議論について行っているつもりで 実は勘違いしているような気がしてきて不安なのですが……。 まず、この議論には この小細工を施したヘッダを『すでに定義を書いてあるファイル』に インクルードしているようなソースが世の中に(けっこう)存在する という大前提がありますよね。その上での話ですが、 > 774RRさんの説は、(1)を問題視したプログラマがこの小細工を使った、 > というものですよね。(2)はいずれにせよ問題になるんですから。 確かに宣言自体を削らずにわざわざexternだけ削っているということは コンパイラのチェックを気にしているとも考えられますが、 単に「ここではまずいから、externを削っとこう」くらいの人もいるような気がします。 誰かが(2)の目的で書いたものを見て、 主旨を誤解して使っている(で、同じことをばっちり2回書いている)というのは あり得そうですね。 >・この小細工は、(1)の問題の解決には役に立たない えーと、これは「小細工を施してもコンパイラはチェックしてくれない」という意味ではなく、 「チェックしてくれるのは小細工のおかげではない」という意味ですよね?
[この投稿を含むスレッドを表示] [この投稿を削除]
[1037] Re:externについて
投稿者:(ぱ)こと管理人
2007/08/28 01:38:14

山奥に旅に出ているうちに掲示板が進んでました。 >この小細工はexternとは同一翻訳単位外のものを取り扱うものだと >「誤解したプログラマが」書いてたもので >言語仕様を理解していたプログラマなら書かない代物。 どうでしょうか。私が最初にコレ↓を書いた時点では、 http://kmaebashi.com/programmer/pointer.html 細かい仕様を理解していたかどうかはともかく、extern付きのとそうでないのを 同一コンパイル単位に書いてよい、ということは経験から知っていたと思いますよ (昔のことですし、証拠を出せといわれても困りますが)。 ていうか、変数定義を入れたdefvar.cとextern宣言を入れたextern.hがあったとして、 defvar.cだけextern.hを#includeしないことは容易です。 その場合嬉しくないこととしては以下の2点があって、 (1)defvar.cとextern.hの間でコンパイラのチェックが働かなくなる。 (2)似たようなことを2箇所に書かなければならない。 774RRさんの説は、(1)を問題視したプログラマがこの小細工を使った、 というものですよね。(2)はいずれにせよ問題になるんですから。 (1)の問題は、int hoge[100];とint *hoge;みたいな問題を起こすので 確かに恐ろしいんですが、(2)の問題も存在するわけですから、 (1)の問題のため「だけ」にこの小細工が使われた、というのは無理があるように 思います。 ・この小細工は、(1)の問題の解決には役に立たない(役に立つと思っている  人がいるとしたら、Cの仕様を知らないだけ)。 ・(2)の問題の解決にはなるが、初期化子が書けなくなるしパーサ通らなくなる  マクロの使い方なのであまり薦められたもんではない。 ということであれば同意します。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1036] Re:externについて
投稿者:yuya
2007/08/27 17:08:34

> [結合]を理解していないプログラマが[仮定義]を理解していて、 > 意識してこういうコードを書いたかという点については、俺はきわめて疑問に思う。 > たまたま実害が無かったとしても「間違っているが結果オーライ」なだけだろう。 全面的に同意します。前回もそういうつもりで書きました。 実害が出てくれりゃ勉強する機会も生まれただろうに、と。 > [1020]と[1033]のサンプルは変えてあるのだけど、ちゃんと見てるよね。 はい、ちゃんと見てますです(コメントしておらず失敬しました)。 複数のヘッダファイルをインクルードする状況では、 [1020]だと#undefしとかないと重複定義になっちゃいますね。 でもって、[1035]のようにEXTERNの名前を使い分けるなら、 わざわざHOGE_DEFINITIONだのPIYO_DEFINITIONだのを別に用意する必要はないわけですね。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1035] Re:externについて
投稿者:774RR
2007/08/27 08:32:29

[結合]を理解していないプログラマが[仮定義]を理解していて、 意識してこういうコードを書いたかという点については、俺はきわめて疑問に思う。 たまたま実害が無かったとしても「間違っているが結果オーライ」なだけだろう。 繰り返すが C++ には[仮定義]は無いのでこーいう書き方はダメ。 [1020]と[1033]のサンプルは変えてあるのだけど、ちゃんと見てるよね。 [1020]は実際には一行抜けてて #undef EXTERN が #ifdef の前に必要 [1033]は EXTERNHOGE と EXTERNPIYO と使い分けて名前がかぶらない 両者ともいちおう正しく使えば[仮定義]も重複しないようになってるつもり。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1034] Re:externについて
投稿者:yuya
2007/08/26 16:41:01

774RRさん、ありがとうございます。 「現代 C/C++ では不要」とあったので、 古い処理系でも通るようにするための小細工なのかな、 と思ったんですが、「誤解の産物」だったんですね。 誤解されたままで、このヘッダが 外部定義か仮定義のあるファイルにインクルードされてEXTERNが消えても、 それに続く部分は仮定義になるので (つまり、外部定義 + 仮定義になるか、仮定義 + 仮定義になり、 どちらにしても「外部定義がただひとつ」と等価になる) 実害はなかった、ということになるのでしょうか。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1033] Re:externについて
投稿者:774RR
2007/08/25 21:38:09

>かつてはexternが「同一翻訳単位外のみ」を意味していたのでしょうか? かつてというのがどのくらい昔の話を意図してるのかわからないけど、 少なくともC89 (ISO/IEC 9899:1990) の文書には今と同じ[結合]の記述がある。 規格採択前の独自仕様の処理系については、もう知る必要も無いと思う。 俺は採択前の処理系も複数個実用してたけど、「外のみ」は無かったと追記しとく。 この小細工はexternとは同一翻訳単位外のものを取り扱うものだと 「誤解したプログラマが」書いてたもので 言語仕様を理解していたプログラマなら書かない代物。 あるいは[1022]前橋さんのコメントのように 宣言部と定義部で類似の記述を分散させるのを嫌ったプログラマが行っていたかもしれない。 ----hoge.h---- extern int hoge; ----hoge.c---- #include "hoge.h" int hoge; // これならここに初期値を書ける -------------- hoge の記述がヘッダとソースで2回出てくるのはミスの元という人がいる 以下のように書いておけば記述が2回必要ないというわけで ----piyo.h---- #ifndef EXTERNPIYO #define EXTERNPIYO extern #endif EXTERNPIYO int piyo; ----piyo.c---- #define EXTERNPIYO #include "piyo.h" // piyo の初期値を与える手段が無い -------------- んで [1022] に既述のごとく初期化子がうまく書けないとか問題があるんで俺はやらない。 ちなみにC++ではODRがあるので「定義にならない宣言」と「定義」は分離するのが定石。 類似の既述が2回でてくるのは仕方ない。類似は同一ではないのだから。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1032] 管理者により削除されました
2007/08/30 03:03:18

引用のみの投稿だったため削除しました。
[この投稿を含むスレッドを表示]
[1031] Re:自動変数を返すこと
投稿者:ひげおやじ
2007/08/25 12:53:42

ご回答ありがとうございますm(_ _)m >returnで変数の値を返すときは、それがポインタかどうかに関わらず、別の場所へ中身がコピーされます。 この「returnの動作」の理解が足りませんでした。おかげさまでモヤモヤが取れました。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1030] Re:externについて
投稿者:yuya
2007/08/25 08:46:08

>以下のような小細工コードをいまだに見るけど、現代 C/C++ であれば不要 >#ifdef HOGE_DEFINITION >#define EXTERN >#else >#define EXTERN extern >#endif 昔のCを知らないので、教えていただきたいのですが、 かつてはexternが「同一翻訳単位外のみ」を意味していたのでしょうか?
[この投稿を含むスレッドを表示] [この投稿を削除]
[1029] Re:自動変数を返すこと
投稿者:トル
2007/08/25 01:49:50

日本語がまずかったので訂正。 >呼び出し側で返されたポインタを使って、自動変数(のあった所)にアクセスしているからまずいのです。 呼び出した関数から返されたポインタを使って、自動変数(のあった所)にアクセスしているからまずいのです。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1028] Re:自動変数を返すこと
投稿者:トル
2007/08/25 01:46:46

はじめまして。 >そこに載っている関数int_to_strではポインタを返しているからまずいの >でしょうか?それとも、ポインタでなく整数値を返す場合でも、関数の >中で宣言した自動変数の値を返すことはやめた方がよいのでしょうか。 呼び出し側で返されたポインタを使って、自動変数(のあった所)にアクセスしているからまずいのです。 >たとえば、次のような関数は(int_to_strと同じ観点から見て)まずいのでしょうか。 > >int keep(int int_value) >{ > int i; > i = int_value * int_value; > return i; >} この場合は問題ありません。 returnで変数の値を返すときは、それがポインタかどうかに関わらず、別の場所へ中身がコピーされます。 自動変数のポインタを返すとまずいのは、そのポインタが指す領域がなくなってしまうからです。 int *f(void) { int a = 0; return &a; } と言う関数があったとき、 int *p = f(); printf("%p", p); /* pの値を表示する */ のようにすることは何の問題もありません。しかし、ポインタが指している領域はすでに開放されているので、 int *p = f(); printf("%d", *p); /* pが指している領域の値を表示する */ のような事はできない、と言うことです。 こんな感じでしょうか?
[この投稿を含むスレッドを表示] [この投稿を削除]
[1027] 自動変数を返すこと
投稿者:ひげおやじ
2007/08/24 23:24:01

お世話になっております。 「C言語ポインタ完全制覇」の97ページの補足「自動変数の領域は、 関数を抜けたら開放される!」のつながりで質問させてください。 そこに載っている関数int_to_strではポインタを返しているからまずいの でしょうか?それとも、ポインタでなく整数値を返す場合でも、関数の 中で宣言した自動変数の値を返すことはやめた方がよいのでしょうか。 たとえば、次のような関数は(int_to_strと同じ観点から見て)まずいのでしょうか。 int keep(int int_value) { int i; i = int_value * int_value; return i; } ご返答いただけると幸いです。 (なにぶん継ぎ接ぎの知識なもんで、この質問自体がまずいかもしれませんが・・・)
[この投稿を含むスレッドを表示] [この投稿を削除]
[1026] Re:体当たり学習について質問
投稿者:ちょいち
2007/08/22 02:02:52

>トルさん、(ぱ)さん 返信遅くなってすみません。 大変分かりやすく説明していただき、ありがとうございました! よくわかりました。 「なぜこの関数から??」 →まさにこの疑問でした・・・。 本当にありがとうございました!!
[この投稿を含むスレッドを表示] [この投稿を削除]
[1025] Re:externについて
投稿者:774RR
2007/08/21 08:37:50

>「別のところにあるのを宣言する」ってのはexternの本質を表していないのですね。 こういう疑問が出てくるということは、言語規格書を読んでみていいレベルということだ 初心者向け解説書は厳密さよりもわかりやすさを優先せざるを得ないので びみょーに不正確だったりすることがある extern の意味するところは[1020]で書いたとおり、結合指定 C なら JIS X 3010:2003 6.2.2 C++ なら JIS X 3014:2003 3.5 厳密なところは自分で JIS 言語規格書を参照してもらうとして、簡単に言うなら extern:外部結合を指定、static:内部結合を指定 外部結合=その名前が表す実体は、他の翻訳単位または同じ翻訳単位で使うことができる 内部結合=その名前が示す実体は、同じ翻訳単位で使うことができる ということだ。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1024] Re:externについて
投稿者:ひげおやじ
2007/08/21 03:24:05

ご回答ありがとうございますm(_ _)m 変数と関数の宣言・定義の違いでの説明がしっくり来ました。 >初心者向け解説として「 extern は別のところにあるものを使う宣言」と書いてある書籍を見かけるけど >言語規格書的には大きく間違い (同一翻訳単位中にあってもかまわないので) まさにこれがもう一つ質問したかったことでした。 「別のところにあるのを宣言する」ってのはexternの本質を表していないのですね。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1023] Re:externについて
投稿者:774RR
2007/08/21 00:03:20

>グローバル変数の名前が偶然かち合ってしまう可能性があります。 (snip) >と書いてもエラーにならないと困ってしまいます。 C++ においては ODR (One Definition Rule) により、これは必ずエラーになる C ではエラーにならない (仮定義の重複を認める) という違いがあるですな。 初心者向け解説として「 extern は別のところにあるものを使う宣言」と書いてある書籍を見かけるけど 言語規格書的には大きく間違い (同一翻訳単位中にあってもかまわないので) 俺も後輩君にそういう説明したことあるし反省っすな。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1022] Re:externについて
投稿者:(ぱ)こと管理人
2007/08/20 22:56:45

>ヘッダ中で宣言+ソースファイル中で定義することは完璧に正しい これはもちろんそうなのですが、 >以下のような小細工コードをいまだに見るけど、現代 C/C++ であれば不要 >#ifdef HOGE_DEFINITION >#define EXTERN >#else >#define EXTERN extern >#endif この小細工は、ヘッダとソースファイルに似たようなものを分散させたくないという面からは有効だと思いますよ。初期化子がうまく書けないとか、文法的にCのパーサを通らんようなマクロを作るなとか、そもそもそんなにグローバル変数使うなよとか、批判があるのはわかりますが。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1021] Re:externについて
投稿者:(ぱ)こと管理人
2007/08/20 22:51:43

>分割コンパイルなどで、外部で定義している変数を参照するにはexternを使う、と >よく本に書いてあると思いますが、外部の関数を参照するにはexternを >付ける必要がないように見受けられるのです。これはなぜなんでしょうか。 774RRさんのおっしゃるようにそういう約束だから…なのですが(X3010の6.1.2.2)それを言ってしまうとつまらないので、理由を考えますと。 大規模なプログラムを何人もの人で書いている場合、グローバル変数の名前が偶然かち合ってしまう可能性があります。たとえば a.c: int hoge; b.c: int hoge; と書いてもエラーにならないと困ってしまいます。この場合、それぞれの担当プログラマには、「グローバル変数の値がいつの間にか変わっている」という得体の知れないバグとして見えるはずです。 その点、「externなしで定義できるのは必ず1箇所のみ、それ以外の箇所では必ずexternを書け」という規則にしておけば、リンク時にエラーになるのでこの問題を回避することができます。 では関数の場合はどうかというと、関数名が偶然かち合ったとして、 a.c: int hoge(void) {...} b.c: int hoge(void) {...} とか書いたらどうせエラーです。 つまり、関数の場合、関数の処理を書くブロックの有無で定義と宣言の区別がつくため、わざわざexternをつける必要はない、というのが私の理解です。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1020] Re:externについて
投稿者:774RR
2007/08/20 20:09:49

そういう約束だから 関数(原型)宣言に extern も static もない場合は extern が補われると考えよう void myfunc(int); // これには extern も static も明示されてないので extern void myfunc(int); // と解釈される規則 この規則は関数の場合にのみ適用されるので、変数宣言には適用されない 以下は、言語規格書の厳密解釈なので、一読してわからなかったらスキップしてね ・関数宣言で指定できる linkage は static か extern かどちらかだけ (無指定も OK) ・ static が明示されている関数宣言は internal linkage ・ internal linkage でない関数宣言は external linkage ヘッダ中で宣言+ソースファイル中で定義することは完璧に正しい ----hoge.h---- void hogefunc(double); // This declaration has external linkage ----hoge.c---- #include "hoge.h" void hogefunc(double d) { ... } // This definition also has external linkage 以下のような小細工コードをいまだに見るけど、現代 C/C++ であれば不要 #ifdef HOGE_DEFINITION #define EXTERN #else #define EXTERN extern #endif
[この投稿を含むスレッドを表示] [この投稿を削除]
[1019] externについて
投稿者:ひげおやじ
2007/08/20 15:07:24

「C言語ポインタ完全制覇」を読ませてもらっております。 その本の本筋とは外れるのかしれませんが、第5章のヘッダファイルの作成と関連 してexternでわからない点がいくつかあるので質問させてください。 ご回答いただけると幸いです。 とりあえず、ひとつお聞きします。 分割コンパイルなどで、外部で定義している変数を参照するにはexternを使う、と よく本に書いてあると思いますが、外部の関数を参照するにはexternを 付ける必要がないように見受けられるのです。これはなぜなんでしょうか。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1018] Re:体当たり学習について質問
投稿者:(ぱ)こと管理人
2007/08/16 22:04:45

ちょいちさん、はじめまして。 >fgets(buf, 1024, stdin) >と書いていたのを、なぜ急に >fget(buf, 1024, fp) >と変えたのですか?? もちろんこれはトルさんから回答があったように入力元を変えるためなのですが、 「なぜこのプログラムから?」というのが疑問であるわけですよね。 確かに説明不足だったかもしれません。 理由は、ここで作っている関数input_string()は、汎用の関数を目指している ためです。 このinput_string()は、扱える行の最大長に制限があるとはいえおおむね現実的な 入力においては、長さチェックを行って長すぎる場合にはエラーまで出してくれる、 という便利な関数です。実際、蔵書管理プログラムの中でもあちこちで使われて いますし、今後別のプログラムで使うこともあるかもしれません。 今後別のプログラムで使うことがあるのなら、入力元をstdinに限定して しまったのでは汎用性が薄れます。そこで、input_string()に引数として 入力元を渡せるようにしているわけです。 これで回答になっていますでしょうか?
[この投稿を含むスレッドを表示] [この投稿を削除]
[1017] Re:体当たり学習について質問
投稿者:トル
2007/08/16 13:24:20

はじめまして。私は『C言語 体当たり学習徹底入門』はもってないんですが・・・ちょっとだけ。 fgetsの第三引数の型はFILE *で、入力先を指定します。 stdinは標準入力と結びついていますので、stdinを渡せば標準入力から入力します。 fpの方は、どこぞのファイルに結びついていますので、fpを渡せばそのファイルから入力します。 要するに、stdinをfpに変えたのは、読み込み先を変えたという事です。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1016] Re:体当たり学習について質問
投稿者:ちょいち
2007/08/16 02:56:05

すいません。 自分の文章が自分でも理解できなかったので 何が分からないかを言い直しますw えぇと、「FILE *fpを引数に渡しているのはなぜか」というよりも、 fgets(buf, 1024, stdin) と書いていたのを、なぜ急に fget(buf, 1024, fp) と変えたのですか?? ってことがわからないってことです・・・。 すんません。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1015] 体当たり学習について質問
投稿者:ちょいち
2007/08/16 02:47:02

はじめまして。ちょいちというC言語初心者です。 C言語体当たり学習徹底入門で勉強しています。 お世話になってます。 で、早速質問を・・・。 既出でしたら大変申し訳ないのですが、 p225のlist5-6やp227のlist5-8において、関数の引数に 『FILE *fp』があるのはなぜですか? よろしくお願いします。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1014] 管理者により削除されました
2007/08/11 13:56:30

広告なので削除しました。
[この投稿を含むスレッドを表示]
[1013] 管理者により削除されました
2007/08/08 01:27:43

意味不明の投稿なので削除しました。
[この投稿を含むスレッドを表示]
[1012] 管理者により削除されました
2007/08/03 19:59:13

広告なので削除しました。
[この投稿を含むスレッドを表示]
[1011] Re:前橋和弥さんへの謝罪
投稿者:(ぱ)こと管理人
2007/08/03 03:26:31

>お父さんには今夜じゅうにでも謝っておこうかと思います。 それはよかった… ですが。 >後、気になることがあるのですが、以前、掲示板を覗かせてもらったときに、 >前橋さんが僕に対して「前言撤回。こういう馬鹿は一度死ななきゃわからないのかも >しれない。」とおっしゃっていたのを記憶しております。 a) まず、私はそのような発言をした覚えはありません。念のため「前言撤回」や  「馬鹿」でkmaebashi.comをGoogleサイト内検索してみましたがみつかりません。 b) それ以前の問題として、そもそも吉田さんは、この掲示板に書き込んだのは  2007年8月1日の[1008]が最初ではないのですか? 「初めまして」と書いてあるし。  ほんの1~2日前にこの掲示板に登場した人に、過去罵声を浴びせることが  できるはずがありません。 c) 仮に、吉田さんがかつては別のハンドルネームでうちの掲示板に書き込んでいて  私から何らかの罵声を浴びせられたとして、だったらその過去のハンドルネームなりを  教えてもらわなければ、私には、何の話だかわかるはずもありません。  >これは何に対する憤怒なのでしょうか。 >僕はずっとbrainfuckインタプリタを自分の物として父親に発表されたことによる >憤怒かと思っておりました。 d) 「brainfuckインタプリタを自分の物として父親に発表された」ということを  吉田さんがこの掲示板に報告したのは、これもつい1~2日前の[1008]の投稿です。  吉田さんがお父さんに何を発表しようと、その内容を私が知ることは不可能です。  よって、それによって私が憤怒するなどということがあるはずもありません。 a)だけなら、別の掲示板と勘違いしてたとか、前橋の方が過去に罵声を浴びせた ことを忘れてる、ということもあり得るでしょうが、b), c), d)は、そういうことでは 説明がつきません。 煽りでもなんでもなく思うのですが、吉田さん、統合失調かなにかのケがありませんか。 もちろん私のような素人が勝手に診断を下してよいはずはないわけで、だからこそ、 (現在未受診であれば)精神科の診察を受けられたほうがよいのではないでしょうか。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1010] Re:前橋和弥さんへの謝罪
投稿者:吉田祥彰(本名)
2007/08/02 11:50:03

前橋さん、ご返信ありがとうございます。 brainfuckインタプリタの件に関して前橋さんが「問題ない」とおっしゃってくれてホッとしております(NYSLの簡単な概要に関しては理解しました)。 お父さんには今夜じゅうにでも謝っておこうかと思います。 後、気になることがあるのですが、以前、掲示板を覗かせてもらったときに、前橋さんが僕に対して「前言撤回。こういう馬鹿は一度死ななきゃわからないのかもしれない。」とおっしゃっていたのを記憶しております。これは何に対する憤怒なのでしょうか。僕はずっとbrainfuckインタプリタを自分の物として父親に発表されたことによる憤怒かと思っておりました。もし、違う理由があるのであれば、その理由を教えていただけないでしょうか。よろしくお願いいたします。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1009] Re:前橋和弥さんへの謝罪
投稿者:(ぱ)こと管理人
2007/08/01 23:16:32

>僕が前橋和弥さんの作った宝であるbrainfuckインタプリタをさも自分が >作ったかのように自分の父親に発表してしまったことです。これは >ソースファイルの盗用にあたるかと思います。 Brainfuck自体は、私が考えた言語ではないですし、実装もそこかしこに 転がっていますがそれはさておき。 BF-BASIC'nのソースについて言えば、ライセンスはNYSLであり、これは http://www.kmonos.net/nysl/ | ご自分の作ったものを扱うのと同じように、自由に利用することが出来ます。 と明記してあるとおり、BF-BASIC'nのソースを「さも自分が作ったかのように」 扱うことはまったく問題がありません。 よって、私からすればまったく問題ないわけですが、吉田さんが謝罪すべき 相手はお父様の方ではないでしょうか。嘘をついたわけですから。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1008] 前橋和弥さんへの謝罪
投稿者:吉田祥彰(本名)
2007/08/01 11:53:44

初めまして。吉田祥彰という者です。今回は前橋和弥さんへ謝罪いたしたく投稿させていただきました。謝りたい件というのは、僕が前橋和弥さんの作った宝であるbrainfuckインタプリタをさも自分が作ったかのように自分の父親に発表してしまったことです。これはソースファイルの盗用にあたるかと思います。ここで前橋さんにお願いがあります。どうか前橋さんの寛大な心で、僕の愚行を許していただけないでしょうか?今後、このようなことはしないように最大限の注意を払って努力していくつもりです。どうかよろしくお願いいたします。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1007] Re:すぽぽーーん
投稿者:(ぱ)こと管理人
2007/07/29 01:32:04

>BF-BASIC…前フリで「逆にいま BASIC 回帰もありなんだな」とか妙に納得しちゃったんですがすぽぽーんでコーヒー吹きました どうもです。ウケたようで何よりです。 いまさらですが、BF-BASIC'nは日付を見ればわかるように2006年のエイプリルフールに書いたものです。 ところで、前フリ部分は、私にとってはあれはあれで一面の本音ではあります(ぼそっ)。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1006] すぽぽーーん
投稿者:通りすがったり
2007/07/28 14:30:08

BF-BASIC…前フリで「逆にいま BASIC 回帰もありなんだな」とか妙に納得しちゃったんですがすぽぽーんでコーヒー吹きましたBF で気づくべきだったのだな
[この投稿を含むスレッドを表示] [この投稿を削除]
[1005] Re:Python 関数電卓
投稿者:nao
2007/07/23 23:49:52

>>コードが美しく、短く、分かりやすいです。 > >うーん、ざっと見ただけですが、なんか効率悪いパーサのような… > 許容範囲のコードかなぁー
[この投稿を含むスレッドを表示] [この投稿を削除]
[1004] Re:Python 関数電卓
投稿者:(ぱ)こと管理人
2007/07/22 14:51:44

>つんつんが時々 訪れている「紫藤さんのページ」のPython関数電卓です。 >http://www.shido.info/py/python_calc.html 情報ありがとうございます。 「Perl, Python, Rubyの比較」 http://www.shido.info/py/python1.html は以前に読んだことがあるのですが、その方のページだったんですね。 >コードが美しく、短く、分かりやすいです。 うーん、ざっと見ただけですが、なんか効率悪いパーサのような…
[この投稿を含むスレッドを表示] [この投稿を削除]
[1003] Python 関数電卓
投稿者:つんつん
2007/07/21 08:08:11

つんつんが時々 訪れている「紫藤さんのページ」のPython関数電卓です。 http://www.shido.info/py/python_calc.html コードが美しく、短く、分かりやすいです。 (つんつんの関数電卓は、引退しました。) 「紫藤さんのページ」には、scheme の関数電卓もあります。 http://www.shido.info/lisp/scheme_calc.html
[この投稿を含むスレッドを表示] [この投稿を削除]
[1002] 管理者により削除されました
2007/07/21 01:14:25

意味不明の投稿なので削除しました。 テスト投稿であればテスト用掲示板にお願いします。
[この投稿を含むスレッドを表示]
[1001] Re:「プログラミング言語を作る」が面白い
投稿者:(ぱ)こと管理人
2007/07/19 00:42:24

>>あ、それすごく面白そうです。何度か書いてますが、私自身車輪の再発明が趣味ですし。 > >私も全く同様なのですが、どうも肩身が狭いですね。 >サイトが稼動し始めたらお知らせします。 や、よろしくお願いします。 エディタとかメーラとか、普段使っているツールは、プログラマにとってもっとも自作 したくなる道具であるはずで、だったらプログラミング言語は最優先のはずではないか、 とも思うのですが。 前提からして間違っているのかなあ… # かくいう私自身、クライアントアプリとしてのメーラを書いたことはないですが # (Webメーラなら書いたことある) >解説とか研修を行なうときは「無駄を省いた自作コース」を提供するのが強力であることが多いと思います。 その意味で、以前書いたように「本当の基礎からのWebアプリケーション入門―― Webサーバを作ってみよう」というのを考えてはいるのですが、Diksamができるまでは お預けです。ていうか私自身読みたいネタなので、誰か書いてくれないかしらん。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1000] Re:「プログラミング言語を作る」が面白い
投稿者:yuya
2007/07/18 12:34:35

>>「車輪の再発明工場(仮称)」なんていうサイトを立ち上げようとしている私としては、 > >あ、それすごく面白そうです。何度か書いてますが、私自身車輪の再発明が趣味ですし。 私も全く同様なのですが、どうも肩身が狭いですね。 サイトが稼動し始めたらお知らせします。 > 言語処理系だけでなく、普段使っている何かを自作するというのは、それを理解する > 一番の方法でもありますし(時間はかかるので効率は悪いですが…)。 そうですよね。何にもない状態から発明した人よりははるかに短時間で作れるわけですから、 解説とか研修を行なうときは「無駄を省いた自作コース」を提供するのが強力であることが多いと思います。 # 「何でも自作してみないと本当に分かった気がしないのは、損なのか得なのか??」と悩んじゃうことはありますが(^^;)
[この投稿を含むスレッドを表示] [この投稿を削除]
[998] Re:「プログラミング言語を作る」が面白い
投稿者:(ぱ)こと管理人
2007/07/15 04:17:07

>「車輪の再発明工場(仮称)」なんていうサイトを立ち上げようとしている私としては、 あ、それすごく面白そうです。何度か書いてますが、私自身車輪の再発明が趣味ですし。 言語処理系だけでなく、普段使っている何かを自作するというのは、それを理解する 一番の方法でもありますし(時間はかかるので効率は悪いですが…)。 >素朴な疑問なんですが、(ぱ)さん自身はCrowbarやDiksamを普段どれくらい使われているのでしょうか? これはもう正直なところを言ってしまうと、ほぼまったく使っていません。 Diksamなんか現状でprint()しか組み込み関数がないので実用になりませんし、 crowbarならAWK程度の役には立ちそうですが、そもそもAWKとかPerlとかRubyとかの 言語でさくっとテキスト処理、という機会も、今の私にはあまりないですし。
[この投稿を含むスレッドを表示] [この投稿を削除]
[997] Re:「プログラミング言語を作る」が面白い
投稿者:yuya
2007/07/14 00:38:53

久々にお邪魔します。 >まあ、あの文章が面白いのだとすればそれは別に私の手柄ではなく、 >「プログラミング言語を作る」という行為自体が非常に面白いためなんだろうと >思いますが。 ># でも、同意してくれる人はあまり多くない気がします。残念ながら。 「(ぱ)さんの手柄ではない」という点は同意しませんが、 「言語を作るという行為自体が面白い」という点は同意します(そんなに少数なんですかね?)。 「車輪の再発明工場(仮称)」なんていうサイトを立ち上げようとしている私としては、 「面白そうだからやってみる。それだけ」というノリに共感を覚えてしまうんですが(^^;) 素朴な疑問なんですが、(ぱ)さん自身はCrowbarやDiksamを普段どれくらい使われているのでしょうか?
[この投稿を含むスレッドを表示] [この投稿を削除]