掲示板
Powered by OTD
この記事は、K.Maebashi's BBSの過去ログです。
書き込む場合は、新しい掲示板へお願いします。
[日付順表示] | [日付順インデックス] | [スレッド順インデックス]


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


[480] strtol
返信


投稿者: tos
2003/12/03 11:20

Mail:   Link:
 素朴な疑問なのでが、strtol()が要求する第2引数は、
何故、char **なのでしょうか?
変換できなかった文字列を格納するなら、char *で
いいような気がするのですが。



[479] Re:断酒宣言
返信


投稿者: 本多
2003/12/03 08:37

Mail:manybook@msc.biglobe.ne.jp   Link:
 > > γ-GTPっていうのが 1年で4倍の数値(30→120)になってしまいました。
> うわ、そんなに一気に増えますか。ご自愛ください。
ありがとうございます。

> 基準値は80くらいまででしたよね。120くらいの人は結構いると思いますが。
これって国によって違うんですかね。
私の受け取った診断書には基準は(8〜46)って書いてありますが...f(^^;)

> 私の前回の数値は24でした。その前は20です。もっと前は、確か14とかいう
> 数値を覚えています。まだまだ余裕がありそうですが、じりじり上がってますし、
> 増えるときは一気に増えるとなると油断できませんね。
私も去年までは全く問題ありませんでした。

> 2chの酒板にはこんなスレがありまして、
> 「お前ら自分のγーGTPを書きなさい」
> ここを読むと勇気がわきますが… 
みんな1000を超えてるの?...f(^^;)
にわかには信じがたい数値ですが...(ぱ)さんも記録に挑戦しますか?(^^)

#挑戦しないための断酒宣言でしたね(^^)

> > 誘われなくすることも、誘いを断ることも
> > 行ってがぶ飲みを拒否することも難しい状況です。
> 白人さんは日本人より圧倒的に酒が強いんですよね。
> あまり無理をされないように(ってそれが難しいってことなんでしょうが)。

私の住んでいるのは白人さんのいる国じゃないんですけど
相当お酒の強い人たちの住んでいる国であるのは間違いないのですが。

でも白人さんも無理をしたら死んでしまうようですね↓
http://www.zakzak.co.jp/society/top/t-2003_11/1t2003112002.html


[478] Re:また質問です。
返信


投稿者: 本多
2003/12/03 08:31

Mail:manybook@msc.biglobe.ne.jp   Link:
 > それと、unsigned型とsigned型ってなんであるんでしょうかね?
> 書式指定で判断するんだから一つに統合してもいいような気もするんですが。
printf()だけ考えたらそうでしょうけど、演算するときに負の数がないと困ったり、
0x80000000以上の正数を扱いたいときに困るからでしょう?

> そういや前の文章で0xFFFFFFFFはオーバーフローを起こして-1になるって書きましたけ
> ど、これってオーバーフローじゃないですよね、1111 1111 1111 1111 1111 1111 1111
> 1111は「2の補数表現」ですよね。%dだから2の補数としてよんでいるんですね。タブ
> ンそうですね?
コンピュータの扱えるbit列では-1と0xffffffffは同じだからですよ。
printf()が%dに対しては-1、%xに対してはffffffffと表示しているだけです。

> あと・・、「ア」という文字コードはB1だと思いますが%xで表示したらなぜFFFFFFB1とな
> るんでしょうか?
これって半角カナ文字? char型の変数に格納して、
それをprintf()の引数につけたんですね?
関数の引数にchar型を使うとint型に自動変換されるからですよ。

0xb1は-79という値に変換されてprintf()に渡されて、
-79を16進数表記したら0xffffffb1になるんです。
char型の最上位bitが1なら常に起こる現象です。

キャストしてからunsigned int型の変数に格納しなおすなどすれば、
0xb1と表示されるはずです。


[477] Re:また質問です。
返信


投稿者: ishikawa
2003/12/03 01:45

Mail:   Link:
 > この表現、感覚的に逆なんですけど。
> マイナスになってない→ singed型
> マイナスになる →unsigned型
>
> 私の感覚では
> マイナスになる → singed型( 符号整数型)
> マイナスにならない→unsigned型(無符号整数型)

すいません逆でした。


[476] Re:また質問です。
返信


