[表示 : 全て 最新50 1-99 101- 201- 301- 401- 501- 601- 701- 801- 2chのread.cgiへ]
Update time : 01/02 08:18 / Filesize : 209 KB / Number-of Response : 862
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

C++相談室 part62



1 名前:デフォルトの名無しさん mailto:sage [2008/05/27(火) 23:53:59 ]
C++に関する質問やら話題やらはこちらへどうぞ。
ただし質問の前にはFAQに一通り目を通してください。
IDE (VC++など)などの使い方の質問はその開発環境のスレに
お願いします。

前スレ
C++相談室 part61
pc11.2ch.net/test/read.cgi/tech/1205059063/

2 名前:デフォルトの名無しさん mailto:sage [2008/05/27(火) 23:54:50 ]
■基本■
[C++ FAQ]
 www.parashift.com/c++-faq-lite/
 www.bohyoh.com/CandCPP/FAQ/ (日本語)
  Cとその仕様を比較しながらの解説なので分かりやすい。
  ***** 質問の前に必ずこの二つに目を通してください *****
[C/C++ リファレンス]
 www.cppreference.com/ (英語)
 www.cppll.jp/cppreference/ (↑の日本語訳だけど最新は反映しない)
[禿 Stroustrup]
 public.research.att.com/~bs/
[C++ International Standard]
 www.iso.org/iso/iso_catalogue/catalogue_tc/catalogue_detail.htm?csnumber=38110
[JTC1/SC22/WG21 - C++]
 www.open-std.org/jtc1/sc22/wg21/
  ここから規格の最新(2003より新しい)ドラフトがダウンロードできる。
[JIS X3014]
 www.jisc.go.jp/app/pager?&RKKNP_vJISJISNO=X3014
  ISO規格の日本語訳。JIS X 3014:2003はISO/IEC 14882:2003 (E)に対応。

3 名前:デフォルトの名無しさん mailto:sage [2008/05/27(火) 23:55:14 ]
■Books(Templateまわり)■
Effective STL
 www.amazon.com/exec/obidos/ASIN/0201749629/
 www.amazon.co.jp/exec/obidos/ASIN/4894714108/ (翻訳)
Modern C++ Design
 www.amazon.com/exec/obidos/ASIN/0201704315/
 www.amazon.co.jp/exec/obidos/ASIN/4894714353/ (翻訳)
C++ Templates
 www.amazon.com/exec/obidos/ASIN/0201734842/
C++ Template Metaprogramming
 www.amazon.com/exec/obidos/ASIN/0321227255/

4 名前:デフォルトの名無しさん mailto:sage [2008/05/27(火) 23:55:56 ]
■Libraries■
[Boost]
 Boost www.boost.org/
 (日本語) www.kmonos.net/alang/boost/
 (日本語) shinh.skr.jp/boost/
[標準ライブラリ]
 SGI-STL www.sgi.com/tech/stl/
 STLport stlport.sourceforge.net/
 GNU libstdc++ gcc.gnu.org/libstdc++/
 Apache STDCXX incubator.apache.org/stdcxx/
 STLFilt www.bdsoft.com/tools/stlfilt.html
 (日本語) www005.upp.so-net.ne.jp/episteme/html/stlprog/
 (日本語) www.wakhok.ac.jp/~sumi/stl/
[Loki]
 sourceforge.net/projects/loki-lib/
 LokiPort-MSVC6sp5 fara.cs.uni-potsdam.de/~kaufmann/?page=lokiport

5 名前:デフォルトの名無しさん mailto:sage [2008/05/27(火) 23:56:33 ]
STLつかうと一気に実行ファイルサイズが10倍に?!

環境によるだろ。
俺はBorland-C++5.6.2に -D_RTLDLL オプションを指定して、極力
ランタイムを使用するようにして使っているが、例えばstd::vectorを
使っても使わない時と比べ10Kほどしか増えない

すげえ。ダイナミックリンクしといてファイルサイズが増えないとかいってるよ。この人。

C1010: プリコンパイル済みヘッダーの検索中に予期しない EOF を検出しました。
とかいうエラーが出るんだけどこれってどうすればいいの?

#include <stdafx.h>
後死ね。

言葉が悪いな。それで教えているつもりか。
まぁヒントぐらいにはなったな。
うむごくろう。

6 名前:デフォルトの名無しさん mailto:sage [2008/05/27(火) 23:58:15 ]
前スレ C++相談室 part61
pc11.2ch.net/test/read.cgi/tech/1205059063/

7 名前:デフォルトの名無しさん mailto:sage [2008/05/27(火) 23:58:27 ]
1乙

8 名前:仕様書無しさん mailto:sage [2008/05/28(水) 00:01:06 ]
1乙

9 名前:デフォルトの名無しさん mailto:sage [2008/05/28(水) 00:11:09 ]
・(明示的・暗黙共に)コンストラクタ、デストラクタを定義していないこと
 → 親クラスが無いもしくは親もPOD型であること
 → メンバ変数が全てPOD型であること
 → 仮想関数を持っていないこと
でPOD型になるはず。

unionに突っ込んでコンパイル出来たらOK。

10 名前:デフォルトの名無しさん mailto:sage [2008/05/28(水) 00:13:08 ]
え、コンストラクタ持ってたら POD じゃないのん?マジ?



11 名前:デフォルトの名無しさん mailto:sage [2008/05/28(水) 00:16:29 ]
unionに突っ込んだ時に初期化で困るべ。

12 名前:デフォルトの名無しさん mailto:sage [2008/05/28(水) 00:18:56 ]
なるほど、超納得。

13 名前:デフォルトの名無しさん mailto:sage [2008/05/28(水) 09:16:22 ]
暗黙のコンストラクタってコンパイラが勝手に作るやつ?

14 名前:デフォルトの名無しさん mailto:sage [2008/05/28(水) 09:26:30 ]
>>9
暗黙定義のコンストラクタで POD じゃなくなるなら、 POD struct なんか作れないことになるぜ。

15 名前:デフォルトの名無しさん mailto:sage [2008/05/28(水) 09:37:07 ]
非explicitなコンストラクタのことじゃないの?

16 名前:デフォルトの名無しさん mailto:sage [2008/05/28(水) 12:07:22 ]
>>14
暗黙の空の実装のコンストラクタは、
「コンストラクタが無い状態」というふうに思ってくれ。
分かりやすくかつ適切な言葉が見つからなかったんで。

実際、union内のPOD型は、空のコンストラクタすら
呼ばれている事にはなってないしね。

17 名前:デフォルトの名無しさん mailto:sage [2008/05/28(水) 12:16:53 ]
>>16
それなら条件としては「明示的にコンストラクタ、デストラクタを宣言していない」でいいでしょ。
あーあと、コピー代入演算子も宣言しちゃだめな気がする。

18 名前:デフォルトの名無しさん mailto:sage [2008/05/28(水) 12:20:25 ]
>>17
「明示的」じゃ駄目なんだ。
空ってところが重要だから。

19 名前:デフォルトの名無しさん mailto:sage [2008/05/28(水) 12:24:40 ]
>>18
え? POD の条件にコンストラクタやデストラクタが空かどうかが関係あるの?
宣言した時点でアウトなはずなんだけど。

20 名前:デフォルトの名無しさん mailto:sage [2008/05/28(水) 12:31:15 ]
明示的なコンストラクタが無くても、
暗黙の空でないコンストラクタが作られたら駄目ってこと。



21 名前:デフォルトの名無しさん mailto:sage [2008/05/28(水) 12:41:19 ]
コンストラクタを必要とする(=非PODの)データメンバを持つ、以外に
暗黙のコンストラクタが生成される条件を思いつかないが。

あ、もちろん、仮想関数を持つなら必要だが。

22 名前:デフォルトの名無しさん mailto:sage [2008/05/28(水) 12:43:01 ]
あ、constメンバや参照メンバというのもあるな。
つっても、これは
コンストラクタ(コピーコンストラクタ)や代入演算子が
「暗黙には作られない」だけかもしれないが。

23 名前:デフォルトの名無しさん mailto:sage [2008/05/28(水) 12:47:17 ]
>>21
以外もなにも、それであってるよ。
>>9の矢印部分で書いた、
暗黙の空でないコンストラクタが作られる要因。

24 名前:デフォルトの名無しさん mailto:sage [2008/05/28(水) 12:54:59 ]
仮想継承も?
あんまり使わないけど

25 名前:デフォルトの名無しさん mailto:sage [2008/05/28(水) 12:59:02 ]
>9 がややこしいんだよ。矢印部分3つそろっててもコンストラクタ宣言してたら
POD じゃないし、そもそも「コンストラクタが無い」っていう認識も規格上はそうなって
ないわけで無理が出てくる。

クラス型が POD であるためには以下すべての条件を満たすこと。
・明示的にコンストラクタ、デストラクタ、コピー代入演算子を宣言していないこと
・基底クラスおよび非 static データメンバがあればすべて POD 型であること
・仮想関数を持たないこと
これでいいでしょ。

仮想継承は、インスタンスごとの情報としてポインタメンバいっこと同等に POD として
実装できそうな気がする。

26 名前:デフォルトの名無しさん mailto:sage [2008/05/28(水) 13:01:45 ]
>>24
たしか仮想継承も駄目だったはず。
昼休みオワタので去りまする。

27 名前:25 mailto:sage [2008/05/28(水) 13:04:07 ]
んー前スレ最後に貼ってもらった規格の引用と比べると、 >25 でも微妙な違いがいろいろ
あるなぁ。継承した時点で POD じゃないっぽい。非 static データメンバについては
private/protected もダメ。

やっぱり正確なところは規格を見るのが一番ってことだねぇ。

28 名前:デフォルトの名無しさん mailto:sage [2008/05/28(水) 13:26:01 ]
理解させるために分かりやすく書いた説明と
厳密に伝えるための説明では目的が違うだろ

>>9-12の流れは前者
>>14-15は後者

規格には理由や経緯が書かれてないこともあるしな

要するにD&E最強

29 名前:デフォルトの名無しさん mailto:sage [2008/05/28(水) 21:07:43 ]
>>16
POD 型のデフォルトコンストラクタは0初期化するよ。
ただ、POD 型の変数を宣言しても
そのデフォルトコンストラクタも何も呼ばれない、というだけ。

30 名前:デフォルトの名無しさん mailto:sage [2008/05/28(水) 22:38:46 ]
デフォルトコンストラクタって0クリアしないんじゃないの?



31 名前:デフォルトの名無しさん mailto:sage [2008/05/28(水) 22:48:06 ]
#include <iostream>

struct X { int a, b; X() : a() {} };

int main()
{
X x;
std::cout << x.a << std::endl;
std::cout << x.b << std::endl;
return 0;
}

出力は

0
4262272

32 名前:デフォルトの名無しさん mailto:sage [2008/05/29(木) 00:58:06 ]
>>29 >>31
ビルトイン型のT()は0初期化の別記法なので、
デフォルトコンストラクタとは呼ばない

テンプレートのために、ユーザー定義型のデフォルトコンストラクタと
同じ記法が使えるようにしてあるだけ

[6.2.8]
The value of an explicit use of the constructor for a builtin
type is 0 converted to that type (§4.9.5).
Thus, int() is another way of writing 0.

For a userdefined type T, T() is defined by the default
constructor (§10.4.2), if any.

The use of the constructor notation for builtin
types is particularly important when writing templates.

Then, the programmer does not know whether a template parameter
will refer to a builtin type or a userdefined
type (§16.3.4, §17.4.1.2).

33 名前:デフォルトの名無しさん mailto:sage [2008/05/29(木) 00:59:51 ]
以下のコードなのですが、gcc3.4.4だと
could not convert template argument 'a' to 'void*'

と怒られます。
VC9.0では問題なくコンパイルが通ります。
どちらの動きが正しいのでしょうか?

template<void* T>

class A
{

};



void f(){}



int main(void)

{

A<f> a;


return 0;

}

34 名前:デフォルトの名無しさん mailto:sage [2008/05/29(木) 01:05:16 ]
まず、本やWebサイトでテンプレートの基本を勉強すべき

35 名前:デフォルトの名無しさん mailto:sage [2008/05/29(木) 09:35:47 ]
>>33
関数のアドレスを渡したいなら
template<void(*T)()>
では?

36 名前:デフォルトの名無しさん mailto:sage [2008/05/29(木) 14:48:23 ]
>>33
標準規格では、関数へのポインタから void* への変換は
認められてない筈。
VC は独自にこれを許してるけど。

37 名前:デフォルトの名無しさん mailto:sage [2008/05/29(木) 15:38:09 ]
struct X { int x; };
X func() { return X(); }
と定義したとき、

X().x = 0; は「左のオペランドが、左辺値になっていません」というエラーが出るのに
func().x = 0; がエラーにならないのはなぜですか?

38 名前:デフォルトの名無しさん mailto:sage [2008/05/29(木) 15:58:25 ]
規格でそうなのか、君の処理系特有のことなのか、俺は知らんけど、
とりあえず自分の処理系書いたほうが問題が整理されやすいんじゃないかな。

39 名前:デフォルトの名無しさん mailto:sage [2008/05/29(木) 16:08:01 ]
>>38 すみません。試したのは VC8 のみです。

40 名前:デフォルトの名無しさん mailto:sage [2008/05/29(木) 16:30:09 ]
>>33
関数のアドレスでなく、traitsを受け取るべき。



41 名前:33 mailto:sage [2008/05/30(金) 00:29:37 ]
みなさんありがとう。

42 名前:デフォルトの名無しさん mailto:sage [2008/05/30(金) 04:43:07 ]
>>37
コンパイラは何?
規格ではどちらもOKのはず。

43 名前:デフォルトの名無しさん mailto:sage [2008/05/30(金) 12:46:33 ]
>>42
>>39 でも書きましたが VC8 です。
規格では非左辺値構造体の組み込み型メンバーでも書き込みOKということですか?

44 名前:デフォルトの名無しさん mailto:sage [2008/05/30(金) 13:03:06 ]
一時オブジェクトでも左辺値になれるだろ

45 名前:デフォルトの名無しさん mailto:sage [2008/05/30(金) 13:23:39 ]
>>44
え?一時オブジェクトは右辺値だろ?
一時オブジェクトが左辺値だったら他に何が右辺値になるんだ?

46 名前:デフォルトの名無しさん mailto:sage [2008/05/30(金) 17:41:55 ]
どちらも問題ないでしょ。一時オブジェクトは副作用が完了した時点で無効になるだけだから。
寧ろ、>37の「エラーが出るのに」という根拠を知りたい。

47 名前:デフォルトの名無しさん mailto:sage [2008/05/30(金) 17:43:49 ]
VC9でも>>37と同じエラーが出た。
どうもバグっぽいね

48 名前:デフォルトの名無しさん mailto:sage [2008/05/30(金) 18:51:51 ]
1 + 2 = 0 ができないのは対称性が悪い。

49 名前:デフォルトの名無しさん mailto:sage [2008/05/30(金) 19:03:15 ]
それは違う。

50 名前:デフォルトの名無しさん mailto:sage [2008/05/30(金) 19:15:40 ]
>>37
func().x = 0;がエラーにならないのって、
XがPOD型のときだけっぽい。



51 名前:デフォルトの名無しさん mailto:sage [2008/05/30(金) 19:37:48 ]
・コンストラクタを付けるだけ(PODでなくなる)で、
 func()経由でも出来なくなる。

struct X {
   int x;
   X(){}
};
...
X().x = 0; //エラー:左のオペ(ry
func().x = 0; //エラー:左のオペ(ry

・関数経由だと、どちらでも出来る。

struct X {
   int x;
   X(){}
   int& xref(){return x;}
};
...
X().xref() = 0;
func().xref() = 0;


誰か仕様詳しい人・・・

52 名前:デフォルトの名無しさん mailto:sage [2008/05/30(金) 19:56:00 ]
逆に POD の時にエラーにしてほしい。意味のない操作になるから。

53 名前:デフォルトの名無しさん mailto:sage [2008/05/31(土) 02:12:49 ]
>>33
うちではvc9は重すぎて入れてないので検証できないのだが、
なんでvc9だと通るんだ??

template <void * P>
class A {};
void *f() { return NULL; }
int main() { A<f()> a; return 0; }
だったらわかるけど。

54 名前:デフォルトの名無しさん mailto:sage [2008/05/31(土) 02:13:29 ]
>>36
自己レス。すまん、これか!
ほほぉ。ややこしいねぇ

55 名前:デフォルトの名無しさん mailto:sage [2008/06/01(日) 19:52:42 ]
>>32
>ビルトイン型で明示的に「コンストラクタ」を使って得られる値は
>0 をその型に変換した値になる、
と、「コンストラクタ」と書かれているわけだが。
んで引数なしだから明らかにデフォルトコンストラクタだろ。

56 名前:デフォルトの名無しさん mailto:sage [2008/06/02(月) 21:07:16 ]
初期化が終わっていないオブジェクトへの参照を関数へ渡すのは合法ですか。
その関数の中では、その参照からアドレスを得るか他の参照変数を初期化する操作しかしないとして。

57 名前:デフォルトの名無しさん mailto:sage [2008/06/03(火) 00:09:19 ]
前スレでもその話は出てて、アドレスや参照の保持だけなら問題無いだろう、
って言われてるけど、規格書レベルでの合法かどうかのソースは出てない。
規格書で保証があるなら、俺も知りたい所。

58 名前:デフォルトの名無しさん mailto:sage [2008/06/03(火) 12:49:04 ]
状態によって処理を変えたい時、Stateパターンで実装する方法と、enumとif文を使って実装する方法があると思います。
あとで状態の種類を増やしたくなった時、Stateパターンの方が保守しやすいと思っているのですが、
私が見てきたサンプルコードでは、enumを使っている例が多く感じます。
この2つの実装方法は、どのような事を考えて使い分ければいいのでしょうか?

59 名前:デフォルトの名無しさん mailto:sage [2008/06/03(火) 17:54:50 ]
stateパターンてどんなの?

60 名前:デフォルトの名無しさん mailto:sage [2008/06/03(火) 22:19:05 ]
状態ごとにオブジェクトを作りそれに動作をにまとめ、切り替える。




61 名前:デフォルトの名無しさん mailto:sage [2008/06/03(火) 22:43:31 ]
(1)とりあえずswitch
状態の数少ないし、stateにしてクラス数増えるのもしんどいし
あんまり変更もなさそうだからenumでswitchしちゃえ
増えるようならstateに書き直そう

(2)能力不足
state間で情報を共有する美しい方法が思いつかない
グローバル変数使うとアイツが怒るし・・・
そうだ、enumでswitchしとけば全部同一クラス内だから問題ナシ

62 名前:58 mailto:sage [2008/06/04(水) 12:33:24 ]
>>61
どうもです。
小規模なものならenumで十分ということですか。
state間で情報共有ですが、各stateに親クラスへのポインタを持たせて〜っていう方法では、
getter/setterが増えてしまうのが問題ということでしょうか。

63 名前:デフォルトの名無しさん mailto:sage [2008/06/04(水) 18:20:21 ]
class X { int x; friend class Y; };
class Y { int y; Y(X a) : y(a.x) {} };
のようにメンバ変数の初期化で private にアクセスできるでしょうか?

64 名前:デフォルトの名無しさん mailto:sage [2008/06/04(水) 18:26:49 ]
friend class Y; されてるんだから、YからXの中は丸見えだ。

65 名前:デフォルトの名無しさん mailto:sage [2008/06/04(水) 20:42:00 ]
Wから
xの
Yが丸見えだと?

ごめんなんでもない

66 名前:デフォルトの名無しさん mailto:sage [2008/06/04(水) 21:26:45 ]
また懐かしいネタを・・・w

67 名前:デフォルトの名無しさん [2008/06/05(木) 10:33:50 ]
kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/6797.txt
buffonの針のシミュレーションでπを求めるプログラムなんですけど
Borland C++ Compilerでコンパイルすると
C:\borland\bcc55\src\C++>buffon.exe
Length of needle (0<L<=1): 1
Drop total of needle : 100
Number of hits = 55
Pi = 3.63636
という風にシミュレーション結果が出るんですが、
同じソースをcygwin g++(version4.2.4)でコンパイルすると
$ ./a.exe
Length of needle (<=1): 1
Drop total of needle : 100
Number of hits = 100
Pi = 2
という風におかしなシミュレーション結果になってしまうんですが、何が原因なんでしょうか?

68 名前:デフォルトの名無しさん mailto:sage [2008/06/05(木) 11:26:10 ]
>>67
y座標の乱数生成に問題がある。
rand()関数が返す値の最大値は定数RAND_MAXで判るけど、
これが65536前後しかないコンパイラは多数ある。
その式だとy座標には0か1しか返ってこない。

69 名前:デフォルトの名無しさん mailto:sage [2008/06/05(木) 11:55:10 ]
>>68
アドバイスありがとうございます。
ちゃんと動くようになりました。

70 名前:デフォルトの名無しさん mailto:sage [2008/06/05(木) 19:41:00 ]
クラスのtemplate化を考えています。
それで、templateで指定する型の取りうる範囲
を調べたいのですが、何か良い方法はありませんでしょうか?

template<T>
(略)

public:
int str[Tの取り得る範囲];

内部にこういう変数の宣言に関してもあるので・・・。



71 名前:デフォルトの名無しさん mailto:sage [2008/06/05(木) 19:44:08 ]
可算で上下限のある型なんて限られてるんだから特殊化すればいいだろ。

72 名前:デフォルトの名無しさん mailto:sage [2008/06/05(木) 19:45:13 ]
long longとか指定されたらどうするの?死ぬの?

73 名前:デフォルトの名無しさん mailto:sage [2008/06/05(木) 20:05:30 ]
std::numeric_limitsのmin(), max()

74 名前:デフォルトの名無しさん mailto:sage [2008/06/05(木) 20:18:10 ]
禿も禿本で言ってるな
numeric_limitsの特殊化も提供しろって

75 名前:デフォルトの名無しさん mailto:sage [2008/06/06(金) 15:56:46 ]
MinGWとVC++との連携を考えてて
下記みたいなソースを考えた。

GeoOpen関数へ引数無しだとちゃんとreturnされてくるんだが、
引数を作るとエラーが起こっちゃうんだよ。
printfはちゃんとされてるからまさにreturnでエラーが起こってる様子。
ちなみにエラー文はコレ↓
「The value of ESP was not properly saved across a funciton call.
This is usually a result of calling a function declared with one calling convention with a function pointer declared with a different calling convention.」

なんぞこれーー
コンパイラが違うから起こってるエラーなのか。。。

■MinGW側cpp(DLL作成側)
extern "C" __declspec(dllexport) int __stdcall GeoOpen(int inta) {
printf("%u", inta);
return 1;
}

■VC++側cpp(DLL読み込み側)
GEOOPEN geoOpen = (GEOOPEN)GetProcAddress(hGEOCODERDLL, "GeoOpen@4");
if (geoOpen != NULL){
int intRes = (*geoOpen)(testInt);
}

76 名前:デフォルトの名無しさん [2008/06/06(金) 15:58:29 ]
ちなみにVC++のヴァージョンは6.0

もしかしてスレチなのかな。

77 名前:デフォルトの名無しさん [2008/06/06(金) 16:00:59 ]
しまった記述し忘れ。
■VC++側cpp(DLL読み込み側)
testInt = 1;

78 名前:デフォルトの名無しさん mailto:sage [2008/06/06(金) 16:05:27 ]
GEOOPENの定義は?

79 名前:デフォルトの名無しさん mailto:sage [2008/06/06(金) 16:07:09 ]
C++にはDLLなんて概念ないしスレ違いだが
まあ呼び出し規約が一致してないんじゃないかなあ。

80 名前:デフォルトの名無しさん mailto:sage [2008/06/06(金) 16:07:44 ]
GEOOPENのtypedeで__stdcallを忘れているんじゃない



81 名前:デフォルトの名無しさん [2008/06/06(金) 16:13:25 ]
>>78
typedef int (* GEOOPEN)(int);
です。

>>79
やはりスレチでしたか。
失礼を。

82 名前:デフォルトの名無しさん mailto:sage [2008/06/06(金) 16:16:12 ]
>>80
ぐほー!

正にその通りでしたっ
ありがとうございます!

83 名前:デフォルトの名無しさん [2008/06/07(土) 05:17:16 ]
templateの型を強引にunsigned形式にキャストしたいんですが
どうやれば良いのでしょうか?
(unsigned T)num;
はエラーになってしまうので・・・。


84 名前:デフォルトの名無しさん mailto:sage [2008/06/07(土) 05:32:20 ]
Boostのmake_unsignedを使う。
あるいは自分で同等のメタ関数を書く。

85 名前:デフォルトの名無しさん mailto:sage [2008/06/07(土) 05:43:10 ]
質問です
ゲームを作るときに速度や位置といったよく変更するものは一箇所のヘッダーにまとめたほうがいいのでしょうか
それとも、その値を使うヘッダーごとに分けたほうがいいのでしょうか

前者だと、変更するたびにコンパイルの時間が長くなるし、
後者だと、書いてるヘッダーを探す手間が増えるというように、
長所と短所があるのでアドバイスをお願いします

86 名前:デフォルトの名無しさん mailto:sage [2008/06/07(土) 06:19:35 ]
>>73
固定配列のサイズ指定でmax() の戻り値使うと、可変長配列にならね?
C99なら問題無いけど、C++だと規格上不正のような気がする。

とはいえGCC4は通っちゃったので俺が間違ってるのか

>>70
boost使えるのならこういうのがあるYo
boost::integer_traits<T>::const_max

87 名前:デフォルトの名無しさん mailto:sage [2008/06/07(土) 10:03:09 ]
>>85
定義ファイルから読み込む

88 名前:83 mailto:sage [2008/06/07(土) 12:18:14 ]
>>84
レスありがとうございます。
boostは環境で使えないので
メタ関数を書いたのですが・・・

template <typename T>
struct add_unsigned
{
typedef unsigned T type;
};

で、エラーが出ます。
unsignedではなくconstなどでは問題なくコンパイル通るのですが・・・


89 名前:83 mailto:sage [2008/06/07(土) 12:24:42 ]
力ずくですが
template <class T> struct add_unsigned{ typedef T type; };
template <> struct add_unsigned<char>{ typedef unsigned char type; };
template <> struct add_unsigned<wchar_t>{ typedef unsigned int type; };
template <> struct add_unsigned<int>{ typedef unsigned int type; };

こんな感じで解決する事にしました。
どうもありがとうございました。

90 名前:85 mailto:sage [2008/06/07(土) 15:55:13 ]
>>87
定義ファイルだとユーザが変更出来るという点が気になって使ってなかったんですが、
気にしなくていいのでしょうか
それとも配布前にコードに埋め込んで配布という形を取るのでしょうか



91 名前:デフォルトの名無しさん mailto:sage [2008/06/07(土) 16:54:34 ]
>>85
ヘッダで宣言してソースで定義すればいいんじゃないの?

92 名前:デフォルトの名無しさん mailto:sage [2008/06/07(土) 17:50:01 ]
>>90
コードに埋め込めばユーザーが変更できないとでも?


93 名前:デフォルトの名無しさん mailto:sage [2008/06/07(土) 18:03:16 ]
>>91
俺もそれ思ったけど、
定数自体よく増えそうじゃね?

その場合、定数取得用の関数に文字列渡して
ソースの方でマッピングするくらいしか無いと思う。

マクロ使って、開発中は関数+文字列渡しで、
リリース時は本当の定数にするのも手だけど、
うまいマクロ書けずに諦めた。

94 名前:デフォルトの名無しさん mailto:sage [2008/06/07(土) 18:29:25 ]
潤沢なCPU資源のある今の時代、別に毎回文字列をmapから探しても大して問題はないと思うな。
適当なテキストファイルにa=bの形式でひたすら列挙したものを読み込むクラスとか、そんなに手間でないし便利だから作っておくといいんじゃね?
俺は保存とかコメント付けもしたいからxml使ってるが。


95 名前:デフォルトの名無しさん mailto:sage [2008/06/07(土) 18:42:44 ]
おれは>>91の方法だな
>>93は同じような文字列(宣言と定義)を2箇所に書くのがいやだとかそういう話?

96 名前:デフォルトの名無しさん mailto:sage [2008/06/07(土) 21:21:47 ]
>>95
じゃなくて、値だけがよく変わるならそれ(cppの書き換えだけ)で良いけど、
定数が増える場合は宣言も当然追加しないといけないので、
ヘッダ書き換える事になって、
結局includeしてる全cppがコンパイルし直しになるな、と。

