掲示板

掲示板を置いてみました。ご自由に書き込んで下さい。
ただし、私は根性なしなので、閑古鳥が鳴いたり、荒れてきたと
思ったらとっとと閉鎖する可能性があります。


より新しい記事へ ← 500 件の投稿中 350件目〜301件目を表示 → より前の記事へ
表示件数: 件/頁 


350 Re^5: ファイルポインタとfclose コメント数:  4件
  (ぱ)   | PXU00211@nifty.ne.jp 2002/05/10 (金) 22:03
 http://member.nifty.ne.jp/maebashi
> > hoge = HOGE_destroy(hoge); // (こういう使い方を想定されていると信じます)
...
> 私は設計するときはこういう関数にはしませんね。

同じくです。

> ただ、間違ってdestroyしたはずのポインタを使ったときに
> すぐにわかるようにfree()する領域を"0xdeadbeaf"で埋め尽くす
> というようなことはよくやりますが。

私は0xCCですね。WRITING SOLID CODEの流儀です。

> HOGE_destroy( Hoge_t **hoge)

そう思って、my_free(void **p) みたいなのを考えたことがありますが、
普通にmy_free(p) と書いてもコンパイラが怒らないから使えないなあ、と。
もちろんHoge_t **ならいいんですが。
【新規投稿】 【この投稿にリプライ】 【投稿者削除】


349 Re^5: ファイルポインタとfclose コメント数:  1件
  xiu 2002/05/10 (金) 15:34
> 第一にHOGE_destroy()を呼び出す人が必ず戻り値を元の変数に
> 再代入してくれる保証がないのと、
> destroyを呼び出した後にdestroyしたポインタを使う・使わないは
> 呼び出し側の責任だと思ってますので。

つまり、戻り値代入を前提としたポインタ管理はかえって危険だということですか?
そういうことなら、分からないでもないですが。ただ、それなら、マクロ
#define HOGE_DESTROY(fp) (fp = HOGE_destroy(fp))
を使うというような方法もありますし、管理の仕方はいろいろあると思います。

> ただ、間違ってdestroyしたはずのポインタを使ったときに
> すぐにわかるようにfree()する領域を"0xdeadbeaf"で埋め尽くす
> というようなことはよくやりますが。

これは、ポインタの指す領域を0xdeadbeafで埋め尽くしてfreeする、ということですか?それとも、freeしたポインタに0xdeadbeafを代入するということですか?
Cでは一度freeされた領域がその後も値を保持するかどうかは保証されていないはずですし、ポインタが0xdeadbeafという値をとらないということも保証されていないと思うのですが。
【新規投稿】 【この投稿にリプライ】 【投稿者削除】


348 Re^4: ファイルポインタとfclose コメント数:  7件
  本多   | manybook@msc.biglobe.ne.jp 2002/05/10 (金) 08:35
> HOGE_destroyのように最後にポインタを返すようになっていれば、
> hoge = HOGE_destroy(hoge); // (こういう使い方を想定されていると信じます)
> のようにすることで上記の状態を回避できるので問題はないのですが。

私は設計するときはこういう関数にはしませんね。

第一にHOGE_destroy()を呼び出す人が必ず戻り値を元の変数に
再代入してくれる保証がないのと、
destroyを呼び出した後にdestroyしたポインタを使う・使わないは
呼び出し側の責任だと思ってますので。

ただ、間違ってdestroyしたはずのポインタを使ったときに
すぐにわかるようにfree()する領域を"0xdeadbeaf"で埋め尽くす
というようなことはよくやりますが。

あとはHOGE_destroyの仕様を
HOGE_destroy( Hoge_t **hoge)
{
...
free( *hoge);
*hoge=NULL;
}
としておいて、
Hoge_t *hoge;
hoge = HOGE_create(...);
HOGE_destroy(&hoge);
のように呼び出すことはいいかもしれませんが...
【新規投稿】 【この投稿にリプライ】 【投稿者削除】


347 Re^3: ファイルポインタとfclose コメント数:  9件
  xiu 2002/05/10 (金) 03:50
> ってよくやるコトでしょう?
> コピー(引数で渡したポインタ)をfree()しちゃいけないって、
> これもダメってコトですか?

それはいいと思います。
説明が悪かったようですが、私の発言の主旨は次のようなものです。
まず、喜びの壁さんの関数funcが、その内部でfcloseしたかどうかが呼び出し元からは分からないようになっていました。
そこで、このfunc内でfcloseすると「呼び出し元のファイルポインタが、それがクローズされているかどうかわからない状態で値を持ちつづける」という状態を引き起こします。私が危険といったのはその状態のことです。

HOGE_destroyのように最後にポインタを返すようになっていれば、
hoge = HOGE_destroy(hoge); // (こういう使い方を想定されていると信じます)
のようにすることで上記の状態を回避できるので問題はないのですが。

・・・ということでよろしいですか?

openとcloseの対称性については私も同意します。
必ずそうしなければならないとは思いませんけれど。
【新規投稿】 【この投稿にリプライ】 【投稿者削除】


346 Re^2: ファイルポインタとfclose コメント数:  11件
  本多   | manybook@msc.biglobe.ne.jp 2002/05/09 (木) 19:15
> 普通はオリジナルの(コピーではない)ファイルポインタをクローズするのではないでしょうか。
> 同じポインタを指す変数がプログラム上に2つ以上ある状態でクローズするのは危険だとおもいます。(malloc,freeでも同様)

