K.Maebashi's BBS

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

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

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

[2081] Re:【C言語ポインタ完全制覇】3-1-2 Cの宣言を解読する
投稿者:(ぱ)こと管理人
2017/12/23 23:26:00

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

 ようやくシステム変数の組込みが終わりました。下記に示すような感じで 使用します。上にある#defineは、システムのヘッダーファイルになり。 #includeされます。 また今回は日本語プログラムにするとこんな感じに なります。と言った感じのプログラムリストです。  システム変数は宣言だけが違い、多少特殊ですが普通の変数と同じように 使用できます。なおかつスレッドセーフで使用できます。 //-- システム変数定義ヘッダーファイル -------------- #define システム変数 sysval #define 生成 1 // システム変数使用 #define 廃棄 2 // システム変数廃棄 #define クリア 3 // システム変数を初期化 #define リスト 4 // システム変数のリスト宣言 #define 辞書 5 // システム変数の辞書宣言(予約) #define 昇順ソート 6 // システム変数をソート #define 降順ソート 7 // システム変数をソート #define システム変数検索 sysval_find #define 線形 1 // システム変数リストを線形検索 #define 二分 2 // システム変数リストを二分検索 #define 辞書 3 // システム変数辞書検索(予約) #define システム変数リスト挿入 sysval_push_list #define システム変数リスト取出 sysval_pop_list #define 先頭 1 // システム変数リストの先頭 #define 最後 2 // システム変数リストの最後 //-- 日本語定義ヘッダーファイル ------------------ #define メイン main #define 表示 print #define 文字列 string #define 整数 int //------------------------------------------------ //-- 日本語で書いた場合 ----------------- 整数 表示(文字列 str); 整数 システム変数(文字列 str,整数 type); 整数 メイン() { システム変数("AAS001",生成); システム変数("AAI001-ACI005",生成); システム変数("BAD001-BCD005",生成); システム変数("CAS001-CCS005",生成); AAS001 = "testdata"; 表示("AAS001 = " + AAS001 + "--\n\n"); AAI001[3][1] = 33; BAD002[2] = 3.2; CAS003[1] = "aaa"; 表示("AAI001 = " + AAI001[3][1] + "--\n\n"); 表示("BAD002 = " + BAD002[2] + "--\n\n"); 表示("CAS003 = " + CAS003[1] + "--\n\n"); } //-----------------------------------    ↓    ↓まったく同じプログラムで英語で書いた場合    ↓ //----------------------------------- int print(string str); int sysval(string str,int type); int main() { sysval("AAS001",CREATION); sysval("AAI001-ACI005",CREATION); sysval("BAD001-BCD005",CREATION); sysval("CAS001-CCS005",CREATION); AAS001 = "testdata"; print("AAS001 = " + AAS001 + "--\n\n"); AAI001[3][1] = 33; BAD002[2] = 3.2; CAS003[1] = "aaa"; print("AAI001 = " + AAI001[3][1] + "--\n\n"); print("BAD002 = " + BAD002[2] + "--\n\n"); print("CAS003 = " + CAS003[1] + "--\n\n"); } -----------------------------------    ↓    ↓日本語版も英語版まったく同じ下記のコードになります。    ↓ ------------------------------------ 1:*** 一般関数情報ダンプ ****************** 1:int main() 1:*** 配列定数 数 = 0 ********** 1:*** 文字列 数 = 23 *** 1: 0: "main" 1: 1: "AAS001" 1: 2: "sysval" 1: 3: "AAI001-ACI005" 1: 4: "sysval" 1: 5: "BAD001-BCD005" 1: 6: "sysval" 1: 7: "CAS001-CCS005" 1: 8: "sysval" 1: 9: "testdata" 1: 10: "AAS001 = " 1: 11: "-- " 1: 12: "print" 1: 13: "aaa" 1: 14: "AAI001 = " 1: 15: "-- " 1: 16: "print" 1: 17: "BAD002 = " 1: 18: "-- " 1: 19: "print" 1: 20: "CAS003 = " 1: 21: "-- " 1: 22: "print" 1:*** 使用予定のスタックサイズ = 1292 1:*** 関数コードのディスアセンブラ size = 223 1: 0 push_string_const 1 1: 3 push_int_1byte 1 1: 5 call_function 2 0 0 2 1: 14 pop 1: 15 push_string_const 3 1: 18 push_int_1byte 1 1: 20 call_function 4 0 0 2 1: 29 pop 1: 30 push_string_const 5 1: 33 push_int_1byte 1 1: 35 call_function 6 0 0 2 1: 44 pop 1: 45 push_string_const 7 1: 48 push_int_1byte 1 1: 50 call_function 8 0 0 2 1: 59 pop 1: 60 push_string_const 9 1: 63 pop_sysval_str 3-0-1 1: 68 push_string_const 10 1: 71 push_sysval_str 3-0-1 1: 76 add_string 1: 77 push_string_const 11 1: 80 add_string 1: 81 call_function 12 0 0 1 1: 90 pop 1: 91 push_int_1byte 33 1: 93 push_sysval_array 1-0-1 1: 98 push_int_1byte 3 1: 100 push_array_int 1 1: 102 push_int_1byte 1 1: 104 pop_array_int 1: 105 push_double_8byte 3.200000e+000 1: 114 push_sysval_array 2-52-2 1: 119 push_int_1byte 2 1: 121 pop_array_double 1: 122 push_string_const 13 1: 125 push_sysval_array 3-104-3 1: 130 push_int_1byte 1 1: 132 pop_array_string 1: 133 push_string_const 14 1: 136 push_sysval_array 1-0-1 1: 141 push_int_1byte 3 1: 143 push_array_int 1 1: 145 push_int_1byte 1 1: 147 push_array_int 0 1: 149 cast_int_to_string 1: 150 add_string 1: 151 push_string_const 15 1: 154 add_string 1: 155 call_function 16 0 0 1 1: 164 pop 1: 165 push_string_const 17 1: 168 push_sysval_array 2-52-2 1: 173 push_int_1byte 2 1: 175 push_array_double 0 1: 177 cast_double_to_string 1: 178 add_string 1: 179 push_string_const 18 1: 182 add_string 1: 183 call_function 19 0 0 1 1: 192 pop 1: 193 push_string_const 20 1: 196 push_sysval_array 3-104-3 1: 201 push_int_1byte 1 1: 203 push_array_string 0 1: 205 add_string 1: 206 push_string_const 21 1: 209 add_string 1: 210 call_function 22 0 0 1 1: 219 pop 1: 220 push_int_1byte 0 1: 222 return 1:*** 行情報 数 = 14 *** 1: 20: from 0 size 15 1: 21: from 15 size 15 1: 22: from 30 size 15 1: 23: from 45 size 15 1: 24: from 60 size 8 1: 25: from 68 size 23 1: 26: from 91 size 14 1: 27: from 105 size 17 1: 28: from 122 size 11 1: 29: from 133 size 32 1: 30: from 165 size 28 1: 31: from 193 size 27 1: 154: from 220 size 2 1: 32: from 222 size 1 1:*** end of main() -------------- --------------------------------------------------