投稿者: ishikawa
2003/12/03 00:48

Mail:   Link:
 > その変数がsignedであるかunsignedであるかとか、あるいはintであるか
> doubleであるかとかいった「型情報」は、Cは実行時には保持していません。
>
> ではprintf()ではどうやって符号付き、符号なしで表示するのかと言えば、
> それをプログラマが書式指定により指定するわけです。
> 10進符号無しで表示させたければ、%uを使います。
>
> そもそもprintf()が、どんな引数が渡されたのかを自力で判断できるのなら、
> 書式指定に%dだの%fだのをプログラマがわざわざ与えてやる必要はないはずで
> (まあフィールド長の指定などをすることもありますが、やらないことが多いでしょ)、
> printf()は、どんな型の引数が渡されたのかを書式指定から知るしかないのです。
>
> だから、%dとか%xとかの指定と、実際の引数の数や型が異なる場合、
> printf()は平然とわけわかんない出力をしてくれます。最悪コケます。
> このあたりのことは、可変長引数(stdarg.h)を勉強するとよくわかります。

なるほど、そう言うことでしたか・・、ありがとうございます。
じゃあ%dっていうのは-2147483648〜2147483647の範囲を表す書式指定と言うことでいい
んですね?
それと、unsigned型とsigned型ってなんであるんでしょうかね?
書式指定で判断するんだから一つに統合してもいいような気もするんですが。
2進数に変換してから変数の中に入れるわけだから、補数か補数じゃない表現上の
違いだけだから、2進数を表現すると言う範囲は変わりないと思いますし。
(すいません一応聞きますけど、数字は一回内部で2進数に直してから書式指定にしたが
って出力するってことでいいんですよね?)

そういや前の文章で0xFFFFFFFFはオーバーフローを起こして-1になるって書きましたけ
ど、これってオーバーフローじゃないですよね、1111 1111 1111 1111 1111 1111 1111
1111は「2の補数表現」ですよね。%dだから2の補数としてよんでいるんですね。タブ
ンそうですね?

あと・・、「ア」という文字コードはB1だと思いますが%xで表示したらなぜFFFFFFB1とな
るんでしょうか?謎です。出力する時「FFFFFF」の部分は数字を変えてもB1さえ最後に入
っていれば「ア」と表示されます。(例えば「0x111111B1」でも表示される)

あと、漢字って出力できないですよね?
#include <stdio.h>

int main(void)
{
int a,b;

a = '入';
printf("%X\n",a);
b = 0xFC93;
printf("%c\n",b);

return(0);
}
これを実行させたら
FC93

とでました、なぜなんでしょう?

長くなってすいません。
どうかよろしくお願いします。



[475] Re:断酒宣言
返信


投稿者: (ぱ)
2003/12/02 22:06

Mail:PXU00211@nifty.ne.jp   Link:http://member.nifty.ne.jp/maebashi/
 > 断酒がんばってください。

ありがとうございます (_o_)

> 本日、先日の健康診断の結果が出まして、
> γ-GTPっていうのが 1年で4倍の数値(30→120)になってしまいました。

うわ、そんなに一気に増えますか。ご自愛ください。
基準値は80くらいまででしたよね。120くらいの人は結構いると思いますが。

私の前回の数値は24でした。その前は20です。もっと前は、確か14とかいう
数値を覚えています。まだまだ余裕がありそうですが、じりじり上がってますし、
増えるときは一気に増えるとなると油断できませんね。

> それこそ1年くらい断酒しないといけない状況なのですが、

2chの酒板にはこんなスレがありまして、

「お前ら自分のγーGTPを書きなさい」
http://food3.2ch.net/test/read.cgi/sake/1020261260/l50

ここを読むと勇気がわきますが… たぶんそんな勇気は持たないほうが
いいんでしょうねえ。

> 誘われなくすることも、誘いを断ることも
> 行ってがぶ飲みを拒否することも難しい状況です。

白人さんは日本人より圧倒的に酒が強いんですよね。
あまり無理をされないように(ってそれが難しいってことなんでしょうが)。


[474] Re:断酒宣言
返信


投稿者: 本多
2003/12/02 16:24

Mail:manybook@msc.biglobe.ne.jp   Link:
 断酒がんばってください。