まぁ、>>85が定数増やすこと有るかどうか分からないけどね。

97 名前:デフォルトの名無しさん mailto:sage [2008/06/07(土) 21:25:14 ]
ヘッダ一つに定数一個だけ宣言して
定数使うソースは使う定数の分だけヘッダをインクルードすればいいんじゃね?

98 名前:デフォルトの名無しさん mailto:sage [2008/06/07(土) 22:40:18 ]
BCC 5.5.1であるテンプレートクラスの変数をメンバに持つクラスがいて、このクラスのヘッダの段階では
テンプレート引数にくるクラスが前方宣言されただけの時コンパイラに未定義の構造体と警告されてしまいます。
でもcppの方で実際の定義が分かるので、一応コンパイルは通ってるみたいなんですが、
コンパイラを黙らせるにはどのように書くのが良いのでしょうか?

ヘッダ
class hoge;
class piyo{
  sokuseki_ptr<hoge> hoggee;
};

ソース
struct hoge{ 〜 }
(hoggeeの使用)

99 名前:デフォルトの名無しさん [2008/06/07(土) 23:27:42 ]
C++でDLL作成に挑戦しています

公開するAPI関数の定義(XXX.h)を extern "C" {} ブロックで囲っているのですが、
関数の本体(XXX.cpp)も同じように extern "C" {} ブロックで囲う必要があるのか分かりません
もちろんインターネットで検索をかけていますが、今のところ有用な情報がないです

両方とも囲う必要があるのか教えてください

100 名前:デフォルトの名無しさん mailto:sage [2008/06/07(土) 23:36:28 ]
>>99
試してみれば?




101 名前:デフォルトの名無しさん mailto:sage [2008/06/07(土) 23:45:59 ]
>>100
コンパイルは通りました
defファイルも作成できました

しかし、これで正しいのかが分からないのです

102 名前:デフォルトの名無しさん mailto:sage [2008/06/07(土) 23:48:23 ]
>>98
BCB2007の付属品のBCC5.9.3では何のエラーも警告も出ない。
5.5.1のバグというか癖では?

103 名前:デフォルトの名無しさん mailto:sage [2008/06/08(日) 00:08:39 ]

ソート済みのvectorに対してupper_boundで取得してきたイテレータから
そもvectorにおけるインデックス番号はどうやれば取得できるでしょうか?

104 名前:デフォルトの名無しさん mailto:sage [2008/06/08(日) 00:11:18 ]
std::distance()

105 名前:デフォルトの名無しさん mailto:sage [2008/06/08(日) 00:24:29 ]
>>99
名前マングルか名前マングリングでググれ。

106 名前:デフォルトの名無しさん mailto:sage [2008/06/08(日) 01:22:37 ]
>>104
ほんとだ。ありがとうございます!

107 名前:デフォルトの名無しさん mailto:sage [2008/06/08(日) 01:33:02 ]
>>105
いくつか有用な情報が得られました
ありがとうございました

108 名前:デフォルトの名無しさん [2008/06/08(日) 02:07:53 ]
質問です。
VC++2008を使用しているのですが
STLのvectorのsize()って、メソッドが呼ばれたらその都度数えているのでしょうか?
それとも、内部に、数量を管理する変数があって、その値を返しているのでしょうか?


109 名前:デフォルトの名無しさん mailto:sage [2008/06/08(日) 02:11:13 ]
実装次第。
VC6 の STL なんかは begin と end のポインタを保持していてその差を返してるが、
全ての STL でそういう実装になっているとは限らない。

110 名前:デフォルトの名無しさん mailto:sage [2008/06/08(日) 02:11:44 ]
普通はその都度数えます
とはいっても引き算1回
意味的には
vector<T> v;
v.end() - v.begin()
と同じ



111 名前:デフォルトの名無しさん mailto:sage [2008/06/08(日) 02:17:45 ]
数えるにしても、少なくとも O(1) の数え方ではある。
strlen みたいな O(N) の数え方はしていないな。

112 名前:デフォルトの名無しさん mailto:sage [2008/06/08(日) 03:00:16 ]
リストと違って定数時間が保証されてる

113 名前:デフォルトの名無しさん mailto:sage [2008/06/08(日) 03:25:40 ]
spliceとどっちを優先するかだね。

114 名前:108 mailto:sage [2008/06/08(日) 06:23:00 ]
レスどうもありがとうございます。
それほど遅くはならない仕様なんですね。

今使ってるプログラムは
配列を使ってmalloc()で逐次拡張していくプログラムなんですが
これをvectorに置き換えたんですが、なんか100倍近く遅くなってるんですよね。
基本的に、配列と同じく[]しか使わなかったし
mallocで1つずつ拡張してた場所をresizeやらpush_backに置き換えただけなのに・・・。

元が1時間くらい回しっぱなしのプログラムなので、vectorに置き換えたら10時間くらいかかるようになってしまった・・・。

115 名前:デフォルトの名無しさん mailto:sage [2008/06/08(日) 07:52:43 ]
>>114
vectorは一般的に[]は速く、resizeやpushu_backは遅い。reservを調べよ。


116 名前:デフォルトの名無しさん mailto:sage [2008/06/08(日) 08:28:37 ]
FreeBSD7.0のgcc4.2.1では
vectorは1つの連続したメモリで管理しています。
resize()、push_back()は内部の配列のメモリは大体二倍ずつ増えるようになっています。
resize()は縮小しても内部のメモリを再割り当てしない様になっています。
STLのソースを読むのが早いのではないですか?


117 名前:デフォルトの名無しさん mailto:sage [2008/06/08(日) 08:59:30 ]
vector<A> v;
void f(vector<A> v);
f(v);
とかやってるんではないですか?
void g(vector<A>& v);
ではなく。

118 名前:85 mailto:sage [2008/06/08(日) 09:00:57 ]
>>91-97
アドバイスを参考に色々考えた結果、ヘッダで宣言して定義をソースに書き、
設定する値は、デバック時はINIファイルやXMLファイルから読み込み、
配布時は埋め込んだコードを使うということにします。

アドバイスありがとうございました。

119 名前:デフォルトの名無しさん mailto:sage [2008/06/08(日) 10:17:40 ]
>>114
VC++2008のSTLはセキュリティのために色々やっていて遅い。
#define _SECURE_SCL=0を書いてからヘッダをインクルードすると
それがなくなってだいぶ速くなる。

120 名前:デフォルトの名無しさん mailto:sage [2008/06/08(日) 10:41:43 ]
>>119
そんなうえーんな事って他のコンパイラにもありうる?
例えば2005とか



121 名前:デフォルトの名無しさん mailto:sage [2008/06/08(日) 11:42:21 ]
むしろ2005からそうなった。

122 名前:デフォルトの名無しさん mailto:sage [2008/06/08(日) 12:13:34 ]
>>115
typo ひどすぎw

123 名前:デフォルトの名無しさん mailto:sage [2008/06/08(日) 14:54:03 ]
typoはコンパイラが教えてくれるから兵器だもん!

124 名前:デフォルトの名無しさん [2008/06/08(日) 15:03:54 ]
defalt:

125 名前:デフォルトの名無しさん mailto:sage [2008/06/08(日) 17:34:26 ]
カタカナでdefaultとか書こうとすると、typoで酷いことになるよね

126 名前:デフォルトの名無しさん mailto:sage [2008/06/08(日) 17:43:43 ]
defualt:とtypoしてラベルと見なされた事がある

127 名前:デフォルトの名無しさん mailto:sage [2008/06/08(日) 17:47:00 ]
>>120
セキュリティとはどんなセキュリティで
なにをしているんですか?

128 名前:デフォルトの名無しさん mailto:sage [2008/06/08(日) 18:27:56 ]
std::vector<int> hoge;
int* p = &hoge[0]; // NOT SECURE!!!

っていう

129 名前:デフォルトの名無しさん mailto:sage [2008/06/08(日) 18:31:09 ]
>>119
それわざわざヘッダに書かずコンパイラオプションでいいよな
ポータブルなC/C++コードをコンパイルしたいときは
その手の呪文をやたらと唱える必要あるよね、VC++8以降だと

130 名前:デフォルトの名無しさん mailto:sage [2008/06/08(日) 18:33:15 ]
>>127
operator []やイテレータでの範囲チェック。

ナントカ_sって関数に変えないCと違って、
何もしなくていいというのはC++さすがというべきところだけど、
どうしてもお節介という感じは否めない。



131 名前:デフォルトの名無しさん mailto:sage [2008/06/08(日) 19:11:08 ]
速度を落としてでも安全方向に振るっていうのは、C++の理念に反発してる。
そんなのはC#でやればいい話だ。

132 名前:デフォルトの名無しさん mailto:sage [2008/06/08(日) 19:19:52 ]
いつからお前の思想がC++の理念になったんだよ。

133 名前:デフォルトの名無しさん mailto:sage [2008/06/08(日) 19:28:20 ]
C++自体はオーバーヘッドは抱え込まない。
オーバーヘッドのある冗長なチェックをどこまで行うかは、ライブラリの実装しだいで使用者の自由ってことかな。



134 名前:デフォルトの名無しさん mailto:sage [2008/06/08(日) 19:38:38 ]
単なるデータ構造使いたい場合でも、
class使っちゃったら、コンストラクタが呼ばれてオーバーヘッドが起きたりとか・・・
工夫すりゃ回避できるけど、言語自体は"デフォルト"では、オーバーヘッドだらけでしょ。

135 名前:デフォルトの名無しさん mailto:sage [2008/06/08(日) 19:43:07 ]
>>134
コンストラクタが呼ばれてオーバーヘッド?
どんな場合の話だ?

136 名前:デフォルトの名無しさん mailto:sage [2008/06/08(日) 19:43:20 ]
プログラミング言語C++とC++の設計と進化をよむと
実効速度を重視して言語を設計してますよね。

137 名前:デフォルトの名無しさん mailto:sage [2008/06/08(日) 19:46:30 ]
>>134
>class使っちゃったら、コンストラクタが呼ばれてオーバーヘッドが
いいえ

>言語自体は"デフォルト"では、オーバーヘッドだらけでしょ。
いいえ

D&EのC++言語の設計ルールの章に書かれてるけど、
C++には「ゼロオーバーヘッドルール」というのがありまして。

138 名前:デフォルトの名無しさん mailto:sage [2008/06/08(日) 20:24:49 ]
オーバーヘッドをコントロールできるかどうかが問題だと思う

139 名前:デフォルトの名無しさん mailto:sage [2008/06/08(日) 20:56:29 ]
理想論でゼロオーバーヘッド言ってても
実際問題、速度差が出てるんだから、言い訳出来まい。

140 名前:デフォルトの名無しさん mailto:sage [2008/06/08(日) 20:58:08 ]
仕方ねーだろコードの肥大でCPUキャッシュからは溢れるし
仮想関数だって投機実行が効かないんだから



141 名前:デフォルトの名無しさん mailto:sage [2008/06/08(日) 20:59:53 ]
インライン展開するからコードの肥大化は関係なし


理想論だけどね ;-)

142 名前:デフォルトの名無しさん mailto:sage [2008/06/08(日) 21:08:26 ]
インライン展開するから肥大化すんだろ

143 名前:デフォルトの名無しさん mailto:sage [2008/06/08(日) 21:13:07 ]
Cでもコンストラクタや仮想関数と同じようなことをしようとすれば同じだけ時間がかかる。

144 名前:デフォルトの名無しさん mailto:sage [2008/06/08(日) 21:14:33 ]
C++はCのつもりで書けばCと同じ速度で動くんだよね。
ただ、速度を犠牲にして抽象化したくなる誘惑が多いということで。

145 名前:デフォルトの名無しさん mailto:sage [2008/06/08(日) 21:21:11 ]
わずかなパフォーマンスと引き換えに、抽象化をしてメンテナンスに有利なコードを書くのか。
それともメンテナンスを犠牲にしてベタコードでパフォーマンスを追及するかの選択は使用者が選べるのが利点だわな。

146 名前:デフォルトの名無しさん mailto:sage [2008/06/08(日) 21:34:03 ]
C++のfstream.writeはどうして第一引数がconst void*ではなくchar*なのですか?

147 名前:デフォルトの名無しさん mailto:sage [2008/06/08(日) 21:40:17 ]
理由は知らないけど、現実にvoid*してもキャストが減るわけでもないし、テンプレート書くときvoidの引数があるといろいろエラーが出るしメリットないもんな

148 名前:デフォルトの名無しさん mailto:sage [2008/06/08(日) 21:58:28 ]
basic_fstream<char>だからcharしか受け取らんという意図なんだろうけど、
バイナリ指向なwrite関数はvoid*が使いやすいよな。

149 名前:デフォルトの名無しさん mailto:sage [2008/06/08(日) 21:59:08 ]
というかなんでconstが無いのかと

150 名前:デフォルトの名無しさん mailto:sage [2008/06/08(日) 22:04:59 ]
charの配列しか動作は保証されないんじゃない?



151 名前:デフォルトの名無しさん mailto:sage [2008/06/08(日) 22:09:55 ]
え?constはあるだろ、流石に

152 名前:デフォルトの名無しさん mailto:sage [2008/06/08(日) 22:12:39 ]
>>149
実は俺も「マジで?」って思ってググッたw
大丈夫const付いてる。146が省略しただけ。

153 名前:デフォルトの名無しさん mailto:sage [2008/06/08(日) 22:22:34 ]
個人的にはmemcpyのsrcにconstが付いてて欲しい。

154 名前:デフォルトの名無しさん mailto:sage [2008/06/08(日) 22:33:58 ]
>>153
それもconstついているぞ。

155 名前:デフォルトの名無しさん mailto:sage [2008/06/08(日) 22:35:51 ]
じゃ、じゃあmainの第二引数にconstが付いて欲しい!

156 名前:デフォルトの名無しさん mailto:sage [2008/06/08(日) 22:39:31 ]
class A :public const B も許して欲しい。


157 名前:デフォルトの名無しさん mailto:sage [2008/06/08(日) 22:42:33 ]
むしろclass要らなくね?
structだけで良いよ。

158 名前:デフォルトの名無しさん mailto:sage [2008/06/08(日) 22:59:10 ]
>>157
classとstructの違いが分からないとは

159 名前:デフォルトの名無しさん mailto:sage [2008/06/08(日) 23:05:22 ]
template<struct T> asdf{ typedef T type };

typename asdf<int>::type;

160 名前:デフォルトの名無しさん mailto:sage [2008/06/08(日) 23:26:55 ]
>>158
分かった上で言ってるんだけど。
class無いと出来ないことってあったっけ?



161 名前:デフォルトの名無しさん [2008/06/08(日) 23:32:05 ]
template<typename T> asdf{ typedef T type };
いらねーな、やっぱw

162 名前:デフォルトの名無しさん mailto:sage [2008/06/08(日) 23:33:01 ]
>>148
basic_fstream<wchar_t> のことを考えると
已む無しなんだろうなあと思う。

163 名前:デフォルトの名無しさん mailto:sage [2008/06/09(月) 00:22:27 ]
>>160
こんなのとか

template <template <typename T> class U>

164 名前:デフォルトの名無しさん mailto:sage [2008/06/09(月) 00:25:05 ]
template <template <typename T> typename U>

もういっその事
template <(template <typename T>) typename U >
にしちゃえば良かったのに

165 名前:デフォルトの名無しさん mailto:sage [2008/06/09(月) 00:33:24 ]
template <typename T> class U { };
をそのまま突っ込む形(現状)がベストだと思うけど。

166 名前:デフォルトの名無しさん mailto:sage [2008/06/09(月) 00:38:57 ]
template <template <typename T> class U>
がよくて
template <template <typename T> typename U>
template <template <typename T> struct U>
がダメな理由がわからん。


167 名前:デフォルトの名無しさん mailto:sage [2008/06/09(月) 00:39:49 ]
たしかに本質的にはclassは無くてもいいが、構文上は必要だな
ただ、元からclassが無ければ↓という構文になっていただろうけどな
template <template <typename T> struct U>

まぁ、あの偉大な禿も万能なわけじゃないからな

168 名前:デフォルトの名無しさん mailto:sage [2008/06/09(月) 00:41:49 ]
class でも struct でも OK にして、
それなら typename も OK でいいだろって感じにして・・・
って感じに C++0x でなったりするのかな。

169 名前:デフォルトの名無しさん mailto:sage [2008/06/09(月) 00:55:47 ]
classの方が打ちやすいYo

むしろstructを非推奨に


ところで何で、びよよん先生を禿っていうの?
ハゲてるから?ハゲだから?


170 名前:デフォルトの名無しさん mailto:sage [2008/06/09(月) 01:06:07 ]
英語ネイティブな人間にはclassという単語がしっくり来るからでしょ
C++の誕生当時はオブジェクト指向は一般的じゃなかったから
言語側がユーザーを啓蒙する必要があったんだと思う



171 名前:デフォルトの名無しさん mailto:sage [2008/06/09(月) 01:36:18 ]
classっていうと階級が最初に出てくるんじゃないかな
階級闘争でいうところの階級な
中産階級とか、総中流意識とか
ブルーカラー、ホワイトカラーとか
そういうイメージ


嘘だけど

172 名前:デフォルトの名無しさん mailto:sage [2008/06/09(月) 08:52:46 ]
classって1年2組のことでしょ

173 名前:デフォルトの名無しさん mailto:sage [2008/06/09(月) 19:20:37 ]
classはsimulaから来たのでしたよね?

174 名前:デフォルトの名無しさん mailto:sage [2008/06/09(月) 19:58:32 ]
1993に恋をして君に夢中なんでしたよね

175 名前:デフォルトの名無しさん mailto:sage [2008/06/09(月) 21:06:43 ]
後ろ後ろ!

176 名前:デフォルトの名無しさん mailto:sage [2008/06/10(火) 14:37:26 ]
パーマン乙

177 名前:デフォルトの名無しさん mailto:sage [2008/06/10(火) 18:25:19 ]
std::basic_fstream<unsigned char> は使っても問題ないでしょうか?

178 名前:デフォルトの名無しさん mailto:sage [2008/06/10(火) 22:36:39 ]
>>177
見慣れないうえにあんまり意味無いと思うからお勧めはしない。

179 名前:デフォルトの名無しさん mailto:sage [2008/06/10(火) 23:31:49 ]
char_traits が定義されてないとダメなんじゃないかな。

180 名前:デフォルトの名無しさん mailto:sage [2008/06/11(水) 01:13:48 ]
std::basic_fstreamがstd::iostreamみたいにC++に規格として盛り込まれているのか、
あるいは処理系に依存するのかをききたいんじゃね



181 名前:デフォルトの名無しさん mailto:sage [2008/06/11(水) 01:15:29 ]
>>179 なるほど
それでは std::char_traits 相当の UcharTraits を定義して
std::basic_fstream<unsigned char, UcharTraits>
とすると使えるでしょうか?

182 名前:デフォルトの名無しさん mailto:sage [2008/06/11(水) 01:16:29 ]
理論上は使えるんじゃないかな? 多分。

183 名前:デフォルトの名無しさん mailto:sage [2008/06/11(水) 01:41:47 ]
>>180
やりたいことは
put( unsigned char ) と write( const unsigned char*, streamsize )
を使ってバイナリデータをファイルに書き込むことです。
このとき1バイトは0から255を表現できないといけないので最低 unsigned char の型が必要です。
型が char の場合、どの処理系でも使える範囲は0から127までなので目的を果たせません。

184 名前:デフォルトの名無しさん mailto:sage [2008/06/11(水) 01:54:15 ]
>>183
バイナリデータとしてみると算術型は違ってもビットパターンを変更しないキャストは実質的に同じデータを指す。
writeはchar*を引数に取るけど、そのポインタがintであれwchar_tであれエンディアンとサイズが正常であれば問題ない。
つまり任意のデータのポインタをchar*として見ることは、その先にあるデータをビットパターンを変更せずにキャストする事に相当する。

185 名前:デフォルトの名無しさん mailto:sage [2008/06/11(水) 02:01:01 ]
>>184
キャストとはちょっと違う。 char* はオブジェクトの内部表現となる
メモリの読み出し〜書き込みに使えることになっている。これは
unsigned char も signed char も同じ。

ってことで、バイナリ出入力したいだけなら普通の fstream で十分。

186 名前:デフォルトの名無しさん mailto:sage [2008/06/11(水) 02:15:47 ]
ios::binary を指定しておけば
fstream で何の問題も無くバイナリの入出力ができる。

187 名前:デフォルトの名無しさん mailto:sage [2008/06/11(水) 13:00:02 ]
>>185
それは仕様書で言えばどのあたりで分かるでしょうか?
JIS X 3010-1993 は6章ぐらいまで目を通したのですが見当たりませんでした。

188 名前:デフォルトの名無しさん mailto:sage [2008/06/11(水) 16:23:35 ]
エンディアンについても実装がバラバラなのが許容されるのにオブジェクトの内部表現って言及されてるの?

189 名前:デフォルトの名無しさん mailto:sage [2008/06/11(水) 16:39:28 ]
>>187
185じゃないけど、
ISO/IEC 9899 [6.5.3.4] でどう?
sizeof(char)==1の保証 → 単位粒度で扱えることの保証。

190 名前:デフォルトの名無しさん mailto:sage [2008/06/11(水) 16:56:05 ]
これかな

3.9 Types
2 For any object (other than a base-class subobject) of trivial type T, whether or not the object holds a valid value of type
T, the underlying bytes (1.7) making up the object can be copied into an array of char or unsigned char.36) If the
content of the array of char or unsigned char is copied back into the object, the object shall subsequently hold its
original value.

36)By using, for example, the library functions (17.4.1.2) std::memcpy or std::memmove.



191 名前:デフォルトの名無しさん mailto:sage [2008/06/11(水) 17:14:51 ]
>>724
ID出る板限定+多少巻き添え有りで良ければ、
NGワードのIDの欄に「O」を加えると消せる。

192 名前:デフォルトの名無しさん mailto:sage [2008/06/11(水) 17:17:35 ]
もちろん誤爆

193 名前:デフォルトの名無しさん mailto:sage [2008/06/11(水) 17:24:40 ]
そんなあなたに性器表現

194 名前:デフォルトの名無しさん mailto:sage [2008/06/11(水) 18:24:26 ]
VBでビルドすると100KBくらいだったプログラムを
ほとんど同じ構成(コード)でC++に移植したらサイズが900KBまでふくらみました
これって正常ですか?

VS2008、C++ 非MFCのアプリケーションです

195 名前:デフォルトの名無しさん mailto:sage [2008/06/11(水) 18:28:09 ]
ヒント: VBランタイムのサイズ

196 名前:デフォルトの名無しさん mailto:sage [2008/06/11(水) 18:32:28 ]
デバッグビルドしてるっていうオチでは?

197 名前:デフォルトの名無しさん mailto:sage [2008/06/11(水) 18:39:43 ]
>>195
C++はランタイムライブラリが大きいということですか?


>>196
いえ、リリース用のビルドでそのサイズです
最適化オプションも分かる範囲で変更してみましたが あまり変化なしでした

198 名前:デフォルトの名無しさん mailto:sage [2008/06/11(水) 18:43:50 ]
>>197
VBはランタイムDLLが別だからその分を考慮しろ。

199 名前:デフォルトの名無しさん mailto:sage [2008/06/11(水) 18:44:49 ]
VBランタイムのサイズをご存知ないのか
www.microsoft.com/downloads/details.aspx?displaylang=ja&FamilyID=7B9BA261-7A9C-43E7-9117-F673077FFB3C
>ダウンロード サイズ : 1.0 MB
>Visual Basic 6.0 を使用して作成されたあらゆるアプリケーションは、これらのファイルを必要とします。

200 名前:デフォルトの名無しさん mailto:sage [2008/06/11(水) 18:48:10 ]
>>198-199
>>194のはVS2008のVBですが
それもDLLが別ということですよね?



201 名前:デフォルトの名無しさん mailto:sage [2008/06/11(水) 18:48:24 ]
現実にはそれで足りないプログラムが多数。

202 名前:デフォルトの名無しさん mailto:sage [2008/06/11(水) 18:50:36 ]
>>200
VB 2008のランタイムたる.NET Frameworkは数百MBある。

あと、一応聞いておくが、C++製はCLRフォームアプリケーションじゃないほうだよね?

203 名前:デフォルトの名無しさん mailto:sage [2008/06/11(水) 18:52:49 ]
>>202
>C++製はCLRフォームアプリケーションじゃないほうだよね?
それです

204 名前:デフォルトの名無しさん mailto:sage [2008/06/11(水) 20:28:33 ]
>>190
なかなかいい情報ありがとう。
でもここでいっているコピーって memcpy() や memmove() を想定しているような気がする。
普通に char, unsingned char ポインタ経由で代入した場合も同じことが言えるのかな?

205 名前:デフォルトの名無しさん mailto:sage [2008/06/11(水) 21:48:42 ]
クリティカルセクションについて質問です。

クリティカルセクション用のクラスを作成しています。
外部からCRITICAL_SECTION構造体を渡さなくても済むように、
staticなメンバ変数としてCRITICAL_SECTIONオブジェクトを作成し、
それに対してInitializeやEnter、Leave、Deleteを行うようにしています。

しかし、ネット上で似たようなコード見つけられていないことから、
本当にこれでスレッドセーフが実現できているのか不安です。

何か問題はありそうでしょうか?

206 名前:デフォルトの名無しさん mailto:sage [2008/06/11(水) 22:46:43 ]
>>205
それだとお互いに無関係なクリティカルセクション同士でも排他してしまうな。
というか、二重にInitializeとかDeleteとかしてしまうのでアウト。
CRITICAL_SECTION構造体は非staticなメンバ変数にすればよろし。

207 名前:デフォルトの名無しさん mailto:sage [2008/06/11(水) 23:11:40 ]
>>206
なるほど、考えが足らなかったです。
ありがとうございます。

208 名前:デフォルトの名無しさん mailto:sage [2008/06/12(木) 00:14:55 ]
こういう時って、コンストラクタでInitialize、デストラクタでDeleteするのが
いいんだっけ?

209 名前:デフォルトの名無しさん mailto:sage [2008/06/12(木) 00:27:16 ]
もう1つ、コンストラクタでEnterしてデストラクタでLeaveするクラスも欲しい。
いかにもWinSTLが持っていそうだ。

210 名前:デフォルトの名無しさん mailto:sage [2008/06/12(木) 00:37:07 ]
boostも持ってるな



211 名前:デフォルトの名無しさん mailto:sage [2008/06/12(木) 02:49:00 ]
>>204
190 は明らかに char や unsigned char の配列として(ポインタ経由で)読み書きした
場合のことを想定した記述だろ。


ほかには 3.10 p15 にある aliasing rule でも char, unsigned char だけ、
そういう直接アクセスを許すように特別扱いされてたりすることから、任意のオブジェクトに
対する char, unsigned char 経由でのアクセスは規格の意図として想定されているものと
考えられる。

よく見ると signed char はダメみたい。微妙だなー。

212 名前:デフォルトの名無しさん [2008/06/12(木) 12:08:09 ]
charがsignedならどうなるの?

213 名前:デフォルトの名無しさん mailto:sage [2008/06/12(木) 12:14:00 ]
char と signed char と unsigned char はそれぞれ別の型
char が符号付きでも符号無しでも signed char とは関係ない

214 名前:デフォルトの名無しさん mailto:sage [2008/06/12(木) 12:33:31 ]
VBでは下記のように宣言して 違うクラスからでも sub.関数() が使用出来ていたのですが
c++で同じ構成の共通関数を作ろうとしても参照エラーが出てうまくいきません
下記のコードをc++用にした場合 クラス、関数はそれぞれ
どのように宣言するのが正しいでしょうか?

Public Class main

    Sub ボタンクリック イベント
         sub.関数()  '違うクラスの共通メソッド呼び出し
    End Sub

End Class

Public Class sub

  Public Shared Sub 関数()
  End Sub

End Class

215 名前:デフォルトの名無しさん mailto:sage [2008/06/12(木) 12:43:19 ]
>>214
C++のソース貼らないと答えようがない。

216 名前:デフォルトの名無しさん mailto:sage [2008/06/12(木) 12:44:18 ]
class main {
public:
 void button_click_event();
};

class sub {
public:
 static void kansu();
};

void main::button_click_event()
{
 sub::kansu();
}

void sub::kansu()
{
}

たぶんこんな感じ?

