K.Maebashi's BBS

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

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

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

[1116] Re:なぜわからなくなってしまうのか?の本質(笑)
投稿者:(ぱ)こと管理人
2008/06/21 02:55:11

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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