私も某国の習慣で暴飲を繰り返した結果、肝臓の数値が危険な領域に。

本日、先日の健康診断の結果が出まして、
γ-GTPっていうのが 1年で4倍の数値(30→120)になってしまいました。

えっと、コレがどういう数値なのか何を意味しているのかサッパリなんですが
肝臓が悲鳴を上げてるのは確かなんだろうと。

それこそ1年くらい断酒しないといけない状況なのですが、
誘われなくすることも、誘いを断ることも
行ってがぶ飲みを拒否することも難しい状況です。


[473] Re:また質問です。
返信


投稿者: 本多
2003/12/02 16:15

Mail:manybook@msc.biglobe.ne.jp   Link:
 詳しい説明は(ぱ)さんからされているので、ちょっとわき道♪

> すいませんこれって16進数で表す時両方ともFFFFFFFFになってますよね、
> マイナスになってないってことは両方ともsigned型のような気がしますが、
> それと10進数で表すと両方-1(オーバーフロー起こして)で、
> どっちもunsigned型のような気がします・・、なぜなんでしょうか?

この表現、感覚的に逆なんですけど。
マイナスになってない→ singed型
マイナスになる →unsigned型

私の感覚では
マイナスになる → singed型( 符号整数型)
マイナスにならない→unsigned型(無符号整数型)

もちろん、どっちの型を使おうが
printf()には0xffffffffっていう値しか渡ってこないんですけどね。


[472] Re:断酒宣言
返信


投稿者: (ぱ)
2003/12/02 00:28

Mail:PXU00211@nifty.ne.jp   Link:http://member.nifty.ne.jp/maebashi/
 > ども前橋君。

どうもです。(古い話ですが)合宿の節はお世話になりました。

> 断酒宣言、読みました。まぁ、そんな気楽なところでいいんではないでしょうか。

まだ2日目なわけですが、えらく健全にゴハン食べたりしてます。
いやその、晩飯と言えばビール+つまみでゴハンなし、なんて食生活は、
やっぱり不健全ですよね。

> ま、健康診断過ぎたらまた金沢へでも行きましょう。

ええと、雑記帳にも書いたとおり、誘われて飲むのは良いことになっているので
いつでもじゃんじゃん声をかけてください。
# と、こうして宣言を有名無実化していくのであった。


[471] Re:また質問です。
返信


投稿者: (ぱ)
2003/12/02 00:16

Mail:PXU00211@nifty.ne.jp   Link:http://member.nifty.ne.jp/maebashi/
 > すいませんこれって16進数で表す時両方ともFFFFFFFFになってますよね、
>マイナスになってないってことは両方ともsigned型のような気がしますが、

ishikawaさんの環境は、int, longともに32ビットのようですから、
この例ではaもbもどちらも4バイトを占めていて、メモリ上では同じ
ビットパターンを持ちます。ここまではよいですか?]

その変数がsignedであるかunsignedであるかとか、あるいはintであるか
doubleであるかとかいった「型情報」は、Cは実行時には保持していません。

ではprintf()ではどうやって符号付き、符号なしで表示するのかと言えば、
それをプログラマが書式指定により指定するわけです。
10進符号無しで表示させたければ、%uを使います。

そもそもprintf()が、どんな引数が渡されたのかを自力で判断できるのなら、
書式指定に%dだの%fだのをプログラマがわざわざ与えてやる必要はないはずで
(まあフィールド長の指定などをすることもありますが、やらないことが多いでしょ)、
printf()は、どんな型の引数が渡されたのかを書式指定から知るしかないのです。

だから、%dとか%xとかの指定と、実際の引数の数や型が異なる場合、
printf()は平然とわけわかんない出力をしてくれます。最悪コケます。
このあたりのことは、可変長引数(stdarg.h)を勉強するとよくわかります。


[470] また質問です。
返信


投稿者: ishikawa
2003/12/01 23:05

Mail:   Link:
 何回もすいません質問です。
#include <stdio.h>

int main(void)
{
long a;
unsigned b;

a = 0xFFFFFFFF;
b = 0xFFFFFFFF;
printf("%x,%x\n%d,%d",a,b,a,b);

return(0);
}
すいませんこれって16進数で表す時両方ともFFFFFFFFになってますよね、マイナスになってないってことは両方ともsigned型のような気がしますが、
それと10進数で表すと両方-1(オーバーフロー起こして)で、どっちもunsigned型のよう
な気がします・・、なぜなんでしょうか?