217 名前:デフォルトの名無しさん mailto:sage [2008/06/12(木) 13:10:00 ]
>>215
namespace test {//Namespace

public ref class Form1 : public System::Windows::Forms::Form{//Class Form

private: System::Void code_Click(System::Object^  sender, System::EventArgs^  e) {//イベント
sub::kansu(); //共通関数 呼び出し
}//イベント

};//Class Form


class Sub{//Class Sub
public :
void kansu();
};//Class Sub

void Sub::kansu(){// 共通関数
};//共通関数

}//Namespace

こんな感じです、共通関数を違うClassのForm1から呼びだして使いたいのですが
識別子が見つからない等のエラーが出てうまくいきません

>>216
そのコードのように修正してみましたが
クラス、識別子が見つからないという同じエラーが出てだめでした

218 名前:デフォルトの名無しさん mailto:sage [2008/06/12(木) 13:22:02 ]
・void kansu() に static を付ける
・sub::kansu() の呼び出しは sub の定義よりも下で行う
・class Sub と sub::kansu で sub の大文字と小文字が異なる

219 名前:デフォルトの名無しさん mailto:sage [2008/06/12(木) 13:25:47 ]
あと
・エラーメッセージは一字一句正確に書け

220 名前:デフォルトの名無しさん mailto:sage [2008/06/12(木) 13:29:36 ]
>>218
うまく動きました、みなさんどうもありがとうございます

>・class Sub と sub::kansu で sub の大文字と小文字が異なる
コードではちゃんとなっているのですが
ここに書くときに記述ミスしていました、申し訳ないです



221 名前:デフォルトの名無しさん mailto:sage [2008/06/12(木) 18:17:23 ]
>>211
3.9 p2 は
「そのオブジェクトを構成するバイトは、char または unsigned char の配列にコピーできる」に対して
「例えば、ライブラリ関数 std::memcpy または std::memmove を使って」という注釈があるけど
char 配列の要素ごとの代入でコピーできるなら「std::memcpy や std::memmove も含まれる」のような
ニュアンスで注釈を付けるんじゃないかな?

それと 3.9 p2 はあるオブジェクトを char 配列にコピーして、その配列から元のオブジェクトにコピー
したときにオブジェクトが元の内容に戻ることを保障しているだけで、同型の他のオブジェクトに対しては
どうなるか分からないんじゃない?
3.9 p3 では char 配列を通さずに std::memcpy でコピーすればオブジェクトが同じ内容になるようです。

3.10 p15 は未定義ではないだけで結果は処理系定義ということもありえるんじゃない?


222 名前:デフォルトの名無しさん mailto:sage [2008/06/13(金) 07:57:56 ]
>>221
> char 配列の要素ごとの代入でコピーできるなら「std::memcpy や std::memmove も含まれる」のような
> ニュアンスで注釈を付けるんじゃないかな?
"for example" って書いてあるんだから、そういうことだと思うよ。


1.7, 1.8 より、 POD 型のオブジェクトはメモリ上で連続する
バイト列とされている。

3.9.1 p1 により、 char, unsigned char はバイト中のすべての
ビットが値に反映されることになっているので、これらの型を介して
バイトを正確にコピーできる。

memcpy などの動作は引数の指すメモリ上の位置から連続する
バイト列に対する操作として定義されているので、 char* を使って
同様にバイト列をコピーするコードを書けば同じ意味になる。

そのような操作に対する意味が 3.9 p2, 3.9 p3 の範囲で確定する。
これ以外のバイト操作( POD 型のオブジェクトに属さないバイトの
操作や、オブジェクトひとつに満たない部分的な操作)については
意味も動作も規定はない。(不定?)

223 名前:デフォルトの名無しさん mailto:sage [2008/06/13(金) 08:14:03 ]
違うフォーム上のテキストボックス等のデータを取得するにはどうすればいいですか?

224 名前:デフォルトの名無しさん mailto:sage [2008/06/13(金) 08:21:14 ]
C++にフォームなんて概念ありません

225 名前:デフォルトの名無しさん mailto:sage [2008/06/13(金) 10:20:30 ]
>>223
初心者スレ、もしくはMFC, WTL, C++/CLIなどで該当するスレへ。
開発環境は必ず書くこと。

226 名前:デフォルトの名無しさん mailto:sage [2008/06/13(金) 11:52:30 ]
array<String>型の2次元配列 data[40][40] を作りたいのですが
array<String^> ^data = gcnew array<String^> (40)(40);
とするとエラーが出ます

どうやって宣言したらいいですか?

227 名前:「CLI」で探せ mailto:sage [2008/06/13(金) 12:04:18 ]
>>226
そんな気持ちの悪い記法は専用スレへどうぞ。

228 名前:デフォルトの名無しさん mailto:sage [2008/06/13(金) 12:23:01 ]
>>226
CLIはC++じゃないのですれ違い。

229 名前:デフォルトの名無しさん mailto:sage [2008/06/13(金) 13:51:26 ]
>>228
じゃ CLIなC++は何言語なんだよ?w
バカかお前ww

230 名前:デフォルトの名無しさん mailto:sage [2008/06/13(金) 13:55:45 ]
C++/CLI



231 名前:デフォルトの名無しさん [2008/06/13(金) 14:00:53 ]
A.hで中身まで記述した
static void Func()
{
 ・・・
};

を B.cpp、C.cppそれぞれでインクルードすると実体はそれぞれにできるんでしょうか?

232 名前:デフォルトの名無しさん mailto:sage [2008/06/13(金) 14:02:42 ]
>>229
>227

233 名前:デフォルトの名無しさん mailto:sage [2008/06/13(金) 14:03:33 ]
>>229
C++/CLIはC++を拡張した別の言語としてEcmaで標準化されてるよ。

234 名前:デフォルトの名無しさん mailto:sage [2008/06/13(金) 14:03:59 ]
>>231
はい。但し、そのFunc()を例えばB.cppでは使いC.cppでは使わなかったとすると、一つだけになるかもしれません。
# 勿論、どちらでも使わない場合は一つもないかもしれないわけで。

235 名前:デフォルトの名無しさん mailto:sage [2008/06/13(金) 14:05:25 ]
まぁそれをやるならせめて無名名前空間をつかってほしいところ

236 名前:デフォルトの名無しさん mailto:sage [2008/06/13(金) 14:13:59 ]
>>234
うわぁぁ。そうなんだ。
staticつければ必ずひとつになると思っていました。ありがとう。
こういう場合ひとつだけにするにはテンプレートにするしかないのかな。
ヘッダに記述すること自体の是非は別として。


237 名前:デフォルトの名無しさん mailto:sage [2008/06/13(金) 14:19:46 ]
>>236
いや、テンプレートにするかしないかとstaticかどうかは別の問題だから。
つーか、>231の場合でもどうせインライン展開されるから消えてなくなると思うし、
テンプレート関数にしたところでインライン展開されなければ複数できてもおかしくはない。

で、一つにしたい積極的な理由があるの?

238 名前:デフォルトの名無しさん mailto:sage [2008/06/13(金) 14:42:06 ]
いろいろ言われそうだけどVCのプリコンパイル済みヘッダーの#include <stdafx.h>
が嫌だからなんです・・。
いろいろなコンパイラで使えればな〜と思っていたらどうしてもこれが邪魔で。
プリコンパイル済みヘッダーの設定変えればいいのでしょうけど、ファイルをコピー、
includeですぐに使えるような書き方はないかな〜と。


239 名前:デフォルトの名無しさん mailto:sage [2008/06/13(金) 14:50:41 ]
あ、見当違いなこと書いてたかも。
上記理由でどうせ同じ関数なんだからひとつにしてファイルサイズ減らせないかなと
思っていた次第です。

240 名前:デフォルトの名無しさん mailto:sage [2008/06/13(金) 14:52:05 ]
>>239
理由がそれだけなら、最適化するとどうせインライン展開されて消えてなくなるから気にするな。



241 名前:デフォルトの名無しさん mailto:sage [2008/06/13(金) 15:27:25 ]
というか、あちこちに同じ中身が生成されるわけだから
ファイルサイズは逆に増えるよね。

242 名前:デフォルトの名無しさん mailto:sage [2008/06/13(金) 15:33:47 ]
う〜ん、いろいろありがとう。
とりあえず最適化に任せてみます。

243 名前:デフォルトの名無しさん mailto:sage [2008/06/13(金) 16:11:17 ]
===foo.h===
#include "bar.h"
class foo
{
(略)// barは出てこない
};

===foo.cxx===
#include "foo.h"
(略)// barが出てくる

とやるのと、
#include "bar.h"
をfoo.cxxの中に持ってくるのは、
どちらにどういうメリットデメリットがあるのでしょうか。
また、一般的にはどちらの書き方が推奨されますか。

244 名前:デフォルトの名無しさん mailto:sage [2008/06/13(金) 16:13:13 ]
CLIって便利だよな
特に他言語で作ったクラスライブラリがそのまま使えるお得感は感動ものだ

245 名前:デフォルトの名無しさん mailto:sage [2008/06/13(金) 16:17:15 ]
>>243
ヒント:依存関係、カプセル化

246 名前:デフォルトの名無しさん mailto:sage [2008/06/13(金) 17:46:14 ]
>>243
後者。素直に使う所に書く、で必要十分。
前者にメリットは無い。fooを使うやつのコンパイルがbar.hの分遅くなるだけ。

247 名前:デフォルトの名無しさん mailto:sage [2008/06/13(金) 18:14:43 ]
次のプログラムをエラー無くコンパイルしたいのですが、方法を教えてください。
//データの構造体-----------
struct dataA
{
int m_dataA;
CLSA * m_next //クラスのポインター
};
//使用するクラス------------
class CLSA
{
dataA m_dat[100];   //データの配列
};
dataAの中にクラスのポインターを持つ。この状態ではCLSAが無いと言われます。
順番を変えるとクラスの中でdataA構造体が無いと言われます。
対処方法が無いでしょうか?


248 名前:デフォルトの名無しさん mailto:sage [2008/06/13(金) 18:16:41 ]
セミコロン抜けてた
CLSA * m_next; //クラスのポインター

249 名前:デフォルトの名無しさん mailto:sage [2008/06/13(金) 18:32:36 ]
>>247
struct dataAの上に 「class CLSA;」を書く。

あと、どうでもいいけど何かよく分からないデータ構造だな。
dataA{ CLSA* m_parent; } とか
dataA{ dataA* m_next; } とか
CLSA{ CLSA* m_next; } なら分かるけど。

250 名前:デフォルトの名無しさん mailto:sage [2008/06/13(金) 20:00:26 ]
出来ましたありがとうございます。基本的な内容ですねorz
データ構造は
root クラスインスタンス
|
|-ノード1クラスインスタンス
| : |-ノード1クラスインスタンス
| : |-ノード1クラスインスタンス
| :
|-ノード1クラスインスタンス

のような多段構造のようなもので、ノード分岐の意味をdataAの内部で示しています。
意味自体が単独で作られたり渡されたりするので、1つの構造体にしています。



251 名前:デフォルトの名無しさん mailto:sage [2008/06/13(金) 20:08:54 ]
>>244
そのままシームレスに使えればだがな。

だが現実は・・・・ ハァー

252 名前:デフォルトの名無しさん mailto:sage [2008/06/13(金) 22:04:32 ]
>>222
3.9.1 p1 は「バイト中のすべてのビットが値に反映される」とはいっても、ビット列と値が
1 対 1 でないこともあるんじゃないかな。
例えば char が符号付きで符号ビットと絶対値で表現する場合、値 0 を表現するビット列が
2 パターンある。その処理系で char* を通して値 0 を読み、その値を char* を通して書く
とビット列が変わる可能性があるんじゃないかな?

253 名前:デフォルトの名無しさん mailto:sage [2008/06/14(土) 00:03:39 ]
char型のコピーはbit列をそのままコピーすると言っているのでは

254 名前:デフォルトの名無しさん mailto:sage [2008/06/14(土) 04:05:09 ]
>>252
現行の規格で多少無理やり解釈すれば、 -0 と +0 は == で比較すれば
同じになるとしても、区別可能な(異なる value representation を持つ)二つの値
ということでコピーでビット列が変わる可能性は無い、とは言えそう。

ちょっと苦しいんで調べてみたところ、 C との互換性と合わせて見直しが
提案されているみたい。
www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2631.html
この中で C99 の規格を基本的にはそのままパクりながら、 C99 では
保証が無いものの、 C++ で半ば慣習的に行われてきた char による
object representation のコピーを保証するため、以下のような記述の追加が
見られる。

The types unsigned char and char may be used for “bitwise” copy.
[Note: this means that if signed char has a negative zero which is
either a trapping value, or will be forced to positive zero on assignment,
plain char must be unsigned. ?end note]

てきとう訳:
型 unsigned char と char は「ビット的」コピーに使ってもよい。
[注: これは、もし signed char が負のゼロをトラップ値として持つか
代入において正のゼロに強制されるのであれば、ただの char は
unsigned でなければならない、ということを意味する。 -注ここまで]

提案とは別に、議論の中では C++ では2の補数を強制してしまうような話も
出ていたらしい。実際のところはそれでもいいのかもしれない。

255 名前:デフォルトの名無しさん mailto:sage [2008/06/14(土) 13:48:22 ]
以下のような二種類の構造体のフィールドなのですが、
どちらがより適切なのでしょうか?

struct A
{
int length; // textの長さ
unsigned char text[0]; // 利用者側で好きに領域を確保して先頭を格納。
};

struct B
{
int length;
unsigned char text[1];
};

違いはtext[1]とtext[0]だけなのですが、
text[1]としてしまうと、

unsigned char text[] = "aiueo";
A* a = (A*)malloc(sizeof(A) + strlen(text));

としたときに(処理系依存ですが)
intで4バイト、unsigned charがパディングされて4バイト
さらに文字列の長さで5バイト確保されます。
これだとunsigned charがパディングされた4バイトは無駄な領域の気がします。

text[1]とするメリットはあるのでしょうか?


256 名前:デフォルトの名無しさん mailto:sage [2008/06/14(土) 14:12:25 ]
>>255
宣言より大きい配列のアクセスはお勧めできないと思う。
環境依存なしでそういう構造を作りたいなら
struct A
{
int length; // textの長さ
};
A* a = (A*)malloc(sizeof(A) + strlen(text));
で確保して
char* buff=(char*)(a+1);
で文字列にアクセス


文字列の構造体を作りたいなら以下の方がお勧めかな
struct A
{
int length; // textの長さ
unsigned char* text;
};

257 名前:デフォルトの名無しさん mailto:sage [2008/06/14(土) 14:24:31 ]
>>255
unsigned char text[0]; はC89では認められていない。
C99から導入されたflexible array memberを使うなら、
unsigned char text[];

258 名前:デフォルトの名無しさん mailto:sage [2008/06/14(土) 14:58:10 ]
>>254
なるほど。
今回初めてC++の仕様書に目を通してみたけど未定義や処理系定義の部分が多くて
正確に解釈するのははなかなか難しいですね。
現状の処理系に合わせて処理系定義の部分を削っていけばかなりシンプルになると
思いますけど。

259 名前:デフォルトの名無しさん mailto:sage [2008/06/14(土) 15:18:36 ]
>>258
処理系を前提とした入門書を読もう。 処理系未定義はその後で。

260 名前:255 mailto:sage [2008/06/14(土) 19:20:57 ]
>>256さんどうもありがとうございます。

struct A{
int a;
unsigned char c[0];
};

gcc -c -pedantic test.c
としたら警告が出ました。

警告: ISO C forbids zero-size array 'b'

gccの独自拡張で可能になっているけれどC89自体では禁止されている
ということですね。



261 名前:デフォルトの名無しさん mailto:sage [2008/06/14(土) 20:30:10 ]
おい、お前ら、googleでソースコードの検索ができることを知ってましたか?
www.google.co.jp/codesearch

262 名前:デフォルトの名無しさん mailto:sage [2008/06/14(土) 20:31:46 ]
お前が今まで知らなかったことに驚愕。

263 名前:デフォルトの名無しさん mailto:sage [2008/06/14(土) 20:32:49 ]
どういうときにつかうん

264 名前:デフォルトの名無しさん mailto:sage [2008/06/14(土) 20:34:41 ]
codeをsearchする時

265 名前:デフォルトの名無しさん mailto:sage [2008/06/14(土) 20:54:24 ]
>>261-264自演乙

266 名前:デフォルトの名無しさん [2008/06/14(土) 20:56:31 ]
>>265
自演じゃねーよ、タコが

267 名前:デフォルトの名無しさん mailto:sage [2008/06/14(土) 20:58:47 ]
>>266
イカですけど何か?

268 名前:デフォルトの名無しさん [2008/06/14(土) 20:59:26 ]
>>267
創価、すまんかった

269 名前:デフォルトの名無しさん mailto:sage [2008/06/14(土) 23:11:26 ]
# include<iostream>

using namespace std;
void func(int a = 0,long int b = 1000, double c = 2.9751)
{
cout<<"This is func[i].\n";
cout<<"a="<<a<<", b="<<b<<", c="<<c<<"\n\n";
}

void func(int a,double b =3.4152)
{
cout<<"This is func[ii].\n";
cout<<"a="<<a<<", b="<<b<<"\n\n";
}

void func(long int a)
{
cout<<"This is func[iii].\n";
cout<<"a="<<a<<"\n\n";
}


int main(void)
{
func(0,1000,2.9751);
func(0,3.14152);
func(0);
return 0;
}
オーバーロード関数が呼び出せませんと言うエラーが出るのですが、
何処が間違えているかわかりませんか?
未熟な私に教えていただけたらありがたいです。

270 名前:デフォルトの名無しさん mailto:sage [2008/06/14(土) 23:16:36 ]
そんな
かわいそうな
つかいかたを
するな



271 名前:デフォルトの名無しさん mailto:sage [2008/06/14(土) 23:22:17 ]
>>269
どれを呼んでいいのかワカンネ。とコンパイラ様は仰っておられる


272 名前:デフォルトの名無しさん mailto:sage [2008/06/14(土) 23:23:24 ]
>>269
とりあえず、2個目と3個目のfuncを関数ごと
コメントアウトして実行してみ。

273 名前:デフォルトの名無しさん mailto:sage [2008/06/15(日) 02:27:52 ]
もう引数全部意図する型にキャストしちゃえよ

274 名前:デフォルトの名無しさん mailto:sage [2008/06/15(日) 02:40:25 ]
既定引数と多重定義は「まぜるな危険」だろ。
危険といっても、だいたいコンパイルエラーか警告だけど。

必要なら既定引数を使わないで多重定義をがんばることもやる。
といってもこういうのはありにしているが。
void f(int x);
void f(double x);
void f(int x, int y, int z = 0);
//実引数1個なら多重定義の解決の候補に既定引数は関係しない。
//実引数2個ならデフォルト引数を使うがfの候補は1つに決まっているので良し。

275 名前:デフォルトの名無しさん mailto:sage [2008/06/15(日) 03:02:24 ]
fcloseの定義はどこにあるのでしょうか?
glibc-2.7のソースの中には無いようなのですが…

276 名前:デフォルトの名無しさん mailto:sage [2008/06/15(日) 03:07:07 ]
libio/stdio.h

277 名前:275 mailto:sage [2008/06/15(日) 03:16:44 ]
>>276
ありがとうございます!
あった!なるほど#defineされてたわけですね。
#define fclose(fp) _IO_new_fclose(fp)

で、_IO_new_fcloseをたどっていくと
最終的に__closeという関数が呼ばれているようなのですが、
今度こそ定義がglibcにはありませんでした。
ここから先はどうやって追えばよいのやら…

278 名前:デフォルトの名無しさん mailto:sage [2008/06/15(日) 03:17:10 ]
>>275
マクロになってるとかじゃないの?

279 名前:275 mailto:sage [2008/06/15(日) 03:22:33 ]
すみません__closeありました。
sysdeps/march/hurd/close.c
にありました。

実は、fcloseするときにバッファをディスクに同期する
部分がどうなってるのかを追いたかったのですが、
__closeから先はどうやら単にクローズしているだけのようです。
追いなおします。

280 名前:デフォルトの名無しさん mailto:sage [2008/06/15(日) 03:25:42 ]
>>277
それはシステムコールじゃないかね。
そうだと、カーネルのソースを見る必要がある。




281 名前:277 [2008/06/15(日) 13:41:18 ]
>>280
ありがとうございます。
Linuxのソースを見てみました。

linux/include/asm-i386/unistd.h
の中に

#define __NR_close 6

というのがあって、

linux/arch/i386/kernel/syscall_tables.S
の中のテーブルの6番の位置は

sys_close

となっていたので、sys_closeで探すと

linux/fs/open.c
の中にあって、その中で呼んでいる
filp_close
の中でflushとかやっていました。

ただ、__closeから__NR_closeのつながりがわかりませんでした。
これをどこかで#defineされているものなのでしょうか。

282 名前:デフォルトの名無しさん mailto:sage [2008/06/15(日) 13:58:38 ]
C++のスレで話すような話題か、っつーのは置いといて...
今時のOSだと、ユーザアプリがファイルをcloseした
からといって、いちいちディスクに同期は取らんと思うけど。

libcのfclose()は、fflush()を呼ぶなりして、少なくとも
ユーザアプリ(というかlibc)が握ってるデータがkernel側に渡るようにはする。
が、kernel側がダーティページをどう処理するかは、バッファキャッシュ管理の
問題になるんでは。

ぶっちゃけsyncとかがあるのはそのためでしょ。

283 名前:デフォルトの名無しさん mailto:sage [2008/06/15(日) 22:44:48 ]
class A { A(); ~A(); A(const A&); void operator=(const A&); friend class X; };
class X { class Impl; Impl* impl_; };

ユーザから見て A オブジェクトの生成と消去を X からしかできないようにしたいけど
impl_ の中で A を何らかのコンテナで管理するとき、そのコンテナは A と friend で
はないので A のコンストラクタとデストラクタを呼び出せません。A の中に実装のため
のクラスを friend として並べたくないし、実装の変更のたびに変更したくありません。

何か簡単に解決する方法はあるでしょうか?


284 名前:デフォルトの名無しさん mailto:sage [2008/06/15(日) 23:10:00 ]
>>283
class A を class X か class X::Impl の private メンバにする。

285 名前:デフォルトの名無しさん mailto:sage [2008/06/16(月) 00:39:28 ]
>>284
もちろんユーザは A の public メンバにアクセスできることが前提です。

286 名前:デフォルトの名無しさん mailto:sage [2008/06/16(月) 00:57:47 ]
>>285
A を抽象インターフェースにして実体を >284

287 名前:デフォルトの名無しさん mailto:sage [2008/06/16(月) 01:12:34 ]
template hackerさん。ヘルプミー。

template < class _T >
class C
 {
  public:
   template < class _Ta >
   void X();
 };

template < class _T >
void F()
{
C< int > obj1;
obj1.X<int>();

C< _T > obj2;
obj2.X<_T>();
}

288 名前:デフォルトの名無しさん mailto:sage [2008/06/16(月) 01:13:57 ]
めっちゃ途中で書き込んだ。さーせん。
その上のコードの、obj2.X<_T>();がコンパイルエラーで通りません。
何ででしょうか
代替案とかあるでしょうか

289 名前:デフォルトの名無しさん mailto:sage [2008/06/16(月) 01:21:27 ]
環境とエラーメッセージくらい書こうぜ

290 名前:デフォルトの名無しさん mailto:sage [2008/06/16(月) 01:29:17 ]
ったりめーだろ
class _Tの実体がない



291 名前:デフォルトの名無しさん mailto:sage [2008/06/16(月) 01:29:37 ]
じゃなかったclass _Tの定義がない

292 名前:デフォルトの名無しさん mailto:sage [2008/06/16(月) 01:33:42 ]
>>286
ああ、その手があったね。

しかも A の唯一の派生クラスを A の friend にしておけば抽象である必要もないし
X の中に入れる必要もないね。

ありがとう。

293 名前:デフォルトの名無しさん mailto:sage [2008/06/16(月) 01:34:00 ]
>>290
_Tはテンプレート引数だろ。

294 名前:デフォルトの名無しさん mailto:sage [2008/06/16(月) 01:57:05 ]
>>288
obj2.template X<_T>();
その名がテンプレートであることを示せ

>>289
この場合はいらんかも


295 名前:デフォルトの名無しさん mailto:sage [2008/06/16(月) 02:02:54 ]
>>294
>>287-288

296 名前:デフォルトの名無しさん mailto:sage [2008/06/16(月) 02:21:21 ]
>>287 予約識別子死ね。

297 名前:デフォルトの名無しさん mailto:sage [2008/06/16(月) 02:25:06 ]
>>292
> しかも A の唯一の派生クラスを A の friend にしておけば抽象である必要もないし
> X の中に入れる必要もないね。

何か変だな。一般的には、抽象でいいものに実装を混ぜる必要もないし、
スコープを無駄に広める必要もない、となりそうなもんなんだが。

まぁ望むものは得られたみたいなんで、書き込みに出てない部分の都合があっての
話ならどうでもいいけど。

298 名前:デフォルトの名無しさん mailto:sage [2008/06/16(月) 07:38:23 ]
これでいいんだよね?

class A {
public:
 virtual ~A() { }
 virtual void Foo() = 0;
};

class X {
public:
 X();
 A* NewA();
private:
 class Impl* impl_;
};

class X::Impl {
public:
 A* NewA() {
  return new AImpl;
 }

private:
 class AImpl : public A {
 public:
  virtual void Foo();
 };
};

X::X() : impl_(new Impl) { }
A* X::NewA() { return impl_->NewA(); }

299 名前:デフォルトの名無しさん mailto:sage [2008/06/16(月) 12:39:10 ]
>>297
抽象にしたくないのは単に性能のため。
Aは単純なクラスを想定しているのでそれほど実装を隠す必要はないから。
もしAの実装を隠したい場合はImpl方式にするかもしれない。
抽象クラスより優れている根拠は特にないが。

確かにAの派生はXに入れたほうが名前空間の汚染を軽減できるね。

>>298
デストラクタは private にしてユーザが削除できないようにしたい。
さらに特定のクラスにしか派生できないようにしほうが何となく安心。

300 名前:デフォルトの名無しさん mailto:sage [2008/06/16(月) 12:47:35 ]
obj2.template X<_T>();

いや本当は知らないんですけどね



301 名前:デフォルトの名無しさん mailto:sage [2008/06/16(月) 23:02:51 ]
>>294
>>300
thx。たすかりますた。thx。
>>287
解った。死ぬから_Tを使わせてくれ。

302 名前:デフォルトの名無しさん mailto:sage [2008/06/16(月) 23:03:51 ]
> _T
処理系の予約語じゃねえか・・・

303 名前:デフォルトの名無しさん [2008/06/17(火) 21:38:29 ]
ワラタ

304 名前:デフォルトの名無しさん mailto:sage [2008/06/17(火) 23:47:32 ]
class x について ++x と x++ を定義する場合
operator++ はどうなるのかしらぁぁぁぁぁぁぁぁ

305 名前:デフォルトの名無しさん mailto:sage [2008/06/17(火) 23:53:14 ]
++x → operator++()
x++ → operator++(int)

後者の引数はオーバーロードのためのダミー引数で、
それ以外の何かに使う物ではない。

306 名前:デフォルトの名無しさん mailto:sage [2008/06/17(火) 23:55:50 ]
X & X::operator ++ (void) ;
X X::operator ++ (int) ;

307 名前:304 mailto:sage [2008/06/17(火) 23:59:07 ]
ありがとうございました。orz

308 名前:デフォルトの名無しさん mailto:sage [2008/06/18(水) 07:40:42 ]
関係無い話だけど、
テンプレート引数型で後置インクリメント使う馬鹿は氏ねと言いたい。

309 名前:デフォルトの名無しさん mailto:sage [2008/06/18(水) 07:56:32 ]
いやむしろ型特性を利用して組み込み型のときだけ後置インクリメントにするという手も

310 名前:デフォルトの名無しさん mailto:sage [2008/06/18(水) 13:14:00 ]
VC++ の2005を使用し、C++/CLIでアプリを作成しています。

ListViewに複数項目が登録されている場合、最下段での下キー押下で最上段へ、
また、最上段での上キー押下で最下段にフォーカスを移したいと思っています。

これをやるだけならキーイベントを拾って
「最下段で下キーが押された場合、フォーカス位置を0にする」
というようにすればいいのかと思ったのですが、ListViewのデフォルト機能(?)で
上下キー押下はフォーカス位置を1つずらすようになっています。