[この投稿を含むスレッドを表示] [この投稿を削除]
[1374] Re:関数の再起について
投稿者:
2009/06/25 00:09:10

お返事遅れてすみません。 >ええと、細かいことですが「再起」ではなく「再帰」ですね。 うはは~~指摘ありがとうございます。思わぬミスをよくします。 >ファイバーとか考えるなら再考の必要がありますね……  ファイバーのことを考えてたら、 「ファイバーは関数ではなく、コードの一部を空きスレッドに渡すだけで実行だな」 と考えていたら下記の点を気がつきました。  今までは、スレッドは実行時にオブジェクト生成とスレッド起動を考えていま したが、良くよく考えれば毎回不必要ですね。初期に10なり20なり起動して待ち 状態で待たせ、その後プログラムのスレッド実行は空きスレッドで即実行を^^  この方法で組み込むことにしました。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1373] Re:関数の再起について
投稿者:(ぱ)こと管理人
2009/06/23 02:34:39

ええと、細かいことですが「再起」ではなく「再帰」ですね。 >その後言語内の関数実行部を >作ったのですが。そのまま、再起で実行する部分を使って組み込んだために、関数実行 >はVM実行部の再起になっています。 了解です。 再帰を使わずに作ると、例外処理機構でCの呼び出し階層を遡らなくてよいとか、 ファイバーのような機能を作るときに現在の実行状態を退避できるとかの メリットがあると思いますが、例外処理をDiksamで作ってみたら、再帰を使っている crowbarの例外処理よりもかえって大変だったような気がしますし、再帰なら 再帰でかまわないと思います。 実はDiksamでもネイティブ関数からDiksam関数を呼ぶところは再帰なので、 ファイバーとか考えるなら再考の必要がありますね…… >う~~んどうしようか、当面このままでいこうと思います。既に出来てしまっ >てるし。スタックを増やさない限り再起が450回しか出来ない欠点はあるけど。 実用的には使われてないであろうcrowbarはさておき、RubyやPerlもCのスタックを 使ってガンガン再帰してますからねえ。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1372] Re:関数の再起について
投稿者:
2009/06/22 19:06:01

