K.Maebashi's BBS

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

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

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

[1831] makeできない
投稿者:daiki
2012/09/26 18:11:43

windows7にてcrowbarをmakeしようとすると、 cd ./memory; gmake 指定されたパスが見つかりません。 gmake: *** [memory/mem.o] Error 1 とでてmakeできません。 gccやmingwも同じバージョンのものを使いました。 回答よろしくお願いします。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1830] 掲示板作成に取り掛かり中
投稿者:タカ
2012/09/04 19:02:20

一からはじめるとなかなか手間取りますね…
[この投稿を含むスレッドを表示] [この投稿を削除]
[1829] Re:C++のメモリ管理
投稿者:南山まさかず
2012/07/24 17:46:23

>ただ、文脈上ここは、「Diksamにファイナライザを付けなかった理由」です。  もうちょっと深く読み込むべきでした。ご返信ありがとうございます。 >ヒープに確保したオブジェクトの >deleteのめんどくささを考えるとついつい  C/C++のメモリ管理は確かに面倒くさいですね。僕はもっぱらboost::shared_ptrを使って ますが……。  現在、貴書を参考にプログラミング言語を作成中です。その課程で少し気になったので書 き込みをさせていただいた次第です。  ご返信ありがとうございました
[この投稿を含むスレッドを表示] [この投稿を削除]
[1828] Re:C++のメモリ管理
投稿者:(ぱ)こと管理人
2012/07/24 02:42:22

> 303ページに「オブジェクトの寿命をプログラマが完全に制御しなければならないC++」 >とありますが。 「プログラミング言語を作る」のp.303ですね。 > C++はコンストラクタ、デストラクタによるリソース管理を行っており、 >原則オブジェクトの寿命はそのスコープ内です。 はい(まあ、どこまでのオブジェクトをスタック上に取るかという問題はありますが)。 > そのため、この記述はC++にとっては特殊な状況を除いて正しくない、という >ことにはならないでしょうか ただ、文脈上ここは、「Diksamにファイナライザを付けなかった理由」です。 C++の場合、デストラクタが動くタイミングは、スタックに取ったオブジェクトなら ブロックを抜けるときですし、ヒープに取ったオブジェクトならdeleteする時です。 よって、デストラクタが動くタイミングはプログラマが完全に予期できるので、 C++ではデストラクタは有用なのだけれど、Diksamではタイミングが予期できないので 役に立たない、ということを書いています。 そういう意味だと「オブジェクトの寿命をプログラマが完全に制御できるC++」と いう言い方の方が適切だったかもしれませんが、ヒープに確保したオブジェクトの deleteのめんどくささを考えるとついつい「オブジェクトの寿命をプログラマが 完全に制御しなければならないC++」と書きたくなってしまう……という感情が 私の中にあったかもしれません。 間違いとは思いませんが、C++好きな方からするとカチンとくるかもしれませんね。 失礼しました。 ご意見ありがとうございました。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1827] C++のメモリ管理
投稿者:南山まさかず
2012/07/23 18:12:07

 303ページに「オブジェクトの寿命をプログラマが完全に制御しなければならないC++」とありますが。  C++はコンストラクタ、デストラクタによるリソース管理を行っており、原則オブジェクトの寿命はそのスコープ内です。  そのため、この記述はC++にとっては特殊な状況を除いて正しくない、ということにはならないでしょうか
[この投稿を含むスレッドを表示] [この投稿を削除]
[1823] Re:標準ライブラリのヘッダファイルのインクルードガード
投稿者:yuya
2012/04/03 07:57:41

>まあ、誰もが規格票を参照できるわけではないですし、ここを読む別の人の >参考になればよいのではないでしょうか。 >今回も774RRさんのおかげでいろいろ話題が広がりましたし。 ありがとうございます。 どうもJISのサイトでスンナリ閲覧できないことが多くて、表示できても操作しにくいし(愚痴) あのビジネスモデルだけはホンマに……(愚痴)
[この投稿を含むスレッドを表示] [この投稿を削除]
[1822] Re:標準ライブラリのヘッダファイルのインクルードガード
投稿者:yuya
2012/04/03 07:56:00

>から、現代的「ヘッダで宣言を100%先行させる」プログラミングにおいて >正しく作られたヘッダはガードしなくても良い可能性があります。 ここだけ読んで「インクルードガードでコンパイラを黙らせるくらいなら、ヘッダファイルを正しく書き直そう」ってキャンペーンを張れるかと思いましたが、 そういうわけには行かなそうですね(笑)
[この投稿を含むスレッドを表示] [この投稿を削除]
[1821] Re:標準ライブラリのヘッダファイルのインクルードガード
投稿者:(ぱ)こと管理人
2012/04/03 03:14:03