つまり、

1
2
3←フォーカス

この状態で下キーを押すと、フォーカス位置が0に戻る処理が実行された後、
フォーカス位置が1つ下にずれてしまうので

1
2←フォーカス
3

となってしまいました。

ListViewが持っているデフォルトのキーイベントを破棄できればいいのかと思ったのですが、
その捨て方も分かりませんでした・・・。

上記要件を満たす方法などがありますでしょうか?



311 名前:デフォルトの名無しさん mailto:sage [2008/06/18(水) 13:39:20 ]
スレ違い
.NETスレ行け

312 名前:デフォルトの名無しさん mailto:sage [2008/06/18(水) 13:39:59 ]
>>310
C++/CLIはC++を元にした別の独立した言語です。
なので基本的にはC++/CLIスレで質問して下さい。

しかし、言語自体でなく、
ListView(.NETコンポーネント)のことなので、
.NET総合スレか、人の多い(+構文が近い)C#スレをお勧めします。

System.Windows.Forms.ListView などは
C++/CLI, C#, VB.NETで同一のものです。

313 名前:デフォルトの名無しさん mailto:sage [2008/06/18(水) 13:52:12 ]
次スレのテンプレには、
C++/CLI関連の誘導を加えた方がよさそうだな

314 名前:デフォルトの名無しさん mailto:sage [2008/06/18(水) 14:25:33 ]
>>311、312
失礼しました
他スレにて再質問します
ありがとうございました

315 名前:デフォルトの名無しさん mailto:sage [2008/06/19(木) 14:53:55 ]
以下のプログラムで、ddd() の中のようなキャストを行ってから bbb() の中で B::f() を正しく
呼び出せるでしょうか?

struct B { void f(); };
struct D : B {};
void bbb( B* b[], int size ) { for ( int i = 0; i < size; ++i ) b[i]->f(); }
void ddd( D* d[], int size ) { bbb( static_cast<B**>( static_cast<void*>( d ) ), size ); }

316 名前:デフォルトの名無しさん mailto:sage [2008/06/19(木) 15:46:32 ]
ちょっと聞いてください。
enumハックを使ってクラスの中でSIZE_MAXという名前の定数を定義したんですよ。
そしたら、「error C2143: 構文エラー : '}' が '定数' の前にありません。」などのエラーが何個か出ました。
いろいろコメントアウトして原因を探ったら、vectorやstringなどをインクルードするとエラーが出る事がわかったんです。
で、インクルードファイルが壊れてると思い、再インストールしたんですが直らず、
結局、limits.hでSIZE_MAXという名前のマクロが定義されていたのが原因でした。
エラーメッセージに名前は出ないし、ネームスペースも無視される。
マクロって最低じゃないですか?

317 名前:デフォルトの名無しさん mailto:sage [2008/06/19(木) 16:00:25 ]
マクロのない言語に乗り換えるといいと思うよ

318 名前:デフォルトの名無しさん mailto:sage [2008/06/19(木) 20:39:42 ]
>>316
だからマクロは大文字を使うんだよ。

319 名前:デフォルトの名無しさん mailto:sage [2008/06/19(木) 21:15:33 ]
やってみて結果を述べるのが自立した大人の行動と思う。

320 名前:デフォルトの名無しさん mailto:sage [2008/06/19(木) 21:15:56 ]
319はto315



321 名前:デフォルトの名無しさん mailto:sage [2008/06/19(木) 21:21:24 ]
だから、大文字の識別名はマクロ名以外には使わないという
お約束があるんだよ。

322 名前:デフォルトの名無しさん mailto:sage [2008/06/19(木) 21:46:10 ]
>>319
すみません。特定の環境ということではなく一般的にできるかどうかです。
VC8で試したら動きます。

323 名前:デフォルトの名無しさん [2008/06/19(木) 22:37:03 ]
やってみた結果から刷り込まれた処理系依存な「知識」が豊富な「大人」は痛いよな

324 名前:デフォルトの名無しさん mailto:sage [2008/06/19(木) 22:44:01 ]
>>318,321
列挙型や定数に大文字使ってるのよく見かけるけどそんなお約束あるの?

325 名前:デフォルトの名無しさん mailto:sage [2008/06/19(木) 22:51:45 ]
>>324
定数もマクロだったりするし、列挙型はスコープ無いから定数の代わりに使ったりするから


326 名前:デフォルトの名無しさん mailto:sage [2008/06/19(木) 23:29:25 ]
std::wstring以外で、汎用的な文字列クラスって言うと何になるんでしょうか。
今までずっとATL::CStringWでやっていたのですが、std::wstringはいまいち不便で。
boostあたりになっちゃうんでしょうかね。

327 名前:デフォルトの名無しさん mailto:sage [2008/06/19(木) 23:49:29 ]
>>325
>定数もマクロだったりするし、
定数をマクロで書くのはよくないんじゃない?
Effective C++ 1項に書いてあるように、これこそお約束なのでは。

>列挙型はスコープ無いから定数の代わりに使ったりするから
>>316の例だって列挙型を定数がわりに使ってハマってるように見えるんだが、何か違う?


328 名前:デフォルトの名無しさん mailto:sage [2008/06/20(金) 00:13:55 ]
怪しかったらundef
CreateWindowとか

329 名前:デフォルトの名無しさん mailto:sage [2008/06/20(金) 00:35:20 ]
質問です。
あるクラスのインナークラスを他のファイルで前方宣言したいと思っているのですが
どのように宣言すればよいのでしょうか…。

以下例です。
名前空間SpaceAに定義されたクラスClassAがあったとして
ClassA内部にはInnerClassAが定義されているとします。

namespace SpaceA {
class ClassA {
public:
class InnerClassA{}
}
}

このInnerClassAを他のファイルClassB.hで前方宣言して使うことはできるのでしょうか…。

// 前方宣言
namespace SpaceA {
class ClassA;
//struct ClassA::InnerClassA; // ClassAは名前空間じゃないからエラー…どう書けばいいのか
}
using SpaceA::ClassA;

namespace SpaceB {
class ClassB {
public:
ClassB( InnerClassA* p ); // イメージ的にはこんな感じで使いたい
}
}

よろしくお願いします。

330 名前:デフォルトの名無しさん mailto:sage [2008/06/20(金) 01:44:36 ]
>>315
D* を B* としてアクセスするのは、規格の 3.10 p15 にあるエイリアスの制約に
違反するので、未定義動作。

ddd() の引数に B* の配列を似たようなキャストしてねじ込んだ場合は、上記の
制約を満たすことになるのでセーフ。



331 名前:デフォルトの名無しさん mailto:sage [2008/06/20(金) 01:48:50 ]
>>329
無理。外側の ClassA の定義が必要。 ClassA の中で class InnerClassA; としてあれば
InnerClassA の定義は必要ない。

332 名前:デフォルトの名無しさん mailto:sage [2008/06/20(金) 08:20:45 ]
>>315
>D* を B* としてアクセスするのは、規格の 3.10 p15 にあるエイリアスの制約に
>違反するので、未定義動作。

普通のアップキャストだからOKじゃないの?

333 名前:332 mailto:sage [2008/06/20(金) 08:34:45 ]
332は>>315じゃなくて>>330だった。

なおModern C++ Designでは、
仮想継承でなければstatic_castによる
アップキャストは問題ないとなってた。
規格でどうなってるかは知らない。

334 名前:332 mailto:sage [2008/06/20(金) 09:16:06 ]
>>330

もしかして static_cast<B**> がダメってことですか?

335 名前:330 mailto:sage [2008/06/20(金) 09:30:49 ]
>>332
ごめん。まぎらわしいね。

「D* に B*& でアクセスするのは、〜」ってことで、少しは伝わりやすいかな、と。

336 名前:デフォルトの名無しさん mailto:sage [2008/06/20(金) 13:36:27 ]
C++ の仕様では sizeof(B*) != sizeof(D*) の処理系もありえるのかな。

337 名前:デフォルトの名無しさん mailto:sage [2008/06/20(金) 15:16:43 ]
クラスが違うとポインタサイズも違うのか・・・?なんという

338 名前:デフォルトの名無しさん mailto:sage [2008/06/20(金) 16:08:14 ]
class XをSTL準拠にするため自作イテレータを作ろうと
operator++( X* x )みたくしたら
「クラス型パラメータがひとつもありません」と怒られました。
ハーバートシルト先生のSTL標準講座を読んでも解決法が書いてありません。
っていうか自作STLの書き方なんて載ってないし。
もうだめです。さようなら。

339 名前:デフォルトの名無しさん mailto:sage [2008/06/20(金) 16:56:07 ]
はい、さようなら。

340 名前:デフォルトの名無しさん mailto:sage [2008/06/20(金) 17:37:07 ]
using namespace std;という呪文が書いてある他人の作ったヘッダ(hoge.hh)をインクルードするのが気持ち悪かったので、

>hogehoge.hh
namespace hogehoge{
#include "hoge.hh"
};

>hogehoge.cc
#include "hogehoge.hh"
……

ってやったらhoge.hhの中でhogehoge::stdをさがしにいきやがったのが納得いかないんですが、
using namespace std;っていうのはstdをグローバルスコープにする命令じゃないんですか?



341 名前:デフォルトの名無しさん mailto:sage [2008/06/20(金) 17:52:33 ]
違うよ。
現在の名前空間から見てstd::以下にあるシンボルを現在のスコープにロードする命令だよ。

ちなみに、名前空間のなかから普通の"std"を読み込みたいなら
using namespace ::std;
とする必要がある。

342 名前:デフォルトの名無しさん mailto:sage [2008/06/20(金) 18:11:09 ]
>>338
ポインタで横着しようとしないで、イテレータ用のクラスを作る。

343 名前:デフォルトの名無しさん mailto:sage [2008/06/20(金) 18:16:56 ]
>>340
hogehoge::stdを探しにいったってことは、
hoge.hh内に namespace std {...} があるのか・・・。

using namespace std;で飽き足らず、
std空間にユーザー定義を追加するとは、不届きなヘッダだなw

とりあえず、

>hogehoge.hh
namespace hogehoge {
namespace std { using namespace ::std; } // これを追加
#include "hoge.hh"
};

しておけばおk。

344 名前:343 mailto:sage [2008/06/20(金) 18:54:47 ]
あ、hoge.hhにstd系のincludeがあったら駄目か・・・。

345 名前:デフォルトの名無しさん mailto:sage [2008/06/20(金) 19:01:52 ]
>>341
うむむ、namespaceは奥深いですね。

>>343
namespace stdは見つかりませんでした。。。
あと、その行を追加してもhogehoge::stdを探しに行ってるように見えます。。。

一番簡単なのはヘッダのusing namespace std;の行を削除することなんだろうけど、
ファイルの上の方のコメントみたらcopyrightとか書いてあるし……

諦めて裸のままインクルードして使うことにします。
ありがとうございました。

346 名前:デフォルトの名無しさん mailto:sage [2008/06/21(土) 13:11:25 ]
>>344-345
hoge.hhの中にincludeがあるなら、
それを先にincludeしとけば良いんじゃね?
インクルードガードで無視されるから。
例えば #include <vector> があるなら↓のように。

#include <vector>
namespace hogehoge {
  namespace std { using namespace ::std; }
  #include "hoge.hh"
};

347 名前:デフォルトの名無しさん mailto:sage [2008/06/22(日) 23:55:19 ]
定数を指定するとき、C言語では#defineを使いましたが、
C++ではconstな変数を使え、とモノの本に書いてありました

ところで、定数がint型で何個も欲しいのですが、
列挙型の列挙子で代用するのはアリでしょうか?

348 名前:デフォルトの名無しさん mailto:sage [2008/06/23(月) 00:09:47 ]
>>347
どれくらいの個数かにもよるかもしれないけど、
列挙子で代用(?)している入門書は結構ある。

349 名前:デフォルトの名無しさん mailto:sage [2008/06/23(月) 00:28:08 ]
#define 使うなってのは、型だとか副作用だとかエラーメッセージだとかだから
enum なら問題ないと思うよ

350 名前:デフォルトの名無しさん mailto:sage [2008/06/23(月) 00:30:07 ]
配列の添え字に使いたかったんです
単なる数字より、文字のほうが読みやすいですし
ありがとうございました



351 名前:デフォルトの名無しさん mailto:sage [2008/06/23(月) 00:34:33 ]
>>347
なんで数が増えたら enum で代用するなんてことになるの?
意味が違うだろ。

352 名前:デフォルトの名無しさん mailto:sage [2008/06/23(月) 00:37:28 ]
連番なら enum だね。

353 名前:デフォルトの名無しさん mailto:sage [2008/06/23(月) 00:46:05 ]
>>351
いや、0から始まる連番なもんで

354 名前:デフォルトの名無しさん mailto:sage [2008/06/23(月) 00:50:15 ]
>>353
それなら代用じゃなくて enum が正解。逆に int const で用意するほうがありえない。

355 名前:デフォルトの名無しさん mailto:sage [2008/06/23(月) 03:11:09 ]
すみません.
ここでする質問ではないかも知れませんが.
C++でMPEG2を取り扱うプログラムを作らなくてはならなくなりました.
MPEG2を扱うにはどのようなlibraryを使わなければならないでしょうか?
またそのマニュアルが詳しく掲載しているサイトを教えてくれません?
Directshowは抜きでお願いします.

356 名前:デフォルトの名無しさん mailto:sage [2008/06/23(月) 03:25:18 ]
ffmpegでヤフれ

ただしMPEG2特許の利用ライセンスは自分でとってね!

357 名前:デフォルトの名無しさん mailto:sage [2008/06/23(月) 16:44:37 ]
VC++環境です。STLのlistについて質問です。
あるlist(Aとする)の情報をまるまる別のlist(Bとする)にassign()で写したのち、
Aのある位置を指しているイテレータをそのままBで使いたい
(Aで指していた位置にある情報を指させたい)
のですが、方法を探しても見つかりません。
アルゴリズムのfind()以外で何か方法はありますか?

358 名前:デフォルトの名無しさん mailto:sage [2008/06/23(月) 17:13:09 ]
>>357
std::distance(), std::advance()

ただ、listだとランダムアクセス出来ないから
一応それぞれO(n)で、セットでO(2n)になる。
まぁとんでもない要素数でない限り一瞬だろうけど。

359 名前:デフォルトの名無しさん mailto:sage [2008/06/23(月) 17:18:01 ]
listはアクセスするだけでもメモリの中を不規則な順序で飛び飛びするので、平均の次の要素へのアクセス速度は
要素が連続しているvectorよりも遅い。

360 名前:デフォルトの名無しさん mailto:sage [2008/06/23(月) 17:24:45 ]
>>357->>359
頭からの距離で考える発想は思いつきませんでした。
要素も少なく、実際に動かしてみても一瞬で処理できました。
ありがとうございました。



361 名前:デフォルトの名無しさん mailto:sage [2008/06/23(月) 22:12:24 ]
解決したようだが、
begin()〜itとit〜end()の2回に分けてコピーするのもいいな。

362 名前:355 mailto:sage [2008/06/24(火) 02:37:33 ]
ffmpegをヤフりました.
MS-DOSで動くオープンソースの動画変換アプリなんですね.
ソースを見て参照方法を探れということですね?
これも方法の一つとしますが時間がかかるので,なにか他の方法はないでしょうか?

それと商用配布は考えていないのでライセンス申請の必要はありません.

363 名前:デフォルトの名無しさん mailto:sage [2008/06/24(火) 03:12:10 ]
いいえ、商用に限らず許可なく使うことは許されません。

364 名前:デフォルトの名無しさん mailto:sage [2008/06/24(火) 07:35:29 ]
特許権は、それを使ったものを製造、保管、流通することを制限することができるよ。
商用かどうかは関係ないよ。
詳しくは法務に聞こうね。

365 名前:デフォルトの名無しさん mailto:sage [2008/06/24(火) 10:47:36 ]
>>362
> MS-DOSで動くオープンソースの動画変換アプリなんですね.
違います。

> ソースを見て参照方法を探れということですね?
違います。

> これも方法の一つとしますが時間がかかるので,なにか他の方法はないでしょうか?
規格書読むより時間掛かりませんよ。

366 名前:デフォルトの名無しさん mailto:sage [2008/06/24(火) 16:10:28 ]
classのstaticメンバで、shortの配列があります。
例えば、
class hoge {
private:
 static array[100];
};
となっていて、arrayの中身を
for(int i=0; i<100; i++){
 array[i] = i*i;
}
のように初期化したいとします。
このよな作業はどの箇所で行えばいいでしょうか。

367 名前:デフォルトの名無しさん mailto:sage [2008/06/24(火) 16:16:38 ]
>>366
クラスの外で一回やっておけばよい。
main()が呼ばれる前に初期化される保証がある。

368 名前:デフォルトの名無しさん mailto:sage [2008/06/24(火) 16:19:15 ]
Singletonの問題のようにも思えるが

369 名前:366 mailto:sage [2008/06/24(火) 16:27:24 ]
>>367
GCCですが、.cxxの先頭でやると怒られます。

src/hoge.cxx:24: error: expected unqualified-id before ‘for’
src/hoge.cxx:24: error: expected constructor, destructor, or type conversion before ‘<’ token
src/hoge.cxx:24: error: expected constructor, destructor, or type conversion before ‘++’ token