[469] 断酒宣言
返信


投稿者: 技術系職場勤めでないOB
2003/12/01 23:02

Mail:   Link:
 ども前橋君。いつも難しいところは飛ばして見させていただいてます。

断酒宣言、読みました。まぁ、そんな気楽なところでいいんではないでしょうか。
私も金土はかなり飲むので、それ以外の平日はできるだけ一人飲みはしないように
しようと思ってます。飲み会は人とのコミュニケーションという意味合いもあり
ますからね。

飲むのが週6から週2になるだけでもずいぶんと違うと思いますので、無理せず
「節酒」してください。いつまでも若いつもりではいけませんよ。

ま、健康診断過ぎたらまた金沢へでも行きましょう。


[467] Re:%cについて
返信


投稿者: ishikawa
2003/11/27 21:20

Mail:   Link:
 > ヌル文字を付けることと、「文字と判断」することは無関係ですね。
> Cでは、通常文字列の終端にはヌル文字を付けますが、
> 「文字にヌル文字を付ける」ということはありません。
>
> 「文字」と「文字列」の違いは理解されてますか?
> 文字といえばchar型ですが、文字列はcharの配列です。

なるほど、これも普通に表示されますからね。

#include <stdio.h>

int main(void)
{
char a;
char b[2];
a = 'y';
b[0] = 'z';
b[1] = 'w';

printf("%c\n",a);
printf("%c\n",b[0]);
printf("%c\n",b[1]);

return(0);
}

どうもありがとうございました。


[466] Re:%cについて
返信


投稿者: (ぱ)
2003/11/27 01:03

Mail:PXU00211@nifty.ne.jp   Link:http://member.nifty.ne.jp/maebashi/
 ははあ… だんだんわかってきました。

> すいません・・、フィールド長ってなんですか?

たとえば%5sのように書くとき、この5がフィールド長です。
でも%cにフィールド長を付けることは通常の使用ではまずないでしょう
から、今は気にしなくてよいと思います。

> それと、ヌル文字を付けてないんだったらどうやって文字と
> 判断しているんでしょうか?

ヌル文字を付けることと、「文字と判断」することは無関係ですね。
Cでは、通常文字列の終端にはヌル文字を付けますが、
「文字にヌル文字を付ける」ということはありません。

「文字」と「文字列」の違いは理解されてますか?
文字といえばchar型ですが、文字列はcharの配列です。


[465] Re:%cについて
返信


投稿者: ishikawa
2003/11/26 19:25

Mail:   Link:
 > > 質問です。C言語の%cっていう書式指定のことなんですけど。
> > %cは文字を入力するときは一文字にNULL文字を付加して入力する、
> > 出力する時はNULL文字を付加しないで出力するってことでいいんですね?
>
> いいえ。
> 普通、%cといえば、scanf()にしてもprintf()にしても「文字」の入出力に
> 使われることが多いんじゃないでしょうか。
> scanf()の場合、フィールド長の指定で文字列を受け取ることもできるようでは
> ありますが、どっちにしてもヌル文字は付加しません。もし付けるようだと、
> フィールド長指定のデフォルトは1ですから、普通に&cとして受けたときに
> 領域破壊を起こしてしまいます。
> また、printf()が書式指定の途中でヌル文字くっつけるようじゃ大変です。

すいません・・、フィールド長ってなんですか?
それと、ヌル文字を付けてないんだったらどうやって文字と判断しているんでしょうか?


[464] Re:%cについて
返信


投稿者: (ぱ)
2003/11/26 00:10

Mail:PXU00211@nifty.ne.jp   Link:http://member.nifty.ne.jp/maebashi/
 > 質問です。C言語の%cっていう書式指定のことなんですけど。
> %cは文字を入力するときは一文字にNULL文字を付加して入力する、
> 出力する時はNULL文字を付加しないで出力するってことでいいんですね?

いいえ。
普通、%cといえば、scanf()にしてもprintf()にしても「文字」の入出力に
使われることが多いんじゃないでしょうか。
scanf()の場合、フィールド長の指定で文字列を受け取ることもできるようでは
ありますが、どっちにしてもヌル文字は付加しません。もし付けるようだと、
フィールド長指定のデフォルトは1ですから、普通に&cとして受けたときに
領域破壊を起こしてしまいます。
また、printf()が書式指定の途中でヌル文字くっつけるようじゃ大変です。


[463] %cについて
返信


投稿者: ishikawa
2003/11/25 22:25

Mail:   Link:
 すいません↑のは途切れてしまったみたいです。

質問です。C言語の%cっていう書式指定のことなんですけど。
%cは文字を入力するときは一文字にNULL文字を付加して入力する、
出力する時はNULL文字を付加しないで出力するってことでいいんですね?
しょーもない単発質問ですいません。


[462] %cについて
返信


投稿者: ishikawa
2003/11/25 22:21

Mail:   Link:
 質問です。C言語の%cっていう書式指定のことなんですけど。
%cは文字を入力するときは一文字にNULL文字を付加して入力する、出力する時はNULL文字を付加しないで出力するってことでいいんですね?
しょーもない単発質問ですいません。


[461] Re:感想など。
返信


投稿者: (ぱ)
2003/11/24 21:47

Mail:PXU00211@nifty.ne.jp   Link:http://member.nifty.ne.jp/maebashi/
 > # ただ、それってオブジェクト指向とはあんまり関係ないんじゃないか?

インスタンスというのはまさにオブジェクトそのものなのであって、
マルチプルインスタンスは、オブジェクト指向の、少なくとも必要条件では
あるはずですよね。もちろん十分条件ではないんでしょうが。

> たとえば、API側でウィンドウハンドルを返すようなシステムで、
> そのラップモジュールではインスタンスを一つしか考えないというのは
> もうちょっと良く考えなさい、としか言いようがないと思いますが。

でも見たことありますし(^^;
仮にラップモジュールを複数のウインドウを扱えるようにしたとしても、
「カレントウインドウ」という概念を持ち込んでしまう人は多そうです。
これはこれで用途次第では悪くはないですが、汎用品を目指すなら
避けたいところですね。

> ポイントは、「なぜモジュールのインスタンスを考える必要があるのか?」
> という疑問に対して、「モジュールには内部状態や属性があるからだ」
> という答えが出せるかどうかでしょうか。

そう思います。ですからそう書いているつもりです。
逆に言うと、内部状態や属性を持たないモジュール(java.lang.Mathのような)は、
別に関数でも全然構わないじゃん、とも思っています。


[460] Re:atoiとatol
返信


投稿者: (ぱ)
2003/11/24 20:36

Mail:PXU00211@nifty.ne.jp   Link:http://member.nifty.ne.jp/maebashi/
 > とありますが、atolでエラーチェック出来ます?

うわっ、失礼しました。strtol()と書くつもりでatol()と書いてました。
ご指摘ありがとうございます。修正しておきました。


[459] Re:感想など。
返信


投稿者: xiu
2003/11/24 12:38

Mail:xiu@pc.email.ne.jp   Link:http://www.ne.jp/asahi/homepage/xiu/
 こんにちは。また書き込ませてもらいます。

私が思ったのは、それがオブジェクト指向言語であれ、手続き型言語であれ、
インスタンスは一つしか考えないような前提に立っていたのでは、
いずれにせよ同じ壁にぶつかってしまうのではないかということです。
# ですから、マルチインスタンスが重要というのには全く同意します。
# ただ、それってオブジェクト指向とはあんまり関係ないんじゃないか?
# という気がするわけでして。

たとえば、API側でウィンドウハンドルを返すようなシステムで、
そのラップモジュールではインスタンスを一つしか考えないというのは
もうちょっと良く考えなさい、としか言いようがないと思いますが。
# そのモジュールをsingletonにしたいのなら別ですでけど。

> 従来の手続き指向プログラミングでは、「データ」と「モジュール」は
> 別物だったわけですが、オブジェクト指向ではどちらもクラスに統合されています。
> で、「データ」に、オマケ程度のメソッドを付けて整合性を保持するのは
> すぐに理解できますが、「モジュール」もまたクラスである、ということを
> 理解するのは結構難しいんじゃないでしょうか。実際、私も説明に苦労したことが
> かなりありますし。
そうかもしれません。手続き型言語ではutility的なモジュールを前提として
考えていることが多いため、「モジュールのインスタンスを作成する」という
ことが一つの壁になる、という気はします。

ポイントは、「なぜモジュールのインスタンスを考える必要があるのか?」
という疑問に対して、「モジュールには内部状態や属性があるからだ」
という答えが出せるかどうかでしょうか。

> 問題は「そもそもインスタンスがわからない奴なんているのか?」という
> ことですが、「いる」と私は考えます。それはもう経験的に。
そういう前提なら、〜再入門の構成は理解できます。
ただ、どちらかというと「オブジェクト指向、ちょっとその前に」
という感じでしょうか?


[458] atoiとatol
返信


投稿者: 284
2003/11/24 04:35

Mail:   Link:
 そういえば「オブジェクトに仕事をさせる、ということ」の文末補足※1に
>atoi()はエラーチェックのできない困った関数なので、 まともなプログラマならsscanf()なりatol()なりを使うかと思いますが
とありますが、atolでエラーチェック出来ます?
手元のヘルプが糞なのかも知れないですが、どうやってエラーチェックするのか
解りませんでした。


[457] Re:感想など。
返信


投稿者: 284
2003/11/24 04:30

Mail:   Link:
 > 問題は「そもそもインスタンスがわからない奴なんているのか?」という
> ことですが、「いる」と私は考えます。それはもう経験的に。
はい。ここに(w
前回更新分のページ読みました。
理解し易かったですよ。

> > #次はクラスと継承あたりかな〜?
>
> うーん、まだ考え中です。
期待しております。


[456] Re:感想など。
返信


投稿者: 284
2003/11/24 04:25

Mail:   Link:
 > つまり、理解できない根本的原因は、
> 「Cで出来るんだから、C++なんていらないんじゃない?」
> という、むしろ「理解しない」ことにあるのではないでしょうか。

私の場合は「理解しない」というより、純粋に「それを利用する価値が見いだせな
かった」ですね。
マルチプルなインスタンスの利用価値です。

ここのサイトのおかげで、ちょっとずつ分かってきましたが…。

最近の「壁(疑念)」は、「かなり綿密に考えてクラス設計しておかないと、
マルチプルに利用するのは難しいのかも??」ですね。

まだまだ分かってませんね。(^^;


[455] Re:感想など。
返信


投稿者: (ぱ)
2003/11/24 03:53

Mail:PXU00211@nifty.ne.jp   Link:http://member.nifty.ne.jp/maebashi/
 どうもです。

> たとえば、Cでバリバリコードを書いていた人が、もしC++でつまずいたとしたら、
> それは「マルチインスタンスが理解できない」からではないと思うんですよ。
> 多分そういう人はCでもmallocを使って動的にインスタンスを生成するということを
> 当たり前のようにやっていたと思いますし。

どうでしょうか。「Cでバリバリコードを書いていた人」の中にも、
構造体といえばでっかい配列をグローバルに確保するだけ、という、
あんたCOBOLのDATA DIVISIONか何かと勘違いしてるんじゃない? なんて人は
結構ゴロゴロしていたりして、まあこれはちょっと極端な例としても、
たとえmalloc()を使っても、それはあくまで「データ」の領域の確保の
ためなんじゃないかと思います。たとえばドローツールを作るとして、
Shape構造体はmalloc()で確保しても、Windowのようなものはあくまで
描画用の「モジュール」であり、コアになるデータを構造体にしてmalloc()で
確保して第1引数で渡そうとは思いもしない、という人が多いのではないかと
思います。
たとえウインドウシステム側がウインドウのハンドルを返すような仕様に
なっていたとしても、たとえば実数での描画座標系が欲しい、というような
理由でそれをラップする場合には、ハンドルを静的な変数で押さえてしまう人が
多いんじゃないでしょうか。初期の仕様で、ウインドウが1枚しか必要とされて
いなかったとすれば。オセロ盤も同様。

「モジュール」を作るときには、当面の要不要に関わらず、とりあえず
それが保持すべきデータを構造体にして、malloc()で確保して、常に
第1引数で渡すようにする、という「作法」を常に心がけているような人は、
C++やJavaに移行するぐらいで困ることはないと思いますよ。

> たとえば、私がC++を始めた頃、
> 「クラスっていうのは構造体に振る舞いがついたもんなのね」
> というような解釈をしていました。確かにそれでも
> 多少はマシなコードにはなったかもしれませんし、プログラムも動きます。

「クラスっていうのは構造体に振る舞いがついたもんなのね」という理解は、
たとえばShapeのような明らかに「データ」であるクラスについて、
メソッドを経由してアクセスすることで整合性が保証されたりする、
という効果があると思います。

しかし、「モジュール」については、たいていのCプログラマは「手続きの
集合体」と認識していて、もちろん「モジュール」もたいてい何らかの
データを保持するけれど、それはstaticでソースファイルに隠蔽するなり
命名規則で逃げるなりすればいいんじゃないか、という意識だと思います。
こういう人に「カプセル化」を教えても、「俺は前からやってるよ」と
言われるでしょうし、それはその通り。

従来の手続き指向プログラミングでは、「データ」と「モジュール」は
別物だったわけですが、オブジェクト指向ではどちらもクラスに統合されています。
で、「データ」に、オマケ程度のメソッドを付けて整合性を保持するのは
すぐに理解できますが、「モジュール」もまたクラスである、ということを
理解するのは結構難しいんじゃないでしょうか。実際、私も説明に苦労したことが
かなりありますし。

> 私がオブジェクト指向の強力さに目からウロコだったのは、継承と仮想関数を
> ちゃんと理解したときでしょうか。Template Methodなんかを当たり前のように
> 使えるようになった頃、ようやく自分もオブジェクト指向を理解したかな、と
> 思ったものです。

継承やポリモルフィズムが強力な概念であることは否定しません。
でも、その前にインスタンスがわからなければいけない、という点は
同意されますよね? ポリモルフィズムは「インスタンスごとに振る舞いを
変える」機能ですし。

問題は「そもそもインスタンスがわからない奴なんているのか?」という
ことですが、「いる」と私は考えます。それはもう経験的に。

> #次はクラスと継承あたりかな〜?

うーん、まだ考え中です。


[454] 感想など。
返信


投稿者: xiu
2003/11/23 02:30

Mail:xiu@pc.email.ne.jp   Link:http://www.ne.jp/asahi/homepage/xiu/
 久々に書き込みます。一時期は凄い書き込みの量で立ち入りがたい
雰囲気だったものですから(笑)。

オブジェクト指向再入門、読ませていただいております。
ちょっと感想や思ったことなどを書き込みます。

〜再入門を読んでいると、オブジェクト指向はマルチインスタンスなんだよ、
ということがイヤというほど伝わってきますが(別にイヤではないですけれど(笑))、
しかし、だからといってそれがCとC++の違いかっていうと「それは違うだろう」
と感じます。
たとえば、Cでバリバリコードを書いていた人が、もしC++でつまずいたとしたら、
それは「マルチインスタンスが理解できない」からではないと思うんですよ。
多分そういう人はCでもmallocを使って動的にインスタンスを生成するということを
当たり前のようにやっていたと思いますし。つまり、理解できない根本的原因は、
「Cで出来るんだから、C++なんていらないんじゃない?」
という、むしろ「理解しない」ことにあるのではないでしょうか。

たとえば、私がC++を始めた頃、
「クラスっていうのは構造体に振る舞いがついたもんなのね」
というような解釈をしていました。確かにそれでも
多少はマシなコードにはなったかもしれませんし、プログラムも動きます。
でも、逆にそれで動いてしまうからそれで満足してしまい、それ以上
前に進もうとしなかったことがありました。
でも、これではコードも構造体がクラスになっただけのCプログラムに
なってしまい、オブジェクト指向設計は絶対に出来ませんよね。

私がオブジェクト指向の強力さに目からウロコだったのは、継承と仮想関数を
ちゃんと理解したときでしょうか。Template Methodなんかを当たり前のように
使えるようになった頃、ようやく自分もオブジェクト指向を理解したかな、と
思ったものです。

長くなりましたが、以上です。
今後も期待していますので、頑張ってください。
#次はクラスと継承あたりかな〜?


[453] Re:関数呼出しかメッセージか
返信


投稿者: (ぱ)
2003/11/17 03:12

Mail:PXU00211@nifty.ne.jp   Link:http://member.nifty.ne.jp/maebashi/
 > お久しぶりです。ちょっとデスマです。

どうもです。
私も何かとアレな状態で、大変に久々な更新になりましたが、
ようやく次のページをUPいたしました。
内容的には書き足りないところが多々あるんですが…

> http://www.zdnet.co.jp/mobile/0311/07/n_bapp.html
>
> ここを読んでいて、インスタンスの考え方がまた少し理解出来たような気もする・・。

ページの紹介ありがとうございます。
これも「第1引数に構造体へのポインタを渡す」形式ですよね。
結局のところ「継承を考えない範囲においては」オブジェクト指向って要するに
そういうことじゃん、と私は思っていますです。



[452] Re:関数呼出しかメッセージか
返信


投稿者: 284
2003/11/15 22:40

Mail:   Link:
 お久しぶりです。ちょっとデスマです。

> Javaのようなオブジェクト指向言語では、誰か一人「主役」を選ばなければならず、
> そこで不自然さが出てくることがあるわけです。
> [435]の引用にあるライトバルブとソケットのように。
>
> だとすると、284さんが[428]で
> >人間的には、DrawTextは”文字列描画”という
> >目的がメインであり、DCは副次的に必要な要素に捉えるものではないかと思います。
>
> と書かれたように、DrawTextという処理をメインに持ってくる方が自然なケースも
> あるはずで、要は上記の部分に賛成したかったのでした。
> せっかく開眼したところに水を差すようですみませんが。

いえいえ、まだまだ修行途中ですし。
複数の主役の使い分け等はまだまだ理解出来ません。

気晴らしに
http://www.zdnet.co.jp/mobile/0311/07/n_bapp.html

ここを読んでいて、インスタンスの考え方がまた少し理解出来たような気もする・・。


[451] Re:メッセージ、private
返信


投稿者: 本多
2003/11/02 11:29

Mail:manybook@msc.biglobe.ne.jp   Link:
 > そうですね。逆にC言語でサクッと実装しちゃうのも凄いなと思ったり。
私もそう思います。すごいですよね。
ちょっとやってみようかなって思っても
「大変そうだし、やらないよなぁ。普通は」
なんて思って躊躇しますよね?(^^)

> コマンドというのはそれで合っています。
> topやらsarなんかで状況を打診したりとか、
> パイプでつないでコマンド間で連携を取るのがメッセージっぽいかなって思いました。
見た目は非常に似てますよね。
どっちも普通の文章ポイ記述を基にしているからかなぁ。
でも、やっぱり見た目だけかも(^^;)

> 継承はできませんが、Bシェル系である機能を持ったスクリプト組んで、
> 下位のスクリプトから「.」で読み込んで無理やりコマンドやら
> 関数のオーバーライトくらいできるかも!?
っていうか、スクリプトを組んでいいなら、
fileの種類とかでcommandを選択させれば、
オーバーライトはできちゃうんですけど、
じゃあシェルがオブジェクト指向かというと
やっぱり、何か違う気がします。

オブジェクト指向って言ったら、やっぱりfile.aとfile.bがあって、
% command file.a
とやった場合と、
% command file.b
とやった場合で、shellがfile.aとfile.bを見分けて
全く異なるcommandが実行されなくちゃ嘘だと思うんですよね。

fileをダブルクリックしたときの動作が一番感覚に近いかも。
fileの種類によってwordやexcelが開くわけだし。
さらにfile一つ一つに対してdefaultとは違うapplicationが実行できるように
指定できたらオブジェクト指向的な感じがします
(defaultを継承してさらに関数のオーバーライトができてる感じ)
# 少し違う気もしますが...

そういう意味では、commandってあくまでグローバル関数のimageに近い気がしてます。

私はUNIX上では、同じmallocでもdynamic link libraryをmapmallocにするだけで、
普通はfree()してもsystemに帰らなかったmemory領域を
free()したときにsystemに返却できることを知って、
継承とかメソッド オーバーライトの利点の様なものを理解しました。
いや、それもオブジェクト指向とは違うと言われたら、うんその通りなのですが。


ひとつ前の過去ログ | 目次へ | ひとつ後の過去ログ