少し、おっしゃってるコピーの意味がわからないのですが、
引数で渡す⇒コピーですか?
つまりある関数に引数で渡したポインタを、
その関数内部で勝手にclose or freeしてはいけないという意味ですか?

例えば、
typedef struct Hoge {
...
} Hoge_t;

Hoge_t *HOGE_create( const char *filename)
{
Hoge_t *hoge;
...
hoge = malloc( sizeof(Hoge_t));
...
return hoge;
}

void HOGE_destroy( Hoge_t *hoge)
{
...
free(hoge);
...
return hoge;
}
ってよくやるコトでしょう?
コピー(引数で渡したポインタ)をfree()しちゃいけないって、
これもダメってコトですか?

...ただ、open/close, malloc/free, HOGE_create/HOGE_destroyに
常に対象性を持たせて呼び出す階層を一致させるのは大事だとは思いますが。
【新規投稿】 【この投稿にリプライ】 【投稿者削除】


345 Re: ファイルポインタとfclose コメント数:  12件
  xiu 2002/05/09 (木) 15:49
普通はオリジナルの(コピーではない)ファイルポインタをクローズするのではないでしょうか。
同じポインタを指す変数がプログラム上に2つ以上ある状態でクローズするのは危険だとおもいます。(malloc,freeでも同様)
【新規投稿】 【この投稿にリプライ】 【投稿者削除】


344 ファイルポインタとfclose コメント数:  13件
  喜びの壁(旧costa)   | qf7t-mrt@asahi-net.or.jp 2002/05/08 (水) 22:03
質問です。
ファイルポインタについて、体当り〜ではP148で(この場合)
「ファイルポインタはfclose()によりクローズ」とあります。
では、例えば
void function(FILE *func_fp,...){
...
}
int main(void){
FILE *main_fp;...;
func(main_fp,...);...
}
というような場合、fpは基本的にはfuncとmainのどちらで閉じた方がよい
のでしょうか。(fopenのある方?)
両方に書いた場合に衝突するのが問題かなと思いまして。

Java謎〜の事が日経ソフトウェアという雑誌に載っていましたね。
自分買わせていただいたのですが、これってやはりJava初心者の自分には
無理があったのでしょうか。思ったよりもはっきりと"初心者向けではない"
と書かれていたような気がしまして。

【新規投稿】 【この投稿にリプライ】 【投稿者削除】


343 Re^2: 体当たり学習List2-5について コメント数:  0件
  ま 2002/05/07 (火) 10:06
正誤表と掲示板のlogはみたのですが、補足は
見落としていました
ありがとうございました
【新規投稿】 【この投稿にリプライ】 【投稿者削除】


342 Re: 5刷が出た? コメント数:  0件
  (ぱ)   | PXU00211@nifty.ne.jp 2002/05/06 (月) 21:37
 http://member.nifty.ne.jp/maebashi
> 本屋で眺めていたら5刷が出たようですね。
> これは、正誤表のどのあたりまで、修正されたのでしょうか?

2001/12/1のものまで、修正されているはずです。

正誤表の方に入れておくのを忘れていました。
なにかとミスが多く申し訳ありません。
【新規投稿】 【この投稿にリプライ】 【投稿者削除】


341 Re: 体当たり学習List2-5について コメント数:  1件
  (ぱ)   | PXU00211@nifty.ne.jp 2002/05/06 (月) 21:29
 http://member.nifty.ne.jp/maebashi
> はじめまして

はじめまして。

> リダイレクトを使うと正常に動作するのですが、
> キーボードから入力するとscore[0]が表示されません

これは、

http://member.nifty.ne.jp/maebashi/seiha/hosoku004.html#dosmado

この問題ですね。Win9x系のDOS窓のバグのようです。

> ダウンロードしたソースを使っても同じでした
> 色々といじってみたところ、16行目の条件を
> if(temp_score==-1)として最後に-1をいれるようにすると
> きちんと表示されます

その場合、Ctrl-Zを叩いていないからだと思われます。
【新規投稿】 【この投稿にリプライ】 【投稿者削除】


340 体当たり学習List2-5について コメント数:  2件
  ま 2002/05/06 (月) 16:15
はじめまして
体当たり学習のP95 List2-5(my_sort4.c)について
お聞きしたいことがあります
リダイレクトを使うと正常に動作するのですが、
キーボードから入力するとscore[0]が表示されません
ダウンロードしたソースを使っても同じでした
色々といじってみたところ、16行目の条件を
if(temp_score==-1)として最後に-1をいれるようにすると
きちんと表示されます
何故なのでしょうか?
ちなみにWin98SE+bcc5.5.1を使用しています
【新規投稿】 【この投稿にリプライ】 【投稿者削除】


339 5刷が出た? コメント数:  1件
  石川 2002/05/06 (月) 14:19
本屋で眺めていたら5刷が出たようですね。
これは、正誤表のどのあたりまで、修正されたのでしょうか?
【新規投稿】 【この投稿にリプライ】 【投稿者削除】


338 Re^2: ダウンロードサービス コメント数:  0件
  net   | o2ka@hotmail.com 2002/04/29 (月) 09:20
> > ポインタ完全制覇のサンプルのダウンロードサービスはありますか?
>
> いまさらですが、用意しました。
>
> 1年以上前にもダウンロードサービスを望む方がいらっしゃったのですが、
> 「気長にお待ちください」と答えたきりそのまま放置してしまいました...
>
> 大変遅くなってしまったことをお詫びいたします。

前橋さん、(ダウンロードサービスを望んでいた人達を代表して)ありがとうございました。
【新規投稿】 【この投稿にリプライ】 【投稿者削除】


337 Re: ダウンロードサービス コメント数:  1件
  (ぱ)   | PXU00211@nifty.ne.jp 2002/04/29 (月) 03:17
 http://member.nifty.ne.jp/maebashi
> ポインタ完全制覇のサンプルのダウンロードサービスはありますか?

いまさらですが、用意しました。

1年以上前にもダウンロードサービスを望む方がいらっしゃったのですが、
「気長にお待ちください」と答えたきりそのまま放置してしまいました...

大変遅くなってしまったことをお詫びいたします。
【新規投稿】 【この投稿にリプライ】 【投稿者削除】


336 ダウンロードサービス コメント数:  2件
  net   | o2ka@hotmail.com 2002/04/25 (木) 09:16
ポインタ完全制覇のサンプルのダウンロードサービスはありますか?
【新規投稿】 【この投稿にリプライ】 【投稿者削除】


335 Re: 2月定期に割引を コメント数:  0件
  (ぱ)   | PXU00211@nifty.ne.jp 2002/04/21 (日) 04:35
 http://member.nifty.ne.jp/maebashi
> はじめまして。いとぶんといいます。

はじめまして。

> 雑記帳の2月で定期にだまされている気がすると書いてありましたが、
> 実はうちの家内も2月に同じ事を言って怒っておりました。

サラリーマンの場合2月も同じ給料をもらうんだからそっちの方が…
とも思うんですが、実は納期も短いという罠。

定期代は、5月もきっと連休分損してますよね。

> いまちょうど前橋さんの著書2冊でC言語の勉強をさせていただいて
> いたことや、家内が前橋さんと同い年であることから
> 変な親近感を覚え、とてもほほえましく読ませていただきました。

ありがとうございます。

ときに、この掲示板は500件までしか保存してくれないので、
最新の書きこみの番号は常に500になっているはずなのですが、
「いとぶん」さんの書き込みがあるまで、「のぐー」さんの
書きこみの番号が499になっていました。