24: for(int i = 0; i < 100; i++){


370 名前:デフォルトの名無しさん mailto:sage [2008/06/24(火) 16:28:58 ]
#include <iostream>

class hoge {
private:
static int array[100];
static int flag;
public:
hoge() {
if (flag) {
for (int i = 0; i < 100; i++)
array[i] = i * i;
flag = 0;
}
}
void printa() const {
for (int i = 0; i < 100; i++)
std::cout << array[i] << ' ';
}
};

int hoge::flag = 1;
int hoge::array[100];

int main()
{
hoge h;

h.printa();
}




371 名前:366 mailto:sage [2008/06/24(火) 16:31:18 ]
short* hoge::array = 0;

としておいて、constructorで
if(!array){
 array = new short[100];
 for(int i=0; i<100; i++){
  array[i] = i*i;
 }
}

でしょうか。それだと、いつdeleteするのでしょうか。
それとも、初期化フラグをメンバ変数に持っておいて、
それのtrue/falseでconstructorからfor文を呼び出す?

372 名前:366 mailto:sage [2008/06/24(火) 16:32:03 ]
>>370
ということのようですね。
ありがとうございました。

373 名前:デフォルトの名無しさん mailto:sage [2008/06/24(火) 17:22:54 ]
どんな初期化をするかにも夜
コンストラクタとデストラクタは忘れないであげてくだちぃ

374 名前:デフォルトの名無しさん mailto:sage [2008/06/24(火) 17:54:53 ]
>>373
staticだからこの場合は無理なのよ

375 名前:355 mailto:sage [2008/06/24(火) 18:33:23 ]
ffmpegのAPIを使ってMPEG2を読み込めということでしょうか?
現在mpeg2dec-0.4.1 とでどちらを使うか考えています.

両方の向き不向きについて何か教えてくれませんか?

376 名前:デフォルトの名無しさん mailto:sage [2008/06/24(火) 18:49:21 ]
C++相談室

377 名前:355 mailto:sage [2008/06/24(火) 19:53:12 ]
すみません.
そうでした.完全にスレ違いになってしまいました.
去ります

378 名前:デフォルトの名無しさん mailto:sage [2008/06/25(水) 00:49:33 ]
C++って先頭からコンパイルしますよね

だから↓はコンパイルエラーになりますよね。
void main(){
int a=func(3);
}
int func(int x){
return x+5;
}

なのに、なぜ↓はコンパイルエラーにならないんでしょうか?
class cA{
public:
cA(){a=10;}
private:
int a;
};


379 名前:デフォルトの名無しさん mailto:sage [2008/06/25(水) 00:50:14 ]
C++って、単純な速さは他の言語と比較してどうなの?

380 名前:デフォルトの名無しさん mailto:sage [2008/06/25(水) 00:56:45 ]
>>378
そういう仕様に決まったから。

>>379
書き方や問題領域で当然変わってくるけど、大体Cと同じ。



381 名前:デフォルトの名無しさん mailto:sage [2008/06/25(水) 00:58:44 ]
ていうことは、C++のコンパイラは場合によっては、
読む場所を行ったり来たりしうるんですね
ありがとうございました

382 名前:デフォルトの名無しさん mailto:sage [2008/06/25(水) 02:00:09 ]
>>378
正確に述べると、クラス定義の中に関数定義を書くと、
そいつはクラス定義の終わった後に、inline付で定義されたものとして扱われるということになる。

383 名前:デフォルトの名無しさん mailto:sage [2008/06/25(水) 02:15:49 ]
クラス宣言じゃないのか。

384 名前:デフォルトの名無しさん mailto:sage [2008/06/25(水) 07:37:29 ]
定義。

385 名前:デフォルトの名無しさん mailto:sage [2008/06/25(水) 07:51:00 ]
クラス宣言って外部でメンバ関数の定義をしたりあと前方宣言
の時に使われる物?

386 名前:デフォルトの名無しさん mailto:sage [2008/06/25(水) 08:26:28 ]
クラスそのものを後方定義というやり方にも使う。

387 名前:デフォルトの名無しさん mailto:sage [2008/06/25(水) 09:26:57 ]
template<typename T> struct base{
 typename T::X test(){ return typename T::X(); }
};

struct A : base<A>{
 struct X{}
};

継承するクラスのテンプレートに継承するクラス自身を渡して、
継承するクラス内の型を基底型で使いたいのですが不可能でしょうか?

388 名前:デフォルトの名無しさん mailto:sage [2008/06/25(水) 10:55:21 ]
>>387
全く問題ない。

389 名前:デフォルトの名無しさん mailto:sage [2008/06/25(水) 11:27:40 ]
>>387
弾かれました


template<typename T> struct base{
 typename T::X test(){ return typename T::X(); } <-error C2039: 'X' : 'A' のメンバではありません。
};

struct A : base<A>{
 struct X{}
};

390 名前:デフォルトの名無しさん mailto:sage [2008/06/25(水) 13:48:24 ]
struct X {};
struct A { void add( X* x ); };

X* x = new X;
A a;
a.add( x );

A のオブジェクトは A::add() で追加した X のオブジェクトを delete する義務があります。
この場合 A::add() が失敗して例外を投げるとき A::add() は x を delete するべきでしょうか?

普通、関数が例外を投げるときその関数が何もしなかったことにするのが理想だと思いますが
delete したほうが便利な場合も多いと思うのですが。



391 名前:デフォルトの名無しさん mailto:sage [2008/06/25(水) 14:02:32 ]
すべきでないと思う
auto_ptrを使えばどうか

struct A{ void add(std::auto_ptr<X> x); };

std::auto_ptr<X> x(new X);
A a;
a.add(x);

392 名前:デフォルトの名無しさん mailto:sage [2008/06/25(水) 20:30:13 ]
>>390
391に同意。
a.add(x)に渡すxはnewしないといけないという変な制約が発生してしまうから。

393 名前:デフォルトの名無しさん mailto:sage [2008/06/25(水) 20:45:33 ]
boost の shared_ptr のコンストラクタや ptr_container の追加関数は
確か失敗したら delete される設計になってた。

394 名前:デフォルトの名無しさん mailto:sage [2008/06/26(木) 02:56:30 ]
>>390
そのインターフェースなら a.add(new X) したくなりそうだから、 delete したほうがいいと思う。

395 名前:デフォルトの名無しさん mailto:sage [2008/06/26(木) 20:01:08 ]
>>393
スマートポインタと一緒にしちゃだめでしょ。

>>394
X x;
a.add(&x)で落ちてもいいんだね。

396 名前:デフォルトの名無しさん mailto:sage [2008/06/26(木) 20:08:30 ]
>>395
boost::ptr_vector

397 名前:デフォルトの名無しさん mailto:sage [2008/06/26(木) 20:27:03 ]
C++で動く、フリーなライセンスの行列演算ライブラリはありませんか?

398 名前:デフォルトの名無しさん mailto:sage [2008/06/26(木) 21:13:04 ]
boost


399 名前:デフォルトの名無しさん mailto:sage [2008/06/26(木) 21:34:13 ]
boost::uBLASな

400 名前:デフォルトの名無しさん mailto:sage [2008/06/27(金) 00:34:47 ]
boost::uBLASってパフォーマンスより安全性とかを優先してて遅いとか、
書かれてるけど、実際どうなん?



401 名前:デフォルトの名無しさん mailto:sage [2008/06/27(金) 00:48:54 ]
boost::numeric::ublasは遅くないぞ
パフォーマンス表も書いてある

boost.cppll.jp/HEAD/libs/numeric/ublas/doc/overview.htm

402 名前:デフォルトの名無しさん mailto:sage [2008/06/27(金) 01:02:54 ]
liboctaveより遅いけどな

403 名前:デフォルトの名無しさん mailto:sage [2008/06/27(金) 01:07:56 ]
そうかもしれんがBlitz++のように途中で更新停止したり
するのが怖い
boostならまずそういう事はないだろうし

404 名前:デフォルトの名無しさん mailto:sage [2008/06/27(金) 01:25:54 ]
確かに。メンテされ続ける安心ってのは大事だな。

405 名前:デフォルトの名無しさん mailto:sage [2008/06/27(金) 01:56:56 ]
Program Optionsとか放置されてて酷いけどな。
一度使おうとして、あまりにも酷い出来で、ワイド文字対応がなってなかったんで、あきらめた。
内部的には全部マルチバイト文字にしてやがる。
そのため、ワイド文字でデフォルト値とか設定しようとするとコンパイルエラー。
少しいじって、utf16からutf8に変換するようにしてやれば動くが、
わざわざそんなことするぐらいなら、自前で書いたほうがいい。

ありゃ絶対に、一文字は絶対に一バイトで、しかも7bitに収まるって前提の南蛮人の書いたコードだ。

406 名前:デフォルトの名無しさん mailto:sage [2008/06/27(金) 02:19:23 ]
progressbarは?

407 名前:デフォルトの名無しさん mailto:sage [2008/06/27(金) 03:59:44 ]
>>401
ありがとうございました。
ありがとうございました。
ありがとうございました。

408 名前:デフォルトの名無しさん mailto:sage [2008/06/27(金) 07:53:35 ]
>>395
> A のオブジェクトは A::add() で追加した X のオブジェクトを delete する義務があります。
これが前提じゃないのか? new してないものは最初から渡せないだろ。

409 名前:デフォルトの名無しさん mailto:sage [2008/06/27(金) 08:08:55 ]
「渡せない」と「渡さない」の違い

410 名前:デフォルトの名無しさん mailto:sage [2008/06/27(金) 09:33:28 ]
すみません。boost::numeric::ublasを教えていただいた者ですが、
vc8でdebugモードとreleaseモードで結果が異なり、debugモードでのみ正常に動作します。
使用しているboostは1.34ですが、これにはバグがあるんでしょうか?
面倒なのでアップデートしたくないのですが・・・。
boostコード中で警告4267と4244が出てくるのでboostが原因かもしれませんが把捉しかねる状態です。
ご教示願います。



411 名前:デフォルトの名無しさん mailto:sage [2008/06/27(金) 10:59:43 ]
engineering.meta-comm.com/boost-regression/1_34_1/user/numeric-ublas_release.html

1.34.1で悪いけど。
結構厳しいね。

412 名前:デフォルトの名無しさん mailto:sage [2008/06/27(金) 12:45:56 ]
>>397
俺はliboctave使ってたよ
もう遅いかもしれないけど…

413 名前:デフォルトの名無しさん mailto:sage [2008/06/28(土) 21:07:42 ]
C++ 始めたばっかなんですが、
this はなんでポインタなんでしょうか
せっかく参照というものがあるのに...

そんで、今日は C++ のオブジェクトが自身への参照を
self という名前で持てるようにいろいろがんばってました。

具体的には、そのクラスを継承したらクラス定義の中で self が使えるようなクラスを作ろー...と思ってたんですが、うまくいかず。
結局
#define self (*this)
しか思いつきませんでした orz

こういうんじゃなくって、ちゃんと自分自身への参照をメンバ変数にもつオブジェクトは作れないのでしょうか。

414 名前:デフォルトの名無しさん mailto:sage [2008/06/28(土) 21:18:51 ]
>>413
別の表記方法がないなら*thisでいいじゃん。表現に揺らぎがなくて結構なことじゃないか。同じものをいろんな名前で表現させるほうが混乱するんでないかい?
size length len count distance 同じ意味だったり違った忌みだったり混乱するね。

415 名前:デフォルトの名無しさん [2008/06/28(土) 21:25:04 ]
>>413
昔、this = malloc(1); てな構文があったんだよ

416 名前:デフォルトの名無しさん mailto:sage [2008/06/28(土) 21:29:05 ]
>this はなんでポインタなんでしょうか
thisが C with Classes に導入されたときには参照はまだなかった

417 名前:デフォルトの名無しさん mailto:sage [2008/06/28(土) 21:31:11 ]
JavaからC++への移行は推奨しません。

418 名前:デフォルトの名無しさん mailto:sage [2008/06/28(土) 21:47:59 ]
selfってことはJavaじゃないと思う

419 名前:デフォルトの名無しさん mailto:sage [2008/06/28(土) 21:50:43 ]
Object Pascalだね。


420 名前:デフォルトの名無しさん [2008/06/28(土) 21:51:42 ]
C++ではboostはデフォなのか?



421 名前:デフォルトの名無しさん mailto:sage [2008/06/28(土) 21:51:52 ]
現代版#define BEGIN {ですね、わかります。

422 名前:デフォルトの名無しさん mailto:sage [2008/06/28(土) 21:58:28 ]
>>420
一部はデフォになりつつある。

まあ、知って損はない。俺も最近使い始めた。今まで知らなくてずいぶん損したと思う。

423 名前:デフォルトの名無しさん mailto:sage [2008/06/28(土) 21:59:31 ]
>>420
中にはそういう人間もいる(俺もその1人だがな)。
当然、すべての人間にとってそうとは限らない、いつだって使えるとは限らないから、
Boostデフォを妄信するのは危険。使えないときは反動でだるくなる。

424 名前:440 mailto:sage [2008/06/28(土) 22:49:03 ]
>442
勉強しておくよ。
GCとか便利そうだし

>443
仕事の場合だと、使えない場合が多そうだな。



425 名前:デフォルトの名無しさん mailto:sage [2008/06/28(土) 22:50:24 ]
今テレビでターミネーター2やってるよね。
未来から来たって話。

426 名前:デフォルトの名無しさん mailto:sage [2008/06/28(土) 22:59:36 ]
>>424
440基準でも未来レスかよw

427 名前:デフォルトの名無しさん mailto:sage [2008/06/28(土) 23:01:52 ]
Testってクラス書くとして

Test.cppとTest.h用意?
Test.cxx作ってそこに全部記述?



428 名前:デフォルトの名無しさん mailto:sage [2008/06/28(土) 23:02:56 ]
Testを他で使うなら.hも作っとけ

429 名前:デフォルトの名無しさん mailto:sage [2008/06/28(土) 23:05:05 ]
Test.hppにテンプレートクラスでイナフ

430 名前:デフォルトの名無しさん mailto:sage [2008/06/28(土) 23:11:42 ]
hppだとどういうコーディングルールがベスト?
サンプルないかな?



431 名前:デフォルトの名無しさん mailto:sage [2008/06/28(土) 23:14:01 ]
boost

432 名前:デフォルトの名無しさん mailto:sage [2008/06/28(土) 23:14:07 ]
>>426
意味不明だよ。


433 名前:デフォルトの名無しさん mailto:sage [2008/06/28(土) 23:15:01 ]
IDテスト

434 名前:デフォルトの名無しさん mailto:sage [2008/06/28(土) 23:16:10 ]
>>430
hppでの例
www.boost.org/doc/libs/1_35_0/boost/shared_array.hpp

ベストかどうかは・・・分からんけど。

435 名前:デフォルトの名無しさん mailto:sage [2008/06/28(土) 23:17:05 ]
>>432

424 :440 [sage] :2008/06/28(土) 22:49:03
  >442
  勉強しておくよ。

436 名前:デフォルトの名無しさん mailto:sage [2008/06/28(土) 23:18:40 ]
>>434
オペレータの定義だけ外だし?

437 名前:413 mailto:sage [2008/06/29(日) 04:39:41 ]
>>414
はっきりいってネタですw
でもthisが参照じゃないのは何でやろー && 参照だったら
Foo& Foo::operator=(const Foo& rhs) {
    this.bar = rhs.bar;
    return this;
}
こんな感じで(->)や(*)使わなくてすむのにと思ったので

>>415

kwsk

>>416
それじゃあ this が参照じゃないのは後方互換性のためなのか。
かつ *this があるから別の予約語を用意する必要もないと

>>419
ざっと見た感じでは self 使ってない雰囲気ですが

438 名前:デフォルトの名無しさん mailto:sage [2008/06/29(日) 12:34:32 ]
google-styleguide.googlecode.com/svn/trunk/cppguide.xml
Google社内でのコーディング規約らしい。例外は悪か、やっぱり。



439 名前:デフォルトの名無しさん mailto:sage [2008/06/29(日) 12:55:16 ]
>>438
全部読んでないけど、「例外は悪」とは書いてないと思うよ。
Googleの場合はデメリットがメリットより大きいから使わないという話と思う。


440 名前:デフォルトの名無しさん [2008/06/29(日) 14:13:45 ]
C++0xがでたら、boostも用済みなんだろうか…というか組み込まれるのか?

最近C++の書籍がどんどん廃刊したり、改訂版が出ないのは、やはりC++0x
待ちなのかな?早くして欲しいもんだ。



441 名前:デフォルトの名無しさん mailto:sage [2008/06/29(日) 14:16:53 ]
boostの一部は標準に取り込まれるが、
標準に新たな機能が追加されるわけで、
boostは更なる進化を遂げるだろう。

442 名前:デフォルトの名無しさん mailto:sage [2008/06/29(日) 14:17:18 ]
coocle

443 名前:デフォルトの名無しさん mailto:sage [2008/06/29(日) 16:03:01 ]
concept_map使った凶悪なライブラリがきっと入る、絶対入る

444 名前:デフォルトの名無しさん mailto:sage [2008/06/29(日) 16:03:44 ]
使わない、って書いてあるけど、
標準ライブラリ等で例外が投げられる奴らはどう使ってるんだろう?
使ってないのか?
new も nothrow で使ってんのかね。

445 名前:デフォルトの名無しさん mailto:sage [2008/06/29(日) 16:09:02 ]
catchしてNULL返す関数でラップしてるとか?

446 名前:デフォルトの名無しさん mailto:sage [2008/06/29(日) 16:16:47 ]
>>438
> string tableName; // Bad - mixed case.
おいらは google で仕事はできない


447 名前:デフォルトの名無しさん mailto:sage [2008/06/29(日) 16:19:09 ]
Googleに限らずどんな環境にも適合する人じゃないと駄目だよね。

448 名前:デフォルトの名無しさん mailto:sage [2008/06/29(日) 16:19:53 ]
まあ、その辺は統一取れてりゃ合わせるよ。
よほど変なのでなければ。

449 名前:デフォルトの名無しさん mailto:sage [2008/06/29(日) 16:20:16 ]
初心者もれに
string tableName; // Bad - mixed case.

なんでバッドなんだよって教えて干しいぉ?

450 名前:デフォルトの名無しさん mailto:sage [2008/06/29(日) 16:24:31 ]
>>449
誰がBADだと言っているのかは知らんが、MixedCaseなのがいかんと言っているだけじゃないか。
要は、caseをmixするなってことだろ。



451 名前:デフォルトの名無しさん mailto:sage [2008/06/29(日) 16:26:28 ]
変数名は全て小文字で。単語の区切りはアンダースコアで。
と書いてある。

452 名前:デフォルトの名無しさん mailto:sage [2008/06/29(日) 16:28:25 ]
コーディング規約に違反しているから bad なだけ

453 名前:デフォルトの名無しさん mailto:sage [2008/06/29(日) 17:01:58 ]
>>445
std::nothrowって知ってる?

454 名前:デフォルトの名無しさん mailto:sage [2008/06/29(日) 17:05:12 ]
>>453
標準ライブラリが例外を投げないようにするのに、
どうやってstd::nothrowを使うのか教えてほしい。

455 名前:445 mailto:sage [2008/06/29(日) 17:08:18 ]
知りませんですた

456 名前:デフォルトの名無しさん mailto:sage [2008/06/29(日) 17:34:59 ]
標準ライブラリから例外が投げられてもそのままキャッチしないで死ぬ
だけ、とか?
もしくは標準ライブラリも書き直して使っているとか。



457 名前:デフォルトの名無しさん mailto:sage [2008/06/29(日) 17:40:28 ]
俺C++2年以上使ってるけど、例外処理ほとんどしたことない

458 名前:デフォルトの名無しさん mailto:sage [2008/06/29(日) 17:50:04 ]
Cの癖が抜けてないんじゃね?

459 名前:デフォルトの名無しさん mailto:sage [2008/06/29(日) 17:56:07 ]
まさにそれ…

460 名前:デフォルトの名無しさん mailto:sage [2008/06/29(日) 17:57:11 ]
googleって例外使わないってことは
C++でも、全部defineかenum斬った値返すだけってこと?



461 名前:デフォルトの名無しさん mailto:sage [2008/06/29(日) 18:04:01 ]
>>457
普段ほとんど気にしなくても、必要なときにキャッチするようにしておけば済むってのが強みだね。

462 名前:デフォルトの名無しさん mailto:sage [2008/06/29(日) 18:08:41 ]
C++はマルチパラダイム言語でしかも多機能だけど、別に
それを全部使ってプログラムする必要はない。

むしろSTLも含めて常時全部の機能を使うのは大変。
その人に合ったコーディングスタイルでいいんじゃないかと
思う。

463 名前:デフォルトの名無しさん mailto:sage [2008/06/29(日) 18:10:39 ]
>>462
ダメそれ無理

464 名前:デフォルトの名無しさん mailto:sage [2008/06/29(日) 18:12:33 ]
>>463
え?全部の機能を常時使えって?
その方が無理でしょ
常に10冊ほどの本を隣に置いておかないといけなくなるよ

465 名前:デフォルトの名無しさん mailto:sage [2008/06/29(日) 18:13:35 ]
より良い選択肢を無視するのは悪ではないか
けっきょく頑固な保守派はC言語をやれば良いではないか

466 名前:デフォルトの名無しさん mailto:sage [2008/06/29(日) 18:14:40 ]
>>464
全部の機能を覚えてれば本置いとく必要なくね?

467 名前:デフォルトの名無しさん mailto:sage [2008/06/29(日) 18:16:04 ]
>>464
学生じゃないなら20万ぐらいのドキュスキャン買って
本を全部PDF化するでしょ?

それで2画面で検索+コーディングするよね?
しない奴はカス

468 名前:デフォルトの名無しさん mailto:sage [2008/06/29(日) 18:17:02 ]
ええっ
例えばSTLの関数名全部覚えられるか?
現在のC++のSTLは当初標準化に際して提出された文書の
サブセットだそうだがそれでも一冊の本が書けるほどだぞ

469 名前:デフォルトの名無しさん mailto:sage [2008/06/29(日) 18:18:25 ]
例外大好きってわけじゃないけど、
RAIIしたら普通に例外に使わないか?
コンストラクタで例外出せないと、かなり面倒です・・・。

470 名前:デフォルトの名無しさん mailto:sage [2008/06/29(日) 18:18:33 ]
関数名なんて覚える必要ないが、だいたいどういうことが出来るか
という全体像を掴んでいれば、その都度調べて使えるし、いつの間にか
覚える。



471 名前:デフォルトの名無しさん mailto:sage [2008/06/29(日) 18:19:33 ]
>>462-464
よくわからんけど、話食い違ってるだけじゃね?

472 名前:デフォルトの名無しさん mailto:sage [2008/06/29(日) 18:24:49 ]
std::locale とか std::codecvt とか一度も使ったことないや

473 名前:デフォルトの名無しさん [2008/06/29(日) 18:38:08 ]
>>468
んな必要ねーし
憶え方なんざ ISO/IEC14882 にだって書いてあるぞ

たかが few 万円の費用が壁になるようなアマチュアの道具ではないってだけさ

474 名前:デフォルトの名無しさん mailto:sage [2008/06/29(日) 18:40:20 ]
few 万円で済めばいいが
俺はC++関連の本だけで既に百万は超えてる

475 名前:デフォルトの名無しさん mailto:sage [2008/06/29(日) 18:45:14 ]
>>474
スゲェ俺一冊w

476 名前:デフォルトの名無しさん mailto:sage [2008/06/29(日) 18:46:37 ]
一冊で済む奴はいいよな
俺頭悪いから、というかCの悪い癖を徹底的に取り除きたかった
からそれなりの出費を強いられたよ

477 名前:デフォルトの名無しさん mailto:sage [2008/06/29(日) 18:50:37 ]
俺は入門書とD&Eで2冊だった。あとはweb。

478 名前:デフォルトの名無しさん mailto:sage [2008/06/29(日) 18:51:15 ]
webって手もあるね。

479 名前:デフォルトの名無しさん mailto:sage [2008/06/29(日) 18:51:55 ]
学校の図書館に散々リクエストしまくっている俺がいる。
卒業したらリクエスト出しづらくなるから、早く0xが出てくれないと困る。

480 名前:デフォルトの名無しさん mailto:sage [2008/06/29(日) 18:54:06 ]
0xが2009年末くらいに出たとして、そこからそれに対応したコンパイラや
書籍が揃うまで、どのくらいかかるんだろうね。



481 名前:デフォルトの名無しさん mailto:sage [2008/06/29(日) 18:55:03 ]
webも含めて、他人のソースを見るのは結構効果的だと思う。
オープンソース系や、STLとかboostとか。

482 名前:デフォルトの名無しさん mailto:sage [2008/06/29(日) 18:55:57 ]
コンパイラの方はすぐだろ
書籍はそれから半年遅れてドバッと出てくるか

まあC++でほとんどのプログラミングテクニックは
出尽くしているから文法本しか買わないと思う

483 名前:デフォルトの名無しさん [2008/06/29(日) 20:16:51 ]
知り合いの達人プログラマーに
何から始めたらいい?って聞いたら
C++とロキやれって言われたけど

ロキってなに?

484 名前:デフォルトの名無しさん mailto:sage [2008/06/29(日) 20:18:27 ]
Lokiは今更だなぁ。boostで良いと思うよ。

485 名前:デフォルトの名無しさん mailto:sage [2008/06/29(日) 21:19:50 ]
コンストラクタやデストラクタにinline指定をして、メリットって
けっこうあるもん?

486 名前:デフォルトの名無しさん [2008/06/29(日) 21:23:55 ]
>>485
inline は使いまくるほど最適化がかかりやすくなる

487 名前:デフォルトの名無しさん mailto:sage [2008/06/29(日) 21:26:53 ]
>>485
プロファイルしてみれ

488 名前:デフォルトの名無しさん mailto:sage [2008/06/29(日) 21:35:44 ]
するってぇと、もはやコンストラクタは一般に
explicit inline 指定はデフォ?

489 名前:デフォルトの名無しさん mailto:sage [2008/06/29(日) 21:37:19 ]
場合による。吐き出すコードのサイズと相談だ。

490 名前:デフォルトの名無しさん mailto:sage [2008/06/29(日) 21:37:52 ]
force inlineして結果変った場合だけつけろよ
デバッグするとき泣くぞ?



491 名前:デフォルトの名無しさん mailto:sage [2008/06/29(日) 21:49:44 ]
>>485
最適化がかかりやすくなるかもしれんが、実装をヘッダに晒すようだとデメリットも大きい。
inline で向上する効率を確かめて、さらにそれが必要だといえる時だけ使うのがいい。

492 名前:デフォルトの名無しさん mailto:sage [2008/06/29(日) 21:55:14 ]
L2キャッシュに収まりきらないコード量をinline指定によって
吐くようになった場合はかえって性能が低下する事がある

実際に走らせてみるかプロファイル取ってみるかだな

493 名前:デフォルトの名無しさん mailto:sage [2008/06/29(日) 21:56:36 ]
アクセッサ程度のメンバ関数なら、無条件でinlineでおk?

494 名前:デフォルトの名無しさん mailto:sage [2008/06/29(日) 22:11:51 ]
おk

495 名前:デフォルトの名無しさん mailto:sage [2008/06/29(日) 22:19:36 ]
逆にヘッダに実装書きつつ、inlineにしたくない場合って
void hoge::hage(){...} ってクラス定義の後に分けて書けば良いんだっけ?
※コンパイラオプションはそのままで

496 名前:デフォルトの名無しさん mailto:sage [2008/06/29(日) 22:23:45 ]
>>493
491と同じではないかと思うけど。
C++ coding standardに載っている時期尚早な最適化(だったかな)じゃないかと思う。

497 名前:デフォルトの名無しさん mailto:sage [2008/06/29(日) 22:24:26 ]
ヘッダに非inline関数の実装を書いたら、そのヘッダを取り込んだ
翻訳単位それぞれに関数の定義ができて、重複エラーになるんでは?

498 名前:デフォルトの名無しさん mailto:sage [2008/06/29(日) 22:30:16 ]
>>497
普通なるね。

499 名前:デフォルトの名無しさん mailto:sage [2008/06/29(日) 22:33:20 ]
>>497
ならない。

inline 関数の定義が、リンクされるすべてのコンパイル単位間で矛盾して無い限りは問題ない。

500 名前:デフォルトの名無しさん mailto:sage [2008/06/29(日) 22:33:33 ]
重複した同じ定義を一つにする方法って無いんだったっけ?
テンプレートクラスとかの型毎のインスタンスはリンク後は一つになるよね?



501 名前:デフォルトの名無しさん mailto:sage [2008/06/29(日) 22:34:08 ]
>>499
非inline関数でっせ?

502 名前:499 mailto:sage [2008/06/29(日) 22:34:30 ]
あれ?非inlineか。ごめん。

503 名前:デフォルトの名無しさん mailto:sage [2008/06/29(日) 22:41:40 ]
クラスの中に

static int a[] = {} かけないんだっけ?

504 名前:デフォルトの名無しさん mailto:sage [2008/06/29(日) 22:50:36 ]
>>503
無理
static const int のみ初期化OK

505 名前:デフォルトの名無しさん mailto:sage [2008/06/29(日) 22:52:14 ]
もっというと整数型がOKってことみたいだね。long や shortも
初期化おk

506 名前:497 mailto:sage [2008/06/29(日) 22:57:12 ]
よく考えたら、
メンバ関数ならOKで非メンバ関数だとNGじゃないかな。

507 名前:デフォルトの名無しさん mailto:sage [2008/06/29(日) 22:59:55 ]
>>506
どっちでも同じ。ただしメンバ関数をクラス定義内で定義した時は自動的に inline 扱いになる。

508 名前:デフォルトの名無しさん mailto:sage [2008/06/29(日) 23:35:16 ]
>>506
俺が497だwなりすますな

509 名前:デフォルトの名無しさん mailto:sage [2008/06/29(日) 23:52:16 ]
最近のC++の流行では
getter/setterはどうやって書くの?

510 名前:デフォルトの名無しさん mailto:sage [2008/06/29(日) 23:55:30 ]
マクロを使って読みにくく且つ簡潔に書きます



511 名前:デフォルトの名無しさん mailto:sage [2008/06/29(日) 23:55:57 ]
今までの話の流れからすると、実装はソースファイルに書くのが
基本みたいな話だね。ただ、inline指定してみて効果が顕著だったら
inlineにするみたいな。
しかし、ほとんどの参考書では、GetやSetはクラスの型定義内に
inlineとして実装されてるよね。あれが誤解の元なんだろうか。

512 名前:デフォルトの名無しさん mailto:sage [2008/06/30(月) 00:00:23 ]
誰か>>500教えて〜

513 名前:デフォルトの名無しさん mailto:sage [2008/06/30(月) 00:02:22 ]
リンカがよきにはからってくれるんじゃないの?

それか明示的にインスタンス化しておくとか

514 名前:デフォルトの名無しさん mailto:sage [2008/06/30(月) 00:06:04 ]
inlineはコンパイラによってはデフォルトで無視されるし
あまり気にしなくていいんじゃないの?
CPUがリターンキャッシュ持ってれば

515 名前:デフォルトの名無しさん [2008/06/30(月) 00:17:18 ]
>>492
P6のばやいL1じゃね?

516 名前:デフォルトの名無しさん [2008/06/30(月) 00:26:54 ]
>>514
無視するコンパイラにも、なるべく広範囲のソースを見せたほうがいい
処理系には何がしたいのかを伝えよ、禿の格言にもあるぞ

517 名前:デフォルトの名無しさん mailto:sage [2008/06/30(月) 00:27:04 ]
なんか初歩的な質問かもしれませんが、変数名やクラス名ってどう名づけてます?
変数や関数、インスタンスは小文字から始まり、
クラス名は大文字からはじめるのが一般的なんでしょうか
また、分かりやすい名前をつけると、クラス名とそのインスタンス名がかぶってしまうんですが、
何か分け方はありませんか

518 名前:デフォルトの名無しさん mailto:sage [2008/06/30(月) 00:31:40 ]
クラス名・変数名に迷ったら書き込むスレ。Part12
pc11.2ch.net/test/read.cgi/tech/1206118762/

ここで聞いてみるとか

519 名前:デフォルトの名無しさん mailto:sage [2008/06/30(月) 00:36:48 ]
>>517
クラス名の最初にcを付けてる

520 名前:デフォルトの名無しさん mailto:sage [2008/06/30(月) 00:41:40 ]
>>517
先生方のルールを参考にしてはどうかな
www.boost.org/doc/libs/1_35_0/boost/multi_array.hpp



521 名前:デフォルトの名無しさん mailto:sage [2008/06/30(月) 00:53:51 ]
一応>>520のを書いておくと

クラス名        :小文字+アンダーバーの組み合わせ(例:multi_array)
ネームスペース名 :クラス名同様
ローカル変数名  :クラス名同様のルールで短めに
メンバ変数名    :クラス名のルールに加えて最後にアンダーバー
             短くなくても良い(例:allocated_elements_)
関数名        :クラス名同様
テンプレート型引数名:パスカルケース(例:NDims)
マクロ名       :大文字+アンダーバーの組み合わせ
             (BOOST_STATIC_CONSTANT)

522 名前:デフォルトの名無しさん mailto:sage [2008/06/30(月) 00:54:58 ]
typedef enumはどうすれあいいの?

523 名前:デフォルトの名無しさん mailto:sage [2008/06/30(月) 01:03:51 ]
typedefはクラス名同様
enumはメンバ変数名と同じ

ただ、boostの中で完全に統一されてるわけでもないみたい

524 名前:デフォルトの名無しさん [2008/06/30(月) 01:04:28 ]
>>517
unko_t unko;

525 名前:デフォルトの名無しさん [2008/06/30(月) 01:16:04 ]
Cの勉強をしているのですが、VCでスタティックライブラリを作ってみたりしました。
その後、似たものでシェアードライブラリ(.so)なるものがあるのを知ったのですが、
VCで作成することはできますか?
検索してもgccばかりが見つかってしまって。

ライブラリのファイルがないとexeの実行ができないようですが、dllと何が違うのか分かりません。

526 名前:デフォルトの名無しさん mailto:sage [2008/06/30(月) 01:20:46 ]
>>525
dll と同じようなものです
UNIX系では shared object
Windows系では dynamic link library

527 名前:デフォルトの名無しさん mailto:sage [2008/06/30(月) 01:41:04 ]
>>517
>438で出てたGoogleのルールのまとめ:
●ファイル名
ぜんぶ小文字で、単語は_か-で区切る。foo-bar.cc
●クラス名
各語の先頭を大文字にする。 FooBar
●名前空間名
ぜんぶ小文字。区切りについては明記してないけど、_? foo_bar
●変数名
ぜんぶ小文字で、単語は_で区切る。 foo_bar
●メンバ変数名
ぜんぶ小文字で、単語は_で区切り、最後は_にする。foo_bar_
●関数名
クラス名と同じ。アクセサだけは変数名と同じ。
●定数
先頭にkを付けて、単語区切りは大文字。 kFooBar
●マクロ名
マクロなんて使うな。

アクセサと定数が妙だなあ。


528 名前:デフォルトの名無しさん mailto:sage [2008/06/30(月) 02:07:19 ]
定数の接頭語のkって何の意味?

529 名前:デフォルトの名無しさん mailto:sage [2008/06/30(月) 02:13:43 ]
konstant。なぜかこれだけドイツ語。

530 名前:デフォルトの名無しさん mailto:sage [2008/06/30(月) 02:13:47 ]
koteiのk



531 名前:デフォルトの名無しさん mailto:sage [2008/06/30(月) 02:16:10 ]
>>518-521,527
細かくありがとうございます
いろいろな方法があるんですね
検討して、しっくりくる方法を選びたいと思います


532 名前:デフォルトの名無しさん mailto:sage [2008/06/30(月) 03:23:02 ]
constant でプレフィクス c だと、コーディング規約にも関わらず class と混同しそうだな
マクロ禁止なら全部大文字でもよさそうだが・・・

533 名前:デフォルトの名無しさん [2008/06/30(月) 03:40:28 ]
メンバはm_というつまらん駄洒落をまだやってる俺はどーせM$かぶれだい

534 名前:デフォルトの名無しさん mailto:sage [2008/06/30(月) 07:48:41 ]
>>533
boostにもあったりするよw
www.boost.org/doc/libs/1_35_0/boost/regex/v4/regex_format.hpp
> const traits& m_traits;
> const Results& m_results;
> OutputIterator m_out;
> ...

535 名前:デフォルトの名無しさん mailto:sage [2008/06/30(月) 12:36:05 ]
標準的な識別子のプレフィックス一覧みたいなのなーい?
てか、どこの会社でもまちまちなんだろうけど。

536 名前:デフォルトの名無しさん mailto:sage [2008/06/30(月) 12:41:49 ]
プレフィックス一覧って?
命名ルールなら上で出てるgoogleかboostので十分だと思うけど。

537 名前:デフォルトの名無しさん mailto:sage [2008/06/30(月) 15:27:37 ]
なんか、なんちゃら記法みたいなのなかったっけ?
ポインタはpを付けるとか。C言語の時代か?

538 名前:デフォルトの名無しさん mailto:sage [2008/06/30(月) 15:49:34 ]
ジャンガリアン

539 名前:デフォルトの名無しさん mailto:sage [2008/06/30(月) 15:50:56 ]
ハンガリアン記法
ja.wikipedia.org/wiki/%E3%83%8F%E3%83%B3%E3%82%AC%E3%83%AA%E3%82%A2%E3%83%B3%E8%A8%98%E6%B3%95

ただし、ポインタにpを付けたりするのは
システムハンガリアンと呼ばれる間違ったハンガリアン記法。

本当のハンガリアン記法は
アプリケーションハンガリアンと呼ばれてる。

540 名前:デフォルトの名無しさん [2008/06/30(月) 19:08:04 ]
禿リアン



541 名前:デフォルトの名無しさん mailto:sage [2008/06/30(月) 19:30:34 ]
>>539
おお、それそれ。なんか批判が多いみたいだね。保守が大変とか。
けっきょくプレフィックスなんてないほうがいいのかね……


542 名前:デフォルトの名無しさん mailto:sage [2008/06/30(月) 19:44:44 ]
プレフィクスの使い方を間違わなければ有用らしいよ

間違ったコードは間違って見えるようにする - The Joel on Software Translation Project
local.joelonsoftware.com/mediawiki/index.php/%E9%96%93%E9%81%95%E3%81%A3%E3%81%9F%E3%82%B3%E3%83%BC%E3%83%89%E3%81%AF%E9%96%93%E9%81%95%E3%81%A3%E3%81%A6%E8%A6%8B%E3%81%88%E3%82%8B%E3%82%88%E3%81%86%E3%81%AB%E3%81%99%E3%82%8B


543 名前:デフォルトの名無しさん mailto:sage [2008/06/30(月) 20:29:03 ]
つまりアプリケーションハンガリアンてのは、識別子の補助的な意味を表す
プレフィックスを付けるって感じ?
システムハンガリアンはデータ型を表すプレフィックスを付けてるのかな?

544 名前:506 mailto:sage [2008/06/30(月) 21:13:12 ]
>>508
ごめん。眠かったから間違えた。 by498

545 名前:デフォルトの名無しさん mailto:sage [2008/06/30(月) 23:01:10 ]
void hoge(const std::vector<foo>& foos);
という宣言をヘッダ(hoge.h)に書いたとき,fooを宣言している
ヘッダもhoge.hでインクルードしないといけないでしょうか?
それともhoge.hでは
class foo;
と書くだけでおkでしょうか?

546 名前:デフォルトの名無しさん mailto:sage [2008/06/30(月) 23:50:55 ]
データを線形リストでアクセス可能かつキューのように
扱えるデータ構造ってありませんかね?

data[3].hogeみたいにアクセスもしたいし
dequeue(data)みたにもアクセスしたい

547 名前:デフォルトの名無しさん mailto:sage [2008/06/30(月) 23:58:57 ]
>>546
std::dequeが火を噴くときが来たな

548 名前:デフォルトの名無しさん mailto:sage [2008/07/01(火) 01:19:19 ]
なんという出番w

549 名前:デフォルトの名無しさん mailto:sage [2008/07/01(火) 08:09:47 ]
>>545
標準ライブラリのテンプレート引数は基本的に完全型じゃないとダメ。
つまり class foo; だけじゃダメ。

550 名前:デフォルトの名無しさん mailto:sage [2008/07/01(火) 10:33:31 ]
forkについて

1プロセスで三回printfを実行して別プロセスを作成
そこからまた三回printfを実行して別プロセス
10プロセス実行完了したら最初のプロセスから終了していく

そんな課題なのだけどforkが理解できなくて困っている…
申し訳ないですがバカな俺でも理解できるように解説してくださらんでしょうか?



551 名前:デフォルトの名無しさん mailto:sage [2008/07/01(火) 10:59:33 ]
>>550
まずスレ違い。OSの話で言語と関係無い。
で、もうちょっと端的に質問しないと、ググって出るような解説をするしかないよ。

552 名前:デフォルトの名無しさん mailto:sage [2008/07/01(火) 11:05:57 ]
>>550
fork → UNIX/Linux系のシステムコールで環境依存
printf → C言語
【初心者歓迎】C/C++室 Ver.55【環境依存OK】
pc11.2ch.net/test/read.cgi/tech/1213466622/l50

>そんな課題
C/C++の宿題を片付けます 111代目
pc11.2ch.net/test/read.cgi/tech/1214563642/l50

>解説して
www.google.com/search?q=fork

553 名前:デフォルトの名無しさん mailto:sage [2008/07/01(火) 12:25:56 ]
質問です。
newでメモリを動的確保する場合失敗するとNULLが返るのですが、
これを意図的に失敗させたい場合どのような手段があるでしょうか?
どういう場合にnewが確実に失敗するのかがよくわかりません。
よろしくお願いします。

554 名前:デフォルトの名無しさん mailto:sage [2008/07/01(火) 12:33:52 ]
>newでメモリを動的確保する場合失敗するとNULLが返るのですが
返らないよ.
newが失敗したらbad_allocって例外が投げられる
ためしに以下の失敗するコードを実行してみるといいよ
char *a = new char[0x7FFFFFFF];
if (a == NULL) printf("%s", "メモリ失敗"); // 標準準拠のコンパイラではこのコードは絶対に実行されない

555 名前:デフォルトの名無しさん [2008/07/01(火) 13:11:01 ]
>>554
先生、失敗しないんですけど

556 名前:デフォルトの名無しさん mailto:sage [2008/07/01(火) 13:24:11 ]
ワロタ

557 名前:デフォルトの名無しさん mailto:sage [2008/07/01(火) 14:00:19 ]
struct test_type{ char mem[0x7FFFFFFF]; };

test_type *a = new test_type[0x7FFFFFFF];
if(a == NULL) printf("%s", "print format");

558 名前:デフォルトの名無しさん mailto:sage [2008/07/01(火) 14:28:44 ]
>>555 for (;;) で囲め。

559 名前:デフォルトの名無しさん mailto:sage [2008/07/01(火) 15:19:53 ]
コンパイラのバージョンを聞いたほうがいい
古いやつとか組み込み用は標準と違う動作をするだろ

560 名前:553 mailto:sage [2008/07/01(火) 16:19:49 ]
ご回答ありがとうございます。
コンパイラはVC++2005付属のMSコンパイラVer 8.00.50727.42です。
>>554のサンプルコードを試しましたが、確かにNULLでなく例外を投げていますた。
コンパイラが古いとNULLを返す仕様になっているのでしょうか?



561 名前:デフォルトの名無しさん mailto:sage [2008/07/01(火) 16:27:37 ]
10年くらい前なら NULL を返したかもしれない
今はみんな bad_alloc を投げる

562 名前:デフォルトの名無しさん mailto:sage [2008/07/01(火) 18:37:37 ]
msdn.microsoft.com/ja-jp/library/kftdy56f(VS.80).aspx
>In Visual C++ 2005, the C Runtime Library's new function will also
>throw a std::bad_alloc exception if the memory allocation fails.
>If you still want the non-throwing version of new for the C Runtime Library,
>link your program with nothrownew.obj. However, when you link with nothrownew.obj,
>new in the Standard C++ Library will no longer function.

563 名前:デフォルトの名無しさん mailto:sage [2008/07/01(火) 18:54:03 ]
失敗時に NULLがほしいときは new (std::nothrow) じゃなかったっけ。

564 名前:デフォルトの名無しさん [2008/07/01(火) 19:52:48 ]
>>557
数学的に破綻してるコード嫌い

565 名前:デフォルトの名無しさん mailto:sage [2008/07/01(火) 19:57:04 ]
今、MSもVC++ Express Editionなる、無料コンパイラ配布してんだし、
最新の2008を使うべきでは。商用コンパイラ必要になるほどの
大プロジェクトじゃないならね。

566 名前:デフォルトの名無しさん mailto:sage [2008/07/01(火) 20:00:24 ]
>>564
数学的に破綻って?

567 名前:デフォルトの名無しさん [2008/07/01(火) 20:18:41 ]
>>566
失敗しない環境がありうるだろ
7で始まるのがプゲラとか言う問題ではない

568 名前:デフォルトの名無しさん mailto:sage [2008/07/01(火) 20:43:06 ]
大抵の環境で失敗するだろうから細かいことはいいんだお!

569 名前:デフォルトの名無しさん mailto:sage [2008/07/01(火) 20:44:11 ]
size_tの最大値じゃん。

570 名前:デフォルトの名無しさん mailto:sage [2008/07/01(火) 20:56:07 ]
>565
Express Edition は無料でいいんだが、MFCが使えん。

お偉いさんは、見た目が一番なんだよ。



571 名前:デフォルトの名無しさん [2008/07/01(火) 21:53:20 ]
>>570
見た目を気にするなら、なおさらMFCはダメだろ

572 名前:デフォルトの名無しさん [2008/07/01(火) 22:11:16 ]
>>569
何が?

573 名前:デフォルトの名無しさん mailto:sage [2008/07/01(火) 23:35:10 ]
size_tは符号無し整数だよ。サイズは処理系定義だけど。
それはともかく、普通に2Gも確保出来るってのが・・・w

>>565
2008はWin2Kに入らなかったりしてなw
2Kをバカにすん(ry

>>570
WTL+ATL使おうぜ

574 名前:デフォルトの名無しさん mailto:sage [2008/07/02(水) 00:01:19 ]
>>573
メモリ確保操作は、物理メモリのサイズが足りなくても
アドレスだけ確保して返して成功してしまう場合がある。
実際に手元の2GBしかメモリ積んでないマシンで2.5GB確保してもなんなく成功する。

これは、デマンドページングといって、物理メモリの確保が
実際にメモリを踏んだ段階で初めて起こるような仕組みが存在するため。
C++のnewの場合は、コンストラクタでメモリを踏んでしまう場合があるから
この仕組みがあったからといって実際に得はしないような気はするけどな。

575 名前:デフォルトの名無しさん mailto:sage [2008/07/02(水) 00:04:33 ]
UNIX系はそうなんだっけか
まあVCには全く関係がないな
連続した大領域確保しようとするとよく失敗するし

576 名前:デフォルトの名無しさん mailto:sage [2008/07/02(水) 00:11:04 ]
>>574
デマンドページングが動いている状態で、実際には確保されていない(&できない)アドレスにアクセスしたらどうなるの?

577 名前:デフォルトの名無しさん mailto:sage [2008/07/02(水) 00:12:46 ]
>>574
単にスワップメモリで足りただけじゃね?

578 名前:デフォルトの名無しさん mailto:sage [2008/07/02(水) 00:24:19 ]
>>576
典型的にはいらないページをスワップアウトしにいく

>>577
確保だけならスワップは発生せずに即終了する

579 名前:デフォルトの名無しさん mailto:sage [2008/07/02(水) 00:35:06 ]
「スワップに充分な領域が必要」な環境もあるし
「スワップに余裕があるか判断しない」環境もある。
後者だと、アクセスした途端にシステム全体でのメモリが不足することになる。
www.linux.or.jp/JM/html/LDP_man-pages/man3/malloc.3.html
>>578の世界はLinuxだけで出来ている模様。

あと、どうしても失敗したければ
new char[2 << (sizeof(void *) * CHAR_BIT - 1) - 1]; を2回もやれば十分だろうが
この2を2Lにしないとオーバーフローする環境もあるし
逆にlong引数のnewを認めない環境もあるんだろうな。

580 名前:デフォルトの名無しさん [2008/07/02(水) 01:31:51 ]
> new char[2 << (sizeof(void *) * CHAR_BIT - 1) - 1]; を2回もやれば十分だろうが

だから、何でそうなる



581 名前:578 mailto:sage [2008/07/02(水) 01:42:20 ]
>>579
ん? なんで自分がバカにされているのか全然理解できないんだけど
いろいろな環境があることを頭に置いているからこそ578では
「典型的には」と頭につけたんだけどな

あとそのコード変だよ
少なくともビットシフトされる方は 2 じゃなくて 1 じゃないとおかしいし
そういうことやりたいなら
new char[std::numeric_limits<size_t>::max()] で十分じゃないかな
# ちなみにこういう最大限のメモリ確保は常識的な環境ならば1回ですぐに失敗するはず
# なぜなら、普通はスタックのためのアドレス空間やカーネルアドレス空間が同居しているから

582 名前:デフォルトの名無しさん [2008/07/02(水) 12:26:21 ]
> new char[std::numeric_limits<size_t>::max()] で十分じゃないかな

やっと出てきたw
が途中UNIXが出てきたり、やっと出てきたこれもmay beな言い方なので合格点はやれんな

583 名前:デフォルトの名無しさん mailto:sage [2008/07/02(水) 12:35:24 ]
std::size_t

584 名前:デフォルトの名無しさん mailto:sage [2008/07/02(水) 12:36:06 ]
SIZE_MAX

585 名前:デフォルトの名無しさん mailto:sage [2008/07/02(水) 16:03:07 ]
VC++のスレから来ました。相談させてください。

以下の710の質問をしました。
711の回答をもらいました。
それはそうだ、と納得しました。

---
710 :デフォルトの名無しさん [↓] :2008/07/02(水) 15:02:13
templateの使い方を教えてください
class parent;
class child : parent;
の2つのクラスがあって、
void hogeFunc(vector<shared_ptr<parent> > & param)
を呼び出したいとき、
vector<shared_ptr<parent> > vp;
は渡せるけど、
vector<shared_ptr<child> > vc;
が渡せないのはなんでかわからないです。
お分かりの方、理由を教えていただけないですか。
ちゃんと、pとcは親子関係にあるので問題ないと思っています。

711 :デフォルトの名無しさん [↓] :2008/07/02(水) 15:07:53
vector<shared_ptr<child> >& から vector<shared_ptr<parent> >& に変換できないから。
---

で、解決方法について相談させてください。以下は正しいですか?
・ void hogeFunc(vector<shared_ptr<parent> > & param)
 のように、多態をvectorでやろうとしてるのが根本的に間違っている。
間違っているならこういったコンテナの要素を多態で扱いたいときは、
どのようにコーディングされているのか教えてください。

586 名前:デフォルトの名無しさん mailto:sage [2008/07/02(水) 16:27:04 ]
template<typename T> void hogeFunc(vector<shared_ptr<T> > & param){
   struct check{ void f(){ T* a=NULL; parent* b = a; } };

   ...
}

587 名前:デフォルトの名無しさん mailto:sage [2008/07/02(水) 17:29:52 ]
樹木型(IPアドレスのような)のクラスを作成するにはどのようにしたらいいですか?

588 名前:デフォルトの名無しさん mailto:sage [2008/07/02(水) 17:34:46 ]
class Tree {
Tree[] subtrees;
}

589 名前:デフォルトの名無しさん mailto:sage [2008/07/02(水) 17:36:01 ]
ここC++だったorz
こんなのでいいんじゃない
class Tree {
std::vector<Tree*> subtrees;
};

590 名前:デフォルトの名無しさん mailto:sage [2008/07/02(水) 17:55:38 ]
template<typename T> struct node<T> {
  T value;
  node* prev;
  node* next;
  node* parent;
  node* first_child;

  static node* tree_next(node* n){
    if(n==NULL){ return NULL; }
    if(n->first_child!=NULL){ return n->first_child; }
    return tree_next_no_child(n);
  }
  static node* tree_next_no_child(node* n){
    if(n==NULL){ return NULL; }
    if(n->next!=NULL){ return n->next; }
    if(n->parent==NULL){ return NULL; }
    return tree_next_no_child(n->parent);
  }
};

for(node* it=n; it!=NULL; it=node::tree_next(it)){
  
}



591 名前:デフォルトの名無しさん [2008/07/02(水) 18:27:09 ]
>>587
C++を使う
できない人は他のスレで聞く

592 名前:デフォルトの名無しさん mailto:sage [2008/07/02(水) 18:47:12 ]
>>591
ここってC++スレじゃないのか??

593 名前:デフォルトの名無しさん [2008/07/02(水) 20:33:00 ]
>>592
そうだけど、あの聞き方ではhello worldから教える必要があるだろ

594 名前:デフォルトの名無しさん mailto:sage [2008/07/02(水) 20:53:29 ]
俺も興味あるんだが多階層にクラスを定義した場合下みたいな使いかたってできる?
Aclass.Bclass.element = NULL
昔クラスのpublic下にクラスを定義し派生用の関数で増やせるようなものを作ろうとしたんだがうまくいかなかった記憶があるもんで…

595 名前:デフォルトの名無しさん mailto:sage [2008/07/02(水) 21:03:01 ]
class Hoge {
const char msg="nullpo";
}

これだとエラー出ますが、こういうことをconst付けてやるにはクラス外に書くか
クラス.cppの方に書くか、もしくは使用する関数の中で書くしか無いのでしょうか。

596 名前:デフォルトの名無しさん mailto:sage [2008/07/02(水) 21:03:35 ]
大体型がおかしいだろ。
staticつけとけ

597 名前:デフォルトの名無しさん mailto:sage [2008/07/02(水) 21:22:21 ]
よーだょ。
ただしbool/char/short/int/long系に限りできる。floatは×

598 名前:デフォルトの名無しさん mailto:sage [2008/07/02(水) 21:23:55 ]
どうも、static付けてみます

599 名前:デフォルトの名無しさん mailto:sage [2008/07/02(水) 21:40:22 ]
enumが便利だよ

600 名前:デフォルトの名無しさん mailto:sage [2008/07/02(水) 21:45:09 ]
あ、なるほど。すっかり忘れてました。



601 名前:デフォルトの名無しさん mailto:sage [2008/07/03(木) 00:45:52 ]
C++0x出たら、ハゲはプログラミング言語C++の改訂版だすのかな?
なんか第3版の次の版が洋書では出てたけど、日本語版はスルーなのかな。
まぁこのタイミングでだしてもしょうがないし、できればC++0x反映させた
版を出して欲しいけどね。

602 名前:デフォルトの名無しさん mailto:sage [2008/07/03(木) 01:10:26 ]
const 定数のみのクラスってどうやってかけばいいのですか?
あとこういうエラー用の定数クラスは1枚のファイルに1こずつ
定義するのが流儀?

603 名前:デフォルトの名無しさん mailto:sage [2008/07/03(木) 01:14:11 ]
Javaじゃあるまいし

604 名前:デフォルトの名無しさん mailto:sage [2008/07/03(木) 01:29:34 ]
>>602
なんでクラスの中に定義する必要があるの
せいぜいネームスペースでいいじゃん

605 名前:デフォルトの名無しさん mailto:sage [2008/07/03(木) 01:34:25 ]
シングルトンですけど、boostに入ってないですよね?
Lokiぐらいしかないんでしょうか?

606 名前:デフォルトの名無しさん mailto:sage [2008/07/03(木) 01:45:21 ]
すみません、素朴な疑問なのですが
C++ではハードあるいはOSレベルの例外(例えば零による除算)は
通常どのように扱うののでしょうか?

もう少し具体的に言うと、例えばVC++なら_ _try, __except という
構造化例外のための機能が提供されていますが、
gccなどの他のコンパイラではこれと同様な機能を実現する手段は
ないのでしょうか。

windows, linux 双方で稼動させる必要のあるシステムを作るとしたら、
例外処理をどのようにするべきなのか非常に疑問です。

607 名前:606 mailto:sage [2008/07/03(木) 01:47:54 ]
うーん・・・

msdn.microsoft.com/ja-jp/library/cc440193(VS.71).aspx
>C++ でプログラミングしたり、コードに移植性を持たせたい場合は、
>可能な限り標準 C++ の例外を使うことを強くお勧めします。

developer.mozilla.org/ja/docs/C%2B%2B_Portability_Guide
>例外は、幅広くは実装されていない C++ の次なる一例です。
>そのため、それらの使用は C++ の移植性を低下させます。
>例外を使ってはいけません。運悪く、同じような機能をもったよい代替案はありません。

例外についての注意勧告がされていますが、では実際にどうするかという
代替案はないということなのか・・?

608 名前:デフォルトの名無しさん mailto:sage [2008/07/03(木) 01:55:31 ]
>>605
209.85.175.104/search?q=cache:FXdOX_s6DgAJ:pc11.2ch.net/test/read.cgi/tech/1192662575/386-411+singleton

609 名前:デフォルトの名無しさん mailto:sage [2008/07/03(木) 01:56:59 ]
鼻から悪魔という言葉があってな

610 名前:デフォルトの名無しさん mailto:sage [2008/07/03(木) 02:05:31 ]
>>607
俺はWinCE用のソースとかでは
std::auto_ptr<std::exception> を戻り値にしてる。
コンストラクタで失敗したものは fail() で返す。
で、毎回戻り値などのチェック。

パフォーマンス悪そうだし面倒なので全部そうしてるわけじゃないけど。



611 名前:デフォルトの名無しさん mailto:sage [2008/07/03(木) 02:09:18 ]
>>607
VC++の話をすると、/EH系のオプションがあって最適化やパフォーマンスの関係で使い分ける。
 オプションなしの場合C++例外は一切使わない。
 /EHs(c) 同期例外だけをキャッチする。c で extern "C"関数は例外を発生させないと仮定する。
 /EHa  同期と非同期例外をc++例外としてキャッチする。
で /EHaの場合は stack overflowを除くほとんどのハード系の例外をキャッチ出来る。
もちろんゼロ除算も。

612 名前:デフォルトの名無しさん mailto:sage [2008/07/03(木) 02:09:23 ]
>>608
どうもです。
detailsの中にあることにはあるんですね。
とりあえずkろえを使っておきます。

613 名前:デフォルトの名無しさん mailto:sage [2008/07/03(木) 02:26:36 ]
>>610-611
ありがとうございます。

VC++の場合はわかるのですが、
gccなどでは同じような処理を行えないのでしょうか?
メモリの不正アクセスにしろ零除算にしろ、いくらでも
起こりうる例外だと思うのですが、Javaのように
統一的にcatchできないものかと悩んでいます・・・。

実際、至るところで零除算の起こりうる数値解析の
ようなシステムを作ったとして、いざシステムを起動
したら零除算で処理が中断したが、どこで起こったかは
わからない、なんてことは有り得ないですよね・・?

614 名前:デフォルトの名無しさん mailto:sage [2008/07/03(木) 03:24:19 ]
gccというよりunix系だとそういうのはsignalではないかな。
ゼロ除算ぐらいなら例外ではなくてプログラムで事前にチェックすべきもので、
メモリの不正アクセスはデバッグ時に潰すべきもので、
例外でキャッチしてリカバリーをかける類のものじゃない。


615 名前:デフォルトの名無しさん mailto:sage [2008/07/03(木) 05:55:32 ]
>>585
最初から vector<shared_ptr<parent> > だけ使ってればいいんじゃね?

616 名前:デフォルトの名無しさん mailto:sage [2008/07/03(木) 05:59:33 ]
>>594
struct { struct { void* element; } Bclass; } Aclass;
よくわからんが、これでやりたいことができたことになるの?

617 名前:デフォルトの名無しさん mailto:sage [2008/07/03(木) 06:33:36 ]
>>607
どこまでの移植性が必要かで判断すればいい。
Windowsだけなら構造化例外を使ってもいいだろうし。、gccあたりを含めるならくらいなら例外は使えるだろうし。


618 名前:デフォルトの名無しさん [2008/07/03(木) 09:30:37 ]
>>607
mozilla のページ、情報がえらく古いな
もっとも古いというだけでは済まされない記述も散見されるが

619 名前:585 mailto:sage [2008/07/03(木) 10:09:51 ]
>>586
目からうろこがぼろぼろでた気分です。
ありがとうございました。

620 名前:デフォルトの名無しさん [2008/07/03(木) 12:12:50 ]
shared_ptrをメンバとして持つクラスで、そのメンバを取得したいとき、
getBBB1, getBBB2, getBBB3の実装をした場合、状況によるんでしょうが、適切なのはどれか教えてもらえないですか。
それぞれのメリット、デメリットがはっきりとわかっていません。
class AAA {
private:
  shared_ptr<BBB> bbbptr;
public:
  AAA() {
    bbbptr = new BBB;
  }
  shared_ptr<BBB> getBBB1() {
    return bbbptr;
  }
  shared_ptr<BBB>& getBBB2() {
    return bbbptr;
  }
  BBB* getBBB3() {
    return bbbptr;
  }
};




621 名前:デフォルトの名無しさん mailto:sage [2008/07/03(木) 12:55:48 ]
状況による面もあるけど、
基本的にBBB1以外は間違った使い方だと思っていい。

622 名前:デフォルトの名無しさん mailto:sage [2008/07/03(木) 13:00:22 ]
#include <stdio.h>

int main(void)
{
float f;

for(f=1.0; (int) f<=5; f=f + 0.1)
printf("%f \n", f);

return 0;
}

このプログラム実行したら

2.600000
2.700000
2.799999
2.899999
2.999999
3.099999
3.199999
3.299999
3.399999
3.499999

と2.7から普通に計算できなくなりました
2.700000
2.800000
2.900000
と計算するようにしたいのですがどればいいですか?


623 名前:デフォルトの名無しさん mailto:sage [2008/07/03(木) 13:07:39 ]
>>622
float -> double
もしくは
二進化十進表現でgoogle

624 名前:デフォルトの名無しさん [2008/07/03(木) 13:16:32 ]
>>623
できました><
floatって精度かなり悪いみたいですね・・・

625 名前:デフォルトの名無しさん mailto:sage [2008/07/03(木) 13:40:07 ]
>>622
つうか思いっきりC言語じゃね?

626 名前:デフォルトの名無しさん [2008/07/03(木) 13:48:35 ]
Cで利用されることが推奨されているDLLがあって、そのヘッダファイルがC用に提供されていて、
それをC++で利用できない場合って、どういう理由が考えられますか?

できない場合があるとしたら、回避方法は、自分でヘッダを修正するってことでしょうか?

627 名前:デフォルトの名無しさん mailto:sage [2008/07/03(木) 13:57:25 ]
マングリング
extern "C"

628 名前:デフォルトの名無しさん [2008/07/03(木) 16:25:02 ]
>>626
#ifdef __cplusplus
#error C++ is not supported
#endif
とか書かれてるなら諦めるしかないだろ。

629 名前:デフォルトの名無しさん [2008/07/03(木) 17:52:58 ]
誰か教えてください。。。

現在プログラムでマウスクリックをさせるものを作っていて、
ボタンのクリックなどはできるようになったのですが、
タブ(TabControl)の切り替えができません。

だれかご存知の方がいましたらご教授いただけると助かります。。

以下プログラム抜粋----------------------------------
POINT pt = {任意の座標X , 任意の座標Y};
HWND hWnd = ::WindowFormPoint(pt.x , pt.y);

// マウスを任意の位置に移動
SetCursorPos(pt.x , pt.y);
// クリック (Down -> UP)
::SendMessage(hWnd , WM_LBUTTONDOWN , 0 , MAKELPARAM(pt.x , pt.y));
::SendMessage(hWnd , WM_LBUTTONUP , 0 , MAKELPARAM(pt.x , pt.y));

よろしくお願いします。

630 名前:デフォルトの名無しさん mailto:sage [2008/07/03(木) 18:03:14 ]
スレ違い、Win32APIスレで聞いたら



631 名前:デフォルトの名無しさん mailto:sage [2008/07/03(木) 18:18:18 ]
>>620
BB1は安全。戻り値最適化が期待できるので速度も十分
BB2は参照が生きているうちにAAAが削除される場合に問題が発生するが、それに気をつければ高速に使える。
BB3は危険。別のshared_ptrに戻りを代入するミスを誘発しそう。

632 名前:デフォルトの名無しさん mailto:sage [2008/07/03(木) 23:49:12 ]
BBB2も代入できるだろ

633 名前:デフォルトの名無しさん mailto:sage [2008/07/05(土) 21:52:38 ]
C99では
if (...)
statement...;
else
statement...;
などのstatementがそれぞれ{}で囲まれたように扱われるようですが
これはC++から来たものなのですか?

634 名前:デフォルトの名無しさん mailto:sage [2008/07/05(土) 21:54:36 ]
元から (C89から) そうでは?

635 名前:デフォルトの名無しさん mailto:sage [2008/07/05(土) 21:59:52 ]
C99よく知らないんだけど、
囲まれたように扱われる場合と
囲まれたように扱われない場合って何が違うの?

636 名前:デフォルトの名無しさん mailto:sage [2008/07/05(土) 22:08:27 ]
変数のスコープのこといってるんじゃね?

637 名前:デフォルトの名無しさん mailto:sage [2008/07/05(土) 22:11:41 ]
>>636
そもそも{}で囲まないと変数は定義できないだろう。

638 名前:デフォルトの名無しさん mailto:sage [2008/07/05(土) 22:14:32 ]
もともとif文の構文は
if (expr) statement [ else statement ]

expr ; の形の単文はstatementだから{}で囲む必要は無い
複文はstatementではないから、{}で囲んでstatementにしなければならない

そんだけのことだ
C99とかは関係ないだろ

639 名前:デフォルトの名無しさん mailto:sage [2008/07/05(土) 23:36:13 ]
seclan.dll.jp/c99d/c99d07.htm#dt19991108
「選択文と反復文のブロック化」のことだな。
C++にもあるぞ、X3014:2003「6.4 選択文」の1, 2節目などなどに規定がある。

そこではこういう例が載せられている。
if (x)
  int i;
このルールによって、if文を抜けたらiはもう使えないという具合。

>>637
C++だと、ブロック内の宣言は文だから、できるんだなこれが。
C99だと(なぜかC++と違って)文ではないから、お前の言うとおり出来ないけどな。

640 名前:デフォルトの名無しさん mailto:sage [2008/07/06(日) 04:17:21 ]
>>639
そんなVC6の時代の知識で語られても。



641 名前:デフォルトの名無しさん mailto:sage [2008/07/06(日) 04:23:29 ]
VC6でお世話になったマクロの意味がわかる
#define for if (0); else for


642 名前:デフォルトの名無しさん mailto:sage [2008/07/06(日) 13:09:27 ]
#define 定義は極力使わない方がいい、と、セキュアプログラミング系の本に書いてあったが

643 名前:デフォルトの名無しさん mailto:sage [2008/07/06(日) 13:13:43 ]
>>642
それは生兵法というもの

644 名前:デフォルトの名無しさん mailto:sage [2008/07/06(日) 13:30:48 ]
#define SubclassWindowみたいなマクロは死ねばいいと思う
使うならせめて大文字ですよね

645 名前:デフォルトの名無しさん mailto:sage [2008/07/06(日) 13:51:36 ]
>>642
OpenSSL脂肪wwwwwwwww

646 名前:デフォルトの名無しさん mailto:sage [2008/07/06(日) 14:42:59 ]
あとで#undefで即死されるマクロはいつもasdfだとかzxcvだとかに命名してる

647 名前:デフォルトの名無しさん mailto:sage [2008/07/06(日) 16:56:32 ]
>>646のコードはメンテしたくない。

648 名前:デフォルトの名無しさん [2008/07/06(日) 20:25:50 ]
同じく

649 名前:デフォルトの名無しさん mailto:sage [2008/07/07(月) 08:09:21 ]
hogehogeマクロ内でboost.pp.repeatとかつかってて子マクロが必要なら、
hogehoge_iとかhogehoge_iiにしてる。
後で#undefで即死されるのは同じだが。

650 名前:デフォルトの名無しさん mailto:sage [2008/07/08(火) 00:13:06 ]
while(1)中のswtch文で特定のcaseの場合whileから抜けたいのですが2重の構造をbreakさせる方法はありませんか?
gotoで抜ける手も考えましたがあまりスマートな方法じゃないのでできれば避けたいです



651 名前:デフォルトの名無しさん mailto:sage [2008/07/08(火) 00:13:48 ]
while(1)をやめる

652 名前:デフォルトの名無しさん mailto:sage [2008/07/08(火) 00:19:50 ]
whileの代わりにgotoをつかえばいい

653 名前:デフォルトの名無しさん mailto:sage [2008/07/08(火) 00:26:15 ]
>>650
フラグかgotoのどちらかを選ぶんだ。

654 名前:デフォルトの名無しさん mailto:sage [2008/07/08(火) 00:29:06 ]
>>650
そのwhileブロックは、breakをreturnに変えて
何らかの意味のある名前を付けられるくらいの処理ではありませんか?

655 名前:650 mailto:sage [2008/07/08(火) 00:40:53 ]
whileを続行するかどうかのフラグ判定式に変更しwhileを抜ける場合はFALSEにセットしてからcontinueすればいい

656 名前:650 mailto:sage [2008/07/08(火) 00:42:49 ]
ということに気づき自己解決しました。
レスありがとうございました
(うっかりEnterと一緒にShiftを押してしまい途中で書き込んでしまいました…)

657 名前:デフォルトの名無しさん mailto:sage [2008/07/08(火) 05:41:19 ]
あくまで自己解決と言い張るならもう質問すんなよ

658 名前:デフォルトの名無しさん mailto:sage [2008/07/08(火) 06:09:44 ]
何怒ってんだよw

659 名前:デフォルトの名無しさん mailto:sage [2008/07/08(火) 06:25:05 ]
657は別に怒ってないと思うが、658はなんでちょっぴり興奮してるんだろ、とは思う

660 名前:デフォルトの名無しさん mailto:sage [2008/07/08(火) 09:38:38 ]
>>653 でフラグ使えと書いてるのに、そんなレスみるまでもなく自分で解決したよ
と言うからだろうw



661 名前:デフォルトの名無しさん mailto:sage [2008/07/08(火) 09:56:40 ]
時間を鑑みるに、おっきしてるのを鎮めてる最中だったんだよきっと

662 名前:デフォルトの名無しさん mailto:sage [2008/07/08(火) 11:15:01 ]
自分のレスの後、同じような内容で
自己解決したと書かれたくらいで、もう質問すんなとか、
もうちょっと心に余裕を持った方が良いかと。

663 名前:デフォルトの名無しさん mailto:sage [2008/07/08(火) 11:20:05 ]
良いなぁこの馬鹿をかばう気持ち悪い空気

664 名前:デフォルトの名無しさん mailto:sage [2008/07/08(火) 11:23:10 ]
相当頭に来てる御様子ですね。

665 名前:デフォルトの名無しさん mailto:sage [2008/07/08(火) 11:27:14 ]
自己解決と書くのは、質問者が「お前ら役立たず」と言ってるようなもんだからなw

666 名前:デフォルトの名無しさん mailto:sage [2008/07/08(火) 11:35:03 ]
>>664
ていうか、こう書けば誰を馬鹿と思ってるのかがわかると思ったんで。

なるほどね。

667 名前:デフォルトの名無しさん mailto:sage [2008/07/08(火) 11:46:23 ]
>>666
>>662の後に>>663なら、普通は
>>650(馬鹿)をかばう気持ち悪い空気」と捉えるでしょう?
そこでこう書けばというのは、それこそ馬鹿丸(ry

668 名前:デフォルトの名無しさん mailto:sage [2008/07/08(火) 11:48:25 ]
もう質問者にとって、このスレは用済みだからこねえよ

669 名前:デフォルトの名無しさん mailto:sage [2008/07/08(火) 12:42:48 ]
>>667
うん、こう書けば、無駄に食い下がるかどうかで痛い人かどうかがわかると思ったんで。

なるほどね。

670 名前:デフォルトの名無しさん mailto:sage [2008/07/08(火) 12:49:02 ]
オレには悔しいから一歩引いた視点の第3者を装って「なるほどね」と書いてるように見える。



671 名前:デフォルトの名無しさん mailto:sage [2008/07/08(火) 12:50:18 ]
>>669
それは自虐ギャグですか?

672 名前:デフォルトの名無しさん mailto:sage [2008/07/08(火) 16:19:05 ]
unique_ptrって本当にC++0xに入ってくれるんだろうか

673 名前:デフォルトの名無しさん mailto:sage [2008/07/08(火) 16:47:35 ]
ばかばっか

674 名前:デフォルトの名無しさん mailto:sage [2008/07/08(火) 17:18:49 ]
>>673
お前がな

675 名前:デフォルトの名無しさん mailto:sage [2008/07/08(火) 17:26:45 ]
>>674
オマエモナー

676 名前:デフォルトの名無しさん mailto:sage [2008/07/08(火) 17:27:46 ]
いってよし?

677 名前:デフォルトの名無しさん mailto:sage [2008/07/08(火) 18:06:30 ]
逝ってよし

678 名前:デフォルトの名無しさん [2008/07/08(火) 22:11:51 ]
>>650
なぜスマートな方法ではないと思うのかを誤魔化さずきちんと述べよ

679 名前:デフォルトの名無しさん mailto:sage [2008/07/08(火) 22:13:35 ]
gotoは悪って(事実かどうかは別にしても)よく言われてるからだろ。
多分。

680 名前:デフォルトの名無しさん mailto:sage [2008/07/08(火) 22:38:18 ]
初心者スレと分けてる意味が無いように思う



681 名前:デフォルトの名無しさん mailto:sage [2008/07/09(水) 00:33:06 ]
初心者スレってVC++しかなくね?

682 名前:デフォルトの名無しさん mailto:sage [2008/07/09(水) 00:33:08 ]
newで動的確保をする際の質問なのですが
Base* foo = new Base(int bar);
この書き方だとBaseの引数付きコンストラクタが呼ばれる事はわかるのですが
動的に配列を確保する場合に引数付きコンストラクタを呼ぶ事は可能なのでしょうか?

イメージ的には↓のようなことをしたいです
Base* foo = new Base[3] {Base(int bar), Base(int bar), Base(int bar), };

683 名前:デフォルトの名無しさん mailto:sage [2008/07/09(水) 00:37:08 ]
出来ません

684 名前:デフォルトの名無しさん mailto:sage [2008/07/09(水) 00:37:54 ]
>>683
ありがとうございます

685 名前:デフォルトの名無しさん mailto:sage [2008/07/09(水) 07:03:55 ]
一度配列か何かを確保しておいて、そこにforで引数付きコンストラクタをnewして回せば解決する。
デストラクタに注意

686 名前:デフォルトの名無しさん mailto:sage [2008/07/09(水) 12:38:32 ]
まずメモリに連続した領域内に生成したいものが、ほんとうに
クラスのインスタンスじゃないとダメなのか再考してみたら?

687 名前:デフォルトの名無しさん [2008/07/09(水) 12:41:11 ]
引き数つきのnewか…これはわりと難しいので、
あとで初期化用メソッドを呼ぶかポインタの配列にしたほうがらくちん。


688 名前:デフォルトの名無しさん mailto:sage [2008/07/09(水) 19:09:17 ]
VC6以前のVS持っている人はいませんか?
DDE spyを分けて欲しいのですが・・・

689 名前:デフォルトの名無しさん mailto:sage [2008/07/09(水) 19:18:31 ]
2.0のなら転がってるPCのHDDあされば出てくるかもだが・・・

690 名前:デフォルトの名無しさん mailto:sage [2008/07/09(水) 19:56:05 ]
>>688
それってダメなんじゃないの?



691 名前:デフォルトの名無しさん mailto:sage [2008/07/09(水) 20:48:29 ]
>>682
vectorじゃだめなのかい?

692 名前:デフォルトの名無しさん mailto:sage [2008/07/10(木) 06:15:03 ]
最新のVC++コンパイラって、C99に対する完全な上位互換を持っていると
思っていいの?

693 名前:デフォルトの名無しさん mailto:sage [2008/07/10(木) 07:29:57 ]
C99はまだスルーされてる

694 名前:デフォルトの名無しさん mailto:sage [2008/07/10(木) 11:04:51 ]
まだどころか多分永遠にスルーされる
今の所C99に準拠しているのはIntel C++程度

695 名前:デフォルトの名無しさん mailto:sage [2008/07/10(木) 11:05:45 ]
C99なんて有ったの… とか

696 名前:デフォルトの名無しさん mailto:sage [2008/07/10(木) 12:30:01 ]
対応させるメリットないしな

697 名前:デフォルトの名無しさん mailto:sage [2008/07/10(木) 14:39:59 ]
一行コメントと関数途中やfor初期化部での変数宣言に対応してくれればあとはいいや

698 名前:デフォルトの名無しさん mailto:sage [2008/07/10(木) 15:25:18 ]
たしかVC++チームのブログのコメント欄だかで、C99対応してくれってユーザの声はほとんど無いって言っていたような。
C99のいくつかの有用な機能、一行コメントだとか、restrictだとかは取り入れたが、C99全部入れても、誰も使わないしなぁ。
Variable-length arrayなんて、いまどき誰が使うんだ。

699 名前:デフォルトの名無しさん mailto:sage [2008/07/10(木) 15:51:39 ]
C++があるからねえ・・・

700 名前:デフォルトの名無しさん mailto:sage [2008/07/10(木) 16:16:02 ]
gccでは可変長配列に対応してたりするけどな



701 名前:デフォルトの名無しさん mailto:sage [2008/07/10(木) 17:36:42 ]
C99欲しい人は何が目当てなの?

702 名前:デフォルトの名無しさん mailto:sage [2008/07/10(木) 17:39:47 ]
>>698
歴史的経緯でalloca()が実装されてないから、可変長配列はあれば便利だぞ。

703 名前:デフォルトの名無しさん mailto:sage [2008/07/10(木) 18:04:05 ]
>歴史的経緯でalloca()が実装されてない
どこのはなし?

704 名前:デフォルトの名無しさん mailto:sage [2008/07/10(木) 18:53:10 ]
stdint.hが欲しいんだ。


705 名前:デフォルトの名無しさん mailto:sage [2008/07/10(木) 19:07:41 ]
よろしい

706 名前:デフォルトの名無しさん mailto:sage [2008/07/10(木) 19:49:43 ]
そもそもallocaはC89、C99の規格の中には存在しない。
ありゃPOSIX規格のモンだ。
このスレ的にはWin32 APIと同等に扱われるべき環境依存の関数。

なんだけど、itoaとかと同じで、事実上無視できない存在ではあるね。
とはいえ、90年代ならまだしも、
今日び、スタックからわずかなメモリを確保できたところで、それほど利点も無いだろ。
現代なら定数時間でメモリを確保解放できるメモリプールで良いじゃん。

707 名前:デフォルトの名無しさん mailto:sage [2008/07/10(木) 20:24:39 ]
C99を策定していた委員会の連中もC++98がこれだけ
広く使われるようになるとは夢にも思ってなかったろう。

でないとあれだけ緻密なC99の規格、しかもC89と互換性を
犠牲にしてわざわざ新しい規格を作るはずがない。

708 名前:デフォルトの名無しさん mailto:sage [2008/07/10(木) 20:42:07 ]
>>706
>702は、POSIXにはあるallocaがWin32にはないから、代わりに使いたいと言ってるんじゃないかと。
確かに、freeする必要がないメモリを好きに取れるのは楽かもしれんね。
それこそ、今時スタックサイズをけちることもないんだし。

709 名前:デフォルトの名無しさん mailto:sage [2008/07/10(木) 20:50:59 ]
ケチる必要は無いかもしれんが多用するのはバカのやることだぞ。
例えば、VCのリンカのデフォルトのスタックサイズは1MBだ。
何GBもメモリがある時代にたったの1MBだぞ。
*unixのことはよく知らんが、そう変わらんだろうよ。
現状の32bitコードで、スタックサイズが大きすぎると、
スレッドを数十個作っただけで、無駄にアドレス空間が浪費される。
だからスタックのサイズは小さいんだよ。

710 名前:デフォルトの名無しさん mailto:sage [2008/07/10(木) 21:06:44 ]
>>708
_alloca()ならVC++でも普通に使えるよ



711 名前:デフォルトの名無しさん mailto:sage [2008/07/10(木) 21:50:21 ]
こんなこともallocaと
って一度言ってみたいです

712 名前:デフォルトの名無しさん mailto:sage [2008/07/10(木) 22:03:10 ]

         |:;:;:;:;:;:;:;:;:;:;:;:;:;:i;:;:;:;:;:;:;:;:;:;:;:;:;|
           |;:;:_:;:_:;:_:;:_;:;_:;:l:;_;:_:;:_:;:_:;:_;:_;|
        |______|_____|
        | 三|  _     _   |三 !
        | 三|  三シ   ヾ三  |三 |
        | 三′  .._     _,,..  i三 |
        ト、ニ| <でiンヽ  ;'i"ィでiン |三.|
        ', iヽ!  、 ‐' /  !、 ーシ |シ,イ
         i,ヽリ    ,' :  !.     |f ノ
         ヾ!    i ,、 ,..、ヽ   lノ
          |      _ _    イ l       malloca
            l    ,ィチ‐-‐ヽ  i /、
             ゙i、   ゝ、二フ′ ノ/'"\
              | \  ー一 / /   _,ン'゙\
          ,ィ|、  \     /_,、-'" _,.-''´ `丶、__
       _, イ  | ヽ_ 二=''" _,. -''´  """""´´  ``ー



713 名前:デフォルトの名無しさん [2008/07/10(木) 22:19:03 ]
alloca は gcc の configure でもチェックあるよな

714 名前:デフォルトの名無しさん [2008/07/10(木) 22:20:10 ]
> バカのやることだぞ

まだそんなカキコしてるんですか? にっぽんのドクターさん

715 名前:デフォルトの名無しさん mailto:sage [2008/07/10(木) 23:11:49 ]
プログラム=PCアプリだと思ってる連中は気楽でいいのう・・

716 名前:デフォルトの名無しさん mailto:sage [2008/07/10(木) 23:15:46 ]
どう気楽なのかキッチリ説明してもらおう。  (と言ってみる

717 名前:デフォルトの名無しさん mailto:sage [2008/07/11(金) 00:06:24 ]
C99は無かったことにならないかな。下手にこんなのがあると、コンパイラ
ベンダーが、C99実装しかねない。

718 名前:デフォルトの名無しさん mailto:sage [2008/07/11(金) 00:13:54 ]
たいていのコンパイラベンダはC++を優先するだろ

sizeofがコンパイル時定数にならないとか悪夢過ぎるだろ

719 名前:デフォルトの名無しさん mailto:sage [2008/07/11(金) 00:51:13 ]
・conio.hを何とかして欲しい。
・stdint.hの声が何故大きくない?

720 名前:デフォルトの名無しさん mailto:sage [2008/07/11(金) 00:58:56 ]
それにしてもC++自体が変態化してきて誰にも使われなくなりそうな気がするのは俺だけだろうか



721 名前:デフォルトの名無しさん mailto:sage [2008/07/11(金) 01:06:43 ]
おれのVC++のソース、alloca普通に便利に使ってる

722 名前:デフォルトの名無しさん mailto:sage [2008/07/11(金) 01:26:23 ]
C++はいろいろ変な部分があるが、
代わりになるいい言語がないのも事実
web限定とかだとPerl系に軍配が上がるが

723 名前:デフォルトの名無しさん mailto:sage [2008/07/11(金) 01:40:53 ]
C++0xはC99みたいな立場になるだろうな
そして代わりに○○が台頭する

○○にはお好きな言語をどうぞ

724 名前:デフォルトの名無しさん mailto:sage [2008/07/11(金) 01:55:57 ]
Obj-C

725 名前:デフォルトの名無しさん [2008/07/11(金) 01:58:45 ]
アプリケーション(ダイアログ)に表示された文字を外のアプリケーションから取得する方法ご存知のかたいませんか?


726 名前:デフォルトの名無しさん mailto:sage [2008/07/11(金) 02:01:16 ]
D言語がいつか主流になる・・・
そんな風に考えていた時期がありました・・・

727 名前:デフォルトの名無しさん mailto:sage [2008/07/11(金) 02:20:56 ]
>>725
君がすれ違いだということだけは、はっきりわかる。
プラットフォームすら記載されてないので、どのすれが適当かはしらん。

728 名前:デフォルトの名無しさん mailto:sage [2008/07/11(金) 03:03:54 ]
>>726
今ひとつ流行らんよなアレ

729 名前:デフォルトの名無しさん mailto:sage [2008/07/11(金) 04:15:06 ]
>>728
だってDは、「言語仕様が確定=開発終了」だもん。
D1の仕様は決まったけど、D2のほうが進歩してるのに誰がつかうよ。

730 名前:デフォルトの名無しさん mailto:sage [2008/07/11(金) 12:54:57 ]
仕様と同時に実装が下りてくるってのもエキサイティングだとは思うがね
なんにせよ俺は指をくわえて見てるだけ



731 名前:デフォルトの名無しさん mailto:sage [2008/07/12(土) 02:55:05 ]
無名namespaceについて教えてください。

名前のある名前空間の場合、
namespace hoge{
void f();
}
というように宣言して、後で
void hoge::f(){}
のように定義できますが、名前無しの場合
namespace{
void f();
}
として後で定義を書く場合、??::f()というような形式では定義できないのでしょうか?
もちろん定義のときも
namespace{
}で囲ってやればいいのでしょうが、関数定義のような長いものをブラケットで
囲むというのも、邪魔くさいなぁと思い。


732 名前:デフォルトの名無しさん mailto:sage [2008/07/12(土) 03:05:35 ]
確かに邪魔くさいが、
だからこそそんなもの使わないですむようしておけって話じゃね?

733 名前:デフォルトの名無しさん mailto:sage [2008/07/12(土) 03:08:33 ]
>>731
>として後で定義を書く場合、??::f()というような形式では定義できないのでしょうか?
こういう参照が出来ないからこそ役に立つんだと思う

734 名前:731 mailto:sage [2008/07/12(土) 03:15:56 ]
レスどうもです。

基本的に、C++では翻訳単位内でのみ使用する変数や関数は、C言語のような
staticを付けるのではなく、無名名前空間を推奨しているようですが、
そうなると関数の定義は
namespace{
void f() { }
}
のようにするということでしょうか。みんなそうしてるのかな。

735 名前:732 mailto:sage [2008/07/12(土) 03:27:22 ]
ごめん。 もっとくだらない理由だと思ってた。

"翻訳単位内でしか使わない"っていうことを明示したいなら、
その邪魔くさいnamespaseが(目立つから)役に立つだろうし、
邪魔くさいnamespaseを使いたくないってことは、
"翻訳単位内でしか使わない"っていうことを明示しなくてかまわない
と、俺は思うけど。

本当に邪魔だと思うなら、翻訳単位内でしか使わないとか、あきらめなよ。

736 名前:731 mailto:sage [2008/07/12(土) 03:51:39 ]
外部リンケージを持たせたくない変数や関数の宣言だけを
namespace{}に収めるところまでは、目立たせる意味でも
一覧という意味でも非常にスッキリしてると思うんですよね。
ただ、ここに関数のボディまで書いてしまうと、一望しづらくなるので
別途書くことになるのですが、関数定義をブラケットで囲むということに
少し拒否反応がでてしまった次第です。ただ、これしか方法がないなら
そうするしかないですね。邪魔だから使わないというわけにもいかない
機能ですし。あとは、関数定義1つ1つをnamespace{]で囲むのか、複数の
関数定義をまとめてnamespace[]で囲むのか、こだわれるところとしたら
そのくらいですか。



737 名前:デフォルトの名無しさん mailto:sage [2008/07/12(土) 04:02:32 ]
すごい余談だけど、目立たせなくてはいけないのは、関数本体だと思うんだ。
関数本体をメンテナンスするとき、どの関数に使用されているかが問題になるので。

宣言が目立たないと、間違って呼び出そうとしてリンクエラーでるじゃん? それもいやじゃん?
ていわれりゃそうなんだけどさ。

738 名前:デフォルトの名無しさん mailto:sage [2008/07/12(土) 08:09:05 ]
templateで、doubleとfloatだけしか使えないようにするには、
何か書き方があるのでしょうか。教えてください。
template<typename T> void hoge(T arg);

739 名前:デフォルトの名無しさん mailto:sage [2008/07/12(土) 08:30:51 ]
template<typename T> void hoge(T arg){return;}
void hoge(double arg);
void hoge(float arg);

740 名前:デフォルトの名無しさん mailto:sage [2008/07/12(土) 08:33:12 ]
>>738
template<typename T> struct hoge_chk{hoge_chk(){ use_float_or_double(); }};
template<> struct hoge_chk<float>{};
template<> struct hoge_chk<double>{};

template<typename T> void hoge(T arg){
   hoge_chk<T>();
   ...
}



741 名前:740 mailto:sage [2008/07/12(土) 08:35:10 ]
use_float_or_double()は定義されていない前提ね。
コンパイルエラーにさせるため。

742 名前:デフォルトの名無しさん mailto:sage [2008/07/12(土) 08:39:49 ]
template<typename T> void hoge(T arg);
template<> void hoge(float arg) { }
template<> void hoge(double arg) { }

でいいじゃん。

743 名前:デフォルトの名無しさん mailto:sage [2008/07/12(土) 08:44:11 ]
>>739 >>742
それだと
void hoge(float arg) {}
void hoge(double arg) {}
と同じだし、それぞれ実装書かないといけないから
テンプレート関数にする意味無いだろw

744 名前:デフォルトの名無しさん mailto:sage [2008/07/12(土) 08:45:47 ]
template<typename T> void hoge_impl(T arg) {}

template<typename T> void hoge(T arg);
template<> void hoge(float arg) { hoge_impl(arg); }
template<> void hoge(double arg) { hoge_impl(arg); }

745 名前:デフォルトの名無しさん mailto:sage [2008/07/12(土) 08:52:53 ]
>>743
同じじゃねーよ。そのコードでhoge("hogehoge")はエラーだけど>>739>>742はエラーじゃない。
テンプレートにする意味がないっていうのは質問者に言えって。

746 名前:デフォルトの名無しさん mailto:sage [2008/07/12(土) 08:55:57 ]
>>745
いや、hoge("hogehoge")で>>742はエラーになるよ。

747 名前:デフォルトの名無しさん mailto:sage [2008/07/12(土) 08:56:00 ]
>>744
だから下のテンプレート関数は意味無いってw
それでやるならこうだろ
template<typename T> void hoge_impl(T arg) {}
inline void hoge(float arg) { hoge_impl(arg); }
inline void hoge(double arg) { hoge_impl(arg); }

748 名前:デフォルトの名無しさん mailto:sage [2008/07/12(土) 08:59:00 ]
質問者がdoubleとfloatだけしか使えないように、と言ってるので
使えてしまう>>739も駄目だな

749 名前:デフォルトの名無しさん mailto:sage [2008/07/12(土) 09:04:54 ]
>>745
>テンプレートにする意味がないっていうのは質問者に言えって。
>>740>>747はテンプレートにする意味あると思うけど。

750 名前:デフォルトの名無しさん mailto:sage [2008/07/12(土) 09:16:21 ]
>>747
テンプレートの特殊化は関数の多重定義に優先するから
意味が違う



751 名前:デフォルトの名無しさん mailto:sage [2008/07/12(土) 09:21:25 ]
>>750
意味分かって言ってる?
それで困る「まともな状況」書いてみ

752 名前:デフォルトの名無しさん mailto:sage [2008/07/12(土) 09:22:41 ]
テンプレートの特殊化と関数の多重定義を二つかくと
関数の多重定義の方が無視されるだろ

753 名前:デフォルトの名無しさん mailto:sage [2008/07/12(土) 09:25:48 ]
>>752
>テンプレートの特殊化と関数の多重定義を二つかくと
それがまともな状況じゃないって言ってるんだよw

754 名前:デフォルトの名無しさん mailto:sage [2008/07/12(土) 09:26:34 ]
>>753
メンテナンスの程度次第ではいくらでもあり得る。
まともかまともな状況じゃないかはお前が判断する事じゃない。

755 名前:デフォルトの名無しさん mailto:sage [2008/07/12(土) 09:27:36 ]
>テンプレートの特殊化と関数の多重定義を二つかくと
>関数の多重定義の方が無視されるだろ

これ逆だよ。関数の多重定義の方が優先される。
だからテンプレートの特殊化と関数の多重定義は混ぜて
書くべきじゃない。

756 名前:デフォルトの名無しさん mailto:sage [2008/07/12(土) 09:31:38 ]
>>754
ワロタwどんな糞メンテナンスだよw

757 名前:デフォルトの名無しさん mailto:sage [2008/07/12(土) 12:06:44 ]
あれ?オーバーロードの方が特殊化より優先するよな?

758 名前:デフォルトの名無しさん mailto:sage [2008/07/12(土) 12:52:15 ]
>>757
>>755

759 名前:デフォルトの名無しさん mailto:sage [2008/07/13(日) 12:38:07 ]
boostスレ過疎ってんな・・・w

760 名前:デフォルトの名無しさん mailto:sage [2008/07/13(日) 13:14:51 ]
このスレ過疎ってるのでしょうか?
この話題↓で盛り上げてください!

やねう企画代表者やねうらお(本名・磯崎元洋)が
・ソフトウェアの不正コピーを行っていた
・労働契約上の違反をしていた
・他は不正コピーしていないことを証明しようとしてエロゲーのパッケージを発見し、
 写真に撮ってアップロードしようとした。
d.hatena.ne.jp/pmoky/19000106
やねう企画の裏側(競馬の詐欺ソフトの製作現場)
d.hatena.ne.jp/pmoky/20060510
d.hatena.ne.jp/pmoky/20060511
d.hatena.ne.jp/pmoky/20060512
有限会社やねう企画(所在地・大阪府八尾市末広町2−1−2)が計画倒産
www.sia.go.jp/~osaka/zenso/19.09.pdf

やねうらおプロフィール
性格:友達から「チンピラ」「ヤクザ」と呼ばれている。前世で殺人鬼だった宿業を背負っているという妄想(自覚)あり。
最終学歴:専門学校卒
主な職歴:有限会社センキ(凌辱系アダルトゲームの製作会社)を経て独立、有限会社やねう企画を設立、2006年に計画倒産
代表作:『夜這いマニア』『盗撮マニア』『お楽しみCDシリーズ』『競馬詐欺ソフト』『BM98』

やねうらお語録
>「ワシのほうが潔癖やと思うんやけどな。
>絶対に違法コピーのソフトしか使わんし。
>たとえば強盗に入ったときに、ちょっとかわいそうになって
>十万円だけ残してったら、おかしいやろ?
>自分の『強盗する』という意思に対して矛盾やろ?
>だからワシは、一個も買ったソフトを使ったことがない!!」




761 名前:デフォルトの名無しさん mailto:sage [2008/07/13(日) 13:18:26 ]
759 :デフォルトの名無しさん [sage] :2008/07/13(日) 12:38:07
  boostスレ過疎ってんな・・・w

760 :デフォルトの名無しさん [sage] :2008/07/13(日) 13:14:51
  このスレ過疎ってるのでしょうか?


日本語が不自由のようだなw

762 名前:デフォルトの名無しさん mailto:sage [2008/07/13(日) 14:27:07 ]
キーワードによる自動コピペ

763 名前:デフォルトの名無しさん mailto:sage [2008/07/13(日) 14:49:07 ]
memset や memcpy の動作について質問です。

memset(buff, 0, 0); や memcpy(buff, work, 0);

764 名前:763 mailto:sage [2008/07/13(日) 14:50:35 ]
すみません、途中で送信してしまいました。


memset(buff, 0, 0); や memcpy(buff, work, 0); のように
サイズが 0 の場合、何も行われないという認識で合っていますか?
MSDN では分らなかったです。

765 名前:デフォルトの名無しさん [2008/07/13(日) 15:06:56 ]
サイズ 0 ならガッされないなんて知ってても役に立たんだろ

766 名前:デフォルトの名無しさん mailto:sage [2008/07/13(日) 15:09:41 ]
>>764
そういう場合、不安だったらmy_memsetかなんか一個かましておけ

767 名前:デフォルトの名無しさん mailto:sage [2008/07/13(日) 15:12:29 ]
>>765
関数の呼び出し元にバッファ領域のポインタと領域サイズを渡させる場合に役に立ちます
memset や memcpy にサイズ 0 を渡しても大丈夫ということであれば、
領域サイズに 0 が指定された場合のエラーチェックをせずに済むケースがあるからです

768 名前:デフォルトの名無しさん mailto:sage [2008/07/13(日) 15:25:06 ]
規格書にはn文字ほげほげするとだけしか書かれてなかった希ガス。
詳しく知りたければJISのサイトでX3010を検索。

769 名前:デフォルトの名無しさん mailto:sage [2008/07/13(日) 15:25:19 ]
>Where an argument declared as size_t n specifies the length of the array for a
>function, n can have the value zero on a call to that function. Unless explicitly stated
>otherwise in the description of a particular function in this subclause, pointer arguments
>on such a call shall still have valid values, as described in 7.1.4. On such a call, a
>function that locates a character finds no occurrence, a function that compares two
>character sequences returns zero, and a function that copies characters copies zero
>characters.

0を渡すことはできるが、その場合でもNULLはダメらしい

770 名前:デフォルトの名無しさん mailto:sage [2008/07/13(日) 15:44:01 ]
>>766
なるほど、それは確かに賢いやり方ですね。
ちょっと考えてみます。

>>768
調べてみます。

>>769
NULL チェックだけは避けられないということですね。
やはり、エラーをチェックする自作関数をかました方が良いのかもしれないですね。



771 名前:デフォルトの名無しさん mailto:sage [2008/07/13(日) 18:18:24 ]
宣言と定義が別々になってるコンストラクタで、初期化リスト使う場合って
宣言と定義両方に初期化リストつけなきゃいけないんだっけ?

772 名前:デフォルトの名無しさん mailto:sage [2008/07/13(日) 18:20:42 ]
定義の方だけ
class A {
int a;
A();
};
A::A():a(0){}

773 名前:771 mailto:sage [2008/07/13(日) 18:25:33 ]
ありがとう。

774 名前:デフォルトの名無しさん mailto:sage [2008/07/14(月) 05:20:26 ]
=== hoge.h ===
class hoge {
public:
 template<typename T> T func(T a) const;
};
=== hoge.cxx ===
#include "hoge.h"
template<typename T>
T hoge::func(T a) const {
 return a;
}
=== main.cxx ===
#include "hoge.h"
int main() {
 hoge h;
 int a;
 h.func(a);
 return 0;
}

775 名前:774 mailto:sage [2008/07/14(月) 05:22:22 ]
GCC 4.0.1で、
$ g++ -c hoge.cxx -o hoge.o
$ g++ -c main.cxx -o main.o
$ g++ main.o hoge.o -o main
Undefined symbols:
"int hoge::func<int>(int) const", referenced from:
_main in main.o
ld: symbol(s) not found
collect2: ld returned 1 exit status

となってしまいます。
templateのメンバ関数というのは、これではまずいですか?


776 名前:デフォルトの名無しさん mailto:sage [2008/07/14(月) 05:41:04 ]
まずいです。
h.func(a); を書いたソースから hoge::func の実装が見えるようにして下さい。
ようするに hoge.h に実装を書いてください。

777 名前:デフォルトの名無しさん mailto:sage [2008/07/14(月) 05:50:17 ]
>>775
exportキーワードをサポートしてないC++処理系では無理

778 名前:774 mailto:sage [2008/07/14(月) 06:14:12 ]
>>776-777
まじですか。なんともめんどくさい。
設計からやり直さないと。
ありがとうございました。

779 名前:デフォルトの名無しさん mailto:sage [2008/07/14(月) 20:11:37 ]
VC++ 2008はもうexportをサポートしてる?

780 名前:デフォルトの名無しさん mailto:sage [2008/07/14(月) 20:14:37 ]
ネイティブコードなんてシロモノはOSぐらいしか使わないような世界になったなら、
exportもサポートされるかもな。



781 名前:デフォルトの名無しさん mailto:sage [2008/07/14(月) 20:19:25 ]
じゃあ2008でも未サポート?

782 名前:デフォルトの名無しさん mailto:sage [2008/07/14(月) 20:57:28 ]
>>780
なんで?

783 名前:デフォルトの名無しさん mailto:sage [2008/07/14(月) 23:23:50 ]
今やオブジェクト間最適化が当然の如く行なわれている。
export実装がそんなに困難であるはずがない。

784 名前:デフォルトの名無しさん mailto:sage [2008/07/14(月) 23:29:47 ]
コードレベルで保持しないとダメだから難しいでしょ。

D言語はうまいことやってるけど。

785 名前:デフォルトの名無しさん mailto:sage [2008/07/14(月) 23:31:36 ]
そろそろVC++2008でexportが実装されてるか教えてくれてもいいだろう

786 名前:デフォルトの名無しさん mailto:sage [2008/07/14(月) 23:33:17 ]
>>785
それがないんだな。

787 名前:デフォルトの名無しさん mailto:sage [2008/07/14(月) 23:39:11 ]
うそ〜ん

788 名前:デフォルトの名無しさん mailto:sage [2008/07/14(月) 23:49:19 ]
exportが実装されるまでvcはスルー確定だな

789 名前:デフォルトの名無しさん mailto:sage [2008/07/15(火) 01:19:30 ]
じゃ、どのコンパイラ使う気?

790 名前:デフォルトの名無しさん mailto:sage [2008/07/15(火) 01:23:38 ]
Cマガってもう再開しないのかな。



791 名前:デフォルトの名無しさん mailto:sage [2008/07/15(火) 01:25:14 ]
exportはおまえらが想像する程素敵じゃないのよとEffectiveC++3版にかいてあるよ

792 名前:デフォルトの名無しさん mailto:sage [2008/07/15(火) 01:28:06 ]
Comeau

793 名前:デフォルトの名無しさん mailto:sage [2008/07/15(火) 08:20:16 ]
ところでMore Effective C++が第2版になっても訳が最悪で読みづらいらしいが
実際どうなの?読む価値ナッシングぅ?

794 名前:デフォルトの名無しさん mailto:sage [2008/07/15(火) 21:27:54 ]
>>793
読解可能なら原書を。
そうでないなら、項目を中心に辞書的に活用。

読む本としては厳しい。


795 名前:デフォルトの名無しさん [2008/07/15(火) 22:33:14 ]
「訳が最悪」という論評は原著が熟読できていて初めて可能
そうでなければ他人の論評の受け売り

796 名前:デフォルトの名無しさん mailto:sage [2008/07/15(火) 22:36:38 ]
日本語版しか読んでないけど、読みにくいのは確か

797 名前:デフォルトの名無しさん mailto:sage [2008/07/15(火) 22:47:18 ]
2つの補い合う16ビット整数について学べる本だと聞いたのだが本当かな?

798 名前:デフォルトの名無しさん [2008/07/15(火) 23:37:13 ]
原著が糞かどうかは見えていないわけか

799 名前:デフォルトの名無しさん mailto:sage [2008/07/16(水) 02:18:51 ]
>>793
新訂版は知らんが、旧版についてなら>>794でFAだと思う。
はっきり誤訳とわかる箇所が散見される
(例:p.139 コンストラクターメンバ関数 → 例示コードでconstメンバ関数とわかる)、
一般的な訳語を使わない(例:省略時コンストラクター)などの問題がある。
訳者まえがきに「翻訳を急いだ」と書いてあるが、そういう問題かなという感じ。

ttp://www.pej-hed.jp/washo/38.html に新訂版の目次があるけど、
少なくとも訳語の問題はあまり変わっていないようす。
訳者は旧版の3人+新任1人なので、自分は読み直す気にはならない。


800 名前:デフォルトの名無しさん mailto:sage [2008/07/16(水) 02:39:21 ]
800ならC++滅亡



801 名前:デフォルトの名無しさん mailto:sage [2008/07/16(水) 02:56:32 ]
>訳者は旧版の3人+新任1人なので
懲りてないな。
トールキンで言うと戸田&山本の最凶タッグが成立するようなもんか。

802 名前:デフォルトの名無しさん mailto:sage [2008/07/16(水) 14:34:49 ]
省略時ナントカは JIS X3014 の術語だからなんとも言えないけど
const → コンストラクタ は酷いな… orz
C++使わない人が訳したんだろうね。

803 名前:デフォルトの名無しさん mailto:sage [2008/07/16(水) 21:09:25 ]
テンプレートを用いる際、引数として与えられた型があるコンセプトを満たすかどうかによって、
異なるテンプレートを用いることはできるでしょうか?

例えば、
template<typename T>
class foo
{
 //Tがコンテナの要件を満たしてなければこの実装
};
template<typename T>
class foo
{
 //Tがコンテナの要件を満たしていればこの実装
};
という感じのコードを書きたいと思っていますが、
やはりredefinition of 'class foo<T>'と怒られます。
上手く解決する方法はありますか?

804 名前:803 [2008/07/16(水) 21:17:36 ]
ちなみに、解決方法は多少技巧的になっても構いません。

805 名前:デフォルトの名無しさん mailto:sage [2008/07/16(水) 21:38:26 ]
>>803
特殊化すればよろし

template< typename T, bool is_container >
class foo
{ /* コンテナ以外 */ };

template< typename T >
class foo< T, true >
{ /* コンテナの場合 */ };

is_container を自動的に判定するにはメタ関数を作る必要がある


806 名前:デフォルトの名無しさん [2008/07/16(水) 21:41:40 ]
CLIで関数ポインタ配列の宣言がどうしても通らないんです。
よかったら教えてください。

public ref class Form1 : public System::Windows::Forms::Form
{
public:
...
int fn1(int,int);
int fn2(int,int);
int fn3(int,int);
int (*fp[])(int,int){
fn1,
fn2,
fn3
};
...


関数ポインタの配列が作りたいのですが、error C4368がでます。

807 名前:デフォルトの名無しさん mailto:sage [2008/07/16(水) 21:43:35 ]
>>806
C++/CLIは最早別の言語なので、専用スレへどうぞ。

808 名前:デフォルトの名無しさん mailto:sage [2008/07/16(水) 21:45:11 ]
>>803
これくらいなら出来る

#include <boost/mpl/if.hpp>
#include <boost/type_traits/is_integral.hpp>

using namespace boost;

template<class T>
struct Y {};

template<class T>
struct Z {};

template<class T>
struct X {
typedef mpl::if_<is_integral<T>, Y<T>, Z<T> >::type type;
};


809 名前:デフォルトの名無しさん [2008/07/16(水) 21:46:08 ]
>>805
ありがとうございます。
そのメタ関数の作り方を教えていただけないでしょうか?
あるいは、そのようなテンプレートプログラミングについて解説してあるサイトを紹介してくださると助かります。

810 名前:デフォルトの名無しさん [2008/07/16(水) 21:46:10 ]
>807
すみません。移動します。



811 名前:デフォルトの名無しさん [2008/07/16(水) 21:57:08 ]
>>808
boost::MPLにはあまり詳しくないのですが、
Xが整数型なら X<T>::type == Y<T> 、そうでなければ X<T>::type == Z<T> ということでしょうか。
組み込み型か否かというような判断ではなく、
例えば「Tがメンバにbegin()とend()を持つか否か」や「Tがメンバにoperator()を持つか否か」で、
使うテンプレートを分岐させたいのですが、解決方法があれば幸いです。

812 名前:デフォルトの名無しさん mailto:sage [2008/07/16(水) 22:27:34 ]
>>811
任意の型について
>「Tがメンバにbegin()とend()を持つか否か」や「Tがメンバにoperator()を持つか否か
を判定することは出来ないと思います

x.begin()

と呼ぶのではなく

begin(x)

などと呼んで型ごとにオーバーロードを用意するとかではダメですか?
Boost.Range がこの方法を採用して begin を持つ型にひ持たない型にも対応しています
私もたまにそうします

813 名前:デフォルトの名無しさん [2008/07/16(水) 22:38:50 ]
>>812
うーん、やはり無理ですか。

コンテナに対するオペレータのオーバーロードを考えていて、
コンテナが高階か1階かによって適用させる関数を変えたいと考えていたのですが、
どうもそういう発想に基づかない実装が必要なようですね。

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


814 名前:デフォルトの名無しさん [2008/07/16(水) 22:45:39 ]
>>799, >>802
だーかーらー、原著者がかましたボケかどうか確認しろつーの

815 名前:デフォルトの名無しさん mailto:sage [2008/07/16(水) 23:03:42 ]
>>813
役に立たないかもしれないけど、要件はクリア?
#include <iostream>

template<class T> struct Y { T m; };
struct Z {};

template<template<class T> class C>
struct X
{
template<class A>
static void f(C<A> x)
{
std::cout << "f(C<A>)" << std::endl;
f(x.m);
}

template<class B>
static void f(B x)
{
std::cout << "f(B)" << std::endl;
}
};

int main()
{
Y<Y<Z> > y;
X<Y>::f(y);
return 0;
}


816 名前:デフォルトの名無しさん [2008/07/17(木) 00:17:58 ]
>>815
この方法だと、型を1つ引数に取るテンプレートクラスか否かで分岐させているということでしょうか。
できればそれに限らないコンテナ(boost::arrayとか)も一括して扱いたいのですが、
確かにvectorやdeque, listに関してはこれで扱えそうですね。

教えてくださってありがとうございます。


817 名前:デフォルトの名無しさん mailto:sage [2008/07/17(木) 22:37:21 ]
テンプレートクラスのインスタンス化についての質問で、
以下のようなことがしたいのです。
※以下の全ての例は当然コンパイルはできません。


// 動的にテンプレートの型
list* getList(int n) {
if(1 == n) {
// int型のリストをreturn
}

if(2 == n) {
// double型のリストをreturn
}
}

int main() {

// 型情報を持たないlistクラスの変数を用意(したい)
list* x;

int num;
std::cin>>num;

// キーボードで入力した値によって型を変える
x = getList(num);

}

このような処理を行いたいのですが、どうにかならないでしょうか…
JavaにおけるObjectクラスのようなクラスがあればいいのですが。

818 名前:817 mailto:sage [2008/07/17(木) 22:37:52 ]
私が考えてみたのは

(1)typedefを使う
(2)マクロを使う

で、どちらも上手くいきません。

(1)については、

// typedef の前方宣言(をしたい)
typdef typ_t;

// 動的に型情報を決定(これだとスコープ的にダメ?)
if(1 == n) {
typedef int type_t
}

if(2 == n) {
typedef double type_t
}

// 動的に定まった型を用いてインスタンス化
list<type_t> x;

こんな感じにできないかと思ったのですが、
宣言がの方法がわかりませんでした。(できない?)

819 名前:デフォルトの名無しさん [2008/07/17(木) 22:38:30 ]
(2)については

// とりあえず何か型を設定
#define TYPE_T int

// 動的に型情報を決定
if(1 == n) {
#undef TYPE_T
#define TYPE_T double
}

if(2 == n) {
#undef TYPE_T
#define TYPE_T char
}

// 動的に定まった型を用いてインスタンス化
list<TYPE_T> x;

これは n の値によらず最後に #defile された値
が常に適用されてしまい、ダメでした。
(今の場合でしたら常に list<char> が生成されてしまう。)

もう本当にお手上げ状態でして、みなさんのお知恵を
お借りしたいと思っている次第でございます;;

何卒よろしくお願いします

820 名前:デフォルトの名無しさん mailto:sage [2008/07/17(木) 22:39:41 ]
>>818最後の行

×宣言がの方法が
○前方宣言の方法が



821 名前:デフォルトの名無しさん mailto:sage [2008/07/17(木) 22:57:57 ]
>>819
テンプレートクラスを使わずに普通のクラスで対処したらいけないの?

class list { /* listの定義 */ };;
class IntegerList : public list { /* IntegerListの定義 */ };
class DoubleList : public list { /* DoubleListの定義 */ };

list* getList(int n) {
    if ( n == 1 ) { return new IntegerList(); }
    if ( n == 2 ) { return new DoubleList(); }
}

822 名前:デフォルトの名無しさん mailto:sage [2008/07/17(木) 23:15:06 ]
インスタンス化クラスの型はコンパイル時に解決するから、実行時の多態性を実現する目的には向かない。

823 名前:デフォルトの名無しさん mailto:sage [2008/07/17(木) 23:20:01 ]
テンプレートはコンパイル時の問題を解決するための道具です
実行時には役立ちません

実行時の問題は実行時用の道具で対処したほうが良いでしょう

824 名前:デフォルトの名無しさん mailto:sage [2008/07/17(木) 23:29:17 ]
>>821
元々の目的が
「テンプレートクラスの型指定を実行時に動的に行いたい」
ということですので、それだと本来の目的に合わないのです。

が、>>822 >>823 さんの仰るように、そもそも本来の目的の
方向性が良くなかったようで…。
一度構成を考え直してみたいと思います。

みなさん、どうもありがとうございました。

825 名前:デフォルトの名無しさん mailto:sage [2008/07/17(木) 23:53:05 ]
boost.variantじゃ駄目なのか

826 名前:デフォルトの名無しさん mailto:sage [2008/07/18(金) 04:24:38 ]
今、とある解説書でC++の例外を勉強しているのだが、投げられた例外を
受け取る例外ハンドラがない場合、terminage()が呼ばれabort()が呼ばれると。
abort()は何の後処理もせずプログラムを終了させるから具合が悪いという
ことが書かれているのだが、プログラムが終了すればすべてメモリは解放
されるのと違うの?プログラムが終了してまで、何か禍根が残るなんてこと
あるの?

827 名前:826 mailto:sage [2008/07/18(金) 04:25:20 ]
ミス
terminage() → terminate()

828 名前:デフォルトの名無しさん mailto:sage [2008/07/18(金) 04:33:50 ]
>>826
ファイルシステムとかデータベースとか。

mkdir() を使ったロックなんかがわかりやすいかな?

829 名前:826 mailto:sage [2008/07/18(金) 04:39:16 ]
レスどうも。
つまりプログラムとは独立したなんらかのリソースを操作する場合に
影響が残るということか…

830 名前:デフォルトの名無しさん mailto:sage [2008/07/18(金) 04:54:12 ]
VC++2008で
void f() throw( hoge1, hoge2, hoge3);
みたいな例外指定ってサポートされてないんだね。
標準C++勉強してると、意外と最近のコンパイラが標準準拠していない
ことに気づく。



831 名前:デフォルトの名無しさん mailto:sage [2008/07/18(金) 07:57:37 ]
むしろ準拠しなくてもOSが「問題ないぜ!掛かって来い冷害!」

832 名前:デフォルトの名無しさん mailto:sage [2008/07/18(金) 13:08:34 ]
初心者で申し訳ないのですが、
googleのsparse_hash_mapを使おうとして、マニュアル通り
#include <iostream>
#include <google/sparse_hash_map>
using namespace std;
using google::sparse_hash_map;
..
int main () {
sparse_hash_map<const char *, int, hash<const char *>, eqstr> months;
とすると、
'hash' was not declared in this scope
と、hash<const char *> すら定義されていないと言って怒られてしまいます。
hash_mapの場合も同じだったのですが、どうするといいでしょうか。
環境は g++ (GCC) 4.1.1 20070105, Linux FC6です。
よろしくお願いします。

833 名前:デフォルトの名無しさん mailto:sage [2008/07/18(金) 13:25:34 ]
#include <ext/hash_fun.h>
を追加してみてはいかがでしょう。

834 名前:デフォルトの名無しさん mailto:sage [2008/07/18(金) 14:28:03 ]
>>833
ありがとうございます。
もう一度追加してみたのですが、エラーメッセージは同じのようでした。
ちなみに using __gnu_cxx; したり、__gnu_cxx::hash<const char *>と
すると、もの凄いエラーメッセージが出ます。。

835 名前:832 mailto:sage [2008/07/18(金) 18:20:56 ]
すみません、自己解決しました。
上のコードの struct eqstr の持つ比較関数
bool operator() (const char *a, const char *b) const
で、最後の const が抜けていたのが原因のようでした。
using namespace __gnu_cxx; で const を加えると、問題なく通りました。
# たったそれだけで長大なエラーメッセージが表示されるとは、
C++、恐ろしい子・・・!!

836 名前:デフォルトの名無しさん mailto:sage [2008/07/18(金) 18:31:34 ]
最初の方の数個のエラーだけ見て推測すりゃ良いだろ。
コンパイル時間と長大なエラーメッセージに怖気づくなよ。

837 名前:デフォルトの名無しさん mailto:sage [2008/07/18(金) 23:32:51 ]
>>830
VCはずっとサポートされないままだね。(他は知らないけど)
やっぱ難しいんかな。

838 名前:デフォルトの名無しさん mailto:sage [2008/07/18(金) 23:45:04 ]
          ζ
         / ̄ ̄ ̄ ̄\
       /         |
       | ⌒  ⌒   /|
       | (・)  (・)   |||||||
       | ⊂⌒◯-----∂)___   ___
       | ||||||||_     /     ゙Y"     \
         \ヽ_/ \/              \
         \    /                 \
          / ̄ ̄ ̄ ̄)        *      ( ̄ ̄ ̄ ̄)
         |    ─<         |\      >─   (
         |      )     /  (|ミ;\    (      )
         ヽ    ̄ ̄)    /(___人|,iミ'=;\  (  ̄ ̄   )
         /" ̄ ̄ ̄ ̄   /    《v厂リiy\  ̄ ̄ ̄ ̄\
         /        /        ゙|,/'' v:,,、.¨)z,_       \
        /       /         ミ/ .-─ .゙》z、      \
        /      /           〔」″ノ‐ 、u ¨\      )
       (      /             ゙|, ..冫 .rー    ̄\_    |
        |      〔              ミ./′   ..r-ー __,,ア┐  |
        |      |              {. .,,,,   .′  .´′ .¨\|
        |       |              ∨   ノ冖′ =vvvvvv¨\
        |     /               ミ.   ,i'           .゙\_
        |     /                .{.  ノ  ,r¬″       .¨\

839 名前:デフォルトの名無しさん mailto:sage [2008/07/18(金) 23:49:41 ]
>837
実装するだけなら全く難しくないと思うが
関数に try, catch 差し込んで unexpected 呼ぶだけでしょ

840 名前:デフォルトの名無しさん mailto:sage [2008/07/19(土) 00:32:21 ]
例外指定なんて誰も使わないから別にいい



841 名前:デフォルトの名無しさん mailto:sage [2008/07/19(土) 16:56:54 ]
Javaは例外指定必須だけどうっぜえ割に大してバグが減るわけでもない
はっきり言って全くいらない機能

842 名前:デフォルトの名無しさん mailto:sage [2008/07/19(土) 23:51:23 ]
同意。C#の設計者もアレあんまし意味無いだろって言ってる品。
www.artima.com/intv/handcuffs.html

843 名前:デフォルトの名無しさん mailto:sage [2008/07/20(日) 07:52:16 ]
>>838
これって遠近法で描かれたウンコなのかドリルなのか気になる

844 名前:デフォルトの名無しさん mailto:sage [2008/07/20(日) 09:28:32 ]
激突
アナル vs ドリル

845 名前:デフォルトの名無しさん mailto:sage [2008/07/20(日) 10:54:04 ]
new/delete演算子をオーバーライドしたいのですが、
これらの中からもとのnew/deleteを呼ぶにはどうしたらよいですか?


846 名前:デフォルトの名無しさん mailto:sage [2008/07/20(日) 14:57:11 ]
置かれている状況が分からないから何とも言えないけど、
::operator newと::operator deleteでどうよ。

847 名前:デフォルトの名無しさん mailto:sage [2008/07/20(日) 17:09:26 ]
operator newをオーバーライドしたなら、必要なのはメモリの固まりなわけで、
mallocでも呼んどきゃいいんでね?

848 名前:デフォルトの名無しさん mailto:sage [2008/07/20(日) 17:58:46 ]
>>847
コンストラクタを呼びたいんじゃね?

849 名前:デフォルトの名無しさん mailto:sage [2008/07/20(日) 18:09:06 ]
「new演算子のオーバーライド」で、どのコンストラクタを呼びたくなるわけ?

ひょっとしてたとえば、メモリ管理クラスがあって、operator new()で
そのメモリ管理クラスをインスタンス化するためにnewしたくなったけど、
メモリ管理クラスのメモリはどうするんだってな話?

850 名前:デフォルトの名無しさん mailto:sage [2008/07/21(月) 04:35:49 ]
クラスのメンバ関数が、自分自身をdeleteする処理を行っても
安全なのでしょうか?
つまりdelete this;ってことになるかな。
自分自身が解体された後にメンバ関数からリターンするって何か変ですよねぇ。
しかもdelete this;の後にも処理が続いてたらやばいですよね。



851 名前:デフォルトの名無しさん mailto:sage [2008/07/21(月) 06:40:13 ]
>>850
安全。ただしもちろん、それやったあとにそのインスタンスを使っちゃいけない。

たとえばboost::intrusive_ptrみたいに、値に自身の参照カウンタを持たせるスマートポインタの場合、
値となる型に
void Release() { if (!--refCount_) delete this; }
みたいなメンバ関数を用意することになる。

852 名前:デフォルトの名無しさん mailto:sage [2008/07/21(月) 06:41:32 ]
規格上どうなってるかは知らないけど、そういうことをやってるライブラリは知ってる。
他のメンバーにアクセスせずにリターンするだけなら問題はないような。

実際どっちのデザインがいいのだろ。
A a = A::createInstance();
a.Free();
A::Free(a);


853 名前:850 mailto:sage [2008/07/21(月) 06:50:27 ]
レスありがとうございます。
deleteした後に余計なことしなければ、いけるってことですね。

854 名前:デフォルトの名無しさん [2008/07/21(月) 16:09:12 ]
現在ublasを使っていて少しつまづいてしまったので教えていただきたいことがあるのですけど
教えていただけないでしょうか?

ある行列を多くの行列演算の和として計算したいのですが、
代入を繰り返すことでおそくなってしまいます。
例えば以下のような例です。
for(i=0;i<100;i++){
MAT1+=some_matrix;
}
some_matrixには毎回べつの行列が計算されてはいります。

expression template でこれを高速可できるということですが、
for文の中で毎回代入していまうとその時点で式が評価されてしまうので遅くなってしまうようです。
式そのものを変数として保持しておくような事はできるのでしょうか?

初歩的な質問ですみませんがどなたかお願いします。

855 名前:デフォルトの名無しさん mailto:sage [2008/07/21(月) 16:15:30 ]
autoやdecltypeがあればいいんだがなぁ。

856 名前:デフォルトの名無しさん mailto:sage [2008/07/21(月) 16:36:33 ]
draw_mark = rand() % 4 + 1;
draw_digit = rand() % 13 + 1;

if(h) {
printf("%sの%s\n", mark[draw_mark-1], digit[draw_digit-1]);
}
r = total[draw_digit-1];
この文の+1と-1はあってもなくても結果は同じですよね? 気になったので教えてください

857 名前:デフォルトの名無しさん mailto:sage [2008/07/21(月) 16:46:49 ]
他の場所で使ってなければ同じ。

858 名前:デフォルトの名無しさん mailto:sage [2008/07/21(月) 18:23:52 ]
結果は同じでも、可読性が違う。
乱数の結果が+1してあれば「乱数値を1オリジンに変換している」というニュアンスが伝わるし、
配列のインデックスが-1してあれば「カード番号を0オリジンに変換している」というニュアンスが伝わる。

859 名前:デフォルトの名無しさん mailto:sage [2008/07/21(月) 18:34:07 ]
一方、ロシアは0オリジンで乱数値を扱った。

860 名前:デフォルトの名無しさん mailto:sage [2008/07/21(月) 18:39:15 ]
>>859
そういう無意味な書き込みして楽しい?
そうかぁ、寂しい青春送っているんだね。



861 名前:デフォルトの名無しさん mailto:sage [2008/07/21(月) 18:49:41 ]
>>860
>>860






[ 新着レスの取得/表示 (agate) ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧]( ´∀`)<209KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef