K.Maebashi's BBS

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

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

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

[550] Re:reallocについて
投稿者:本多
2007/02/20 02:13:25

こんな感じかなぁ? 要素追加しちゃったけど。 ---- #include <stdio.h> #include <stdlib.h> #include <string.h> typedef struct{ int itemCount; char cString[50]; char **cpItem; } typChangePrm; typChangePrm *CreatePrm( char *cString, int itemCount) { typChangePrm *prm = NULL; int i; if ( (prm = malloc( sizeof( typChangePrm))) == NULL) { fprintf(stderr,"ERROR: memory allocation\n"); goto LERROR; } if ( strlen( cString) >= 50 ) return NULL; strcpy( prm->cString, cString); prm->itemCount = itemCount; if ( (prm->cpItem = malloc( sizeof(char *) * itemCount )) == NULL) { fprintf(stderr,"ERROR: memory allocation\n"); goto LERROR; } for ( i=0; i<itemCount; i++) prm->cpItem[i] = NULL; return prm; LERROR: free( prm->cpItem); free( prm); return NULL; } void PrmDestroy( typChangePrm *prm) { int i; for ( i=0; i<prm->itemCount; i++) free(prm->cpItem); free(prm->cpItem); free(prm); } void PrmResize( typChangePrm *prm, int itemCount) { char **tmp; int i; if ( prm->itemCount >= itemCount ) { for ( i=itemCount; prm->i<itemCount; i++) free( prm->cpItem[i]); prm->itemCount = itemCount; return; } tmp = prm->cpItem; if ( (tmp = realloc( tmp, sizeof(char *) * itemCount)) == NULL) { fprintf(stderr,"ERROR: memory allocation\n"); goto LERROR; } prm->cpItem = tmp; for ( i=prm->itemCount; i<itemCount; i++) prm->cpItem[i] = NULL; prm->itemCount = itemCount; return; LERROR: free( prm->cpItem); } void PrmSetItem( typChangePrm *prm, int item_no, char *item) { if ( item_no >= prm->itemCount) return; if ( (prm->cpItem[ item_no] = strdup( item)) == NULL) fprintf(stderr,"ERROR:memory allocation\n"); } void PrmShow( typChangePrm *prm) { int i; printf("********************************\n"); printf("Item Count:%d\n",prm->itemCount); printf("cString :%s\n",prm->cString); for ( i=0; i<prm->itemCount; i++) printf("Item[%d]:%s\n",i,((prm->cpItem[i]==NULL)?"NULL":prm->cpItem[i])); } int main(void) { typChangePrm *prm; char *item[] = { "hello", "world", "program"}; if ( (prm = CreatePrm("c-string",2)) == NULL) return 1; PrmSetItem(prm,0,item[0]); PrmSetItem(prm,1,item[1]); PrmShow( prm); PrmResize( prm, 3); PrmSetItem(prm,2,item[2]); PrmShow( prm); PrmResize( prm, 1); PrmShow( prm); PrmDestroy(prm); return 0; }
[この投稿を含むスレッドを表示] [この投稿を削除]
[548] Re:reallocについて
投稿者:774RR
2007/02/20 02:13:25

>data.cpItem[n] = realloc( data.cpItem[n], new_size); 皆さん同じコードをかかれていますけど、これってダメコードですよ。 realloc() に失敗したら、旧 data.cpItem[n] がリークしますね。 # 旧値が失われて復旧の手段が無い。 realloc() に失敗する状況でどうリカバリーするかの仕様次第ですけど、 書かない癖つけたほうがいいと思う。
[この投稿を含むスレッドを表示] [この投稿を削除]
[547] Re:reallocについて
投稿者:本多
2007/02/20 02:13:25

>要はコダマンさんが、 > ・cpItem自体をreallocしたいのか > ・cpItem[n]のほうをreallocしたいのか >に尽きるんじゃないでしょうか。 要求をちゃんと定義してもらわずに作業を始めると戻り工数が大きくなりますよねー 私は最初「構造体の中のポインタ配列のreallocの方法」と言ってるので typedef struct{ char cString[50]; char *cpItem[]; }typChangePrm; typChangePrm data; data.cpItem[n] = realloc( data.cpItem[n], new_size); の程度のことを質問してると思ってましたが...(^^) 日本語の解釈って色々できるんですね。
[この投稿を含むスレッドを表示] [この投稿を削除]
[546] Re:reallocについて
投稿者:れぷ
2007/02/20 02:13:25

要はコダマンさんが、  ・cpItem自体をreallocしたいのか  ・cpItem[n]のほうをreallocしたいのか に尽きるんじゃないでしょうか。 まきじさんのサンプルは前者をrealloc()ですけれど、 後者も行いたい場合はやはりこちらもrealloc()で書いたほうが便利でしょうね。 # あとcpItem自体が縮小した場合の考慮をしないとメモリリークしますね。 # ってここはツッコミ入れなくても大丈夫か(^-^;)
[この投稿を含むスレッドを表示] [この投稿を削除]
[545] Re:reallocについて
投稿者:(ぱ)
2007/02/20 02:13:25

>…が、既にかずまさんからツッコミが入ってますが、まきじさんのコードだと、 >2回目のrealloc()でも第一引数にNULL渡してますね…ケアレスミスだとは思いますが。 よく読んでなかったのでここも修正です… 2回目のrealloc()は別に領域拡張しているわけではなく、単なるmalloc()と 同値なので、上の私の記述は見当外れですね。失礼しました。
[この投稿を含むスレッドを表示] [この投稿を削除]
[544] Re:reallocについて
投稿者:まきじ
2007/02/20 02:13:25

>最初から第一引数に定数のNULLを渡すくらいなら、malloc()を使うべきでしょう。 realloc() の質問でしたので、realloc() にしただけです。 特に深い意味、意図はないです。
[この投稿を含むスレッドを表示] [この投稿を削除]
[543] Re:reallocについて
投稿者:(ぱ)
2007/02/20 02:13:25

>>>data.cpItem[i] = malloc(sizeof(char) * 64); > >realloc() の第一引数を、NULL にすれば、malloc() と同じ動作をします。 >よって、realloc(NULL,sizeof(char) * 64); でも問題ありません。 いや、もちろんそれは知っていますが、スタイルとしてどちらを取るかという 問題です。 もともと、realloc()の第一引数をNULLにすればmalloc()と同じ動作をする、 という仕様は、最初のメモリ確保と2回目以降のメモリ確保とで別々のコードを 記述する手間を避けるためのものでしょう。 ですから、この例で言えば、data.cpItemの指す先を確保した際、 その中身を全部NULLに初期化しておけば、 data.cpItem[i] = realloc(data.cpItem[i],sizeof(char) * 64); と書けば、このポインタの指す先にデータが来るかどうかわからないような 時、重複したコードを書かなくてよくなるわけです。 この仕様自体はそれなりに便利なものだとは思うのですが(でもこれも realloc()の仕様としてはオーバースペックだという意見もありうるわけですが)、 最初から第一引数に定数のNULLを渡すくらいなら、malloc()を使うべきでしょう。 …が、既にかずまさんからツッコミが入ってますが、まきじさんのコードだと、 2回目のrealloc()でも第一引数にNULL渡してますね…ケアレスミスだとは思いますが。 これは私は気付いていませんでした。
[この投稿を含むスレッドを表示] [この投稿を削除]
[542] Re:reallocについて
投稿者:まきじ
2007/02/20 02:13:25

>最初の 10個の領域とは別に、新たに 20個の領域を確保 *(data.cpItem + i) = realloc(NULL,sizeof(char) * 64); で、要素数が 64 個の char 型配列が新たに、20 個確保されていると云うことですね? それより前で、10 個確保されているので、第一引数に NULL を指定すると、 新たに 20 個確保され10 個分、余分にメモリを消費する。 だから、解放するか、20 個の内 10 個は、前と同じ内容なので、残りの 新たに確保された領域 10 個に対して、malloc() してやれば良いですね。 data.cpItem[10] から領域を新たに確保という事で for(i = 10;i < 20; i++){ *(data.cpItem + i) = realloc(NULL,sizeof(char) * 64); strcpy(*(data.cpItem + i),str); } でどうでしょうか?
[この投稿を含むスレッドを表示] [この投稿を削除]
[541] Re:reallocについて
投稿者:れぷ
2007/02/20 02:13:25

そういうわけで私流に書き直してみるテスト。 --- #include <stdio.h> #include <stdlib.h> #include <string.h> typedef enum { true = (1 == 1), false = !true } boolean; typedef struct{ char cString[50]; char **cpItem; } typChangePrm; void freeMemory(typChangePrm *data) { int i; printf("freeMemory - start\n"); for(i = 0; data->cpItem[i]; i++) { printf(" free(item) : pointer[%p]\n", data->cpItem[i]); free(data->cpItem[i]); } printf(" free(item container) : pointer[%p]\n", data->cpItem); free(data->cpItem); data->cpItem = NULL; printf("freeMemory - end\n"); return; } boolean allocateMemory(typChangePrm *data, size_t itemSize) { char **prevMemory; size_t allocateSize; int i; printf("allocateMemory - start\n"); if (data->cpItem != NULL) { freeMemory(data); } data->cpItem = calloc(itemSize + 1, sizeof(char *)); // +1して番兵をつける printf(" allocate(item container) : pointer[%p]\n", data->cpItem); for(i = 0;i < itemSize; i++){ data->cpItem[i] = calloc(64, sizeof(char)); if (data->cpItem[i] == NULL) { freeMemory(data); // 初期化に失敗したら壊す return false; } printf(" allocate(item) : pointer[%p]\n", data->cpItem[i]); } printf("allocateMemory - end\n"); return true; } int main(void){ typChangePrm data; char str[]="hoge"; size_t allocateSize; size_t itemSize; int i; data.cpItem = NULL; allocateMemory(&data, 10); allocateMemory(&data, 20); freeMemory(&data); return 0; }
[この投稿を含むスレッドを表示] [この投稿を削除]
[540] Re:reallocについて
投稿者:れぷ
2007/02/20 02:13:25

ついでに言うと、2回目のアロケートを以下のように書き直しても   *(data.cpItem + i) = realloc(*(data.cpItem + i), sizeof(char) * 64); realloc失敗時に*(data.cpItem + i)がNULLになってしまってやはりダメですね。
[この投稿を含むスレッドを表示] [この投稿を削除]
[539] Re:reallocについて
投稿者:かずま
2007/02/20 02:13:25

>realloc() の第一引数を、NULL にすれば、malloc() と同じ動作をします。 >よって、realloc(NULL,sizeof(char) * 64); でも問題ありません。 malloc も realloc も関係ありません。そのプログラム自体に問題があります。 最初の 10個の領域とは別に、新たに 20個の領域を確保していて、最初の 10個の領域は二度と使えません。これをメモリーリークといいます。
[この投稿を含むスレッドを表示] [この投稿を削除]
[538] Re:reallocについて
投稿者:まきじ
2007/02/20 02:13:25

>>data.cpItem[i] = malloc(sizeof(char) * 64); realloc() の第一引数を、NULL にすれば、malloc() と同じ動作をします。 よって、realloc(NULL,sizeof(char) * 64); でも問題ありません。
[この投稿を含むスレッドを表示] [この投稿を削除]
[537] Re:reallocについて
投稿者:(ぱ)
2007/02/20 02:13:25

ええと、これはコダマンさんの質問に対するひとつの解答例、ということで よいでしょうか? ところで私なら、 >*(data.cpItem + i) = realloc(NULL,sizeof(char) * 64); この部分はこう書きます。 >data.cpItem[i] = malloc(sizeof(char) * 64);
[この投稿を含むスレッドを表示] [この投稿を削除]
[536] Re:reallocについて
投稿者:まきじ
2007/02/20 02:13:25

#include<stdio.h> #include<stdlib.h> typedef struct{ char cString[50]; char **cpItem; /* ポインタのポインタにする*/ }typChangePrm; int main(void){ typChangePrm data; char str[]="hoge"; int i; /* 10 個の要素を持つポインタの配列を確保 */ data.cpItem = realloc(NULL,sizeof(char*) * 10); for(i = 0;i < 10; i++){ /* *(data.cpItem + i) に 64 個 の要素を持つ char 型の配列を確保 */ *(data.cpItem + i) = realloc(NULL,sizeof(char) * 64); strcpy(*(data.cpItem + i),str); } for(i = 0;i < 10; i++) printf("%s\n",*(data.cpItem + i)); strcpy(str,"foo"); /* ポインタの配列の要素数を 20 個に変更 */ data.cpItem = realloc(data.cpItem,sizeof(char*) * 20); for(i = 0;i < 20; i++){ /* *(data.cpItem + i) に 64 個 の要素を持つ char 型の配列を確保 */ *(data.cpItem + i) = realloc(NULL,sizeof(char) * 64); strcpy(*(data.cpItem + i),str); } for(i = 0;i < 20; i++) printf("%s\n",*(data.cpItem + i)); return 0; }
[この投稿を含むスレッドを表示] [この投稿を削除]
[535] Re:reallocについて
投稿者:(ぱ)
2007/02/20 02:13:25

はじめまして。 >typedef struct{ > char cString[50]; > char *cpItem[]; //タイプ/処理名/置換先項目/置換元項目/デフォルト値/ >}typChangePrm; まず質問ですが、コンパイラはなんでしょうか? いわゆるANSI-C (ISO-C89)では上のコードは通りません。 ISO-C99なら通ります。gccにも似たような独自拡張があったような。 >↑のような構造体の中のポインタ配列のreallocの方法がわからず苦戦しております。 で、単にcpItemを可変個確保したいだけなら、このページが参考になるでしょう。 http://seclan.dll.jp/c99d/c99d04.htm#dt19990726 確保するサイズは sizeof(typChangePrm) + sizeof(char*) * num ですね。 ただ、それ以前の問題として、こういう構造体をrealloc()する時は、 「この構造体を指しているポインタはないか」ということを意識する必要があります。 realloc()するとアドレスが変わることがあるため、これを指しているポインタがあると そっちも書き換えてやらなければいけません。 それが難しいのなら、可変長構造体を使うのではなく、この構造体に 可変長配列へのポインタを持たせるべきでしょう。 typedef struct{ char cString[50]; char **cpItem; // この先の領域をrealloc()する。 }typChangePrm; # ところでcpItemの数はどっかで保持してるんでしょうか。
[この投稿を含むスレッドを表示] [この投稿を削除]
[534] reallocについて
投稿者:コダマン
2007/02/20 02:13:25

始めまして。 typedef struct{ char cString[50]; char *cpItem[]; //タイプ/処理名/置換先項目/置換元項目/デフォルト値/ }typChangePrm; ↑のような構造体の中のポインタ配列のreallocの方法がわからず苦戦しております。 どなたか、ご存知でしたら教えてください。
[この投稿を含むスレッドを表示] [この投稿を削除]
[533] Re:名前のないクロージャで再帰呼び出し
投稿者:(ぱ)
2007/02/20 02:13:25

ええと、まず目的として、クイックソートなんだから当然再帰を使いたい、 ってのがあって、つまりいかにしてquick_sort_sub()を呼び出すかが 問題なわけですが、 以下の箇所で定義されているふたつのクロージャを、それぞれ c1, c2とすると、 fp_op2(closure(quick_sort_sub) { ←c1 return closure(left, right) { ←c2 c2が、通常のクイックソートの実行部ですが、その中では、 その外周のクロージャであるc1の引数である、quick_sort_sub()が 参照できるわけですね。 c1は、引数としてクロージャを受け取り、戻り値としてc2を返すわけですが、 c1の引数にc2を渡して実行できれば万事解決である、と。 で、これを実現しているのがfp_op2()であるわけですが、 これは以下のように書き換えることが可能で、 function fp_op2(f) { c3 = closure(p) { return p(p); }; c4 = closure(x) { c5 = closure(g, h) { return f(x(x))(g, h); }; return c5; }; return c3(c4); } 最後のreturnでc3が実行されていますが、 c3というのは、クロージャを受け取り、そのクロージャにそれ自身を 渡して実行して返す関数なわけで、で、c3のpに実際に渡されているのは c4なので、つまりこのタイミングでc4が実行される。 c4は引数としてxを受け取りますが、c3の定義からして、 xにはc4自身が格納されている。 そして、c4は、戻り値としてc5を返す。 この戻り値は、c3の戻り値でありすなわちfp_op2()の戻り値でもある。 呼び出し元のquick_sort()関数のほうでは、fp_op2()の戻り値に 引数ふたつ与えて評価して、それがクイックソートの実行となる。 で、そのc5ですが、「f(x(x))」のfはつまりc1であり、 その引数の「x(x)」におけるxはc4なので、fの引数には c4の戻り値が渡されることになる。 c4の戻り値であるc5はつまり、引数をふたつとってc1の戻り値 すなわちc2を実行して返す、という、c2のラッパーなので、 当初の目的である 「c1の引数にc2を渡して実行できれば万事解決である」 というのが実現できている… うーん、ぶすぶす… (頭から煙が出ている音) Paul Grahamの「簡潔さは力なり」の中で、 http://www.shiro.dreamhost.com/scheme/trans/power-j.html 数式を散文で書くと量が増える、なんてことが書いてありますが、 数式の力を持ち合わせていない私が書くとこうなってしまうわけで、 やっぱり勉強不足ですね。
[この投稿を含むスレッドを表示] [この投稿を削除]
[532] Re:名前のないクロージャで再帰呼び出し
投稿者:NykR
2007/02/20 02:13:25

> …頭から煙が出そうになったので、サンプルのソースを読もうとしてみました。 サンプルをそのまま追うと多分死にます。 簡略化してから追うと fp_op2(closure(f) { return closure(x, y) { ... f(a, b) ... }; }) ⇒ Z Z(c, d) ⇒ closure(f) { return closure(x, y) { ... f(a, b) ... }; }(Z)(c, d) ⇒ closure(x, y) { ... Z(a, b) ... }(c, d) こんな感じです。 参考ページ http://lecture.ecc.u-tokyo.ac.jp/~kawai/pub/is/isis2-note.html http://www.ice.nuie.nagoya-u.ac.jp/~h003149b/lang/fix.html # 「不動点演算子」じゃなかなか見付からないですね。orz # どうやって見付けたんだろう。 == 私も(crowbarを基に)プログラミング言語を作ろうと思っていますが、 そのときは名前付きのクロージャは入れないで、 Schemeの拡張シンタックスのような機能を付けようと思っています。 んで、 named_closure tag (x, y, ...) { ... } と書けば closure(tag) { tag = closure(x, y, ...) { ... }; return tag; }(null) と展開されるようなものをプログラマが自分で作れるようにしたいな、と(不動点演算子はどこへ行った) # で、ライブラリに入れておく
[この投稿を含むスレッドを表示] [この投稿を削除]
[531] Re:名前のないクロージャで再帰呼び出し
投稿者:(ぱ)
2007/02/20 02:13:25

>はじめまして、「プログラミング言語を作る」楽しく読ませていただいています。 どうも。はじめまして。最近停滞しておりましてすみません。 >crowbarには再帰呼び出しのための名前付きのクロージャがありますが、 >名前のないクロージャでも、不動点演算子を使えば再帰呼び出しは可能です。 知らなかったので、「不動点演算子」をGoogleしてみました。 …頭から煙が出そうになったので、サンプルのソースを読もうとしてみました。 …すみません、今の眠い頭ではちょっと追えそうにないので、後日再挑戦してみます。 興味深いネタの提供ありがとうございました。 # 勉強不足を痛感いたしますです。
[この投稿を含むスレッドを表示] [この投稿を削除]
[530] 名前のないクロージャで再帰呼び出し
投稿者:NykR
2007/02/20 02:13:25

はじめまして、「プログラミング言語を作る」楽しく読ませていただいています。 crowbarには再帰呼び出しのための名前付きのクロージャがありますが、名前のないクロージャでも、不動点演算子を使えば再帰呼び出しは可能です。 # 不動点演算子(2引数関数用) function fp_op2(f) { return closure(p) { return p(p); }(closure(x) { return closure(g, h) { return f(x(x))(g, h); }; }); } # 使用例。コードは(ぱ)さんの本にあったクイックソートをそのまま使わせていただきました function quick_sort(data, less) { fp_op2(closure(quick_sort_sub) { return closure(left, right) { pivot = data[(left + right) / 2]; left_index = left; right_index = right; while (left_index <= right_index) { for (; less(data[left_index], pivot); left_index++) {} for (; less(pivot, data[right_index]); right_index--) {} if (left_index <= right_index) { temp = data[left_index]; data[left_index] = data[right_index]; data[right_index] = temp; left_index++; right_index--; } } if (left_index < right) { quick_sort_sub(left_index, right); } if (left < right_index) { quick_sort_sub(left, right_index); } }; })(0, data.size() - 1); return data; } print("" + quick_sort({ 5,6,3,2,1,9,8,0,7,5,3,2,4,3 }, closure(lhs, rhs) { return lhs < rhs; }) + "\n"); # => (0, 1, 2, 2, 3, 3, 3, 4, 5, 5, 6, 7, 8, 9) 名前付きクロージャを使った方が簡単でわかりやすいですが(ついでに効率もいいです)、こういうのもありますよ、ということで投稿しました。 # 既にご存じでしたら申し訳ありません
[この投稿を含むスレッドを表示] [この投稿を削除]
[529] Re:crowbar ver.0.3.01について
投稿者:(ぱ)
2007/02/20 02:13:25

> | IF LP expression RP block ELSE block > { > $$ = crb_create_if_statement($3, $5, NULL, $7); > } >の間違いではないでしょうか? ご指摘ありがとうございます。その通りです。(また)まぬけなポカをしており 申し訳ありません。 なぜ気付かなかったんだろう… とtest.crbを見てみたのですが、 elsifを使っているパターンと、else側を通らないパターンでしか テストしてませんね… 論外。 さすがに今日は直せないので、この週末に対処させていただきます。 ご指摘ありがとうございました。
[この投稿を含むスレッドを表示] [この投稿を削除]
[528] crowbar ver.0.3.01について
投稿者:tsuka
2007/02/20 02:13:25

はじめまして.楽しく拝見させていただいております. 「プログラミング言語を作る」のcrowbar ver.0.3.01についてなのですが, crowbar.yのif statementの | IF LP expression RP block ELSE block { $$ = crb_create_if_statement($3, $5, NULL, $5); } は, | IF LP expression RP block ELSE block { $$ = crb_create_if_statement($3, $5, NULL, $7); } の間違いではないでしょうか? 使っていて気付いたのですが・・・. 既にお気づきor指摘済みかもしれませんが念のため.
[この投稿を含むスレッドを表示] [この投稿を削除]
[527] Re:リバーシゲームのはさみ将棋への改造
投稿者:SFファン
2007/02/20 02:13:25

ご無沙汰しています。 メモリリークの問題等を解決して何とかプロトタイプが出来ました。 まだ、 1)先手=人プレーヤー 後手=コンピュータプレイヤー オンリー 2)3手目以降人プレーヤーが打てない。 等の制限はありますが、コンピュータプレイヤーに打たせる事には成功しました。 コンピュータプレイヤーが打つ速度はJava版より速いです。 もっと改良を重ねて、最終的には本将棋ソフトを作成したいと考えています。 ソースを公開しますので、何かご意見があればお聞かせ下さい。 http://revolver.at.infoseek.co.jp/hasami-vc.lzh
[この投稿を含むスレッドを表示] [この投稿を削除]
[526] Re:JAVA VMエラー
投稿者:じゃぶじゃぶ
2007/02/20 02:13:25

アドバイスありがとうございます。 >そんなのはその証券会社にでも問い合わせるのが筋では? 証券の回答:SUNに問い合わせてください SUNでは米国に英語で問い合わせてください たらいまわし >いずれにせよこのエラーは、環境の不具合か、VMにバグがあるかしなければ >発生しないエラーです。ユーザ側で対処できることがあるとすれば、 >JRE(できれば少し古いの)を再インストールすることぐらいでしょう 結局:マイクロソフト VMビルドをインストールすることでHPアクセスできるようになりました。
[この投稿を含むスレッドを表示] [この投稿を削除]
[525] Re:JAVA VMエラー
投稿者:(ぱ)
2007/02/20 02:13:25

>本屋でJAVA謎+落とし穴徹底解明を見つけました。 だから何? >あまりにも難しい内容ですが今困っていますので教えてください。 >WIN XPSP2で証券会社のHPにアクセスすると下記ERRで強制終了します。 そんなのはその証券会社にでも問い合わせるのが筋では? あるいは、他のJavaアプレットのあるページ(うちのリバーシなど)も 動かなければ、そちらのブラウザの環境の問題ですし。 うちのリバーシのページ: http://kmaebashi.com/javaworld/reversi.html いずれにせよこのエラーは、環境の不具合か、VMにバグがあるかしなければ 発生しないエラーです。ユーザ側で対処できることがあるとすれば、 JRE(できれば少し古いの)を再インストールすることぐらいでしょう。 >またSUN JAVAコンソールをクイックしても同じERRになります。 クイック… http://www.google.co.jp/search?hl=ja&q=%E3%82%AF%E3%82%A4%E3%83%83%E3%82%AF%E3%81%99%E3%82%8B&btnG=Google+%E6%A4%9C%E7%B4%A2 なるほどねえ。
[この投稿を含むスレッドを表示] [この投稿を削除]
[524] JAVA VMエラー
投稿者:じゃぶじゃぶ
2007/02/20 02:13:25

本屋でJAVA謎+落とし穴徹底解明を見つけました。 あまりにも難しい内容ですが今困っていますので教えてください。 WIN XPSP2で証券会社のHPにアクセスすると下記ERRで強制終了します。 またSUN JAVAコンソールをクイックしても同じERRになります。 # # An unexpected error has been detected by HotSpot Virtual Machine: # # EXCEPTION_ACCESS_VIOLATION (0xc0000005) at pc=0x6d6c20e6, pid=1228, tid=2324 # # Java VM: Java HotSpot(TM) Client VM (1.5.0_02-b09 mixed mode) # Problematic frame: # V [jvm.dll+0x820e6] # --------------- T H R E A D --------------- Current thread (0x0562a6a8): JavaThread "main" [_thread_in_vm, id=2324] siginfo: ExceptionCode=0xc0000005, reading address 0x00000008 Registers: EAX=0x00000000, EBX=0x00000000, ECX=0x00000008, EDX=0x00000000 ESP=0x069f5f74, EBP=0x069f5fac, ESI=0x0562a6a8, EDI=0x00000000 EIP=0x6d6c20e6, EFLAGS=0x00010246 Top of Stack: (sp=0x069f5f74) 0x069f5f74: 6d6c494b 00000000 00000000 0562a764 0x069f5f84: 6d317763 0000000c 09352923 00000000 0x069f5f94: 100f38a0 00000000 00000000 056cf3a8 0x069f5fa4: 0562a6a8 00000000 069f5fd0 6d304c3a 0x069f5fb4: 0562a764 6d317774 00000000 0562a764 0x069f5fc4: 00000000 00000000 0562a764 069f5ff8 0x069f5fd4: 6d30543a 0562a764 069f6003 6d317774 0x069f5fe4: 6d317768 6d317750 055f5684 0562a764 Instructions: (pc=0x6d6c20e6) 0x6d6c20d6: e8 0c 2a ff ff c3 8b 44 24 04 8b 0d b0 64 7a 6d 0x6d6c20e6: 8b 04 01 c3 8b 44 24 04 8b 0d ac 64 7a 6d 8b 04 Stack: [0x06900000,0x06a00000), sp=0x069f5f74, free space=983k Native frames: (J=compiled Java code, j=interpreted, Vv=VM code, C=native code) V [jvm.dll+0x820e6] C [java.dll+0x4c3a] C [java.dll+0x543a] C [java.dll+0x54d3] C [java.dll+0x18ba] j java.lang.ClassLoader$NativeLibrary.load(Ljava/lang/String;)V+0 j java.lang.ClassLoader.loadLibrary0(Ljava/lang/Class;Ljava/io/File;)Z+300 j java.lang.ClassLoader.loadLibrary(Ljava/lang/Class;Ljava/lang/String;Z)V+48 j java.lang.Runtime.load0(Ljava/lang/Class;Ljava/lang/String;)V+57 j java.lang.System.load(Ljava/lang/String;)V+7 v ~StubRoutines::call_stub V [jvm.dll+0x818e8] V [jvm.dll+0xd4989] V [jvm.dll+0x817b9] V [jvm.dll+0x887ae] C [jpishare.dll+0x4380] C [jpishare.dll+0x1eb2] C [jpiexp32.dll+0x5744] C [npjpi150_02.dll+0x1abf] C [ole32.dll+0x2206a] C [ole32.dll+0x40a03] C [ole32.dll+0x4071d] C [ole32.dll+0x27b76] C [ole32.dll+0x27a62] C [ole32.dll+0x27c48] C [ole32.dll+0x27bf4] C [ole32.dll+0x4112b] C [ole32.dll+0x410e2] C [ole32.dll+0x27c9b] C [ole32.dll+0x27a62] C [ole32.dll+0x27a7c] C [ole32.dll+0x27a62] C [ole32.dll+0x278f6] C [ole32.dll+0x277af] C [ole32.dll+0x27731] C [urlmon.dll+0x3c5c7] C [urlmon.dll+0x3cb1e] C [urlmon.dll+0x3ce5a] C [mshtml.dll+0x273785] C [mshtml.dll+0x273afa] C [mshtml.dll+0x26e889] C [mshtml.dll+0x275cfe] Java frames: (J=compiled Java code, j=interpreted, Vv=VM code) j java.lang.ClassLoader$NativeLibrary.load(Ljava/lang/String;)V+0 j java.lang.ClassLoader.loadLibrary0(Ljava/lang/Class;Ljava/io/File;)Z+300 j java.lang.ClassLoader.loadLibrary(Ljava/lang/Class;Ljava/lang/String;Z)V+48 j java.lang.Runtime.load0(Ljava/lang/Class;Ljava/lang/String;)V+57 j java.lang.System.load(Ljava/lang/String;)V+7 v ~StubRoutines::call_stub --------------- P R O C E S S --------------- Java Threads: ( => current thread ) 0x066f0878 JavaThread "traceMsgQueueThread" daemon [_thread_blocked, id=2540] 0x066decc0 JavaThread "AWT-Windows" daemon [_thread_in_native, id=560] 0x066de8d8 JavaThread "AWT-Shutdown" [_thread_blocked, id=460] 0x066dab40 JavaThread "Java2D Disposer" daemon [_thread_blocked, id=1336] 0x06657588 JavaThread "Low Memory Detector" daemon [_thread_blocked, id=2148] 0x0659d750 JavaThread "CompilerThread0" daemon [_thread_blocked, id=292] 0x06554df8 JavaThread "Signal Dispatcher" daemon [_thread_blocked, id=2536] 0x06592a50 JavaThread "Finalizer" daemon [_thread_blocked, id=2532] 0x0563a580 JavaThread "Reference Handler" daemon [_thread_blocked, id=2528] =>0x0562a6a8 JavaThread "main" [_thread_in_vm, id=2324] Other Threads: 0x06581580 VMThread [id=2496] 0x05659768 WatcherThread [id=744] VM state:not at safepoint (normal execution) VM Mutex/Monitor currently owned by a thread: None Heap def new generation total 576K, used 334K [0x100b0000, 0x10150000, 0x10810000) eden space 512K, 52% used [0x100b0000, 0x100f3a80, 0x10130000) from space 64K, 100% used [0x10140000, 0x10150000, 0x10150000) to space 64K, 0% used [0x10130000, 0x10130000, 0x10140000) tenured generation total 1408K, used 201K [0x10810000, 0x10970000, 0x160b0000) the space 1408K, 14% used [0x10810000, 0x10842500, 0x10842600, 0x10970000) compacting perm gen total 8192K, used 3930K [0x160b0000, 0x168b0000, 0x1a0b0000) the space 8192K, 47% used [0x160b0000, 0x16486a20, 0x16486c00, 0x168b0000) No shared spaces configured. Dynamic libraries: 0x00400000 - 0x00419000 C:\Program Files\Internet Explorer\iexplore.exe 0x7c940000 - 0x7c9dd000 C:\WINDOWS\system32\ntdll.dll 0x7c800000 - 0x7c931000 C:\WINDOWS\system32\kernel32.dll 0x77bc0000 - 0x77c18000 C:\WINDOWS\system32\msvcrt.dll 0x77cf0000 - 0x77d7f000 C:\WINDOWS\system32\USER32.dll 0x77ed0000 - 0x77f16000 C:\WINDOWS\system32\GDI32.dll 0x77f20000 - 0x77f96000 C:\WINDOWS\system32\SHLWAPI.dll 0x77d80000 - 0x77e29000 C:\WINDOWS\system32\ADVAPI32.dll 0x77e30000 - 0x77ec1000 C:\WINDOWS\system32\RPCRT4.dll 0x76350000 - 0x764bc000 C:\WINDOWS\system32\SHDOCVW.dll 0x765c0000 - 0x76653000 C:\WINDOWS\system32\CRYPT32.dll 0x77c40000 - 0x77c52000 C:\WINDOWS\system32\MSASN1.dll 0x75410000 - 0x75485000 C:\WINDOWS\system32\CRYPTUI.dll 0x76be0000 - 0x76c0e000 C:\WINDOWS\system32\WINTRUST.dll 0x76c40000 - 0x76c68000 C:\WINDOWS\system32\IMAGEHLP.dll 0x770d0000 - 0x7715c000 C:\WINDOWS\system32\OLEAUT32.dll 0x76970000 - 0x76aad000 C:\WINDOWS\system32\ole32.dll 0x59250000 - 0x592a4000 C:\WINDOWS\system32\NETAPI32.dll 0x76660000 - 0x76704000 C:\WINDOWS\system32\WININET.dll 0x76f10000 - 0x76f3c000 C:\WINDOWS\system32\WLDAP32.dll 0x77bb0000 - 0x77bb8000 C:\WINDOWS\system32\VERSION.dll 0x762e0000 - 0x762fd000 C:\WINDOWS\system32\IMM32.DLL 0x60740000 - 0x60749000 C:\WINDOWS\system32\LPK.DLL 0x73f80000 - 0x73feb000 C:\WINDOWS\system32\USP10.dll 0x77160000 - 0x77262000 C:\WINDOWS\WinSxS\x86_Microsoft.Windows.Common-Controls_6595b64144ccf1df_6.0.2600.2180_x-ww_a84f1ff9\comctl32.dll 0x7d5b0000 - 0x7ddad000 C:\WINDOWS\system32\SHELL32.dll 0x5ab60000 - 0x5abf7000 C:\WINDOWS\system32\comctl32.dll 0x58730000 - 0x58768000 C:\WINDOWS\system32\uxtheme.dll 0x74660000 - 0x746ab000 C:\WINDOWS\system32\MSCTF.dll 0x75ed0000 - 0x75fcd000 C:\WINDOWS\system32\BROWSEUI.dll 0x20000000 - 0x20010000 C:\WINDOWS\system32\browselc.dll 0x76d90000 - 0x76db2000 C:\WINDOWS\system32\appHelp.dll 0x76f80000 - 0x76fff000 C:\WINDOWS\system32\CLBCATQ.DLL 0x77000000 - 0x770ab000 C:\WINDOWS\system32\COMRes.dll 0x73620000 - 0x7364e000 C:\WINDOWS\system32\msctfime.ime 0x4edc0000 - 0x4ee16000 C:\WINDOWS\system32\imjp81.ime 0x648f0000 - 0x649c0000 C:\WINDOWS\system32\imjp81k.dll 0x3b100000 - 0x3b11b000 C:\WINDOWS\IME\IMJP8_1\Dicts\IMJPCD.DIC 0x75c40000 - 0x75cdc000 C:\WINDOWS\system32\urlmon.dll 0x77fa0000 - 0x77fb1000 C:\WINDOWS\system32\Secur32.dll 0x76570000 - 0x765c0000 C:\WINDOWS\System32\cscui.dll 0x76550000 - 0x7656c000 C:\WINDOWS\System32\CSCDLL.dll 0x76040000 - 0x76199000 C:\WINDOWS\system32\SETUPAPI.dll 0x10000000 - 0x100af000 c:\program files\google\googletoolbar1.dll 0x71a00000 - 0x71a0b000 C:\WINDOWS\system32\WSOCK32.dll 0x719e0000 - 0x719f7000 C:\WINDOWS\system32\WS2_32.dll 0x719d0000 - 0x719d8000 C:\WINDOWS\system32\WS2HELP.dll 0x76af0000 - 0x76b1b000 C:\WINDOWS\system32\WINMM.dll 0x5a820000 - 0x5a827000 C:\WINDOWS\system32\serwvdrv.dll 0x58a60000 - 0x58a67000 C:\WINDOWS\system32\umdmxfrm.dll 0x74cd0000 - 0x74d61000 C:\WINDOWS\system32\MLANG.dll 0x76940000 - 0x76964000 C:\WINDOWS\system32\ntshrui.dll 0x76ad0000 - 0x76ae1000 C:\WINDOWS\system32\ATL.DLL 0x759b0000 - 0x75a60000 C:\WINDOWS\system32\USERENV.dll 0x71a50000 - 0x71a62000 C:\WINDOWS\system32\MPR.dll 0x75eb0000 - 0x75eb7000 C:\WINDOWS\System32\drprov.dll 0x71b60000 - 0x71b6e000 C:\WINDOWS\System32\ntlanman.dll 0x71c20000 - 0x71c35000 C:\WINDOWS\System32\NETUI0.dll 0x71be0000 - 0x71c20000 C:\WINDOWS\System32\NETUI1.dll 0x71bd0000 - 0x71bd7000 C:\WINDOWS\System32\NETRAP.dll 0x71b40000 - 0x71b53000 C:\WINDOWS\System32\SAMLIB.dll 0x75ec0000 - 0x75ec9000 C:\WINDOWS\System32\davclnt.dll 0x73cc0000 - 0x73cd3000 C:\WINDOWS\system32\shgina.dll 0x758b0000 - 0x759a3000 C:\WINDOWS\system32\MSGINA.dll 0x762b0000 - 0x762c0000 C:\WINDOWS\system32\WINSTA.dll 0x73520000 - 0x7355d000 C:\WINDOWS\system32\ODBC32.dll 0x76300000 - 0x76348000 C:\WINDOWS\system32\comdlg32.dll 0x03aa0000 - 0x03ab7000 C:\WINDOWS\system32\odbcint.dll 0x092d0000 - 0x09349000 C:\WINDOWS\system32\Audiodev.dll 0x086c0000 - 0x08904000 C:\WINDOWS\system32\WMVCore.DLL 0x070d0000 - 0x0710b000 C:\WINDOWS\system32\WMASF.DLL 0x67930000 - 0x679d1000 C:\WINDOWS\system32\DBGHELP.DLL 0x76e90000 - 0x76ecc000 C:\WINDOWS\system32\RASAPI32.DLL 0x76e40000 - 0x76e52000 C:\WINDOWS\system32\rasman.dll 0x76e60000 - 0x76e8f000 C:\WINDOWS\system32\TAPI32.dll 0x76e30000 - 0x76e3e000 C:\WINDOWS\system32\rtutils.dll 0x72220000 - 0x72225000 C:\WINDOWS\system32\sensapi.dll 0x03dd0000 - 0x03e52000 C:\WINDOWS\system32\shdoclc.dll 0x04060000 - 0x0406e000 C:\Program Files\Adobe\Acrobat 7.0\ActiveX\AcroIEHelper.dll 0x7c340000 - 0x7c396000 C:\WINDOWS\system32\MSVCR71.dll 0x75de0000 - 0x75e8f000 C:\WINDOWS\system32\SXS.DLL 0x040c0000 - 0x04620000 C:\WINDOWS\system32\xpsp2res.dll 0x71980000 - 0x719bf000 C:\WINDOWS\system32\mswsock.dll 0x607c0000 - 0x60816000 C:\WINDOWS\system32\hnetcfg.dll 0x719c0000 - 0x719c8000 C:\WINDOWS\System32\wshtcpip.dll 0x04b20000 - 0x04b3c000 c:\progra~1\mcafee.com\vso\McVSSkt.dll 0x76ed0000 - 0x76ef7000 C:\WINDOWS\system32\DNSAPI.dll 0x76930000 - 0x76938000 C:\WINDOWS\system32\LINKINFO.dll 0x76f70000 - 0x76f76000 C:\WINDOWS\system32\rasadhlp.dll 0x03d80000 - 0x03d9c000 C:\Program Files\Adobe\Acrobat 7.0\ActiveX\PDFShell.dll 0x7cca0000 - 0x7cf85000 C:\WINDOWS\system32\mshtml.dll 0x74600000 - 0x74627000 C:\WINDOWS\system32\msls31.dll 0x74630000 - 0x7465a000 C:\WINDOWS\system32\msimtf.dll 0x64890000 - 0x648eb000 C:\WINDOWS\IME\imjp8_1\IMJPCIC.DLL 0x75ba0000 - 0x75c0e000 C:\WINDOWS\system32\jscript.dll 0x75390000 - 0x75401000 C:\WINDOWS\system32\mshtmled.dll 0x72c70000 - 0x72c79000 C:\WINDOWS\system32\wdmaud.drv 0x72c60000 - 0x72c68000 C:\WINDOWS\system32\msacm32.drv 0x77b90000 - 0x77ba5000 C:\WINDOWS\system32\MSACM32.dll 0x77b80000 - 0x77b87000 C:\WINDOWS\system32\midimap.dll 0x71c90000 - 0x71cac000 C:\WINDOWS\system32\ACTXPRXY.DLL 0x6bf50000 - 0x6bf85000 C:\WINDOWS\system32\dxtrans.dll 0x6d5d0000 - 0x6d5da000 C:\WINDOWS\system32\ddrawex.dll 0x736b0000 - 0x736f9000 C:\WINDOWS\system32\DDRAW.dll 0x73b10000 - 0x73b16000 C:\WINDOWS\system32\DCIMAN32.dll 0x6bf90000 - 0x6bfea000 C:\WINDOWS\system32\dxtmsft.dll 0x1c000000 - 0x1c006000 C:\WINDOWS\HKNTDLL.dll 0x5ec50000 - 0x5ec89000 C:\WINDOWS\ime\mscandui.dll 0x6d590000 - 0x6d5a1000 C:\Program Files\Java\jre1.5.0_02\bin\npjpi150_02.dll 0x5c9a0000 - 0x5c9b7000 C:\WINDOWS\system32\OLEPRO32.DLL 0x6d400000 - 0x6d417000 C:\Program Files\Java\jre1.5.0_02\bin\jpiexp32.dll 0x76f60000 - 0x76f68000 C:\WINDOWS\System32\winrnr.dll 0x6d450000 - 0x6d468000 C:\Program Files\Java\jre1.5.0_02\bin\jpishare.dll 0x6d640000 - 0x6d7c5000 C:\PROGRA~1\Java\JRE15~1.0_0\bin\client\jvm.dll 0x6d280000 - 0x6d288000 C:\PROGRA~1\Java\JRE15~1.0_0\bin\hpi.dll 0x76ba0000 - 0x76bab000 C:\WINDOWS\system32\PSAPI.DLL 0x6d610000 - 0x6d61c000 C:\PROGRA~1\Java\JRE15~1.0_0\bin\verify.dll 0x6d300000 - 0x6d31d000 C:\PROGRA~1\Java\JRE15~1.0_0\bin\java.dll 0x6d630000 - 0x6d63f000 C:\PROGRA~1\Java\JRE15~1.0_0\bin\zip.dll 0x6d000000 - 0x6d166000 C:\Program Files\Java\jre1.5.0_02\bin\awt.dll 0x72f50000 - 0x72f76000 C:\WINDOWS\system32\WINSPOOL.DRV 0x73890000 - 0x73960000 C:\WINDOWS\system32\D3DIM700.DLL 0x6d240000 - 0x6d27d000 C:\Program Files\Java\jre1.5.0_02\bin\fontmanager.dll 0x6d1f0000 - 0x6d203000 C:\Program Files\Java\jre1.5.0_02\bin\deploy.dll 0x049c0000 - 0x049dd000 C:\Program Files\Java\jre1.5.0_02\bin\RegUtils.dll 0x08910000 - 0x08bd6000 C:\WINDOWS\system32\msi.dll VM Arguments: jvm_args: -Xbootclasspath/a:C:\PROGRA~1\Java\JRE15~1.0_0\lib\deploy.jar;C:\PROGRA~1\Java\JRE15~1.0_0\lib\plugin.jar -Xmx96m -Djavaplugin.maxHeapSize=96m -Xverify:remote -Djavaplugin.version=1.5.0_02 -Djavaplugin.nodotversion=150_02 -Dbrowser=sun.plugin -DtrustProxy=true -Dapplication.home=C:\PROGRA~1\Java\JRE15~1.0_0 -Djava.protocol.handler.pkgs=sun.plugin.net.protocol -Djavaplugin.vm.options=-Djava.class.path=C:\PROGRA~1\Java\JRE15~1.0_0\classes -Xbootclasspath/a:C:\PROGRA~1\Java\JRE15~1.0_0\lib\deploy.jar;C:\PROGRA~1\Java\JRE15~1.0_0\lib\plugin.jar -Xmx96m -Djavaplugin.maxHeapSize=96m -Xverify:remote -Djavaplugin.version=1.5.0_02 -Djavaplugin.nodotversion=150_02 -Dbrowser=sun.plugin -DtrustProxy=true -Dapplication.home=C:\PROGRA~1\Java\JRE15~1.0_0 -Djava.protocol.handler.pkgs=sun.plugin.net.protocol vfprintf java_command: <unknown> Environment Variables: PATH=C:\PROGRA~1\Java\JRE15~1.0_0\bin;C:\Program Files\Internet Explorer;;C:\WINDOWS\system32;C:\WINDOWS;C:\WINDOWS\System32\Wbem;. USERNAME=管理人室 OS=Windows_NT PROCESSOR_IDENTIFIER=x86 Family 15 Model 4 Stepping 1, GenuineIntel --------------- S Y S T E M --------------- OS: Windows XP Build 2600 Service Pack 2 CPU:total 1 family 15, cmov, cx8, fxsr, mmx, sse, sse2, ht Memory: 4k page, physical 244464k(55328k free), swap 598668k(323724k free) vm_info: Java HotSpot(TM) Client VM (1.5.0_02-b09) for windows-x86, built on Mar 4 2005 01:53:53 by "java_re" with MS VC++ 6.0
[この投稿を含むスレッドを表示] [この投稿を削除]
[523] Re:マルチプルインスタンス
投稿者:CES
2007/02/20 02:13:25

>CESさん自身が挙げられたこのページに、 >http://sumim.no-ip.com:8080/wiki/414 >| Smalltalk(アラン・ケイ)は“オブジェクトへのメッセージ送信”という >| メタファをしてその「オブジェクト指向」と、C++(ストラウストラップ)は >| 抽象データ型からの発展型(あるいはそれとは別のクラスのあり方)をして >| その「オブジェクト指向」と位置づけ、その進化の初期の過程で整備されました。 > >と書いてあるわけですが。読んでいませんか? ふむぅ…読み飛ばしていたような気がします。 やっぱり、C++ 流儀にどっぷりつかった視点では理解しにくいですから。 >また、既に書きましたが、(私が作っているcrowbarのような)タイプベースの言語では、 >そもそもクラスがないので、抽象データ型からは離れているように思います。 crowbar がどのような言語かはまだじっくりと見ていないのですが、クラスが無かろうとも、オブジェクト指向(モジュール指向)であれば、抽象データ型が無いということは無いと思います。 > http://kmaebashi.com/programmer/object/othello.html > ここは読みましたか? 書いてから全編に渡って何度か読み直しました。 結果、読めば読むほど >オブジェクト指向=モジュール化+マルチプルインスタンス なんだな、と感じるようになりました。 > 私の「再入門」は、そういう読者をターゲットとしているつもりです。 つまり、 > 「既にモジュール指向は知っている人のためのオブジェクト指向入門」 ということですね。 そういうスタンスだということであれば、私の反論はまったく的外れです。 ご気分を害されましたら、申し訳ございません。 > 「オブジェクト指向もモジュール指向も知らないが、 > マルチプルインスタンスは知っている」人というのは、具体的にどんな経歴(言語 > 経験)で、どんなプログラムを書く人なのでしょうか。 前にも申しましたように、 int i; int j; これで、モジュール指向ではありませんがマルチプルインスタンスです。 モジュール化を知る前の人だって、こういうことは素でやるでしょう。 >> マルチプルインスタンスで、何故再利用性が高まっているのでしょうか。 > strtok()みたいに、よそで使われてないか意識しないと使えないようでは、 > 再利用性が高いとは言えないと思うんですが? うん、確かにそうです。 …何なんでしょう。↑の1行を書くのに1時間悩みました。 たぶんあれです。 私はオブジェクト指向とモジュール指向を混同していたから。 マルチプルインスタンスではなく責務の分離こそオブジェクト指向だと思っていながら、データが1つしかない本当のモジュール指向を全然やってないから、マルチプルインスタンスのありがたみがわかってなかったんじゃないかな、と。 長きに渡お付き合いいただき、ありがとうございました。 ここで頂いたコメントをヒントにして、自分なりにもう少し煮詰めてみたいと思います。
[この投稿を含むスレッドを表示] [この投稿を削除]
[522] Re:マルチプルインスタンス
投稿者:(ぱ)
2007/02/20 02:13:25

>マルチプルインスタンスで、何故再利用性が高まっているのでしょうか。 >また、その再利用性は、ライブラリの再利用性とどう違うものなのでしょうか。 strtok()みたいに、よそで使われてないか意識しないと使えないようでは、 再利用性が高いとは言えないと思うんですが?
[この投稿を含むスレッドを表示] [この投稿を削除]
[521] Re:マルチプルインスタンス
投稿者:(ぱ)
2007/02/20 02:13:25

>オブジェクト指向=モジュール化+マルチプルインスタンス >ということでよろしいのでしょうか。 >ただ、そうしますと、再入門講座はどうしても不適切だと言わざるを得ません。 http://kmaebashi.com/programmer/object/othello.html ここは読みましたか? ここでは、まず「モジュール」としてboard.cを作り、その後それを複数生成 できるようにしています。 | 以前のboard.cというモジュールは、カプセル化は実現できていましたが、 | 静的にひとつしか存在しませんでした。それが、必要に応じていくつも生成できる | ようになったものがオブジェクトです。そして、このようにオブジェクトを | 必要な数だけ生成し、それに付属した関数を呼び出しながら動作していくという | プログラミングスタイルが、「オブジェクト指向」であるわけです。 つまり、私の説明では、 >オブジェクト指向=モジュール化+マルチプルインスタンス まさにこれが前提になっているのであり、なのになぜ不適切といわれるのかが わかりません。 >・マルチプルインスタンスはモジュール指向以前からあった > →オブジェクト指向もモジュール指向も知らない人でも、これは知っている >・非オブジェクト指向、オブジェクト指向の知名度に比べて、モジュール指向の > 知名度が低い > (私のように、オブジェクト指向とモジュール指向を混同している可能性が高く、 > 非オブジェクト指向→モジュール指向→オブジェクト指向 という経路ではなく、 > 非オブジェクト指向→オブジェクト指向 という経路を辿ると思っている) …ということは、 「モジュール」→「マルチプルインスタンス」 という説明の順序は逆で、 「マルチプルインスタンス」→「モジュール」 という順序のほうがよい、という主張でしょうか? そうなのかもしれませんが、ではその順序で説明したら、どんな感じの説明に なるのでしょうか。私にはちとイメージがつかめません。 また、上のページでこう書いたように、 | 既に書いたように、board.cはオブジェクト指向とは言えません。 | そして、多くのCプログラマには、「この設計でいったい何がいけないのか?」と | 思えるのではないかと思います。 そこそこ経験を積んだCプログラマなら、「モジュール化」はある程度意識して いるものです。また、オブジェクト指向の入門書を読めば、「カプセル化」の 話はたいてい書いてあります。 結果として、 http://kmaebashi.com/programmer/object/response3.html こちらで示したように、 284 :デフォルトの名無しさん :03/09/16 11:45 | データの局所性を高めたり隠蔽するってさ、 | 一データ群を取り扱う関数群を一つのソースにまとめて、データへのアクセスは | 専用のI/O関数を介してやり取りするのと違いはある? | Cでもこういうのを徹底しとけばいいんでしょ? こういう誤解をしてしまう可能性が非常に高いわけです。 # 284さんはその後うちの掲示板にも登場されました。 # やはりboard.cのようなものをイメージされていたようです。 私の「再入門」は、そういう読者をターゲットとしているつもりです。 CESさんのおっしゃるような「オブジェクト指向もモジュール指向も知らないが、 マルチプルインスタンスは知っている」人というのは、具体的にどんな経歴(言語 経験)で、どんなプログラムを書く人なのでしょうか。 少なくとも私には、具体的にイメージできません。
[この投稿を含むスレッドを表示] [この投稿を削除]
[520] Re:マルチプルインスタンス
投稿者:(ぱ)
2007/02/20 02:13:25

>>C++などの流儀のOOは、そう言われることが多いようですね。 > >C++ ファミリーじゃない言語をよく知らないので、よろしければ、 >他の流儀では何がオブジェクト指向だと呼ばれているのか、ご教示願えませんか。 CESさん自身が挙げられたこのページに、 http://sumim.no-ip.com:8080/wiki/414 | Smalltalk(アラン・ケイ)は“オブジェクトへのメッセージ送信”という | メタファをしてその「オブジェクト指向」と、C++(ストラウストラップ)は | 抽象データ型からの発展型(あるいはそれとは別のクラスのあり方)をして | その「オブジェクト指向」と位置づけ、その進化の初期の過程で整備されました。 と書いてあるわけですが。読んでいませんか? また、既に書きましたが、(私が作っているcrowbarのような)タイプベースの言語では、 そもそもクラスがないので、抽象データ型からは離れているように思います。 >「型」がある→「マルチプルインスタンスが前提」という繋がりがよくわかりません。 >「鋳型」「ケーキ型」などは、同じ形のものを量産するためにありますが… >そもそも「型」の語源は「type」ですし、「クラス」という用語もそうですが、 >「分類」というような意味があるんじゃないでしょうか。 実は拙著「Java謎+落とし穴~」ではタイヤキの型を使ってクラスとインスタンスの 説明をしていますが、タイヤキ型がtypeでないことはわかってて注でツッコミ入れたり してます。それはさておき。 typeだから分類だ、という解釈をしたところで、分類というのは、通常ひとつの カテゴリに複数のナニモノカが入るでしょう。 ただ、イメージとしては、プログラミング言語における「型」は、 結構タイヤキの型の方に近いような気もします。インスタンス生成なんて 型にタネとアンコ(メモリ)を詰めてタイヤキ作るイメージそっくり。
[この投稿を含むスレッドを表示] [この投稿を削除]