>すみません、規格票は閲覧できるのだから、調べれば分かる質問をしてちゃいけませんね(反省)。 まあ、誰もが規格票を参照できるわけではないですし、ここを読む別の人の 参考になればよいのではないでしょうか。 今回も774RRさんのおかげでいろいろ話題が広がりましたし。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1820] Re:標準ライブラリのヘッダファイルのインクルードガード
投稿者:774RR
2012/04/02 15:01:47

あとついでに ・先のスレッドで紹介したとおり、関数宣言は(矛盾しない限り)繰り返してよいこと ・同一内容の #define を繰り返すことは認められていること ISO/IEC 14882:1998 16.3 - 3,4 JIS X 3010:2003 6.10.3 ・C++ では typedef の同一内容の繰り返しは認められている (同 7.1.3-2) こと ・C では typedef の同一内容の繰り返しについて記述が無いこと  (未規定なので、処理系は許しても良いしエラーにしても良い) から、現代的「ヘッダで宣言を100%先行させる」プログラミングにおいて 正しく作られたヘッダはガードしなくても良い可能性があります。 typedef の同一内容の繰り返しに関して調査した範囲では ・ Visual C++ 2005 の C コンパイラは無警告で認めています。 ・ GCC 4 の C コンパイラは認めていません。 ・某社の組み込み系コンパイラは認めていません。 (enum/struct 等の繰り返し宣言の認め方については言語仕様書・処理系の挙動とも調べていません) コンパイル時間の短縮のためには「ヘッダの同一内容を複数回 parse しない」よう ガードに類する機構があったほうが望ましいですけどね。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1819] Re:標準ライブラリのヘッダファイルのインクルードガード
投稿者:yuya
2012/04/02 14:21:24

再度ありがとうございます。 考えてみれば、多くの入門書では 分割コンパイルも自分で.h書く局面にも到達しないことが多いから、当然かもしれませんね。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1818] Re:標準ライブラリのヘッダファイルのインクルードガード
投稿者:774RR
2012/04/02 14:05:44

> 意外に少なかったりしません? そんな瑣末なところにページ割くくらいならもっと別なことに使いたい、 んだと思います(俺でもそうします) 入門書では「おまじないとして」 #include <stdio.h> と書くんだよ・・・ と説明しているものが多いような気がします。 (標準)ヘッダとは何か?の解説が必要になるほどの分量が必要なサンプルを作ると 読者がついてこれないでしょう(だからサンプルも hoge.c 1個で完成する程度で) 手前味噌ですが http://kmaebashi.com/bbs/thread.php?boardid=kmaebashibbs&from=1706&range=1 #1712 のような .h と .c の使い分けの認識が必要になる、程度まで来ると それはもう入門レベルではないのかもしれません。 使い分けができるようになって、その先ですからね > 二重 include
[この投稿を含むスレッドを表示] [この投稿を削除]
[1817] Re:標準ライブラリのヘッダファイルのインクルードガード
投稿者:yuya
2012/04/02 10:39:17

774RRさん、ありがとうございます。 面白いですねぇ。実例があれば見てみたい。 ところで入門書に「標準ライブラリは二重インクルードの心配はないよ」って書いてくれてること、 意外に少なかったりしません?(たくさん読んでいるわけではないので分かりませんが)
[この投稿を含むスレッドを表示] [この投稿を削除]
[1816] Re:標準ライブラリのヘッダファイルのインクルードガード
投稿者:774RR
2012/04/02 09:50:55

ついでに C++ の場合 ISO/IEC 14882:1998 17.4.2.1 Headers に同等の文言があります。 もっとついでに C にも C++ にも ・「ヘッダ」は必ずしもソースファイルでなくてよい ・ヘッダの < ... > で囲まれた文字の列がソースファイル名でなくてよい とあります(関連節の脚注など) 処理系は「ヘッダ」(のうちの特に <標準ヘッダ>)の1回目の読み込みに関して ・ソースファイルとして提供してもいい ・プリコンパイル済みバイナリファイルで提供してもいい ・処理系固有のビルトイン機能として実装してもいい ・謎の「ほげほげ機能」の結果として実装してもいい ようです。 2回目以後の読み込みに対しては ・正しく include ガードされているソースファイルとして提供してもいい ・処理系側で2回同じ標準ヘッダを読まない機構を用意してもよい  ・処理系側ビルトイン機構として同一<ヘッダ>を2回読まない機構を用意  ・#pragma once 類似機構を設けて<ヘッダ>側記載で回避 わけです。 なんにせよ [実装手段] は問われていない模様です。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1815] Re:標準ライブラリのヘッダファイルのインクルードガード
投稿者:yuya
2012/03/31 14:26:40

>X 3010:2003 (ISO/IEC 9899:1999)の「7.1.2 標準ヘッダ」から引用します。 >| 標準ヘッダはどのような順序で取り込んでもよい。各ヘッダは与えられた有効範囲内で >| 2回以上取り込んでもよいが,その効果は,<assert.h>の取込みの効果がNDEBUG の >| 定義に依存すること(7.2 参照)を除いて,1 回だけ取り込んだ場合と同じとする。 > >とのことなので、保証されています。(実現手段は問わないのでしょうが) ありがとうございます。 すみません、規格票は閲覧できるのだから、調べれば分かる質問をしてちゃいけませんね(反省)。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1814] Re:標準ライブラリのヘッダファイルのインクルードガード
投稿者:(ぱ)こと管理人
2012/03/31 13:38:26

>標準ライブラリのヘッダファイルにインクルードガードが施されていることって、保証されているものなんでしょうか? X 3010:2003 (ISO/IEC 9899:1999)の「7.1.2 標準ヘッダ」から引用します。 | 標準ヘッダはどのような順序で取り込んでもよい。各ヘッダは与えられた有効範囲内で | 2回以上取り込んでもよいが,その効果は,<assert.h>の取込みの効果がNDEBUG の | 定義に依存すること(7.2 参照)を除いて,1 回だけ取り込んだ場合と同じとする。 とのことなので、保証されています。(実現手段は問わないのでしょうが)
[この投稿を含むスレッドを表示] [この投稿を削除]
[1813] 標準ライブラリのヘッダファイルのインクルードガード
投稿者:yuya
2012/03/30 09:15:50

あの、今更こんなこと恥ずかしくて聞きづらいんですが…… 標準ライブラリのヘッダファイルにインクルードガードが施されていることって、保証されているものなんでしょうか? そうじゃなきゃ使い物にならないことは分かるのですが。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1812] kmaebashi.com停止のお詫び
投稿者:(ぱ)こと管理人
2012/03/29 04:30:54

おそらく3/27~3/28にかけて、本Webサイトkmaebashi.comが停止しておりました。 管理人である私が、忙しさにかまけてレンタルサーバの利用料金の振込みを失念していたのが原因です。3/28に振り込んで復旧していただきました。 利用者の皆様にはご迷惑をおかけしまして申しわけありませんでした。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1811] Re:char hoge = 'A';
投稿者:yuya
2012/03/15 11:52:07

>この書き方とは? getchar()==(unsigned char)('a') っすか? >俺ならここまで厳密に書くことは絶対にしない(お仕事コードでも)と思うですよ。 あわわ、ちゃいますgetchar() == 'a'のほうです、紛らわしい書き方ですいません(^^;) >俺が本を書くとしたら 貴重なご意見ありがとうございます。 原理に深入りするかどうかはともかく、getchar() == 'a' が意図したとおりに動くかどうかは、 基本文字集合以外は保証されない、基本文字集合なら保証される、 ということは伝えるべきなのでしょうねぇ。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1810] Re:char hoge = 'A';
投稿者:774RR
2012/03/14 18:49:51

この書き方とは? getchar()==(unsigned char)('a') っすか? 俺ならここまで厳密に書くことは絶対にしない(お仕事コードでも)と思うですよ。 俺が本を書くとしたら unsigned char の話には触れないです。 EOF は一般の意味での [文字] ではないため int が必要であるとは書きます。 int c=getchar(); switch (c) { case EOF: case 'a': } のように文字コードに関しては単純に 'a' と書くでしょう。んで、脚注にでも (†1) C はもともと英語圏で発展した言語なので、英語のアルファベットにない文字: ドイツ語のウムラウト文字とかエスツェットとか フランス語のアクサングラーブ文字とか 日本語の各種ひらがなカタカナ漢字とか は、C の初期からある標準関数ではうまく扱えないことがある。 たとえばこの例で case 'ア': と書いても動かない処理系のほうが多い。 (†2) そもそも日本語や中国語などの文字は多バイトで表現するので、 取り扱い方法がまったく変更になることが通例である。 とでもしておきますかね。もしかしたら脚注3で (†2) 標準関数で無理なく問題なく扱える文字の集合を基本実行文字集合と呼ぶ。 とするかもしれないです。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1809] Re:char hoge = 'A';
投稿者:yuya
2012/03/14 15:36:23

よく理解できました。 自分がコーディングするときはこの書き方を使い続けることになると思いますが、 初心者に指導する際はどうすればいいんでしょうかねぇ…… 例えば入門書を書く機会があればどうされますか>皆様
[この投稿を含むスレッドを表示] [この投稿を削除]
[1808] Re:char hoge = 'A';
投稿者:774RR
2012/03/14 14:32:29

まあついでに言うと getchar()=='ア' も getchar()=='a' も「本質的には」間違っているわけで。 getchar() は [unsigned char 型として取り込み] [int 型に変換] なので、 返却される文字の値は char 型としての値ではなく unsigned char 型としての値となるため getchar()==(unsigned char)('ア') や getchar()==(unsigned char)('a') としておかないと 言語仕様と不一致になってしまう、と判断すべきでしょう。 これではあまりにもウザイので =='a' のような判断を許すべく 多く使われる基本文字については非負と決めているのだと思われますです。 非負ならば (unsigned char) にキャストしても、しなくても、値が同じなので。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1807] Re:char hoge = 'A';
投稿者:774RR
2012/03/13 12:32:04

処理系依存にならないよう、基本文字は [後半] にできないことになっているようですね。 #1806 基本文字は非負、の文言は C にもありました。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1806] Re:char hoge = 'A';
投稿者:774RR
2012/03/13 10:55:31

>>この「非負の」に相当する文言がCの方にはないように思えるんですよね。 >俺が探した範囲でも無いっすね。 C++ で追記されたと読むべきでしょう。 あった。 JIS X 3010:2003 6.2.5 型 型 char として宣言されたオブジェクトは、実行基本文字集合の任意の要素を格納するのに十分な大きさを持つ。 基本実行文字集合の任意の要素を char 型のオブジェクトに格納した場合、その値は非負であることを保証する。 その他の文字を char 型のオブジェクトに格納した場合、その結果の値は処理系定義とするが、 その型で表現可能な値の範囲に含まれなければならない。 ってことは EBCDIC では char 型の内部表現は unsigned char と同じにならざるを得ないってことか?
[この投稿を含むスレッドを表示] [この投稿を削除]
[1805] Re:char hoge = 'A';
投稿者:yuya
2012/03/13 10:49:35

kitさん、ありがとうございます。 >いや、それは勘違いです。与れますよ。 >ファイルからコード 255 のバイトを getchar() で読むと、-1 ではなく 255 を返しますから。 あちゃ、まだ完全に分かってませんでした。 getc系の関数はストリームから得た文字をunsigned char型の値として解釈して、それをint型に変換するのでした。 つまり、「ア」の文字コードが 0xB1のとき、 文字定数'ア'の値がデフォルトcharによって異なる(signedならint型の-79、unsignedならint型の177になる)のに対し、 getcの戻り値は必ずint型の177になるのですね。 バイナリエディタで0xB1を書き込んだファイルを使って実験すると、 手元のVCでは 'ア' == getc() が偽になります。 はっきり言って「文字定数」と「getc系関数の戻り値」とは、ぜんっぜん違う!ということですね。 どちらも最終的にint型になるが、【値を解釈するときに】デフォルトcharに合わせるか、unsigned char固定か。 あれ?ということは、 int hoge = getchar(); if(hoge == 'a'){ /* ...... */ } のほうが(C++ではなくCでは)処理系依存ということになるのですか? 「a」が「後半の」文字かもしれないことを考えると。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1804] Re:char hoge = 'A';
投稿者:kit
2012/03/12 16:43:58

>>EOFは-1とは限らない(負でさえあればよい)ので回避のしようはありますね。 > >そうですね。 > >手元のVCだと無印charはデフォルトでsigned、EOFの値は-1になっていて、 >回避できるにも関わらず回避していない。 多くのUNIX系プラットフォームでもそうです。 (powerpc なんかは char のデフォルトが unsigned だったような気もしますが) >getchar()などの戻り値をintで受ける理由は言わずと知れたFAQですが、 >上記のような処理系では、せっかくの「文字コードの空間の外でEOFを扱えるように」という恩恵に与れないことになりますよね。 >(というか、そういう処理系がほとんどのような気がします。) いや、それは勘違いです。与れますよ。 ファイルからコード 255 のバイトを getchar() で読むと、-1 ではなく 255 を返しますから。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1802] Re:char hoge = 'A';
投稿者:yuya
2012/03/07 11:33:17

774RRさん、C++の情報ありがとうございます。 私の理解の変遷: 文字定数は本来はchar型だが、汎整数拡張されてint型になると理解していた →プギャー、規格に「int型を持つ」って明記されてるぅ! (汎整数拡張が抑止されるはずのsizeofでもint型のサイズが返ってくる) →じゃあcharに一旦入れちゃったら、表現しきれない値は壊れるかもしれないのか? →「charの符号の扱いに合わせた」int値になるから大丈夫だよん ということですね。 「なんでcharの符号は処理系定義なのにめったに困ることがないのか」という疑問が晴れたように思います。 ヘンにsigned/unsignedを指定して文字コードを扱ってしまった場合にこそバグるんですね。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1801] Re:char hoge = 'A';
投稿者:774RR
2012/03/05 14:51:19

>この「非負の」に相当する文言がCの方にはないように思えるんですよね。 俺が探した範囲でも無いっすね。 C++ で追記されたと読むべきでしょう。 # 最初 [基本] を見落としていて 負数のcharは一切ダメ? と思ったのは内緒。 >しかし、EBCDICのC++処理系があるものかどうか (^^; あって、自由に使ってよければ是非試してみたいところです。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1800] Re:char hoge = 'A';
投稿者:(ぱ)こと管理人
2012/03/04 23:22:39

すみません、この投稿を見落としていました。 >2.2 - 3 基本実行文字集合 >基本実行文字集合において、それぞれの文字は非負の互いに異なる値をもっていなければならない。 この「非負の」に相当する文言がCの方にはないように思えるんですよね。探したのですが。 >char オブジェクトが負の値をもてるか否かは、処理系定義とする >EBCDIC およびその派生な文字セットの場合 'A'=h'C1, '0'=h'F0 なので、 >[基本文字集合は非負の値] からいくと「単なる char は符号なし」しかダメなんだろう。 なのだろうと思います。しかし、EBCDICのC++処理系があるものかどうか (^^;
[この投稿を含むスレッドを表示] [この投稿を削除]
[1799] Re:char hoge = 'A';
投稿者:yuya
2012/02/28 09:49:14

>EOFは-1とは限らない(負でさえあればよい)ので回避のしようはありますね。 そうですね。 手元のVCだと無印charはデフォルトでsigned、EOFの値は-1になっていて、 回避できるにも関わらず回避していない。 getchar()などの戻り値をintで受ける理由は言わずと知れたFAQですが、 上記のような処理系では、せっかくの「文字コードの空間の外でEOFを扱えるように」という恩恵に与れないことになりますよね。 (というか、そういう処理系がほとんどのような気がします。) ただ「0xFFに文字が割り当てられることは滅多にない」という「実情」に依存しているような……。 >(いつものことですが)私も勉強させていただいております。 こちらこそ、いつも本当にありがとうございます。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1798] Re:char hoge = 'A';
投稿者:774RR
2012/02/28 09:42:53

出遅れ気味... C++ の場合は仕様書の文言が若干違うようです。 以下 ISO/IEC 14882:1998 ならびに JIS X3014:2003 から 2.2 - 3 基本実行文字集合 基本実行文字集合において、それぞれの文字は非負の互いに異なる値をもっていなければならない。 実行文字集合は、基本実行文字集合をその部分集合とする集合とする。 実行文字集合における文字の値は、処理系定義とする。 俺:この文言は [基本文字集合は非負の値] [基本でない文字集合は負でもよい] と読むべきなのだろう・・・ 2.13.2 文字リテラル 文字リテラルは型 char をもち、実行文字集合での符号数値に等しい値を持つ。 俺:C の 6.4.4.4 の例のような文言は無いな・・・ 3.9.1 基本型 char として宣言されたオブジェクトの大きさは、処理系定義である実行文字集合のすべての要素を 格納するのに十分なだけ大きくなければならない。 char オブジェクトが負の値をもてるか否かは、処理系定義とする EBCDIC およびその派生な文字セットの場合 'A'=h'C1, '0'=h'F0 なので、 [基本文字集合は非負の値] からいくと「単なる char は符号なし」しかダメなんだろう。 ただ、実処理系で確認しようにもいろいろ微妙かも。 すぐ使える場所に EBCDIC な処理系は無いし printf("%d\n", '\xF0'); とすると [汎整数拡張] 後の int 型の値確認にしかならないし cout << '\xF0'; だと[文字表記]になって[文字の値]ではないし cout << int('\F0'); だと同 int の確認だし
[この投稿を含むスレッドを表示] [この投稿を削除]