>すみません、いまいちよくわからないです。関数呼び出しのたびにVM起動して >いるわけではないですよね? そうだった、VMが違うものでした。簡単にVMの構造を説明します。 ↓AP管理からVMとして起動される -------------------------------------- |      VM管理システム      | --------------------------------------  ↓     ・・・       ↓    ------    ------    |   |    |   |    | V |    | V |    | M |    ・・・     | M |    | 実 |    | 実 |    | 行 |    | 行 |    | 部 |    | 部 |    |   |    |   |    ------    ------  VMは上記のような構造をしています。VM管理システムは1つのスレッドで、VM実行 部のスレッド実行管理と各種サービスを提供します。機能は、  ・マルチスレッドでVM実行部の起動・停止・廃棄等の実行管理  ・動的コンパイルの管理、関数の管理  ・タイムスケジュールの管理(タイマーキューの生成と管理)  ・スレッドの実行優先順位管理(キューに優先順位がありその管理)  ・メッセージキューの管理(スレッドの実行はキューによって行われる)  ・グローバル変数の管理  ・その他各種IOや外部機能インターフェースの管理  ・言語のデバック機能  ・上記サービスをスレッドセーフで提供するための排他制御管理 等のいろいろな機能があり、それなりに大きなプログラムです。  それに対し、VM実行部は純粋にバイトコードを実行する以外何の機能も持っていま せん。VM実行部は1つのクラスで、そのオブジェクト一つが1スレッドになり、マルチ スレッドが実行可能であり、VM実行部が再起実行しても問題の無い仕様です。 そして、出来る限り単純で最小になるように作られています。  で^^;、最初に組込み関数部分を作りましたが、その時組込み関数から言語内の関数 を自由に起動したり廃棄したり、スレッド起動したり出来るように作ったので、それを 実行する一番いい方法はVM実行部の再起的実行でした。その後言語内の関数実行部を 作ったのですが。そのまま、再起で実行する部分を使って組み込んだために、関数実行 はVM実行部の再起になっています。今思えば別に再起しなくても良かったかな。^^;  今の実装の欠点は、VMのスタックを消費することと、ほんの少しのオーバーヘッド。 今の方法の利点は関数実行や管理が一元管理されて、プログラム的にすっきりしている。 かな、う~~んどうしようか、当面このままでいこうと思います。既に出来てしまっ てるし。スタックを増やさない限り再起が450回しか出来ない欠点はあるけど。 >なお、現在はDiksamはシングルスレッドですが、スレッドを分けるなら、 >VMのスタックも分離する必要があると考えています。 こちらも、1スレッドおきにスタック領域が作られます。そのためスタック領域はあまり 大きくしたくなっかったので。 ちなみにVM実行部の起動は S_Func_Val * CL_VMexe::execute(CL_Function *sfp,int stackp); 引数は関数情報と戻りスタックポインターです。ローカル変数をスタックに作成後すぐに S_Func_Val * CL_VMexe::execute_code(); のコード実行部が呼ばれる単純な構造です。
[この投稿を含むスレッドを表示] [この投稿を削除]
[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 $ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
[この投稿を含むスレッドを表示] [この投稿を削除]