これは別に荒らされたから削除したとかではなくて、私自身が
セキュリティホールのチェックのために書いたのを消したためです。
削除パスワードをミスタイプしたらしく、消せなくて、管理者用
パスワードのメモを探す羽目になってしまいました(^^;
【新規投稿】 【この投稿にリプライ】 【投稿者削除】


334 2月定期に割引を コメント数:  1件
  itobun 2002/04/20 (土) 00:44
はじめまして。いとぶんといいます。
雑記帳の2月で定期にだまされている気がすると書いてありましたが、
実はうちの家内も2月に同じ事を言って怒っておりました。

いまちょうど前橋さんの著書2冊でC言語の勉強をさせていただいて
いたことや、家内が前橋さんと同い年であることから
変な親近感を覚え、とてもほほえましく読ませていただきました。

御本はのびのびと教科書ライクでない書き方でかかれていて
とても面白いです。先に「バイブル」の方から読んで勉強していたのですが、洋書の翻訳独特のわかりにくさがあっていやでした。

前橋さんの、わからないことからいっさい逃げず
「じゃ調べてみましょ」な態度に
感動しております。

5月から開発に入りますので
しっかり勉強させていただきます。
ありがとうございます。
【新規投稿】 【この投稿にリプライ】 【投稿者削除】


333 Re^6: 配列へのポインタについて コメント数:  0件
  のぐー   | bxm06466@nifty.ne.jp 2002/03/27 (水) 00:57
 http://homepage1.nifty.com/nogue/
doubleでは、そのとおりです。しかし、int等では、そうではありません。
計算結果が同じになるなら(これをas if規則と言います)、処理系は、
(a+1)+(b+1) を、文字通りの3回の加算ではなく、2回の加算(a+b)+2に
変更してかまいません。また、(a+b)+(c+d)を、((a+b)+c)+d に変更して
かまいません。(中間結果を保持するメモリを節約==アクセスの高速化)
そして、intが2の補数であるほとんどの処理系は、この最適化を行います。

JIS規格 5.1.2.3 プログラムの実行 の「例4」「例5」を見てください。

>例4
>(中略)
>しかし,オーバフローが例外を発生させず,オーバフローの結果が可逆で
>ある計算機では,同じ結果が得られるので,処理系は上で述べた方法の
>いずれに書き換えることもできる.

などと書いてあります。

ちなみに、「昔のK&R Cではそうでした」とありますが、K&R Cでも
doubleについては、書かれた通りに演算してました。
【新規投稿】 【この投稿にリプライ】 【投稿者削除】


332 Re^5: 配列へのポインタについて コメント数:  1件
  かずま   | sakamoto@mc.catv.ne.jp 2002/03/26 (火) 02:51

ためしに次のプログラムを実行してみてください。

 double a = -123456789012345.0;
 double b = 123456789012345.0;
 double c = 0.123456789012345;
 printf("%.15f\n", a + b + c);
 printf("%.15f\n", a + (b + c));
 printf("%.15f\n", (a + b) + c);

規格書で規定していないのは、演算のオペランドの評価順序です。
演算の順序は構文規則で規定されています。

ただ、(a+b)+(c+d) の場合、真ん中の +演算は最後に実行されますが、
左と右の +演算の順序は規定されていません。(a+b) と (c+d) が
真ん中の +演算子のオペランドだからです。

規格書では、オペランドという代わりに部分式(subexpression)という
言葉を使っています。
【新規投稿】 【この投稿にリプライ】 【投稿者削除】


331 Re^4: 配列へのポインタについて コメント数:  2件
  かずま   | sakamoto@mc.catv.ne.jp 2002/03/26 (火) 02:49
> ついでに言うと、括弧をつけても、実際の演算の順序は規定できません。
> コンパイラは、1つのシーケンスポイントから次のシーケンスポイント
> までの式を、任意の順序で演算する最適化を行う自由を持っています。

昔の K&R C では、そうでした。a+b+c と書いても、(a+b)+c と書いても、
a+(b+c) と書いても、コンパイラはどの +演算を先にやってもよかったのです。
しかし、今の規格では、構文規則どおりの順序でしか演算は許されません。
a+b+c と (a+b)+c は同じで、左の +演算が先です。a+(b+c) なら、右の
+演算が先です。

K&R2の訳書の p.329に「数学的な結合演算子を計算上も結合的なものとして扱
うコンパイラのライセンスは取り消される」とあります。これは迷訳ですね。
ライセンスは、自由度または裁量と訳すべきです。ANSI C の Rationale (例
えば http://www.lysator.liu.se/c/rat/title.html) の 3.3 Expression に
も書かれています。規格書なら、分かりにくいけど「6.3 式」と脚注35 です。
(字数オーバーなので、つづく)
【新規投稿】 【この投稿にリプライ】 【投稿者削除】


330 括弧の機能 コメント数:  0件
  田中 2002/03/25 (月) 01:47
ご回答、ありがとうございました。

>括弧の機能は、構文の上で、演算子の結びつきを変更することです。
(中略)
>ついでに言うと、括弧をつけても、実際の演算の順序は規定できません。
全く誤解しておりました。

http://www.toyo.co.jp/ss/qac/sstp0025j.html
にも、この問題が言及されていますね。
【新規投稿】 【この投稿にリプライ】 【投稿者削除】


329 Re^4: 配列へのポインタについて コメント数:  0件
  田中 2002/03/25 (月) 00:43
>違うのは、「型」です。
ようやく、理解できました。

私は*演算子をポインタに適用すると、単にポインタの値(アドレス)にあるもの
「のみ」にアクセスできるのだと考えていました。
しかし、実際には、ポインタは単なるアドレスでなく型をもっていて、
*演算子は、その型にあわせてポインタを展開(?)するのですね。

こんな事はよく考えれば当たり前のことですね。

こんな変な間違いを犯したのも、私は、
ポインタの値=アドレス=そのオブジェクト「全て」が入っている場所
と考えていたからでした(そして配列はオブジェクトが集まっているから特別と)。

これはintについて考えてみても、sizeof(int)個のアドレスを消費しているから、
おかしいですね。

結局、ポインタ=アドレスという捉え方ではなく、もう少し高級なものであると
考えるべきなのですね。

そして、ポインタの値は、たまたま(!?)
そのオブジェクトが格納されている場所の「先頭」のアドレス
ということでしょうか。

#「先頭」と言い切って良いのか分かりませんが、
#こうすると、とりあえず、&strの値と&str[0]の値が同じであることが、
#理解できます。

どうも、ありがとうございました。
【新規投稿】 【この投稿にリプライ】 【投稿者削除】


328 Re^3: 配列へのポインタについて コメント数:  4件
  のぐー   | bxm06466@nifty.ne.jp 2002/03/25 (月) 00:05
 http://homepage1.nifty.com/nogue/
割り込み失礼します。

> ただ、&strを先に求めてから(そのために括弧を付けた)、

括弧の機能は、構文の上で、演算子の結びつきを変更することです。
*&strでは、もともと&とstrが先に結びつき、その後に*が係るので、
*(&str)と書いても、全く同じです。

ついでに言うと、括弧をつけても、実際の演算の順序は規定できません。
コンパイラは、1つのシーケンスポイントから次のシーケンスポイント
までの式を、任意の順序で演算する最適化を行う自由を持っています。

>それに*を作用させる と考えた場合は、納得できません。

*演算子の機能は、ポインタをオペラントにとり、それの型にもとづいて
それが指すオブジェクトを評価することです。
【新規投稿】 【この投稿にリプライ】 【投稿者削除】


327 Re^3: 配列へのポインタについて コメント数:  1件
  (ぱ)   | PXU00211@nifty.ne.jp 2002/03/24 (日) 22:17
 http://member.nify.ne.jp/maebashi/
> &strの値は、文脈によっては、&str[0]の値と同じにならない
> ということなのでしょうか?

printf()の%pで表示させてみれば、「値」は同じになっている
ことでしょう。

違うのは、「型」です。
【新規投稿】 【この投稿にリプライ】 【投稿者削除】


326 Re^2: 配列へのポインタについて コメント数:  7件
  田中 2002/03/24 (日) 21:27
(ぱ)さん、素早いお返事ありがとうございます。

>&strは配列へのポインタだ→よって、*(&str)は「配列」だ
*(&str)「全体」としてみれば、&と*が逆の関係(?)であるので、これは当然です。

ただ、&strを先に求めてから(そのために括弧を付けた)、それに*を作用させる
と考えた場合は、納得できません。

&strの値は、文脈によっては、&str[0]の値と同じにならない
ということなのでしょうか?

#もちろん、*(&str)なんて普通は書きませんが、実験ということで。
【新規投稿】 【この投稿にリプライ】 【投稿者削除】


325 Re: 配列へのポインタについて コメント数:  8件
  (ぱ)   | PXU00211@nifty.ne.jp 2002/03/24 (日) 21:02
 http://member.nify.ne.jp/maebashi/
> char str[] = "abc";
> printf("%c", *(&str));
>
> とした場合、2文目を素直に(?)に内側の括弧から読み、
> &strは配列へのポインタだ→(型はともかく)値は&str[0]と同じだ

型を「ともかく」で無視しないでください (^^;

&strは配列へのポインタだ→よって、*(&str)は「配列」だ

つまり、strと同じ。もちろん、配列は式の中なのでポインタに
読みかえられます。

普通に考えて、ごく当たり前の結果になっていると思いますが?

> と考えたのですが、実際は、printf("%c\n", str)と解釈されるようです。

型をキャストで無理やり変更すると、&str[0]と同じように扱わせる
こともできます。それがまさにこの例ですよね。

> printf("%c", *((char *)&str));
> とした場合は、当然ながら意図通り、「a」を表示します。
【新規投稿】 【この投稿にリプライ】 【投稿者削除】


324 配列へのポインタについて コメント数:  9件
  田中 2002/03/24 (日) 20:25
はじめまして。C初学者の田中です。
前橋さんの著書を読まずに、質問することをお許しください。

char str[] = "abc";
printf("%c", *(&str));

とした場合、2文目を素直に(?)に内側の括弧から読み、
&strは配列へのポインタだ→(型はともかく)値は&str[0]と同じだ
→*(&str)は、*(&str[0])と同様、つまり、str[0]
→よって、「a」を表示する
と考えたのですが、実際は、printf("%c\n", str)と解釈されるようです。

このような解釈は、ISOやJIS等で規定されているのでしょうか?

なお、
printf("%c", *((char *)&str));
とした場合は、当然ながら意図通り、「a」を表示します。
【新規投稿】 【この投稿にリプライ】 【投稿者削除】


323 Re^10: メモリの割り当てについて コメント数:  0件
  (ぱ)   | PXU00211@nifty.ne.jp 2002/03/23 (土) 20:19
 http://member.nify.ne.jp/maebashi/
> さっきこのことに気づいてよけいな心配をしていたのだなと思いました。
> int power(int x){
> int temp; /* わざとらしくローカル変数使いますが */
> temp = x * x;
> return temp;
> }
> のような関数でもtempは関数から抜けると消えますがその値が消える
>心配をしていたようなものだったのだなーと。

まさにそういうことです。ご自分で気付かれたようで何よりです。
destは所詮ポインタですので、その値(ポインタ値)だけ、呼び出し側に
引き継げれば問題ないわけですね。

> ところでC++の本は書かれないのでしょうか?
> C++ STL完全踏破とか、 C++ オブジェクト指向完全究明とかそういうのりで。
> 期待しています。

えー、今のところ予定はありません (^^;
【新規投稿】 【この投稿にリプライ】 【投稿者削除】


322 Re^9: メモリの割り当てについて コメント数:  1件
  TDa   | tda@plum.to 2002/03/23 (土) 00:44
> 関数から抜けると自動変数は消滅するから、TDaさんのmy_strcat()だと
> destは消滅します。ただ、destの指す先の領域は残っていますし、
> それを指すポインタ値が、戻り値として返されるわけです。

さっきこのことに気づいてよけいな心配をしていたのだなと思いました。
int power(int x){
int temp; /* わざとらしくローカル変数使いますが */
temp = x * x;
return temp;
}
のような関数でもtempは関数から抜けると消えますがその値が消える心配をしていたようなものだったのだなーと。

> 最近仕事はC++なのですが、しばらくJavaやってからC++やると、
> やっぱりdeleteの責任分担の設定が大変ですわ (^^;
ところでC++の本は書かれないのでしょうか?
C++ STL完全踏破とか、 C++ オブジェクト指向完全究明とかそういうのりで。
期待しています。
【新規投稿】 【この投稿にリプライ】 【投稿者削除】


321 Re^8: メモリの割り当てについて コメント数:  2件
  (ぱ)   | PXU00211@nifty.ne.jp 2002/03/22 (金) 22:36
 http://member.nifty.ne.jp/maebashi/
なんだかちょっと不安ですので。

> ここが引っかかっていたのですよ。この話で言えばmy_strcatの中で
>mallocしたポインタは誰がfreeするのかなと言うところから

ポインタをfreeするわけではありませんよね。ポインタの指す先の領域を
freeするわけで。

>関数から抜けると自動変数は消滅するから

関数から抜けると自動変数は消滅するから、TDaさんのmy_strcat()だと
destは消滅します。ただ、destの指す先の領域は残っていますし、
それを指すポインタ値が、戻り値として返されるわけです。

ですから、この仕様だと、free()するのは呼び出し側の責任になります。

最近仕事はC++なのですが、しばらくJavaやってからC++やると、
やっぱりdeleteの責任分担の設定が大変ですわ (^^;
【新規投稿】 【この投稿にリプライ】 【投稿者削除】


320 Re^7: メモリの割り当てについて コメント数:  3件
  TDa   | tda@plum.to 2002/03/22 (金) 22:18
> ・スタック(自動変数) → 寿命は、ブロック(関数)を抜けるまで
> ・static(静的変数) → 寿命は、プログラムが終わるまでずっと
> ・ヒープ(malloc()等) → 寿命は、free()するまで
>
> C FAQ 7.5 は、スタックとstaticにしか言及していないのです。

ここが引っかかっていたのですよ。この話で言えばmy_strcatの中でmallocしたポインタは誰がfreeするのかなと言うところから疑問が始まりました。関数から抜けると自動変数は消滅するから訳のわからないところを指したり知らぬ間にメモリが破壊されたりしないかというようなことが不安になっていたのです。それでC FAQの回答を見て先のように思ったのです。

> このへんの話は、「ポインタ完全制覇」の2章で説明しています(宣伝)。

はい、ヒープのあたりをもう一度読み直します。
前橋さん、本田さんありがとうございました。

【新規投稿】 【この投稿にリプライ】 【投稿者削除】


319 Re^6: メモリの割り当てについて コメント数:  4件
  (ぱ)   | PXU00211@nifty.ne.jp 2002/03/22 (金) 20:05
 http://member.nifty.ne.jp/maebashi/
> でもこれってC FAQ 7.5の
> 「(返されたポインタは)呼ばれた関 数のローカルな(自動変数の)配列を
>指していてはいけない。」
> に反してないですか。

いいえ。この場合、配列の領域をmalloc()で確保していますから、
「自動変数の配列」には合致しません。

Cで使える記憶領域には以下の3種があって、

・スタック(自動変数) → 寿命は、ブロック(関数)を抜けるまで
・static(静的変数) → 寿命は、プログラムが終わるまでずっと
・ヒープ(malloc()等) → 寿命は、free()するまで

C FAQ 7.5 は、スタックとstaticにしか言及していないのです。
このへんの話は、「ポインタ完全制覇」の2章で説明しています(宣伝)。
【新規投稿】 【この投稿にリプライ】 【投稿者削除】


318 Re^5: メモリの割り当てについて コメント数:  5件
  TDa   | tda@plum.to 2002/03/22 (金) 18:54
> char *my_strcat(char *dest, const char *src)
> {
> char *string;
>
> if ( (string = malloc( strlen(dest)+strlen(src)+1) ) == NULL )
> return NULL;
> sprintf(string,"%s%s",dest,src);
> return string;
> }

でもこれってC FAQ 7.5の
「(返されたポインタは)呼ばれた関 数のローカルな(自動変数の)配列を指していてはいけない。」
に反してないですか。それとも私のポインタ、配列、バッファの理解が全く間違っているのでしょうか。
【新規投稿】 【この投稿にリプライ】 【投稿者削除】


317 Re^4: メモリの割り当てについて コメント数:  6件
  本多   | manybook@msc.biglobe.ne.jp 2002/03/22 (金) 16:35
> > ptr = my_strcat("Hello,","world");
> > はうまくいかないのでは、ないでしょうか?
> もちろんうまくいきません:p そういう仕様で書いておりましたし。
> 上記のように書けないのは気持ち悪いですがメモリの割り当てのことを気にしてのサンプルコードですのでご了承を。
なるほど、わかりました。
サンプルコードですから抜けがあるのは理解できます。

ただ、関数を作るときに
「関数の引数がmallocされたポインタを渡さなくてはいけない」
という仕様を押し付けるのは気持ち悪いなぁって思ったもので。

↓こういうのなら、そういう仕様を使用者に押し付けずに済みますよね?
char *my_strcat(char *dest, const char *src)
{
char *string;

if ( (string = malloc( strlen(dest)+strlen(src)+1) ) == NULL )
return NULL;
sprintf(string,"%s%s",dest,src);
return string;
}
【新規投稿】 【この投稿にリプライ】 【投稿者削除】


316 Re^3: メモリの割り当てについて コメント数:  7件
  TDa   | tda@plum.to 2002/03/22 (金) 09:53
> ptr = my_strcat("Hello,","world");
> はうまくいかないのでは、ないでしょうか?

もちろんうまくいきません:p そういう仕様で書いておりましたし。

上記のように書けないのは気持ち悪いですがメモリの割り当てのことを気にしてのサンプルコードですのでご了承を。
【新規投稿】 【この投稿にリプライ】 【投稿者削除】


315 Re^2: メモリの割り当てについて コメント数:  8件
  本多   | manybook@msc.biglobe.ne.jp 2002/03/22 (金) 08:22
> > dest = realloc(dest, strlen(dest) + strlen(src) + 1);
> メモリが足りなくなったときの対処の甘さを除けば、合法です。

この関数my_strcat()の引数destがmallocされた領域じゃないと
うまくいかないのではないですか?

ptr = my_strcat("Hello,","world");
はうまくいかないのでは、ないでしょうか?
【新規投稿】 【この投稿にリプライ】 【投稿者削除】


314 Re: メモリの割り当てについて コメント数:  9件
  (ぱ)   | PXU00211@nifty.ne.jp 2002/03/22 (金) 02:17
 http://member.nify.ne.jp/maebashi/
> C FAQ7.5にて
> 「返されたポインターは静的に割り当てられたバッファか、呼んだ側の
>関数から渡されたバッファを指すべきで、呼ばれた関数のローカルな
>(自動変数の)配列を指していてはいけない。」

この記述は正しいです。自動変数の配列を指してはいけません。

> 自分で呼ばれた関数で新たにメモリを割り付けて文字列を格納した場合

もちろん、malloc()などでヒープに確保するのであれば、
問題ありません。ただし、呼び出し側にfree()の手間を押し付ける
ことになるでしょう。

> dest = realloc(dest, strlen(dest) + strlen(src) + 1);

メモリが足りなくなったときの対処の甘さを除けば、合法です。
【新規投稿】 【この投稿にリプライ】 【投稿者削除】


313 メモリの割り当てについて コメント数:  10件
  TDa   | tda@plum.to 2002/03/21 (木) 22:27
こんにちは、お世話になりますTDaです。文字列を返り値とする関数について疑問がありまして質問させていただきたく投稿します。

C FAQ7.5にて
「返されたポインターは静的に割り当てられたバッファか、呼んだ側の関数から渡されたバッファを指すべきで、呼ばれた関数のローカルな(自動変数の)配列を指していてはいけない。」
とありました。

自分で呼ばれた関数で新たにメモリを割り付けて文字列を格納した場合この文字列(のポインタ)を返り値とするとメモリの確保や解放はどうなるのだろうとおもいC FAQをあたって上記の記述に行き当たりました。これをふまえて以下のようなコードは合法なのでしょうか?自分で判断できなくてご相談した次第です。下ではreallocを使っていますがmallocではどうでしょう。

#include <stdio.h>
#include <string.h>

char *my_strcat(char *dest, const char *src)
/* destを自動的にのばしてsrcをつなげる */
{
dest = realloc(dest, strlen(dest) + strlen(src) + 1);
return strcat(dest, src);
}
【新規投稿】 【この投稿にリプライ】 【投稿者削除】


312 Re^3: はじめまして(?) コメント数:  0件
  (ぱ)   | PXU00211@nifty.ne.jp 2002/03/21 (木) 15:28
 http://member.nify.ne.jp/maebashi/
>代入抑止文字を使った場合、変換の数と代入の数は一致しません。

了解です。その通りですね。

正誤表に入れておきます。
【新規投稿】 【この投稿にリプライ】 【投稿者削除】


311 Re^3: はじめまして(?) コメント数:  0件
  Aki 2002/03/20 (水) 21:25
is-a関係の件ですが、勘違いしていたようです。すみませんでした。
【新規投稿】 【この投稿にリプライ】 【投稿者削除】


310 Re^2: はじめまして(?) コメント数:  2件
  Aki 2002/03/20 (水) 04:29
>「サブクラスはスーパークラスの一種である」
>という言葉を文字通りに解釈しても、やっぱり変ですよね。
そうかもしれません。でも釈然としない部分があるのでしばらく
考えてみます。結局私の勘違いだったらすみません。

「サブクラスはスーパークラスである」
「サブクラスはスーパークラスの一種である」

うーん。。。言葉は難しい。

>変換の数と代入の数が異なるケースがありましたら、教えていた
>だけると助かります。

代入抑止文字を使った場合、変換の数と代入の数は一致しません。
ex.) scanf("%*d%d%d", &a, &b); /* エラーがなければ2を返却 */
%*dは(確かに)変換を行いますが代入はしません。
【新規投稿】 【この投稿にリプライ】 【投稿者削除】


309 Re: はじめまして(?) コメント数:  3件
  (ぱ)   | PXU00211@nifty.ne.jp 2002/03/20 (水) 03:22
 http://member.nify.ne.jp/maebashi/
>「a」には「一種の」という意味がありますが、これはご存知
>でしたでしょうか。

辞書はいま引いたんですけど、ありますね。ですからis aを「一種である」と訳すのはいいと思うんですが、「サブクラスはスーパークラスの一種である」という言葉を文字通りに解釈しても、やっぱり変ですよね。

元のご指摘は、そういう意味だと解釈しておりますが、どうでしょうか。

>>strncat()も同様です
>の記述は間違いではないでしょうか。

これはまさにその通りでした。ご指摘に感謝します。完全に思い違いをしておりました。
正誤表に載せておきます。

>>変換に成功した変換指定子の数を返しますが、...
>とありますが、「変換」ではなく「代入」でなければならないん
>じゃないでしょうか。

規格には確かに「代入」と書いてありますが、すみません、違いが認識できておりません。

変換の数と代入の数が異なるケースがありましたら、教えていただけると助かります。

>近いうちに自分の持っている本全部の間違い探しをやろうと思って
>いるので、また書き込ませてもらうかもしれません。

かなりびくびくものですが(^^; よろしくお願いいたします。
【新規投稿】 【この投稿にリプライ】 【投稿者削除】


308 はじめまして(?) コメント数:  4件
  Aki 2002/03/19 (火) 18:06
補足(海外在住の方より)のついてですが、私の持っている別の本
(Java言語プログラミングレッスン)には、「サブクラスはスーパ
ークラスの一種である」との記述があります。辞書を引いてみる
と、「a」には「一種の」という意味がありますが、これはご存知
でしたでしょうか。

ところで、完全性覇のp300ですが、

>strncat()も同様です

の記述は間違いではないでしょうか。
#藤原博文さんの本にも同じ間違いがあったような。。。

あとすごく細かいんですが、完全性覇のp78に、

>変換に成功した変換指定子の数を返しますが、...

とありますが、「変換」ではなく「代入」でなければならないん
じゃないでしょうか。
#Sorry pointing small miss.

近いうちに自分の持っている本全部の間違い探しをやろうと思って
いるので、また書き込ませてもらうかもしれません。私は最初に買
った入門書をぼろぼろになるまで何度も読んだのですが、今それを
読むとあまりにも間違いだらけで、よくまあこんなのを真剣になっ
て読んでいたなと思います。2冊目は林晴比古の本(これまたひどい)
でした。というわけで勉強し始めて最初の2年ばかしは嘘を一生懸命
覚えていました。ちくしょう!
【新規投稿】 【この投稿にリプライ】 【投稿者削除】


307 Re^3: java 入門書 コメント数:  0件
  (ぱ)   | PXU00211@nifty.ne.jp 2002/03/04 (月) 19:37
 http://member.nifty.ne.jp/maebashi/
> > 私は入門書には詳しくないのですが、
>
> というと、前橋さんはどのように新しい言語を習得されるのでしょうか?
> 参考まで、教えていただけると幸いです。

私について言えば、JDK1.0.2の頃の入門書は何冊か読みました。
「かんたんJava」「Java言語入門」「Just Java」程度です。
しかし、前に書いたように、これらの本の内容は、既に時代遅れです。

その後のJavaについては、JLSやら、APIリファレンスやら、雑誌やら、Webページやら、メイリングリストやらで学習しました。「プログラミング言語Java 第3版」をはじめ、何冊か解説書も読みましたが、入門書ではないでしょうし。

Java2対応の入門書も(興味本位で)何冊かは目を通しましたが、「この本がいいよ」と人に勧められるほどたくさんの本を読んだわけではないということです。
【新規投稿】 【この投稿にリプライ】 【投稿者削除】


306 Re^2: java 入門書 コメント数:  1件
  osi 2002/03/04 (月) 11:20
回答ありがとうございます。

> 私は入門書には詳しくないのですが、

というと、前橋さんはどのように新しい言語を習得されるのでしょうか?
参考まで、教えていただけると幸いです。


【新規投稿】 【この投稿にリプライ】 【投稿者削除】


305 Re: java 入門書 コメント数:  2件
  (ぱ)   | PXU00211@nifty.ne.jp 2002/03/02 (土) 02:18
 http://member.nifty.ne.jp/maebashi/
> javaを知らずに、前橋さんの「Java謎+落とし穴徹底解明」
> を読ませていただきました。

確かにあの本は、あれ一冊では厳しいものがあります。
# どちらにしても、プログラミング言語をそれなりに習得しようと
# 思ったら、本が一冊で済むとは思わないほうが良いと思いますが。

> 参考図書に記載されていた「続 java入門」
> がいいのでしょうか?

少なくともこれはだめです。だめな本というわけではなくて、入門書では
ありません。「続」の付かない「Java言語入門」はかつては評判が良かった
ですが、日本語版は確かJDK1.0.2までしかないので完全にobsoleteです。

私は入門書には詳しくないのですが、

http://pc.2ch.net/test/read.cgi/tech/1010312992/4

で、上の方に挙がっている本などはどうなんでしょうか(って、ここに振るか)。
Core Javaは良いと思うんですけど、厚いんですよねえ...
Javaチュートリアルの邦訳が出たので、それが良いかとも思うのですが。
# 余談ですけど、私は「鉄則」や「格言」はどうも...
【新規投稿】 【この投稿にリプライ】 【投稿者削除】


304 java 入門書 コメント数:  3件
  osi 2002/03/01 (金) 09:50
はじめまして、osiと申します。

javaを知らずに、前橋さんの「Java謎+落とし穴徹底解明」
を読ませていただきました。

そこで、javaを基本から勉強してみようと思っているのですが、
お勧めの入門書はありますでしょうか?

参考図書に記載されていた「続 java入門」
がいいのでしょうか?

【新規投稿】 【この投稿にリプライ】 【投稿者削除】


303 Re: critical session ? コメント数:  0件
  (ぱ)   | PXU00211@nifty.ne.jp 2002/02/27 (水) 01:30
 http://member.nifty.ne.jp/maebashi/
> 『Java謎+落とし穴徹底解明』の256ページに
> "クリティカルセッション(critical session)"と書かれていますが、
> "クリティカルセクション(critical section)"が正しいのでは?

そうですね。Sunの文書で、たとえばJava tutorialを見ても、
critical section になっています。

http://java.sun.com/docs/books/tutorial/essential/threads/multithreaded.html

もう正直に告白してしまいますが、私はごく最近まで、これは
cirtical session だと思い込んでいました。

ちょっと前、某掲示板で「クリティカルセクション」と書いてあるのに
気付いてGoogleしてみたら、「critical section」の方がヒット数が
多い。

実は「クリティカルセッション」がこの意味で使われているページも
結構あったりしますが、今回改めて確認したところ、やはりどう見ても
critical sectionが正解ですね。

正誤表に入れておきます。

まったく、思い込みというのは恐ろしいものです。ご指摘ありがとう
ございました。

http://www.google.co.jp/search?q=%95%B5%88%F6%8BC&;hl=ja&lr=

を笑えませんね。
【新規投稿】 【この投稿にリプライ】 【投稿者削除】


302 critical session ? コメント数:  1件
  tatsu-o 2002/02/25 (月) 18:52
『Java謎+落とし穴徹底解明』の256ページに
"クリティカルセッション(critical session)"と書かれていますが、
"クリティカルセクション(critical section)"が正しいのでは?
【新規投稿】 【この投稿にリプライ】 【投稿者削除】


301 Re^8: ポインタと配列について コメント数:  0件
  (ぱ)   | PXU00211@nifty.ne.jp 2002/02/23 (土) 14:21
 http://member.nifty.ne.jp/maebashi/
> > ANSI-Cの元の章番号の振り方とJISの振り方は異なります。
> > ISOの振り方とJISの振り方は同じです。
>
> 「元の」と書いてあるのでこの文章は正しいと思いますが、
> ISOの規格が決まった時点でANSIもISOに合わせたことをちゃんと書いておかないと誤解をまねくと思います。

はい、それに気付いて途中で「元の」を追加したんですけど、
確かに誤解を招きますね (^^;
【新規投稿】 【この投稿にリプライ】 【投稿者削除】

Copyright(C) 1999 NIFTY Corporation
All Rights Reserved.