K.Maebashi's BBS

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

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

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

[213] Re:C言語ポインタ完全制覇についての質問
投稿者:九龍
2007/02/20 02:13:25

>bcc32ですが、 > > extern void piyo(int a); > >と書いていたのを、 > > extern int piyo(int a); 一応、VC++ 6.0(SP6)でテストしてみました。 --a.c-- void hoge1 (void); void hoge1(void) { extern int piyo(int a); piyo(1); } void hoge2(void) { piyo(2); } --b.c-- int piyo (int a) { return a; } c:\cppsrc\a\a.c(11) : warning C4013: 関数 'piyo' は定義されていません。int 型の値を返す外部関数と見なします。 となりました。 しかし、 >a)hoge1()の中のpiyoの宣言はhoge1()の中で完結していて、 なのに、既存の宣言(hoge1の関数ブロック内の宣言)との整合性がチェックされているとは…。 >あまり関係ありませんが、コンパイラの警告メッセージの翻訳チームは規格書を理解して >細心の注意を払って訳しているのか、かなり疑問。 >宣言と定義は用語の意味が違うのですが、どう見ても混同していると思われます。 同感です。 私もコンパイラの警告メッセージで理解に苦しむ時があります。
[この投稿を含むスレッドを表示] [この投稿を削除]
[212] Re:C言語ポインタ完全制覇についての質問
投稿者:774RR
2007/02/20 02:13:25

>ということでしょうかね。 と思います。C++ と違い C の場合、K&R1 の頃の(いわゆる non-ansi C) との後方互換性を 保つため、規格書に書かれていない(もしくは規格書が禁じている)後方互換のための機能が いくつも有効になっている処理系がほとんどのようです。 VC++ や BCC なんかはその典型ですね。 # 関数宣言のスコープ拡大なんかはその一例。 gcc の場合、後方互換な機能が使われると警告を出すオプションがあったりしますが... あまり関係ありませんが、コンパイラの警告メッセージの翻訳チームは規格書を理解して 細心の注意を払って訳しているのか、かなり疑問。 宣言と定義は用語の意味が違うのですが、どう見ても混同していると思われます。 >エラー E2356 proto2.c 10: 'piyo' の再宣言で型が一致していない(関数 hoge2 ) >エラー E2344 proto2.c 3: 一つ前の 'piyo' の定義位置(関数 hoge2 ) 前者は正しく『宣言』ですが、後者は『定義』ではなく宣言であるはずです。 >hoge.c(7) : warning C4013: 関数 'piyo' は定義されていません。int 型の値を返す外部関数と見なします。 これもヘン。ここは『宣言』でなければならないはずです。 >hoge.c:7: warning: implicit declaration of function `piyo' gcc の英語は正しく「宣言」と言っています。 gcc-3.3.4 の gcc/po/ja.po を見たところほぼ正しく翻訳しているようですが、 一部やはり誤訳を発見。あぁ、フィードバックしないといけないかも?
[この投稿を含むスレッドを表示] [この投稿を削除]
[211] Re:C言語ポインタ完全制覇についての質問
投稿者:(ぱ)
2007/02/20 02:13:25

>C++ 規格書であれば 「JIS X3014:1998-3.3.2 局所的な有効範囲」で、 >ブロック内に宣言された名前はそのブロックに局所的である。 >と書かれています。実際以下のコードはコンパイルエラーです。 C でも、6.1.2.1 を見る限り、ブロック内で宣言された識別子のスコープは ブロック内ですから、プロトタイプ宣言もブロック内だけで有効と考えるのが 自然なように思います。 ただ、ふたつのコンパイラで、単純にそうとは言えない動きをしているので、 どこか別に規定があるのかと、昨晩は規格書をひっくり返していたのでした。 >んで、上記を hoge.c とした場合の挙動ですが >bash-3.0$ hppa2.0w-hp-hpux11.00-gcc-3.3.4 -Wall -c hoge.c >hoge.c: In function `func2': >hoge.c:7: warning: implicit declaration of function `piyo' これはプロトタイプ宣言がない場合の通常の挙動ですよね。 だから、gccでは、ちゃんとブロックでスコープが終了していて、 C++ではだめなのは、C++ではそもそもプロトタイプ宣言がないことを許さないからで。 bcc32ですが、 extern void piyo(int a); と書いていたのを、 extern int piyo(int a); にしたら通りました。 推測するに、 a)hoge1()の中のpiyoの宣言はhoge1()の中で完結していて、 b)hoge2()の中のpiyoの呼び出しで、宣言がないので暗黙にintを返す関数として  宣言されて、 c)その宣言の段階で、既存の宣言との整合性がチェックされ、なぜかこのときは  hoge1()の中での宣言とのチェックも行っていて、そのためにエラーになった。 ということでしょうかね。
[この投稿を含むスレッドを表示] [この投稿を削除]
[210] Re:C言語ポインタ完全制覇についての質問
投稿者:九龍
2007/02/20 02:13:25

申し訳ございません。コンパイラの警告レベルを4に上げるの忘れてました…(面目ないです)。 ちなみに、警告レベル3では何も出ませんでした。 >cl -W4 -Za -c hoge.c だと >hoge.c(7) : warning C4013: 関数 'piyo' は定義されていません。int 型の値を返す外部関数と見なします。 >となるのでやはりブロックスコープなのが本来みたいですね。 Microsoft言語拡張機能の無効スイッチですね(全然気にしてませんでした。これからは切るようにします…)。 確かに、これを見るとブロックスコープなのが本来の仕様みたいですね。
[この投稿を含むスレッドを表示] [この投稿を削除]
[209] Re:C言語ポインタ完全制覇についての質問
投稿者:774RR
2007/02/20 02:13:25

おっと自己レス。 cl -W4 -Za -c hoge.c だと hoge.c(7) : warning C4013: 関数 'piyo' は定義されていません。int 型の値を返す外部関数と見なします。 となるのでやはりブロックスコープなのが本来みたいですね。 ブロックスコープを超越して大域に関数宣言が有効になるのは(互換性のための)拡張機能、と。 # 規格書を要確認だなこりゃ。
[この投稿を含むスレッドを表示] [この投稿を削除]
[208] Re:C言語ポインタ完全制覇についての質問
投稿者:774RR
2007/02/20 02:13:25

C 規格書はウチに帰らないと無いのでアレげですが C++ 規格書であれば 「JIS X3014:1998-3.3.2 局所的な有効範囲」で、 ブロック内に宣言された名前はそのブロックに局所的である。 と書かれています。実際以下のコードはコンパイルエラーです。 ---hoge.cpp--- int func1(void) { extern int piyo(void); return piyo(); } int func2(void) { return piyo(); } ---EOF of hoge.cpp--- んで、上記を hoge.c とした場合の挙動ですが bash-3.0$ hppa2.0w-hp-hpux11.00-gcc-3.3.4 -Wall -c hoge.c hoge.c: In function `func2': hoge.c:7: warning: implicit declaration of function `piyo' Microsoft Visual C++ 6.0SP6 だと cl -W4 -c hoge.c hoge.c(2) : warning C4210: 非標準の拡張機能が使用されています : 関数にはファイル スコープが与えられています。 hoge.c(7) : warning C4217: 非標準の拡張機能が使用されています : 以前のブロックでの関数宣言です。 となりました。 やはり言語規格がスコープ詳細等を定めていないようです。 # IE6 でも Acrobat Reader を uninstall してから JIS 閲覧するとゲフガフ # って検索が効かない文書なので、むりくり保存してもあまり役に立たない鴨。
[この投稿を含むスレッドを表示] [この投稿を削除]
[207] Re:C言語ポインタ完全制覇についての質問
投稿者:九龍
2007/02/20 02:13:25

774RRさん、度々申し訳ありません。 >リンク先の12番の解説を文字通りに解釈してください。 >仮定義(初期化子なし定義)だけがあって、初期化子あり定義が無い場合、 >翻訳単位のEOFに達した時点で仮定義は定義となります。 >--hoge.c-- >int x; // 仮定義 >int x; // 仮定義:何回仮定義が現れても(既存の宣言に反しない限り)問題ない >int x; // 仮定義 >--EOF of hoge.c-- >この時点で int x=0; と定義されたことになる。 > >>上記の場合だと、b.cのint a;が仮定義なので、 >この文章はある意味YES、ある意味NO。確かに int a; は仮定義ですが、既に述べたとおり >翻訳単位 (b.c) の EOF に達した時点で、仮定義は「仮ではない『定義』」になります。 >よって提示の例では a.c b.c ともに変数 a が定義されています。 >そこではじめてリンク先13番目の解説が効いてきます。 > >>a.cで定義されているint a = 1;のオブジェクトとまとめられたと言うことで >「仮定義だからまとめられた」のではありません。 >「C では、定義が複数ある場合の挙動が定められていない」(未定義動作) >→「エラーにするのも、定義を1つにまとめるのも処理系の実装次第」 >→→「多くの C 処理系では定義を1つにまとめちゃう」 >となっただけです。 > >>b.cのint a;がextern int a;と解釈されている訳ではないという解釈で宜しいでしょうか? >コンパイラは int a; を勝手に extern int a; と解釈しません。 >そのへん関数宣言と変数宣言で文法が違う場所です。 なるほど。理解できました。 ご丁寧な解説、ありがとうございます。
[この投稿を含むスレッドを表示] [この投稿を削除]
[206] Re:C言語ポインタ完全制覇についての質問
投稿者:774RR
2007/02/20 02:13:25

リンク先の12番の解説を文字通りに解釈してください。 仮定義(初期化子なし定義)だけがあって、初期化子あり定義が無い場合、 翻訳単位のEOFに達した時点で仮定義は定義となります。 --hoge.c-- int x; // 仮定義 int x; // 仮定義:何回仮定義が現れても(既存の宣言に反しない限り)問題ない int x; // 仮定義 --EOF of hoge.c-- この時点で int x=0; と定義されたことになる。 >上記の場合だと、b.cのint a;が仮定義なので、 この文章はある意味YES、ある意味NO。確かに int a; は仮定義ですが、既に述べたとおり 翻訳単位 (b.c) の EOF に達した時点で、仮定義は「仮ではない『定義』」になります。 よって提示の例では a.c b.c ともに変数 a が定義されています。 そこではじめてリンク先13番目の解説が効いてきます。 >a.cで定義されているint a = 1;のオブジェクトとまとめられたと言うことで 「仮定義だからまとめられた」のではありません。 「C では、定義が複数ある場合の挙動が定められていない」(未定義動作) →「エラーにするのも、定義を1つにまとめるのも処理系の実装次第」 →→「多くの C 処理系では定義を1つにまとめちゃう」 となっただけです。 >b.cのint a;がextern int a;と解釈されている訳ではないという解釈で宜しいでしょうか? コンパイラは int a; を勝手に extern int a; と解釈しません。 そのへん関数宣言と変数宣言で文法が違う場所です。
[この投稿を含むスレッドを表示] [この投稿を削除]
[205] Re:C言語ポインタ完全制覇についての質問
投稿者:九龍
2007/02/20 02:13:25

>それをやっちゃうと、swap(float *a, float *b)のような関数で困りますし。 なるほど。仰られる通りです。 >もともと、プロトタイプ宣言なんて書かなくても(警告は出ても)動きますから、 >結合はされるとしても、プロトタイプ宣言の有効範囲は微妙な問題のように >思います。 > >以下のソースをbcc32でコンパイルしたところ、 > >void hoge1(void) >{ > extern void piyo(int a); > > piyo(1); >} > >void hoge2(void) >{ > piyo(2); >} > >こんなエラーが出ました。 >エラー E2356 proto2.c 10: 'piyo' の再宣言で型が一致していない(関数 hoge2 ) >エラー E2344 proto2.c 3: 一つ前の 'piyo' の定義位置(関数 hoge2 ) > >hoge2のブロックの先頭に「extern void piyo(int a);」を入れると >ちゃんと通るので、少なくともbcc32においては、hoge1()内部の宣言がそのまま >hoge2()内部で有効になっているというわけではないようです。 > >この件について規格書になにか書いてないかとぱらぱらめくったのですが >見つけられませんでした。 わざわざ規格書まで調べて頂き有り難うございます。 と、ゆうことは処理系依存って事なんでしょうね…。
[この投稿を含むスレッドを表示] [この投稿を削除]
[204] Re:C言語ポインタ完全制覇についての質問
投稿者:(ぱ)
2007/02/20 02:13:25

> どうせ仮引数でdoubleしか渡せないのなら、void sub_funcの関数宣言での >floatへのポインタの仮引数宣言は、doubleへのポインタに読み替えられて >いるのではないかという勝手な勘違いです。 それをやっちゃうと、swap(float *a, float *b)のような関数で困りますし。 > 例えば、別のモジュールで定義宣言されている関数を、他のモジュールの >関数ブロック内でextern void f (void)とすると(普通はこんなことしませんが)、 >その関数ブロック内だけでその関数への参照が可能だと思っていたのですが、 >それより下の関数定義ブロック内でも参照可能となっていました(VC++ 6.0で確認)。 もともと、プロトタイプ宣言なんて書かなくても(警告は出ても)動きますから、 結合はされるとしても、プロトタイプ宣言の有効範囲は微妙な問題のように 思います。 以下のソースをbcc32でコンパイルしたところ、 void hoge1(void) { extern void piyo(int a); piyo(1); } void hoge2(void) { piyo(2); } こんなエラーが出ました。 エラー E2356 proto2.c 10: 'piyo' の再宣言で型が一致していない(関数 hoge2 ) エラー E2344 proto2.c 3: 一つ前の 'piyo' の定義位置(関数 hoge2 ) hoge2のブロックの先頭に「extern void piyo(int a);」を入れると ちゃんと通るので、少なくともbcc32においては、hoge1()内部の宣言がそのまま hoge2()内部で有効になっているというわけではないようです。 この件について規格書になにか書いてないかとぱらぱらめくったのですが 見つけられませんでした。 ご存知の方がいらっしゃいましたら情報よろしくお願いいたします(_o_)
[この投稿を含むスレッドを表示] [この投稿を削除]
[203] Re:C言語ポインタ完全制覇についての質問
投稿者:九龍
2007/02/20 02:13:25

774RRさん、度々申し訳ありません。 すばやいレスありがとうございます。 つまり、 --a.c-- int a = 1; // 定義 --b.c-- int a; // 仮定義 上記の場合だと、b.cのint a;が仮定義なので、a.cで定義されているint a = 1;のオブジェクトとまとめられたと言うことで、b.cのint a;がextern int a;と解釈されている訳ではないという解釈で宜しいでしょうか? (774RRさんがお書きになったリンク先の13番目の項目に該当するので、結局それは処理系依存になる為、VC++ 6.0ではまとめられて解釈されたというような解釈で宜しいでしょうか?) 後、くだらない事をお聞きしますが、 -- a.c -- #include <stdio.h> extern void f (void); // a.c の関数 f と結び付く(通常externは付けないけど) int main (void) { f (); return 0; } static void f (void) { printf ("a.c の関数 f\n"); } -- b.c -- #include <stdio.h> extern void f (void) { printf ("b.c の関数 f\n"); } の場合、main関数のf関数の呼び出しは、a.cにある関数fとなりますが、この場合のextern void f (void)の関数プロトタイプ宣言のリンケージ属性はどうなるのでしょうか? くだらない質問ですが、宜しくお願い致します。
[この投稿を含むスレッドを表示] [この投稿を削除]
[201] Re:C言語ポインタ完全制覇についての質問
投稿者:774RR
2007/02/20 02:13:25

関数宣言と変数宣言では話が違います。 関数宣言の省略時解釈は extern つまり外部結合ありです。 関数定義においても省略時解釈は extern つまり外部結合ありです。 関数定義と関数宣言とでは書式が違うので誤解を生む余地が無く、問題は発生しません。 大域変数の「定義にならない宣言」の場合は extern が必須です。 extern を書かずに大域変数を宣言し、初期化子が無い場合 ・C の場合:変数の仮定義となります。仮定義は複数個あってかまいません。 ・C++ の場合:変数の定義となります。定義は1つしか許されません。 ・C/C++ とも、その大域変数は外部結合となります。 --a.c-- extern int g; /* 定義にならない宣言 */ int g; /* 仮定義 */ int g=1; /* 定義 */ C の場合、言語規格は 「同一翻訳単位中に同一名称の大域変数の複数個の仮定義がある」ことを認めています。 「複数翻訳単位中に同一名称の大域変数の定義がある」ことは定めておらず、 たいていの処理系では全翻訳単位での定義を1つにまとめてしまいます。 ==b.cpp== extern int g; /* 定義にならない宣言 */ int g; /* 定義 */ int g=1; /* 再定義:エラー */ C++ の場合、仮定義などというものはないので 「同一翻訳単位中に同一名称の大域変数の複数個の定義がある」 「複数翻訳単位中に同一名称の大域変数の複数個の定義がある」 の両方が言語規格上、認められずエラー発生となります。 http://www2s.biglobe.ne.jp/~hig/q_a/Programing_QA02.html
[この投稿を含むスレッドを表示] [この投稿を削除]
[200] Re:C言語ポインタ完全制覇についての質問
投稿者:九龍
2007/02/20 02:13:25

774RRさん、はじめまして。 >>>int hoge(void); という関数宣言は extern int hoge(void); と解釈されます。 >>そのため、過去のコンパイラ用に書かれたコードとの互換性のために、 >>「複数個の翻訳単位で同一名称の変数が定義されたら、それを同一の実体とみなす」 >>処理系がほとんどです。 という事は、他の翻訳単位のファイルスコープ(外部宣言)で同一識別子で変数定義宣言をおこなった場合でも、省略時解釈ではexternになるために省略可能(でも普通は区別する為に付けますが)って解釈で宜しいのでしょうか?
[この投稿を含むスレッドを表示] [この投稿を削除]
[199] Re:C言語ポインタ完全制覇についての質問
投稿者:774RR
2007/02/20 02:13:25

>>・どこかで定義されている関数を使う場合、プロトタイプ宣言を行うが、 >> これにはexternをつけても付けなくても良い(で、たぶん普通はつけない) つけてもつけなくても良い、というか単純に省略時解釈なだけですね。 int hoge(void); という関数宣言は extern int hoge(void); と解釈されます。 void piyo(void) {} という関数定義は extern void piyo(void) {} と解釈されます。 extern がついているので外部結合となるわけです。 あと C と C++ では規則が少し変更されていて --a.cpp-- int g; --b.cpp-- int g; とするとエラーになります (One Definition Rule : ISO/IEC 14882:1998 3.2) C の場合 ODR の規定がありません。 そのため、過去のコンパイラ用に書かれたコードとの互換性のために、 「複数個の翻訳単位で同一名称の変数が定義されたら、それを同一の実体とみなす」 処理系がほとんどです。 # そーいうコードが多く残っているので。
[この投稿を含むスレッドを表示] [この投稿を削除]
[198] Re:C言語ポインタ完全制覇についての質問
投稿者:九龍
2007/02/20 02:13:25

 (ぱ)さん、はじめまして。  丁寧なご解答ありがとうございます。 >そうです…と答えると一言で終わってしまうわけですが、何か疑問があるので >質問されたのだと思います。そこをもう少し明確にしていただけると、何か回答 >できるかもしれません。 >たとえばfloat 4バイト、double 8バイトの処理系を仮定したとして、fは実は >doubleなので 8バイトです。その領域をfloat *で読めるはずはないわけです。    するどいですね。実は私が最初に思ったのが、どうせ仮引数でdoubleしか渡せないのなら、void sub_funcの関数宣言でのfloatへのポインタの仮引数宣言は、doubleへのポインタに読み替えられているのではないかという勝手な勘違いです。  それでちょっと心配になったのでご質問させて頂きました。  後、externとリンケージについての解答もありがとうございます。 >・どこかで定義されている関数を使う場合、プロトタイプ宣言を行うが、 > これにはexternをつけても付けなくても良い(で、たぶん普通はつけない)  昔、プロトタイプ宣言にexternをつけていたプログラムがあったので、一時期付けていた記憶があります。  話はちょっと脱線しますが、http://okuyama.mt.tama.hosei.ac.jp/unix/C/slide82-1.htmlにある解説、表はちょっと分かりずらいと思うのですが…。  例えば、別のモジュールで定義宣言されている関数を、他のモジュールの関数ブロック内でextern void f (void)とすると(普通はこんなことしませんが)、その関数ブロック内だけでその関数への参照が可能だと思っていたのですが、それより下の関数定義ブロック内でも参照可能となっていました(VC++ 6.0で確認)。  変数の場合であれば、その関数ブロック内のみ有効な筈ですが…。  うーん、ややっこしい。  ちょっと長くなりそうなので、この辺でやめておきます。  これからもちょくちょく寄らせて頂きますので、宜しくお願い致します。
[この投稿を含むスレッドを表示] [この投稿を削除]
[194] Re:C言語ポインタ完全制覇についての質問
投稿者:(ぱ)
2007/02/20 02:13:25

> 初めまして、九龍と申します。 > C言語でのプログラム経験は結構長いのですが、ある事が分からなかったので、 > C言語ポインタ完全制覇に購入させて頂きました。 はじめまして。お買い上げいただきありがとうございます。 > それで、現在読んでいる真っ最中なのですが、p303ページに記載されている >「fは勝手にdoubleに読み替えられているので,当然正しく渡らないことになります.」 > の意味が分かりません。 > 上記は、仮引数float fは、double fと読み替えられているため、fのポインタを >渡しても、void sub_func 関数では、floatへのポインタで間接参照されるため、 >正常に参照されないということでよろしいのでしょうか? そうです…と答えると一言で終わってしまうわけですが、何か疑問があるので 質問されたのだと思います。そこをもう少し明確にしていただけると、何か回答 できるかもしれません。 たとえばfloat 4バイト、double 8バイトの処理系を仮定したとして、fは実は doubleなので 8バイトです。その領域をfloat *で読めるはずはないわけです。 > 後、もし宜しければexternとリンケージに関する事も教えて頂ければと思います。 > p80の脚注にも出てきているので、ちょっとインターネットで調べてみたのですが >(http://okuyama.mt.tama.hosei.ac.jp/unix/C/slide82-1.html)、見た瞬間に >定義宣言と参照宣言、関数プロトタイプ宣言がごっちゃになりました。 そのページにあるように、外部結合とは、 | プログラムが複数のソースファイルから構成される場合,それらすべての | ソースファイルにおいて同一のオブジェクト,或いは関数として参照。 ですよね? それに対し内部結合はそのソースファイルの中だけで有効なリンケージです。 関数や変数を内部結合にするためにはstaticを付けますが、 外部結合の場合、定義では何もつけず、宣言ではexternを付ける…と決まっていれば 説明が楽なのですが、実際には、 ・どこかで定義されている変数を参照する場合、externを付けなくても、たいていの  処理系では何のエラーにもならない(p.317を参照) ・どこかで定義されている関数を使う場合、プロトタイプ宣言を行うが、  これにはexternをつけても付けなくても良い(で、たぶん普通はつけない) ということで、説明がややこしくなっています。 > (なにせ今まで、どこかで定義宣言をしている変数を参照する場合には、 > externを付ければ良いぐらいにしか思ってなかったんで。) この認識で正しいと思います。
[この投稿を含むスレッドを表示] [この投稿を削除]
[193] C言語ポインタ完全制覇についての質問
投稿者:九龍
2007/02/20 02:13:25

 初めまして、九龍と申します。  C言語でのプログラム経験は結構長いのですが、ある事が分からなかったので、C言語ポインタ完全制覇に購入させて頂きました。  それで、現在読んでいる真っ最中なのですが、p303ページに記載されている「fは勝手にdoubleに読み替えられているので,当然正しく渡らないことになります.」の意味が分かりません。  上記は、仮引数float fは、double fと読み替えられているため、fのポインタを渡しても、void sub_func 関数では、floatへのポインタで間接参照されるため、正常に参照されないということでよろしいのでしょうか?  一生懸命意味を理解しているつもりですか、拙い理解能力で申し訳ありません。  後、もし宜しければexternとリンケージに関する事も教えて頂ければと思います。  p80の脚注にも出てきているので、ちょっとインターネットで調べてみたのですが(http://okuyama.mt.tama.hosei.ac.jp/unix/C/slide82-1.html)、見た瞬間に定義宣言と参照宣言、関数プロトタイプ宣言がごっちゃになりました。  (なにせ今まで、どこかで定義宣言をしている変数を参照する場合には、externを付ければ良いぐらいにしか思ってなかったんで。)  宜しくお願い致します。
[この投稿を含むスレッドを表示] [この投稿を削除]
[192] Re:ありがとうございます
投稿者:(ぱ)
2007/02/20 02:13:25

本筋と関係ないですが。 >(ぱ)さん、kit2004さん本当にありがとです。 kitさんはkitさんであってkit2004さんではないわけですが、 神奈川さんが「kit2004」さんだと思ってしまったのは、スレッド表示のとき ハンドル名と日付の間に空白が空いてなかったからだと思います。 これは掲示板の仕様の問題で、要するに私が悪いので、先ほど修正しました。 数日前から気になってはいたのですが、対応が遅くなりましてすみません。
[この投稿を含むスレッドを表示] [この投稿を削除]
[191] ありがとうございます
投稿者:神奈川
2007/02/20 02:13:25

件名を変更しました。 (ぱ)さん、kit2004さん本当にありがとです。 根本的なところから、やり直す必要が多々あるかもしれません。 プログラムを始めてから、はや2週間ぐらいになります。 ここまで成長(といってもまだまだですが)したのも、ひとえに皆さん のお陰だと思っています。 解らない事もたくさんあり、丁寧に教えてくださったり、サイトを教えてくださったり 本当に感謝しています。 プログラム以外の基本的なこと(ぱ)さんが指摘してくださった。質問のしかたなど も勉強になりました。 こんな基本的なことも知らずに皆さんに接していた事は、失礼な事だと承知しました。 皆さんに聞くにしても、ちゃんとしたルールを守る必要があると強く思いました。 私としては、本や参考書などまず自分で調べてみて、解らなかった事は、人に聞くという プロセスを実行しています。そこで安易に「解らなかったから教えてください」という 感じになっていました。もしかしたら皆さんに不快な思いをさせてしまったかもしれません。 もしそうでしたら、申し訳ないです。 もう一つ自分を成長させるためにも、頑張ってみます。そして本当に解らなかった時、 具体的な説明を踏まえ解らない所を説明をします。 また逆に私が皆さんのお役に立てるように皆さんのお話を継承しこの掲示板を利用していきたいと思います。
[この投稿を含むスレッドを表示] [この投稿を削除]
[190] Re:XMLについて
投稿者:kit
2007/02/20 02:13:25

> こういう場合は、似たようなことを > している他人のプログラムを読んで理解し、真似を > することから始めるのがいいんじゃないでしょうか。 書き忘れましたが、読むプログラムは一つではなく、 多いほうが良いです。勉強ってどういう分野でも そうなんですけど、沢山読んでいるうちに、だんだん どうすれば良いのか分かるようになってきます。
[この投稿を含むスレッドを表示] [この投稿を削除]
[189] Re:XMLについて
投稿者:kit
2007/02/20 02:13:25

ちょっと気になるのは、神奈川さんがどういう立場で プログラミングをされているかですね。 自力でプログラミングができるようになることが目的で あれば、分からない問題を安易にBBSで聞いて解決する のは考えものです。むしろ、ひとに全く聞かなくても 自分で解けるようになるにはどうすれば良いのかを 考えた方がいいと思います。 最初のうちは、自分で解こうにもどうすればいいのか 見当もつかないことも多いわけですし、神奈川さんの 質問自体、まさにそういう状態にあると思われる質問 なわけですが、こういう場合は、似たようなことを している他人のプログラムを読んで理解し、真似を することから始めるのがいいんじゃないでしょうか。 似たようなプログラムはあるけどどう変えたらいいのか 分からないような場合、それは結局、そのプログラムが どういう動作をしているかちゃんと理解できてないという ことを意味しますから、理解できるようになるまで、 変数の内容表示を行う文を挿入したり、デバッガによる トレースなどを行いながら、他人のプログラムを繰り返し 読むというのが、遠回りに見えて実は近道になると思います。 神奈川さんの質問を見ていると、そもそも他人の書いた プログラムを細部までちゃんと理解して読んだ経験が 少なそうに見える点、そしてもっと大きな問題として、 自分で書くプログラムについても、どう動作するのか、 ちゃんと理解してないように見える点が気になります。 このあたりの問題をきちんと解決しておかないと、当面の 問題は解決できても、いつまでたっても一人だちできない ということになりかねません。 あと、これは基本中の基本なので、わざわざ指摘するのも 何か変な気もするのですが、インデントも変ですよ。 使い捨てのテストプログラムならともかく、人に見て もらう場合、インデントを正しくつけるのは、最低限必要な ことだと思います。
[この投稿を含むスレッドを表示] [この投稿を削除]
[188] Re:XMLについて
投稿者:(ぱ)
2007/02/20 02:13:25

>ここで問題なのは、属性を作成するとエラーが発生してしまうということです。 このプログラムを自分のところでコンパイルして動かすほど私は親切ではないので、 エラーが出たというのなら、どんなエラーが出たかぐらいは書いてください。 もちろん、エラーメッセージを直接コピペする形で。 掲示板やMLに質問する際の質問のしかたについては、以下のページが参考になります。 JavaHouse Topics。この中の「質問のしかたについて」 http://java-house.jp/ml/topics/ 技術系メーリングリストで質問するときのパターン・ランゲージ http://www.hyuki.com/writing/techask.html 真 技術系メーリングリストFAQ http://www.geocities.co.jp/SiliconValley/5656/
[この投稿を含むスレッドを表示] [この投稿を削除]
[187] XMLについて
投稿者:神奈川
2007/02/20 02:13:25

件名を変更しました。 またXMLで解らない事が出てきてしまいました・・・ 問題例を以下に記述します。 ---あ.xml---- <愛 id=1>   <b>     <c>     </c>   </b>     <愛 ID=2>     </愛> </愛> ------------ 特定のタグの属性の下に -- <k>  <愛 ID=7>あああ</愛>   </k> を記述しそのタグ<愛>に属性を与えるというプログラムです。 ☆例えば、あ.xmlの<愛 ID=2>の下に <k>  <愛 ID=7>あああ</愛>   </k> を加えたりするなどです。 ここで問題なのは、属性を作成するとエラーが発生してしまうということです。 以下に自作したプログラムを記述します。 static void selectionAppend() throws Exception { DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); DocumentBuilder db = dbf.newDocumentBuilder(); Document doc = db.parse(new FileInputStream("あ.xml")); NodeList list = doc.getElementsByTagName("愛"); for (int i = 0; i < list.getLength(); i++) { Element node = (Element)list.item(i); if (!(node instanceof Element)) continue; String value = ((Element)node).getAttribute("ID"); //ここで対象属性名を指定し if (value != null && value.equals("2")) { //ここで対象属性値を指定する Node child1 = doc.createElement("k"); Node child2 = doc.createElement("愛"); //↑ここのタグに属性を追加したい、setAttribute("ID", "7");このメソッドを代入する //のでしょうがどのように代入すればよろしいでしょうか。 Node child3 = doc.createTextNode("あああ"); child2.appendChild(child3); child1.appendChild(child2); node.appendChild(child1); //↑ここでツリー構成は完了していることになるのでしょうか?できたとしたら、 //NodeList know = node.getElementsByTagName("愛"); //Element knowe = (Element)know.item(0); //knowe.setAttribute("No", "8"); //こうするのでしょうが、 //解らなくなってしまったので、また質問しにきました。宜しくお願いします。 } } FileOutputStream out = new FileOutputStream("あ2.xml"); DOMSource src = new DOMSource(doc.getDocumentElement()); StreamResult dst = new StreamResult(out); Transformer tfm = TransformerFactory.newInstance().newTransformer(); tfm.transform(src, dst); out.close(); }
[この投稿を含むスレッドを表示] [この投稿を削除]
[186] Re:どうしても,整理できません.
投稿者:student
2007/02/20 02:13:25

※この投稿は、現在の裏掲示板に投稿されたものを前橋が転載したものです。 丁寧な,ご返答ありがとうございます.大変,参考になりました.大分,整理がついてきました. 心から,感謝します. 今後も,疑問が沸いてくると思いますが,どうしても,手に負えない場合には,相談させて頂きます.お時間が,ありましたら返答して頂けたら幸いです. > よろしければ、studentさんの最初の投稿から、全て表の掲示板に移行しようと > 思うのですが、よろしいでしょうか? 是非,移行してください.
[この投稿を含むスレッドを表示] [この投稿を削除]
[185] Re:どうしても,整理できません.
投稿者:(ぱ)
2007/02/20 02:13:25

※この投稿は、現在の裏掲示板に投稿されたものを前橋が転載したものです。 > オブジェクト指向再入門を読ませて頂きました.大変,勉強になりました. ありがとうございます。 > こんな,私が,今,一番悩んでいることは,まさに,関数による再利用性との違いです. そのあたりのことについては、 「オブジェクトに仕事をさせる、ということ」 http://kmaebashi.com/programmer/object/shigoto.html に書いたつもりです。 まとめると、関数による再利用では、関数の呼び出しをまたがって何らかのデータを 保持することができない、ということです。無理に保持しようとすると、 例に出したstrtok()のような困った仕様になってしまいます。 これで回答になっていますでしょうか? ところでお願いですが、 現在、当サイトの掲示板は以下のURLに移転しています。 http://kmaebashi.com/bbs/list.php?boardid=kmaebashibbs ここは裏掲示板でして、ザンボットがどうのZガンダムがどうのといった話ばかり しているのはそのためです。 「オブジェクト指向再入門」のページのリンクが古いままになっていました。すみません。 よろしければ、studentさんの最初の投稿から、全て表の掲示板に移行しようと 思うのですが、よろしいでしょうか? よろしいようでしたら、投稿内容をこちらで貼り直します。
[この投稿を含むスレッドを表示] [この投稿を削除]
[184] どうしても,整理できません.
投稿者:student
2007/02/20 02:13:25

※この投稿は、現在の裏掲示板に投稿されたものを前橋が転載したものです。 オブジェクト指向再入門を読ませて頂きました.大変,勉強になりました. 私は,オブジェクト指向プログラミングを初めて,2ヶ月の初心者であります. こんな,私が,今,一番悩んでいることは,まさに,関数による再利用性との違いです. ここが,どうも,頭の中で整理出来ていません. どうか,教えてください.お願いします.
[この投稿を含むスレッドを表示] [この投稿を削除]
[183] Re:ファイルについて
投稿者:神奈川
2007/02/20 02:13:25

>>しかしLinkedHashsetやSetなどのシンボルが解決できないとというエラーが >>起こってしまいました。 > >LinkedHashSetやSetはjava.utilパッケージにありますから、 >importしなければそうなって当たり前です。 すみません(TOT) ioのパッケージに含まれいるものだと思っていました。 変な勘違いをしていました。何してんだ私・・・ とりあえず解決は、しました。よくよく考えれば当たり前なのに・・
[この投稿を含むスレッドを表示] [この投稿を削除]
[182] Re:ファイルについて
投稿者:(ぱ)
2007/02/20 02:13:25

>しかしLinkedHashsetやSetなどのシンボルが解決できないとというエラーが >起こってしまいました。 LinkedHashSetやSetはjava.utilパッケージにありますから、 importしなければそうなって当たり前です。 SAXなどのパッケージはimportしているわけですから、神奈川さんがimportの 何たるかを知らないとは考えにくいのですが、それでなぜ、java.utilの importを忘れるのかが不思議です。書き忘れるのは別に不思議じゃないですが、 このエラーメッセージを見れば一目瞭然です。 もしかして神奈川さんが、importの何たるかがわかっていなくて、 ネットに落ちてるコードとかを拾い集めてここまでプログラムを書いたのだとすれば、 それはそれでたいしたものではありますが、やっぱり勉強の順番がおかしいように 私には思えます。 >また最後の値{"け","ちち","た"}を配列に格納したいのですが 配列に格納したいのなら、すればよいのでは?
[この投稿を含むスレッドを表示] [この投稿を削除]
[181] Re:ファイルについて
投稿者:神奈川
2007/02/20 02:13:25

>>今度は、txtファイルの読み込みと書き込みについて質問なんですが、 > >APIリファレンスを見ると、InputStreamReaderにはmarkとresetという >メソッドがありますが、markSupportedはfalseのようなので使えませんね。 > >よって、対象とするファイルがよっぽど巨大なのでなければ、 >「最初にいったん全部読み込んでメモリに載せ、いったんclose()し、 > 処理が全部すんだらまとめて書き出す」 >という方法で良いんじゃないでしょうか。 返信送れてしみません。。確かにこの方法しかないようですね。。 これでやってみます。 新たな質問です。 文字列が String[] a={"あい","うえ","お","かか","きき","こ"} String[] b={"あい","け","お","こ","ちち","た"} と二つあるとき,bに対してaの文字列を引いた文字列 だけを取得するためのサンプルプログラム作成しようと思っているのですが この場合は、結果的に{"け","ちち","た"}のみになります。 以下にプログラムを書きました。 しかしLinkedHashsetやSetなどのシンボルが解決できないとというエラーが 起こってしまいました。 もしよろしければ正しく直していただけるとうれしいのですが、 また最後の値{"け","ちち","た"}を配列に格納したいのですが それも含めて宜しくお願いします。 import javax.xml.parsers.*; import org.xml.sax.*; import org.xml.sax.helpers.*; import java.io.*; public class www extends DefaultHandler { public static void main(String[] args) { String[] a = {"あい","うえ","お","かか","きき","こ"} ; String[] b = {"あい","け","お","こ","ちち","た"} ; Set setA = new LinkedHashSet(Arrays.asList(a)); Set setB = new LinkedHashSet(Arrays.asList(b)); setB.removeAll(setA); Iterator it = setB.iterator(); while (it.hasNext()) { System.out.println(it.next()); } }
[この投稿を含むスレッドを表示] [この投稿を削除]
[180] Re:センス・オブ・プログラミングの間違い?
投稿者:(ぱ)
2007/02/20 02:13:25

>はじめまして。 はじめまして。ご指摘ありがとうございます。 >// カーソルの位置の直後の文字を削除 >void backSpace(); > >ですけど >「直後」じゃなくて「直前」ではないでしょうか? おっしゃる通りです。なにしろbackSpace()ですから、カーソルの前の文字が 消えるのが当然です。 ご迷惑をおかけして申し訳ありません。 正誤表に加えておきました。ご指摘ありがとうございました。
[この投稿を含むスレッドを表示] [この投稿を削除]