C++相談室 part86

このエントリーをはてなブックマークに追加
1v(^・^)v
C++に関する質問やら話題やらはこちらへどうぞ。
ただし質問の前にはFAQに一通り目を通してください。
IDE (VC++など)などの使い方の質問はその開発環境のスレに
お願いします。

前スレ
C++相談室 part85
http://hibari.2ch.net/test/read.cgi/tech/1286623355/
2v(^・^)v:2010/11/06(土) 02:05:59
■基本■
[C++ FAQ]
 http://www.parashift.com/c++-faq/
 http://www.bohyoh.com/CandCPP/FAQ/ (日本語)
  Cとその仕様を比較しながらの解説なので分かりやすい。
  ***** 質問の前に必ずこの二つに目を通してください *****
[C/C++ リファレンス]
 http://www.cppreference.com/ (英語)
 http://www.cppreference.com/wiki/jp/ (↑の日本語訳だけどまだ未完)
[禿 Stroustrup]
 http://www.research.att.com/~bs/
[C++ International Standard]
 http://www.iso.org/iso/iso_catalogue/catalogue_tc/catalogue_detail.htm?csnumber=38110
[JTC1/SC22/WG21 - C++]
 http://www.open-std.org/jtc1/sc22/wg21/
  ここから規格の最新(2003より新しい)ドラフトがダウンロードできる。
[JIS X3014]
 http://www.jisc.go.jp/app/pager?id=15868
  ISO規格の日本語訳。JIS X 3014:2003はISO/IEC 14882:2003 (E)に対応。
3v(^・^)v:2010/11/06(土) 02:07:02
■Libraries■
[Boost]
 Boost http://www.boost.org/
 (日本語) http://www.kmonos.net/alang/boost/
 (日本語) http://shinh.skr.jp/boost/
[標準ライブラリ]
 SGI-STL http://www.sgi.com/tech/stl/
 STLport http://stlport.sourceforge.net/
 GNU libstdc++ http://gcc.gnu.org/libstdc++/
 Apache C++ Standard Library (STDCXX) http://stdcxx.apache.org/
 STLFilt http://www.bdsoft.com/tools/stlfilt.html
 (日本語) http://episteme.wankuma.com/stlprog/ (※1999年発行注意)
[Loki]
 http://sourceforge.net/projects/loki-lib/
 LokiPort-MSVC6sp5 http://fara.cs.uni-potsdam.de/~kaufmann/?page=lokiport
4v(^・^)v:2010/11/06(土) 02:10:41
5v(^・^)v:2010/11/06(土) 02:13:26
6v(^・^)v:2010/11/06(土) 02:17:42
■長いソースを貼るときはここへ。■
 http://codepad.org/
 http://ideone.com/
7v(^・^)v:2010/11/06(土) 02:19:57
STLつかうと一気に実行ファイルサイズが10倍に?!

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

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

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

#include <stdafx.h>
後死ね。

言葉が悪いな。それで教えているつもりか。
まぁヒントぐらいにはなったな。
うむごくろう。
8デフォルトの名無しさん:2010/11/06(土) 02:22:23
>>4
スレ立て乙だが、More Exceptional C++とExceptional C++ Styleは翻訳本が出てるよ
俺買ったもん

More Exceptional C++
http://www.amazon.co.jp/exec/obidos/ASIN/4894714833/ (翻訳)

Exceptional C++ Style
http://www.amazon.co.jp/exec/obidos/ASIN/4894714663/ (翻訳)

次からのテンプレに入れてくれるとありがたい
9v(^・^)v:2010/11/06(土) 02:25:49
テンプレ、こんなもんかと。後は好きにして。

>>2 ■基本■ C++ FAQ Lite が Lite じゃなくなった。
>>4 ■Books■に amazon.co.jp の C++ カテゴリを追加。

禿のページ、しばらく前から www2 にリダイレクトされるんだけど、
www が無効になったわけじゃないんみたいなんでそのままに。

>>7
やっぱりそれ要るの?
もう当時のことがわかる人もあんまり居ないから要らないかと思ってるんだけど。

>>8
ありがとう。覚えてたら足しとくよ。次は別の人が建てることになる
かもしれないけどね。
10デフォルトの名無しさん:2010/11/06(土) 02:25:50
早速質問で申し訳ないです。

親クラスからのメンバ関数からだったら子クラスのメンバ変数にアクセス出来るのに
子クラスのメンバ関数から親クラスのメンバ変数にアクセス出来ないのは何故なんでしょうか。
親クラスでprotected宣言した変数は子クラスからはアクセスできるかと思ったんですがなかなか上手くいきません。
エスパーの方宜しくお願いします。

'Basic::value' はアクセスできない(関数 Application::Change(Basic &) )

http://codepad.org/et7uxwjs
11デフォルトの名無しさん:2010/11/06(土) 02:32:12
>>10
protecteed で許されるアクセスは this を通してのみ。
そんなわけで、よく見る「派生クラスからアクセスできる」という説明は不十分。

おとなしく private/public で済ませるのがおすすめ。ほんとうに protected が
使いたいとしても、メンバ変数直はやめとけ。
12デフォルトの名無しさん:2010/11/06(土) 02:32:57
>>9
>やっぱりそれ要るの?

いや単なる地鎮祭w
不要だと思うけど面白いじゃんw
13デフォルトの名無しさん:2010/11/06(土) 02:34:47
>>10
こういうことじゃね?

自分の親のすねはかじれるが
他人の親のすねはかじれない
ただし、友達にたかることはできる
14デフォルトの名無しさん:2010/11/06(土) 02:47:28
>>10
11.5 Protected member access [class.protected]
1 When a friend or a member function of a derived class references a protected nonstatic member function or
protected nonstatic data member of a base class, an access check applies in addition to those described earlier
in clause 11.102) Except when forming a pointer to member (5.3.1), the access must be through a
pointer to, reference to, or object of the derived class itself (or any class derived from that class) (5.2.5). If
the access is to form a pointer to member, the nested-name-specifier shall name the derived class (or any
class derived from that class).

要するに基底クラスBasicから派生したクラスが複数存在したとすると、他のクラスから基底クラスの
protectedメンバをいじれる事になってしまい、隠蔽が破られる

そのため特別ルールを設け、この場合はApplicationのポインタもしくはリファレンスもしくはオブジェクト
を介してしかいじれなく制限されている

この場合はvoid Application::Change(Basic& other)のようにApplicationではなくBasicを引数に
取るためエラーになる
15デフォルトの名無しさん:2010/11/06(土) 02:49:00
早い話が

void Application::Change(Application& other) {
  other.value = value;
}

これなら問題ないわけだ
16デフォルトの名無しさん:2010/11/06(土) 02:53:27
>>15 other.value がアクセスできないっていう話だよ
1716:2010/11/06(土) 02:55:14
>>15 悪い。 other が Application なら大丈夫だな。
18デフォルトの名無しさん:2010/11/06(土) 03:03:11
なお、>>14には (or any class derived from that class) とあるので、
Applicationから派生したクラスのポインタもしくはリファレンスもしくはオブジェクト
を通してもアクセス出来るが、この場合どのようにクラス階層を重ねればいいのか
俺にはわからん

先行宣言しようとするとエラーになるし
19デフォルトの名無しさん:2010/11/06(土) 03:04:46
単にApplication2がApplicationからpublic派生したとすると、Application2を
通してアクセス出来るという意味ならそうなのかもしれん

というかそれしかコンパイル出来ないしな
20デフォルトの名無しさん:2010/11/06(土) 03:06:22
http://codepad.org/gMrjDg9p

要するにこういう事だと思う
21デフォルトの名無しさん:2010/11/06(土) 03:07:48
まだ勉強不足のようでさっきから何度もレスを読み返しているのですが分かったようで分からないようで。。。
取りあえず今はもう一つメンバ関数作ってそこから値を操作するようにしていますがもう少し勉強してから再度読み直してみます。
詳しく解説頂き感謝です。


22デフォルトの名無しさん:2010/11/06(土) 03:07:53
http://www.gotw.ca/gotw/070.htm
> In short, public data is evil (except only for C-style structs).
> Likewise, in short, protected data is evil (this time with no exceptions).

この記事がもう 10 年も前のものなのにな。
なんでこう、 private をさしおいて protected を使う初心者が後を絶たないのか。
23デフォルトの名無しさん:2010/11/06(土) 03:20:18
Applicationのポインタもしくはリファレンスもしくはオブジェクト
を介してしかいじれなく制限されている

とあるのですがApplicationのポインタやリファレンスだと親クラスのBasicを引数に取れないのでBasicのメンバ変数を操作しようがないように思うのですがどうなんでしょうか。
続けて質問で申し訳ないです。

void Application::Change(Application& other) {
other.value = value;
}
24デフォルトの名無しさん:2010/11/06(土) 03:24:26
もうこうしとけよ

class Basic {
friend class Application ;
protected:
int value;
public:
void Change(Basic& other);
};
25デフォルトの名無しさん:2010/11/06(土) 03:25:56
>>24
そうします。
回答ありがとうございました。
26デフォルトの名無しさん:2010/11/06(土) 03:28:29
>>23
http://codepad.org/XGP83bqD

こういうのがコンパイル通ったらまずいでしょ?

ApplicationクラスとApplication2クラスは全く別のクラスなのに
Application2クラスのメンバ関数ChangeからApplicationクラス
のprotected変数をいじれるとprotectedの意味が無意味になって
しまう

もしApplicationクラスのメンバ関数がBasicクラスのproteced
メンバ変数をいじりたいのなら、基底クラスBasicに元々protected
をいじるようなアクセサを付けておくしかない

でもそうすると外部からもprotected変数を自由にいじれるようになって
しまい、意味がない

というわけでApplicationクラスはBasicのprotectedメンバ変数をいじる
には自分自身の中でやるしかないわけだ
27デフォルトの名無しさん:2010/11/06(土) 03:30:06
>>24
そやね
手持ちの詳説C++にもfriendクラスとして派生クラスを宣言する事を推奨している
28デフォルトの名無しさん:2010/11/06(土) 03:45:20
>>24-25,27
基底クラスが派生クラスのことを知っている上に friend とか、
protected を使うためにどんだけ犠牲にする気だ。

おとなしく private/public で組めよ。
29デフォルトの名無しさん:2010/11/06(土) 03:46:38
お前の話はいつも役にたたないなぁ
30デフォルトの名無しさん:2010/11/06(土) 03:47:14
protected は中途半端。
方針としては中途半端。
「見えちゃ嫌だけどちょっとは見えたほうが」
そんなの微妙すぎ。
31デフォルトの名無しさん:2010/11/06(土) 03:50:55
でも確かに今回のケースは初心者には「なぜ?どうしてー?」と思うようなワナだよな
32デフォルトの名無しさん:2010/11/06(土) 03:54:07
#define protected public

これでいいだろ
33デフォルトの名無しさん:2010/11/06(土) 12:47:26
メルセンヌツイスタを使って0〜(n-1)までの均等な乱数を作りたいんですが
これで問題ないですか?
INT value;
do {value=genrand_int31()%n;}
while(value>=0x0fffffff-value%n);
34デフォルトの名無しさん:2010/11/06(土) 15:15:08
>>33
ループなんかまわしたらダメに決まってるだろ。
その処理が終わったときの擬似乱数発生器の状態に
一定の制約がかかることになるんだから。

スレ違いなんで、まだなんかあるなら↓へどうぞ。

疑似乱数2
http://hibari.2ch.net/test/read.cgi/tech/1192628099/
35デフォルトの名無しさん:2010/11/06(土) 22:37:59
>>34
レスサンクス
どうやって直せばいいか分からないので聞いてきます。
36デフォルトの名無しさん:2010/11/06(土) 22:48:24
なんでループがいるの?
37デフォルトの名無しさん:2010/11/07(日) 08:47:44
iostreamを利用して、Messagebox関数をラップしようと思っているのですが
Messageboxのタイトルとか、ボタンのスタイルなどは、マニュピレーターにして変更できるようにしたほうが良いのでしょうか?

例)
msgbox << _T("こんにちは、世界!") << mb_title(_T("テストだよ〜ん")) << mb_style(MB_OK) << std::endl;

こんな感じで利用できるように
38デフォルトの名無しさん:2010/11/07(日) 08:49:08
そんなきもいことしなくても
普通に関数でいいやん
39デフォルトの名無しさん:2010/11/07(日) 09:13:55
いつ見ても無理してるようにしか見えない
40デフォルトの名無しさん:2010/11/07(日) 09:34:24
iostreamって無理矢理オペレータのオーバーロードを使ってみましたって感じだよな
41デフォルトの名無しさん:2010/11/07(日) 09:41:54
禿が可変個数引数を否定するにあたって代案を作る必要がでてきて用意した答え
42デフォルトの名無しさん:2010/11/07(日) 10:59:14
「iostreamを利用して、Messagebox関数をラップ」がそもそも
おかしいと思うのは俺だけか
43デフォルトの名無しさん:2010/11/07(日) 11:30:13
可変個引数に、実際に何個の引数が渡されたのかを知る仕組みが加われば
それだけでよかったのに
44デフォルトの名無しさん:2010/11/07(日) 12:29:10
~int();
これってどういう意味ですか。
45デフォルトの名無しさん:2010/11/07(日) 12:36:20
intクラスのデストラクタ
46デフォルトの名無しさん:2010/11/07(日) 12:37:10
47デフォルトの名無しさん:2010/11/07(日) 12:38:40
>>43
個数だけじゃダメだろ。型情報がないと非PODが渡されたときに困る。

というか可変長引数は型安全性がダメすぎる
48デフォルトの名無しさん:2010/11/07(日) 13:11:21
~はXORか
じゃあ~double() とかはどうなるんだろう
49デフォルトの名無しさん:2010/11/07(日) 13:11:51
試せよ
50デフォルトの名無しさん:2010/11/07(日) 13:14:39
XORではなくてNEG、そしてdoubleへの~演算子の適用は出来ない
51デフォルトの名無しさん:2010/11/07(日) 13:40:24
template<class T> struct Foo
{
Foo(){ T* p; p->~T(); }
};
Foo<int> f;

はコンパイル通るのに

struct Foo
{
Foo(){ int* p; p->~int(); }
};
Foo f;

こっちはコンパイル通りません。
何故ですか。VC2010です。
52デフォルトの名無しさん:2010/11/07(日) 13:51:36
>>50
ネゲート命令のことならそれは単項マイナス
ハードでいうアサートの反対じゃねえぜ

NEG ではなく NOT な
53デフォルトの名無しさん:2010/11/07(日) 13:53:37
>>51
だから~int()はデストラクタじゃないから
54デフォルトの名無しさん:2010/11/07(日) 13:55:09
>>51
intもplacement newできるのに、~int()が通らないってなんだろね。
55デフォルトの名無しさん:2010/11/07(日) 13:56:41
>>53
>>51はテンプレートパラメータならintを通せるのはなぜ?って言ってるんじゃないか?
56デフォルトの名無しさん:2010/11/07(日) 14:12:59
>>54
禿本に書いてあるやん
57デフォルトの名無しさん:2010/11/07(日) 14:51:37
>>38
いちいち、wsprintfとか使って出力を整形するのに疲れた

msgbox << _T("変数xの値:") << x << std::endl;
これで済むなら、この方が楽で良いと思うの
58デフォルトの名無しさん:2010/11/07(日) 14:57:12
いつも関数定義考えるときに思うんだけど、

void foo(bar* param) {
  param->method();
5958:2010/11/07(日) 15:00:03
ごめんごめん途中で送っちゃった。

void foo(bar* param) {
  param->method();
  xxx(param);
}
bar obj;
foo(&obj);

と、

void foo(bar& param) {
  param.method();
  xxx(¶m);
}
bar obj;
foo(obj);

と、結局どっちも同じだけどどっちにすべきか悩む。
なにかこう明確な仕切りとかどうしてる?
60デフォルトの名無しさん:2010/11/07(日) 15:03:44
グーグル先生によると参照の引数は必ずconstをつけるんだとさ
61デフォルトの名無しさん:2010/11/07(日) 15:28:20
typedef boost::array<char, ???> char_array<???>;
char_array<100> a;
char_array<333> b;
char_array<555> c;
のように使いたいのですが、うまいtypedefの仕方ありますか?
62デフォルトの名無しさん:2010/11/07(日) 15:33:55
>>57
俺なら
MessageBox("変数xの値:%d", x);
とできるようにするけどそれじゃダメなんか
63デフォルトの名無しさん:2010/11/07(日) 15:54:42
>>59
ポインタだとnullが渡される可能性が生じるのでは
64デフォルトの名無しさん:2010/11/07(日) 16:16:50
一回テストすれば気付くだろう
65デフォルトの名無しさん:2010/11/07(日) 16:32:54
>>62
それだと、変数の型に縛られるのがいまいちだなぁと思うの
66デフォルトの名無しさん:2010/11/07(日) 16:34:40
ではboost::formatを参考にしてみるとか
67デフォルトの名無しさん:2010/11/07(日) 16:53:31
>>66
いや、boost::formatを参考にして作るぐらいなら、boost::formatがそのまま利用できるようにした方がいいのでは?
68デフォルトの名無しさん:2010/11/07(日) 16:55:54
好きに作ればいいと思うけど
オレはCStringで充分だな
69デフォルトの名無しさん:2010/11/07(日) 16:58:06
ostream& operator << (ostream& s, const myclass& x);

myclass obj;

cout << obj;
msgbox << obj;

試したこと無いけど
こうすれば汎用性が高くなるかな?
70デフォルトの名無しさん:2010/11/07(日) 18:46:36
>>67
boost::formatはstringが返されるんだからc_strすればMessageBoxに直接渡せるだろ。

71デフォルトの名無しさん:2010/11/07(日) 20:29:05
>>70
そんなこと言ったら、stringstreamだってstr()でstringが返るんだから、c_str()でMessageBoxに直接渡せるじゃん

で、そんな野暮ったいことをするぐらいなら、ストリーム化したほうが格好良いじゃんってなって、以下ループじゃないの?
72デフォルトの名無しさん:2010/11/07(日) 21:12:06
汎用性のないクラスは自己満足じゃないか
73デフォルトの名無しさん:2010/11/07(日) 21:15:34
int* p = new int( 0, 1, 2, 3, 4, 5, 6 );

int型のコンストラクタにいくらでも引数渡せるのは何故ですか
74デフォルトの名無しさん:2010/11/07(日) 21:23:58
75デフォルトの名無しさん:2010/11/07(日) 21:26:47
VisualStudio2010です。
76デフォルトの名無しさん:2010/11/07(日) 21:46:02
確かにエラーメッセージが異様だな
通らんが
77デフォルトの名無しさん:2010/11/07(日) 22:03:00
まぁ、結局
p = new int(6);
ってやってるのと一緒なんだけどな
78デフォルトの名無しさん:2010/11/07(日) 22:24:48
コンストラクタ呼び出しは関数呼び出しと同じ形式だから、カンマ演算子じゃないだろ
79デフォルトの名無しさん:2010/11/07(日) 22:37:28
うむう・・・MSDNを必死で検索してみたけど>>73みたいな例は見つからないなあ
多分VC独自の拡張だと思うけど、本来のC++の文法から逸脱している
80デフォルトの名無しさん:2010/11/07(日) 22:45:56
>>79
VC10で試したけど、VCの拡張ですって警告も出ないな。
>>78
残念なことに>>77のいうとおりカンマ演算子の動作をしてるっぽい。バグじゃないのか?

こうなら問題ないのにな
int* p = new int(( 0, 1, 2, 3, 4, 5, 6 ));
81デフォルトの名無しさん:2010/11/07(日) 22:45:56
構文解析の時に)に一番近い6しか選択されないようになってるだけでしょ
int* p1 = new int( 0, 1, 2, 3, 4, 5, 6 );
0042D679 push 4
0042D67B call operator new (42C07Ch)
0042D680 add esp,4
0042D683 mov dword ptr [ebp-5Ch],eax
0042D686 cmp dword ptr [ebp-5Ch],0
0042D68A je main+2Dh (42D69Dh)
0042D68C mov eax,dword ptr [ebp-5Ch]
0042D68F mov dword ptr [eax],6
0042D695 mov ecx,dword ptr [ebp-5Ch]
0042D698 mov dword ptr [ebp-60h],ecx
0042D69B jmp main+34h (42D6A4h)
0042D69D mov dword ptr [ebp-60h],0
0042D6A4 mov edx,dword ptr [ebp-60h]
0042D6A7 mov dword ptr [p1],edx

int* p2 = new int( 6 );
0042D6AA push 4
0042D6AC call operator new (42C07Ch)
0042D6B1 add esp,4
0042D6B4 mov dword ptr [ebp-58h],eax
0042D6B7 cmp dword ptr [ebp-58h],0
0042D6BB je main+5Eh (42D6CEh)
0042D6BD mov eax,dword ptr [ebp-58h]
0042D6C0 mov dword ptr [eax],6
0042D6C6 mov ecx,dword ptr [ebp-58h]
0042D6C9 mov dword ptr [ebp-60h],ecx
0042D6CC jmp main+65h (42D6D5h)
0042D6CE mov dword ptr [ebp-60h],0
0042D6D5 mov edx,dword ptr [ebp-60h]
0042D6D8 mov dword ptr [p2],edx
82デフォルトの名無しさん:2010/11/07(日) 22:50:34
>>81
>構文解析の時に)に一番近い6しか選択されないようになってるだけでしょ
それはバグじゃね?普通にクラスだとそんな動作しないぞ
83デフォルトの名無しさん:2010/11/07(日) 22:57:01
VC2008EEでも問題なし
84デフォルトの名無しさん:2010/11/07(日) 22:59:49
バグだな
こういう致命的なバグを持っているとBoostで通らない場合が出て来たりして
都合が悪い
MSに報告しとくか
85デフォルトの名無しさん:2010/11/07(日) 23:11:32
まて規格を見るのが先だ、いやそれよりも腹がへった飯が先だ
86デフォルトの名無しさん:2010/11/07(日) 23:21:07
バグ報告して規格通りだったら恥ずかしいw
87デフォルトの名無しさん:2010/11/07(日) 23:47:28
intのときだけカンマ演算子になるのが規格どおりだとしたら、それによる何らかのメリットがあるはずだ

なんだ?
88デフォルトの名無しさん:2010/11/07(日) 23:52:52
だけ、じゃない
89デフォルトの名無しさん:2010/11/08(月) 00:29:18
>>86
gccよりVSが規格に近かったって聞いた試しがないけど・・・
90デフォルトの名無しさん:2010/11/08(月) 00:31:21
C++/CLIの規格なんじゃないの?
91デフォルトの名無しさん:2010/11/08(月) 00:38:00
いやC++で通っちまうんだよコンパイルが
92デフォルトの名無しさん:2010/11/08(月) 00:49:14
new-initializerからprimary-expressionまで辿ったけどカンマは出てこないな
間違いでいいんじゃないか
93デフォルトの名無しさん:2010/11/08(月) 07:29:58
自分がnewで作られたクラスだとして、自分の関数内で、自分をdeleteしたらどのようになりますか?

例えば以下クラス内関数
void A::DeleteMe(){
 delete this;
 func1(int &a);←aを弄る処理(クラス内関数、引数は外部のもの)
 func2();←自分のクラス内の変数を弄る処理(クラス内関数)
 func3();←外部の関数
}

疑問点1、delete this以降の関数は実行されるのか、そもそもこれは問題ないのか
疑問点2、デストラクタはどこで呼び出されるのか
疑問点3、func1,2,3のどれが駄目な処理で、どれが問題無い処理なのか
94デフォルトの名無しさん:2010/11/08(月) 07:45:39
>>93
自分をdeleteするのは構わないが
その時点で開放されてるので
以後仮想メンバ関数や非staticメンバ変数へのアクセスはしていけない
1,2,3は全部ダメな可能性があるし大丈夫かもしれない
95デフォルトの名無しさん:2010/11/08(月) 07:54:32
クラス内関数ってのが引っかかるな
static もクラス内ではあるわけで

外部の関数ってのは
::func3(); と書けばコメントは必要ない
96デフォルトの名無しさん:2010/11/08(月) 08:04:12
>>93
delete this の後にある、 this に対する非 static メンバアクセスは
メンバ関数呼び出しも含めてすべて未定義動作になる。
97デフォルトの名無しさん:2010/11/08(月) 08:11:59
>>94-95
ありがとう、自分をdeleteするのは問題ないけれど、delete後はstaticで宣言されていない
自分の変数,関数に触るのはいけないのね。
98デフォルトの名無しさん:2010/11/08(月) 12:00:45
delete thisなんて他人に強要される以外に書く機会なんてあるの?
99デフォルトの名無しさん:2010/11/08(月) 13:09:05
他人に強要されるってどんなときだよw
 「delete thisを書け!さもなくば人質を殺す!」
って言われた場合とか??
100デフォルトの名無しさん:2010/11/08(月) 13:11:34
delete this;を書け。でなければクビだ。
101デフォルトの名無しさん:2010/11/08(月) 13:23:28
(delete this;を)書くなら早くしろ、でなければ帰れ!

102デフォルトの名無しさん:2010/11/08(月) 13:53:53
delete this;を書かなければ民がどうなっても知らんぞ
民のためぇ…これは民のためなんだからぁ〜ん…カタカタ
103デフォルトの名無しさん:2010/11/08(月) 13:56:36
MFC使うと強制的に書く羽目になった気がする
104デフォルトの名無しさん:2010/11/08(月) 15:50:46
STLのvectorをXcodeで使用したいのですがエラーが出ます...
解決法ってありますか?
105sage:2010/11/08(月) 16:22:01
教えてください

*.cppのファイルをコンパイルしたときに

「致命的エラー F1003 c:\Borland\Bcc55\include\stdcomp.h 5: error 指令: Must use C+
+ for STDCOMP.H
*** 1 errors in Compile ***
new_dog.cpp:」

上記のようなエラーが出たのですが、なぜでしょうか?
106デフォルトの名無しさん:2010/11/08(月) 16:41:21
拡張子が本当に.cppになってるか確認しる
ピリオドが2個ついてたり全角小文字になってたりしないか?
ちゃんと合ってるなら後はコンパイルオプションで -P を付けるとか
107デフォルトの名無しさん:2010/11/08(月) 16:47:48
コンパイルオプション-Pをつけたら
コンパイルが通りました!ありがとうございました

致命的エラー F1003 ←このエラーって.cファイルのときに出るもんだと
思っていたんですが、.cppファイルでも出るとは思いませんでした。

new_dog.cpp ファイル名は正しいはずなんですが・・・
108デフォルトの名無しさん:2010/11/08(月) 16:52:38
実はnew_dog.cpp.txtになってるというオチ
109デフォルトの名無しさん:2010/11/08(月) 16:56:09
フォルダの拡張子も表示する表示形式でやってますが、
.txtになってなかったです。一瞬ヒヤっとしました。
110デフォルトの名無しさん:2010/11/08(月) 17:21:02
実はUnicodeで反転されていると
ppc.god_wen
111デフォルトの名無しさん:2010/11/08(月) 17:40:39
112デフォルトの名無しさん:2010/11/08(月) 17:51:04
113デフォルトの名無しさん:2010/11/08(月) 18:13:02
114デフォルトの名無しさん:2010/11/08(月) 18:14:49
kakikomi.txtを改竄したくなるレス
115デフォルトの名無しさん:2010/11/08(月) 20:33:08
C#しかろくに使ったことがないのですが、
C++にはC#のプロパティに近い機能かそれを再現するライブラリはありますでしょうか?
116デフォルトの名無しさん:2010/11/08(月) 20:51:07
VC++の独自拡張でよければこんなのがある。
http://www.codeproject.com/KB/cpp/properties.aspx

でも普通はgetterとsetterを使う。
117デフォルトの名無しさん:2010/11/08(月) 21:04:30
キーボードから整数を入力させ、
1からその整数までの和を出させるプログラムを書きたいのですが
うまく動きません

#include <stdio.h>
int main(void)
{
int i, x=0;

printf("please input positive nunber\n");
scanf("%d", &x);
for(i=1; i<=x; i++){
x += i;
printf("x = %d", x);
}
}

どこかおかしい点があれば指摘してくれませんか?
118デフォルトの名無しさん:2010/11/08(月) 21:06:33
scanfは悪魔にとりつかれておる
悪いことは言わん。素人のみでそれを使うのはやめなされ…
119デフォルトの名無しさん:2010/11/08(月) 21:07:12
scanfは悪魔にとりつかれておる
悪いことは言わん。素人のみでそれを使うのはやめなされ…
120デフォルトの名無しさん:2010/11/08(月) 21:10:11
for(i=1; i<=x; i++){
printf("x = %d", i);
}
121デフォルトの名無しさん:2010/11/08(月) 21:10:52
>>117
#include <stdio.h>
int main()
{
int i, n, x;

printf("please input positive nunber\n");
scanf("%d", &x);
n = 0;
for(i=1; i<=x; i++){
n += i;
printf("x = %d", n);
}
return 0;
}
122デフォルトの名無しさん:2010/11/08(月) 21:19:11
>>117
xをせっかく0で初期化してんのにscanfでxに値代入してるじゃん。
123デフォルトの名無しさん:2010/11/08(月) 21:22:40
>>122
できれば値はxとiのみで書きたいのですが
どこを直せばいいでしょうか?
124デフォルトの名無しさん:2010/11/08(月) 21:24:06
125デフォルトの名無しさん:2010/11/08(月) 21:24:55
>>116
ありがとうございます。
コンパイラ依存は面倒ですね・・・

クラス外部から書き換え不可(読み取り専用)なメンバってのも指定出来ませんか
126デフォルトの名無しさん:2010/11/08(月) 21:27:13
>>124
できれば全文書いていただけるとありがたいです
127デフォルトの名無しさん:2010/11/08(月) 21:30:26
int型の変数2つだけじゃ無理だな
128デフォルトの名無しさん:2010/11/08(月) 21:30:54
>>126
for文は何ヶ所もねえだろ
ちったぁ自分で考えろ
129デフォルトの名無しさん:2010/11/08(月) 21:50:55
http://ideone.com/NMzk8

>>127
int型1つで十分だお
130デフォルトの名無しさん:2010/11/08(月) 21:53:06
iとxのみ

#include <stdio.h>
int main()
{
int i, x;

printf("please input positive nunber\n");
scanf("%d", &i);
for( x=0 ; i>0 ; i--){
x+=i;
}
printf("x = %d", x);
return 0;
}
131デフォルトの名無しさん:2010/11/08(月) 21:58:23
>>129は凄いけどソースが汚いしダメだな。
132デフォルトの名無しさん:2010/11/08(月) 22:00:22
>>130
きれいにまとまってるな
どうしてfor文のiに--がつくんだろう
133デフォルトの名無しさん:2010/11/08(月) 22:02:54
変数iに入力した値をデクリメントで0になるまでxに足していくだけ
134デフォルトの名無しさん:2010/11/08(月) 22:07:10
環境依存すれってどこいっちゃったんだ・・・
135デフォルトの名無しさん:2010/11/08(月) 22:48:41
xml関係の処理をするために、sax関係のクラスを継承しています
gccが使っていない変数(パラーメータ)があるよと警告してきますが、
どのようにすれば黙らせることができるのでしょうか?
136デフォルトの名無しさん:2010/11/08(月) 23:05:09
man gcc
137質問です:2010/11/08(月) 23:17:49
アクセッサ(プロパティ)のGetの方について質問です。

普通なら下のように実装するのでしようが、

int GetValue() const
{
  return m_nValue;
}

このメソッドの中でエラーが発生する場合、
以下のように引数で得たポインタに値を代入し、戻り値でエラーコードを返すのがいいのか、

bool GetValue(int& pValue) const
{
  *pValue = m_nValue;
  return true;
}

以下のようにexceptionで実装した方が好ましいのか、

int GetValue() const
{
  if (!m_nValue) throw "ぬるぽ";
  return m_nValue;
}

どれがいいのでしょうか。
138デフォルトの名無しさん:2010/11/08(月) 23:20:09
pair<bool, value>を返すとか
139>>137:2010/11/08(月) 23:26:48
ミスってた…

× bool GetValue(int& pValue) const
○ bool GetValue(int* pValue) const // まぁint&の方がいいのでしょうけど

>>138
なるほどその手もありますね。
140デフォルトの名無しさん:2010/11/08(月) 23:27:40
エラーが出るようなものはgetterにしない
141デフォルトの名無しさん:2010/11/08(月) 23:44:27
検索、追加とか
142デフォルトの名無しさん:2010/11/08(月) 23:51:14
というかgetterとか関係なくね?
例外かエラーコードかどっちなの?ってだけでしょ
143デフォルトの名無しさん:2010/11/08(月) 23:54:32
>引数で得たポインタに値を代入し
おいおいどこがポインタだよ
144デフォルトの名無しさん:2010/11/09(火) 00:00:16
エラーが出るような処理をするならその処理の名前を付けて
他の関数でのエラー通知法とあわせるって話じゃないの
145デフォルトの名無しさん:2010/11/09(火) 01:35:21
質問です。

class p
{
double x;
double y;
double z;

...(略)
}

std::vector<p> a,b

a,bにはそれぞれ50000くらいの要素が入る

この状態でaの中のとある要素(Xa,Ya,Za)に
bの中で最も近い点(Xb,Yb,Zb)を算出するってのをやります。

で、そのときのaに対応するbの要素が何処に格納されてるかを知りたいので
クラスpの中に対応するbの要素のアドレスを保管する変数を定義したいのですが、
うまい方法無いでしょうか?
146デフォルトの名無しさん:2010/11/09(火) 01:56:03
p* nearest;
147デフォルトの名無しさん:2010/11/09(火) 02:00:28
>>145
単純に以下の形ではだめなの?
class p {
double x; double y; double z;
p *nearest;
};

std::vector<p> b上の添え字を覚えておくだけでもいいなら p* の代わりに size_t にでもすればいい。

そもそもpの中に覚えておくとするとb側の各要素もその情報をもつことになるけど無駄じゃない?
b上の各要素も最も近いa上の要素を記憶するというなら無駄ではないけど。

a側のみ最も近い相手を覚える必要があるなら、pのメンバではなく、
別の配列として std::vector<p*> や std::vector<size_t>で覚えておくことも出来る。
148デフォルトの名無しさん:2010/11/09(火) 02:01:51
リロードしてなかったorz
149デフォルトの名無しさん:2010/11/09(火) 06:53:34
>>134
2-3週間ぐらい前に落ちてそれっきり。
150デフォルトの名無しさん:2010/11/09(火) 15:46:22
>>146-147
ありがとう。p*をclassのなかに追加することにしました。

bにもp*を持つことになるけど、bは次のcについて最も近い点(Xc,YcZc)の情報を保持
するのに使うので無駄にはならないかなぁと。
151デフォルトの名無しさん:2010/11/09(火) 18:43:12
3行3列の行列の積を求めるプログラムを書きたいのですが
実行してもうまくいきません
どこがおかしいのか指摘してくれませんか?

#include <stdio.h>
int main (void)
{
int i,j,k;
int a[3][3] = { {1, 2, 3}, {1, 2, 3}, {1, 2, 3} };
int b[3][3] = { {1, 2, 3}, {1, 2, 3}, {1, 2, 3} };
int c[3][3];

for(i=0;i<3;i++){
for(j=0;j<3;j++){
for(k=0;k<3;k++){

c[i][j] = c[i][j] + a[i][k] * b[k][j];
}
}

for(i=0;i<3;i++){
for(j=0;j<3;j++){
for(k=0;k<3;k++){
printf(" %3d", c[i][j]);
}
printf("\n");
}
return 0;
}
}
}
152デフォルトの名無しさん:2010/11/09(火) 18:45:56
c の初期値がない
153デフォルトの名無しさん:2010/11/09(火) 19:15:24
釣りじゃないか?
154デフォルトの名無しさん:2010/11/09(火) 19:44:59
まずベクトルクラスを作るんだ
155デフォルトの名無しさん:2010/11/09(火) 19:46:54
そして次にPCの電源を切ります
156デフォルトの名無しさん:2010/11/09(火) 20:04:18
物でベクトル作ってみろや!!
157デフォルトの名無しさん:2010/11/09(火) 20:35:53
using namespace std;があまり良くないってホントですか?
158デフォルトの名無しさん:2010/11/09(火) 20:38:02
>>157
うっかり min や max をつぶしてしまったことがありました。
159デフォルトの名無しさん:2010/11/09(火) 20:41:22
>>158
kwsk
160デフォルトの名無しさん:2010/11/09(火) 20:59:16
>>157
stdはものすごい広いので、把握できないほど大量の物が定義されており
うっかり被って怒られることがあるのでやめたほうがいい
特にグローバル領域でやるのは
161デフォルトの名無しさん:2010/11/09(火) 21:02:52
個人レベルで作るくらいならたいした問題じゃないと思うけど
たとえばboostライブラリを使ってて、stdとboostで同じ名前のクラスが定義されてたりするとコンパイル通らない

using std::cout;

とかするといいよ
162デフォルトの名無しさん:2010/11/09(火) 21:47:38
スペースを" "意外で表す方法ありませんか?
" "はVB6っぽくてすごく気持ち悪いです
163デフォルトの名無しさん:2010/11/09(火) 21:51:34
#define SPACE " "
164デフォルトの名無しさん:2010/11/09(火) 21:55:49
' '
165デフォルトの名無しさん:2010/11/09(火) 21:57:40
std::space
166デフォルトの名無しさん:2010/11/09(火) 22:07:23
>>157
はげしくダメだろう。
167デフォルトの名無しさん:2010/11/09(火) 22:23:44
javaでは機能ごとにパッケージに分割することが多いと思います。
C++ではあまりディレクトリに分割しないんですか?
168デフォルトの名無しさん:2010/11/09(火) 22:27:40
お好きなように
169デフォルトの名無しさん:2010/11/09(火) 23:14:17
データが失われない暗黙的な型変換(boolからintへ、intからdoubleへ)ってコンパイラに警告出させられます?
g++かVC++を想定しています
170デフォルトの名無しさん:2010/11/09(火) 23:38:18
ツリー構造の後順走査って再帰使わないでループで書けますか?
171デフォルトの名無しさん:2010/11/09(火) 23:43:24
書けるけど
スタックをスタックにとるかヒープにとるかの違いに意味があるのか
172デフォルトの名無しさん:2010/11/09(火) 23:54:26
ループで書けるしスタックも要らない
173デフォルトの名無しさん:2010/11/10(水) 01:00:28
ツリーの作り方によるんでないの
174デフォルトの名無しさん:2010/11/11(木) 03:46:22
初歩的なことですが確認のためお聞きしたい
例えば
int* a,b;
としたとき、これは
int *a;//aはポインタ
int b;//bは実体
こういう解釈になるらしい?
175デフォルトの名無しさん:2010/11/11(木) 03:49:42
yes
176デフォルトの名無しさん:2010/11/11(木) 03:52:55
>>175
ご返答感謝
ということは全部ポインタにしたい場合
int *a,*b;
ですね
177デフォルトの名無しさん:2010/11/11(木) 06:15:55
>>176
int* a;
int* b;
でおねがいします。
178デフォルトの名無しさん:2010/11/11(木) 08:11:22
>>177
素人か?
力抜けよ
179デフォルトの名無しさん:2010/11/11(木) 09:04:03
(int *) p, q;
180デフォルトの名無しさん:2010/11/11(木) 12:11:39
質問です!
C++の開発現場に回されることになりそうなんですが、
OSがAIXということで、気をつけなくてはいけないところがありますか?
今まではUNIXやsolarisでmakefileを使ってコンパイルしてました。
181デフォルトの名無しさん:2010/11/11(木) 12:19:42
何を開発するかが最大の問題であって、環境は大して変わらんと思うよ。
IBMのコンパイラのマニュアルでも斜め読みしておけば?
182デフォルトの名無しさん:2010/11/11(木) 13:06:43
>>179
話の流れでそれがふと思い浮かんだけどできなかった
そのためのtypedefか
183デフォルトの名無しさん:2010/11/11(木) 14:36:43
s-jisコードをユニコードに変換する方法教えてください。
184デフォルトの名無しさん:2010/11/11(木) 15:04:39
>>183
環境依存スレが立ったようなのでそっちで聞いた方が良い
185デフォルトの名無しさん:2010/11/11(木) 17:03:43
>>181
ネットにAIXのマニュアルが転がってたので見てみることにします
マニュアルの癖に読みづらいな〜w
186デフォルトの名無しさん:2010/11/13(土) 05:30:18
stringクラスを使うには#include <string>になるけど
これはC言語のstrcpy()やstrcmp()と同じヘッダーファイル
なんだろうか。
187デフォルトの名無しさん:2010/11/13(土) 07:09:10
違う
188デフォルトの名無しさん:2010/11/13(土) 09:00:37
cstring
189デフォルトの名無しさん:2010/11/13(土) 11:15:15
非情に重いヘッダをインクルードしてるので
pimplで翻訳単位を分割してコンパイルを早くしたい
だけど実行効率も無視できない部分なのでnew/deleteを削りたい
こんな時はどうすればいいですか?
190デフォルトの名無しさん:2010/11/13(土) 11:58:41
>>189
pimplとnew/deleteが競合する理由がわからない
191デフォルトの名無しさん:2010/11/13(土) 12:16:06
//hpp
class foo
{
double strage[ENEOUGN_LENGTH];
public:
foo(void);
};

//cpp
foo::foo(void)
{
static_assert(align_of<foo>::value & (align_of<impl>::value - 1) == 0);
static_assert(sizeof(impl) <= sizeof(strage));
new (strage) impl();
}
192デフォルトの名無しさん:2010/11/13(土) 20:11:52
placement new のオーバーヘッドは0だろ。気にするな。

ENEOUGN_LENGTHがサイズを無駄にする可能性があるけど、重いヘッダーに対してnew(普通の)のコストは誤差レベルが多いだろうからshared_ptrでpimplれば十分だと思う。
193デフォルトの名無しさん:2010/11/14(日) 13:10:17
mutableを使う時に注意すべき事を教えてください
194デフォルトの名無しさん:2010/11/14(日) 14:04:33
関数の戻り値にconstを付けると、どのような意味があるのですか?
195デフォルトの名無しさん:2010/11/14(日) 14:08:44
桶屋が儲かる
196デフォルトの名無しさん:2010/11/14(日) 14:37:23
template< class T, class S > class Foo
{
T< S > v;
};
Foo< std::vector, int > foo;

これ出来ないんですが解決する方法教えてください
197デフォルトの名無しさん:2010/11/14(日) 14:48:50
198デフォルトの名無しさん:2010/11/14(日) 14:50:09
ありがとう
199デフォルトの名無しさん:2010/11/14(日) 15:45:58
>>194
意味は普通の const と同じ
特徴は次のようなのがある
・メンバー変数を変更される恐れがない
・ (a + b).hoge() といった使い方ができない
200デフォルトの名無しさん:2010/11/14(日) 16:17:05
>>193
mutableを使うとconstメンバーだと思ったら、状態が変わっていたということになる。だから、状態が変わったことがクラスの外からは無関係な場合に使用する。たとえばキャッシュとか。
マルチスレッドでは、constメンバー関数は再入可能な実装が多いが、mutableがあるとconstメンバー関数も再入不可になる可能性がある。再入可能にするためにはmutex等でmutexメンバーを保護する必要がある。
201194:2010/11/14(日) 17:07:47
>>199
それじゃ、std::string func() const;と何が違うのですか
202デフォルトの名無しさん:2010/11/14(日) 17:29:44
後ろにconstついてる場合は意味が違う
その関数を呼び出してもメンバ変数が書き換わらないことを意味する
203194:2010/11/14(日) 17:42:56
>>202
なるほど、だからT getXXX()はconst関数なんですね
thx
204デフォルトの名無しさん:2010/11/14(日) 17:44:29
関数の戻り値にconstを付けると、どのような意味があるのですか?

→ メンバー変数を変更される恐れがない

それじゃ、std::string func() const;と何が違うのですか

→ その関数を呼び出してもメンバ変数が書き換わらないことを意味する

???
205デフォルトの名無しさん:2010/11/14(日) 17:49:53
>>204
>>199の・メンバー変数を変更される恐れがない は
const hoge& getHoge()const{return m_hoge;}
のことを言ってると思われ
constつけないと戻りの参照でメンバーを変更できるでしょ
206デフォルトの名無しさん:2010/11/14(日) 17:55:34
関数の戻り値にconstを付けると、どのような意味があるのですか?
→ 返り値が変更される恐れがない
ex) if(func() = 1){}っていうミス防止

std::string func() const;は?
→ その関数を呼び出してもメンバ変数が書き換わらないことを意味する

の間違いじゃねえのか
207デフォルトの名無しさん:2010/11/14(日) 17:58:22
よく分かってない人に対する解説として説明不足ではあるなw
208デフォルトの名無しさん:2010/11/14(日) 18:01:27
そうであるなw
209デフォルトの名無しさん:2010/11/14(日) 18:26:04
const T& U::get() const;
前のconstは戻り値がconstになる
後のconstはUの全メンバ変数がconstになる
210デフォルトの名無しさん:2010/11/14(日) 18:35:03
ここでmutableが乱入!
>>193>>200はその布石だったのだよ!!
211デフォルトの名無しさん:2010/11/14(日) 18:59:47
まぁ、禿って一所懸命に考えてるけど。




結局、矛盾を取り繕うための対処策なんだよな
212デフォルトの名無しさん:2010/11/14(日) 19:55:07
#undef HAGE
213デフォルトの名無しさん:2010/11/14(日) 21:42:30
>>211
そうそう。
奥が深いんだと勘違いしているだけだろう。

いや引き返せなくなっちゃっているからその仕事は大事なんだけどさ。
214デフォルトの名無しさん:2010/11/14(日) 21:50:24
黙れ小僧!お前に禿が救えるか?
215デフォルトの名無しさん:2010/11/14(日) 22:08:20
#if !defined HAIR
#define HAIR TEXT("ふさふさ")
#endif
216デフォルトの名無しさん:2010/11/14(日) 23:15:57
>>215
#undef HAIR
217デフォルトの名無しさん:2010/11/14(日) 23:18:12
>>214
C++を助ければいいのか頭髪を助ければいいのか。
218デフォルトの名無しさん:2010/11/14(日) 23:20:31
助けるんじゃなくて投げ捨てるべき
219デフォルトの名無しさん:2010/11/14(日) 23:23:26
JavaやC#みたいなインターフェイスが欲しくてたまらないお…
安全性にも気遣って欲しいお…
220デフォルトの名無しさん:2010/11/14(日) 23:25:06
じゃあC#でやれよ
221デフォルトの名無しさん:2010/11/14(日) 23:29:43
>>220
それじゃあC++が進歩せんだろ。
lambda取り入れたぐらいだし、
もうどんどん他の言語の良いとこ取り込んだ方がいいと思うぜ。
222デフォルトの名無しさん:2010/11/14(日) 23:40:05
Boost InterfaceのC++0x版でも夢想しとけ。
223デフォルトの名無しさん:2010/11/14(日) 23:40:36
C#をネイティブコンパイル出来るようにする。
  or .NETのexeからネイティブexeを生成する。
224デフォルトの名無しさん:2010/11/14(日) 23:48:36
>>222
サンクス
オナってくる

やはりC++は豊穣やな
225デフォルトの名無しさん:2010/11/15(月) 00:01:15
C++ に @interface はなぜ存在しないんだろう
特に矛盾なく実装できそうなんだが…

private なメンバ関数を増やすだけなんてインターフェイスを変えずに実装を変えてるだけなのに、
その都度ヘッダを見てるソース全コンパイルなんてどう考えてもおかしいだろう
何のためのインターフェイス分離だ

pimpl 使うのはいいけどコピーコンストラクタとか書くの面倒だし、
なによりコンパイル速度を上げるためだけに、実行速度を犠牲にしてまで構造を変えるってのが気持ち悪い

でも実装されないってことは何か理由があるんだと思うんだが
実際に何があるの?
226デフォルトの名無しさん:2010/11/15(月) 00:07:57
privateメンバーの代わりに匿名空間の関数を使ったり今のままでもなんとかなるから余計なキーワード追加してまで機能を追加したくない
227デフォルトの名無しさん:2010/11/15(月) 00:10:44
>>225
純粋仮想関数だけ宣言したクラスで、何か不満か?
228デフォルトの名無しさん:2010/11/15(月) 00:12:08
コストが不満
229デフォルトの名無しさん:2010/11/15(月) 00:15:12
>>226
でもC#使ってると、如実にその力を感じるわよ。
IListとかIDisposableとか、何のインターフェイスがあるかで機能がすぐ分かるし、
それに何より安心感がある。
ドキュメント見ながら修正〜みたいな事も減るし、良い事づくめの様に思えるが?

今までのままでなんとかなるっつーても、それはそうだけど、
オブジェクト指向の精神から言うと絶対に入れるべき機能に思えるんだぜ。
開発者が楽するためにってのもすごく重要だし。
230デフォルトの名無しさん:2010/11/15(月) 00:17:18
231デフォルトの名無しさん:2010/11/15(月) 00:19:14
仮想関数ぐらいでコストとか死んでしまえばいいよ
232デフォルトの名無しさん:2010/11/15(月) 00:19:42
いちいち継承しないといかんのがだるいからどうにかしてくれ。自前Vtableは遅いしやんなっちゃう
233デフォルトの名無しさん:2010/11/15(月) 00:21:38
テンプレートでダックタイピングできるじゃない。しかも実行時のコストはゼロ。
234デフォルトの名無しさん:2010/11/15(月) 00:25:08
相談室だから聞いちゃうけどさ、
C++でダックタイピングってどうなの?
あれは動的言語じゃなきゃ出来ないかと思ってたんだけど…。
確かにテンプレートを知った時は、
「うはwwwwこれでダックタイピング出来るじゃんwww」
って思ったけど、C++って一応静的言語だよね…?
実行時型判断とかやってるの?
初心者の質問ごめんなさい。でも誰か答えてたもれ。
235デフォルトの名無しさん:2010/11/15(月) 00:28:23
>>234 呼び出しに適合する関数が無ければコンパイルエラーになるだけのこと。
236デフォルトの名無しさん:2010/11/15(月) 00:29:13
C++に必要なのは機能の追加より制限だろ
生ポインタはunsafeコンテキスト外で使用禁止とかさ
237デフォルトの名無しさん:2010/11/15(月) 00:31:29
機能追加も制限も、安易にやってしまうとライブラリ開発者が死んでしまうだろうな
238デフォルトの名無しさん:2010/11/15(月) 00:33:30
>>235
それはそうなんだけど、その静的動作がダックタイピングって言えるのかなっていう疑問です。
ダック"タイピング"だから、打ち込む時の扱いでダックタイピングだと決めていいのかな…?

>>236
それC#…ってツッコミを待っているのか貴様ッ!
C#はVS2010でやっとポインタインデックスに対する加算からアドレスを求めるメソッドが実装されましたよヤレヤレ…
危険な機能でもC系列の末裔なんだからさっさと欲しかったです…
239デフォルトの名無しさん:2010/11/15(月) 00:36:30
>>238
.NETでポインタ演算したいならC++/CLI使おうよ
240デフォルトの名無しさん:2010/11/15(月) 00:39:17
ゴミだろ…
241デフォルトの名無しさん:2010/11/15(月) 00:40:52
ポインタの制約(+α)で、標準オプションレベルでは、
C的キャストにおいてC++キャストに置き換え可能なときはエラー
とかしても良かったと思う。

下請けがCキャスト使いすぎだってばよ!
242デフォルトの名無しさん:2010/11/15(月) 00:42:19
置き換え不可能なCスタイルキャストってあるか?
243デフォルトの名無しさん:2010/11/15(月) 00:42:58
せめて警告は出してほしいよね。
244デフォルトの名無しさん:2010/11/15(月) 00:45:34
KdTreeをC++で構築したい。

何となく木構造の構築する手順は解ったんだけど、
実際に最近傍探索をどうやるのかが解らない。詳しい人居ますかね?
245デフォルトの名無しさん:2010/11/15(月) 00:45:58
>>242
dynamic
246デフォルトの名無しさん:2010/11/15(月) 00:46:51
>>238
じゃあなんか適当に西洋人に受けそうな名前をつければいいよ。
「チャイニーズダックタイピング」とかなんとか。
247デフォルトの名無しさん:2010/11/15(月) 00:47:09
危険な処理に片っ端から警告出すコンパイラがあってもいいはずだ
どうせならコンパイルエラー吐いてくれれば最高だ
ウチで採用する
248デフォルトの名無しさん:2010/11/15(月) 00:51:38
>>234
面倒な奴だな。その言葉遊びにどれほどの実益があるのかしらんけど
Matzとでも語ってりゃいいんじゃね?

http://jp.rubyist.net/magazine/?0018-Legwork
249デフォルトの名無しさん:2010/11/15(月) 00:52:02
>>245
逆だろ
C++キャスト"に"、だよ
250デフォルトの名無しさん:2010/11/15(月) 01:03:28
>>246 >>248
いや単純に疑問でさ…ごめんよ。そういうトリヴィアルな所が気になっちゃうんだ。
251デフォルトの名無しさん:2010/11/15(月) 01:40:19
諸先輩方に質問がございます。
「決定版 はじめてのC++ 初版」を読みながらXP sp3 / VC++2008 EE sp1 で
Windowsプログラムを作成しております。
わたくしはプログラミング歴2日ほどの初心者です。

動的変数の配列への適用(p.405)についての質問です。
TCHAR型の動的配列の書き方についてです。

Windowsの変数型であるTCHAR型変数への記載が当然ながら書いてありません。
またchar型変数のことも記載がないのでとまどっております。

TCHAR *str1 ;
str1 = new TCHAR[ 256 ] ;

delete [] str1 ;
という記述は正しく機能するでしょうか?

なぜネットで散見いたします
char *str1 = new char[ 256 ] ;
のような書き方をしないかについて申しあげます。

LPCTSTR lpcszMes1 = TEXT( "hogehoge" ) ;
LPCTSTR lpcszMes2 = TEXT( "mesomeso" ) ;
LPTSTR lpszUnited ;
があるときに
void MessageUnited( TCHAR *unit , LPCTSTR mes1 , LPCTSTR mes2 )
{
// ここでmes1とmes2のそれぞれの文字数を合計した数値sumを計測して
// unit = new TCHAR[sum+1] ;
}
といった関数で合体処理して、新しい文字列変数unitのポインタをlpszUnitedで参照して、活用した後、deleteしたいのです。
私の頭は大丈夫でしょうか。
252デフォルトの名無しさん:2010/11/15(月) 01:43:36
>>238
非ダックタイピングてのはduckはwalkとquackのメソッドを持つと予め宣言する必要があるものをいう。
C++ではコンセプトだな。流れたが。
253デフォルトの名無しさん:2010/11/15(月) 01:44:57
>>251
TCHARってのは
ユニコード環境でもマルチバイト環境でも使えるようにっていうWindows定義の型
VSならプロジェクトの構成プロパティに
文字セットをどちらにするかの設定がある

Unicode文字セットを使用するなら
typedef wchar_t TCHAR;
マルチバイト文字セットなら
typedef char TCHAR;
となる

同様に、LPTSTRも文字セットの違いによって
wchar_t*型かchar*型の違いがでる

なのでTCHARにしとかないと
どちらかの環境ではエラーがでることになるのでたぶん正しいんじゃない?
全コード見たわけじゃないからなんともいえないけど
254デフォルトの名無しさん:2010/11/15(月) 01:45:00
>>251
とりあえず書かれた内容にあからさまな間違いは見当たらないから大丈夫じゃね?
やってみるといいよ。

ただし std::vector か std::string の使用を強くお勧めするよ。
255デフォルトの名無しさん:2010/11/15(月) 01:48:24
TCHARなんて忘れたほうがいいよ
Win95/98/Meなんて誰も使ってないんだから
256デフォルトの名無しさん:2010/11/15(月) 01:49:30
>>251
前半はいいけど

> void MessageUnited( TCHAR *unit , LPCTSTR mes1 , LPCTSTR mes2 )
> {
> // ここでmes1とmes2のそれぞれの文字数を合計した数値sumを計測して
> // unit = new TCHAR[sum+1] ;
> }
> といった関数で合体処理して、新しい文字列変数unitのポインタをlpszUnitedで参照して、活用した後、deleteしたいのです。

この関数は正しく機能しないと思います
unit は MessageUnited のローカル変数なのでただ代入しても呼び出し元に影響しません
呼び出し元の変数を書き換えるには参照を使って
void MessageUnited( TCHAR *&unit , LPCTSTR mes1 , LPCTSTR mes2 )
のようにするか、二重ポインタを使って
void MessageUnited( TCHAR **unit , LPCTSTR mes1 , LPCTSTR mes2 )
とします
257デフォルトの名無しさん:2010/11/15(月) 01:55:01
>>253
>>254
大変心強いお言葉をいただきありがとうございます。
とりあえずやってみてダメなところが見つかったら
試行錯誤してみます。

それにstd::vector、とstd::stringでやりたいことが出来そうであることがわかりました。
重ねてありがとうございます。
258デフォルトの名無しさん:2010/11/15(月) 02:00:11
LPTSTR UniteMessages(LPCTSTR msg1, LPCTSTR msg2)
void UniteMessages(LPTSTR&united, LPCTSTR msg1, LPCTSTR msg2)
でしょ
259デフォルトの名無しさん:2010/11/15(月) 02:02:41
>>256
ご指摘ありがとうございます。

void MessageUnited( TCHAR *&unit , LPCTSTR mes1 , LPCTSTR mes2 )
とするときには
呼び出し側で
MessageUnited( &lpszUnited , lpcszMes1 , lpcszMes2 ) ;
とすれば正しく文字列参照ができる、というかんじでしょうか。

そのときでも
TCHAR* lpszUnited ;
としているときには
delete [] lpszUnited ;
でメモリ解放は完了するということであってますでしょうか。

ポインタがこんがらがってきました。

>>255
ところがどっこい
260デフォルトの名無しさん:2010/11/15(月) 02:04:07
>>259
自分で試してから聞けよ。
261デフォルトの名無しさん:2010/11/15(月) 02:12:00
stringってwstringと分かれてるよね
262デフォルトの名無しさん:2010/11/15(月) 02:12:14
Win32APIスレか環境依存スレでやったほうがいいんじゃね?
それとどこのスレで質問するにしても最低限MSDNで検索してからにしろよ
TCHARの説明もあるし、TCHAR用の文字列結合関数もあるぞ

っつかTCHAR使ってるのに触りも説明しないなんて本あるのか?
今までオレが購入したWindowsのAPIを扱う本ではそんなの一冊もなかったが
263デフォルトの名無しさん:2010/11/15(月) 02:15:27
今はもう wchar_t 一本でいいよ。XPも切り捨てようかって時代に9xなんてさすがにもう眼中にないだろ。
264デフォルトの名無しさん:2010/11/15(月) 02:19:45
まあいいじゃないか2chなんだし
なにかしら事情があるのだろう察してやれリョ
265デフォルトの名無しさん:2010/11/15(月) 02:22:15
またいつか新しいまともな文字コードに切り替わるときに
TCHARに含められるんじゃないか?
266デフォルトの名無しさん:2010/11/15(月) 02:22:52
×リョ
○よ
267デフォルトの名無しさん:2010/11/15(月) 02:32:08
なんか質問のポイントが散りすぎ
WindowsプログラミングどころかC/C++もロクにわかってなさそう
268デフォルトの名無しさん:2010/11/15(月) 03:13:26
そらプログラミング歴2日ならそんなもんだろう
269デフォルトの名無しさん:2010/11/15(月) 03:17:50
もう歴とは呼べまい。w
270デフォルトの名無しさん:2010/11/15(月) 06:11:36
>>252
レス感謝
その定義だと一応C++もダックタイピング可って事になりますね。

http://en.wikipedia.org/wiki/Duck_typing
けどwikipediaによると、やっぱり動的ってのは必須らしい(宗教論争中なのかもだけど)。
けど同時にJava,C++,Dは静的にunreachableやらが検出できる(当然だけど)と書いてて、
定義はともかく、静的にやれた方が便利みたいなニュアンスを感じる。

タイピング時の動作で言うならテンプレートもダックタイピングなのに、
動的じゃないからダックタイピングじゃないって言われるのはなんか不合理な気もするんだぜ。
動的型検査はダックタイピングの本来的な要素じゃないだろうに。


でもこれよりも流れてほしくないのがインターフェイスについての話についてです。
C++でC++0xにも取り込まれてないのはなんで?
大規模開発可能な言語を自称するんなら必須の機能に思えるのに。
設計と進化にはその理由とか載ってるんでしょうか?
271デフォルトの名無しさん:2010/11/15(月) 06:20:03
interfaceなんていうありふれた名前を予約語に使えるわけ無いだろ。
まあ大抵の処理系なら[[interface]]あたりでも用意するだろう。
272デフォルトの名無しさん:2010/11/15(月) 07:16:04
C++/CLIを使ってるのですが
char[100] moji = "プログラム中でいろいろ入れる"みたな感じでやってて
ボタン->Text = moji のようにしたいのですがString^型がうんたらかんたらと出て変換できません
どうやって変換すれば良いのでしょうか?
273デフォルトの名無しさん:2010/11/15(月) 07:27:18
String^ moji = "なんとかかんとか";
ボタン->Text = moji;
274デフォルトの名無しさん:2010/11/15(月) 07:50:00
>>273
ありがとうございます
String^ out = gcnew String(moji)でやったのですが
自分のはString^ 型のoutを使うのが少なくて、char型のmojiを使うのは多かったのですが(strcpyとかやたらある)
その方法ならchar[100]型使ってたところは全部そのままでいけたのでしょうか?
275デフォルトの名無しさん:2010/11/15(月) 08:21:04
>>270
多重継承でもしてろ
276デフォルトの名無しさん:2010/11/15(月) 10:53:44
・予約語を増やしたくない
・現状で十分機能する代替案がある

よって追加する必要なし
277デフォルトの名無しさん:2010/11/15(月) 11:05:02
タダでゲームを作ろう! 〜無料で使えるRPG制作ツール16〜
http://d.hatena.ne.jp/ryoh1212/20090624/1243306857

「ゲームを作ってみたいけど、プログラミングが難しくて……」という人も
いるでしょう。確かにプログラミング言語を使ってゲームを作るには、
画像表示やキー入力などのゲーム以外のことも覚えなければなりません。
そこで今回は、プログラミング言語をマスターしていなくてもゲームを
作れるフリーウェアを紹介します。
WOLF RPGエディター、Queek II、CardWirth、J-RPG CreatorDX、
Like A Quest Hyper、RPG Script System、ERPG、mRPG、
シミュレーションRPGエディター、WWWエディター(仮)、
−R− RPG制作ツール、Rmake、Desigeon、
ロープレジェネレーター、RPG_MT、MEIQAの16種類です。
278デフォルトの名無しさん:2010/11/15(月) 15:30:44
質問です。
名前つきenumの中身を、後から定義する方法はないでしょうか?

enum HogeA{};
enum HogeB{};

void foo(HogeA hoge){}
void foo(HogeB hoge){}

enum HogeA
{
MONYO = 0
};

enum HogeB
{
MOO = 0,
PPP,
};

こんな感じで、
・enumの型を使って同名な関数を呼び分けたい
・enumの中身の定義は後回しにしたい
のです。
実際上のコードはHogeAは定義済みとしてエラーになってしまいます。
279デフォルトの名無しさん:2010/11/15(月) 15:35:21
最初の方を宣言のみにしとけばいいだけじゃないのか
280デフォルトの名無しさん:2010/11/15(月) 15:37:26
>>279 それ、現行の標準には含まれてない。拡張で受け付けるコンパイラもあるけど。
281デフォルトの名無しさん:2010/11/15(月) 15:40:16
>>280
そうなんだ
ごめんね
282デフォルトの名無しさん:2010/11/15(月) 15:44:08
enum fuckってやつか
283デフォルトの名無しさん:2010/11/15(月) 15:46:01
>>279-281
ありがとうございました。
少なくともVS2010では
extern enum HogeA;
(略)
enum HogeA
{
foo = 0
};

が可能でした。
externとは思いつきませんでしたが、関数とかでは「宣言」できるわけですから、想像してしかるべきでした。
本当にありがとうございました!
284デフォルトの名無しさん:2010/11/15(月) 19:14:39
それ完全にVC++拡張だからC++0xの方も覚えとけ
http://d.hatena.ne.jp/faith_and_brave/20090318/1237371641
285デフォルトの名無しさん:2010/11/15(月) 23:06:06
オススメのフレームワークありますか?
286デフォルトの名無しさん:2010/11/15(月) 23:07:14
なんのフレームワークでしょうか
287デフォルトの名無しさん:2010/11/15(月) 23:15:23
おすすめのつってんだろボケ
288デフォルトの名無しさん:2010/11/15(月) 23:16:12
おすすめのフレームワークありますよ
289デフォルトの名無しさん:2010/11/15(月) 23:24:46
野菜を育てるフレームワークです
290デフォルトの名無しさん:2010/11/15(月) 23:30:40
きっとこういうボットを作るためのフレームワークのことだよ。 http://twitter.com/tsubuyakibooks
291デフォルトの名無しさん:2010/11/16(火) 00:00:17
void classA::funcB(int C)

void classA::funcB(const int& C)

の引数ってどうやって使い分けるの?
上はインクリメントができるとかそういうこと?
292デフォルトの名無しさん:2010/11/16(火) 00:14:16
>>291 そういうこと。
293デフォルトの名無しさん:2010/11/16(火) 00:46:20
void func(int m)
{
//〜
}

void func(int const & n)
{
int m = n;
//〜
};

まあこれでほぼ等価と考えていい
ただ上のほうが最適化しやすいので上で書いて玄人ぶる人もいる
294デフォルトの名無しさん:2010/11/16(火) 01:03:58
const後置する人ってなんなの?
295デフォルトの名無しさん:2010/11/16(火) 01:09:34
>>294 ポインタを const にしたいときは後置しかできないことを知ったうえで統一感を重視する人だよ。
296デフォルトの名無しさん:2010/11/16(火) 01:14:46
constポインタとの兼ね合いを考えると、後置の方が綺麗だろう
297デフォルトの名無しさん:2010/11/16(火) 02:03:18
左右から修飾されるより右から修飾されるで統一させたほうが読みやすい
298デフォルトの名無しさん:2010/11/16(火) 02:12:57
int const * const func() const
299デフォルトの名無しさん:2010/11/16(火) 03:17:12
C++は、日本人ライターの本は、あまり良書がないな。
ただし、「STLよるコンポーネントデザイン」や「Generic Programming
- STLによる汎用プログラミング -」の日本語訳者でもある人で、C++を
専門的に執筆してる人の著書だけは、良書だと思うが。
300デフォルトの名無しさん:2010/11/16(火) 10:08:28
>>284
ご丁寧にありがとうございます。
こちらも参考にさせていただきますね。
C++0xは色々便利になっていて素敵ですね。はやくVSとかに適用されてくれればなぁ(2010への適用度がかなり低い…)
301デフォルトの名無しさん:2010/11/16(火) 10:25:25
法則優先させることが読みやすさにつながるとは限らないことが理解できるといいですね(ニコッ
302デフォルトの名無しさん:2010/11/16(火) 11:24:48
constポインタとの兼ね合いを考えたら前置きの方がいいんじゃないの?
後ろ置きだと意味が変わるような
303デフォルトの名無しさん:2010/11/16(火) 12:02:37
@const int *const *const *const p;
Aint const *const *const *const p;
どう考えてもAの方が統一性がある。
304デフォルトの名無しさん:2010/11/16(火) 16:03:22
for(int i=0;i<size;++i){
  if(array[i]==0)
    goto label1;
}
return false;
label1:
/*...*/

っていう処理を書いたんですけど、gotoなしで書き直すにはどうしたらいいでしょうか?
305デフォルトの名無しさん:2010/11/16(火) 16:05:06
for(int i=0;array[i];++i)
if(i>=size)return false;
/*...*/
306304:2010/11/16(火) 16:31:52
>if(i>=size-1)return false;
じゃね?
307304:2010/11/16(火) 16:33:57
ともかくありがとうございます
308デフォルトの名無しさん:2010/11/16(火) 18:26:35
循環参照してるクラス(例えばオブザーバーやメディエーター)の相互参照性を弱めるためにグローバル変数やそれをラップしたインスタンス管理クラス(オブジェクトのマッピング+アクセサ関数)を作るってありだと思いますか?
309デフォルトの名無しさん:2010/11/16(火) 19:43:35
>>308
設計は違うスレで聞いたほうがいいと思う。。。
310デフォルトの名無しさん:2010/11/16(火) 22:48:21
ここは、C++の初級者が多いな。
311デフォルトの名無しさん:2010/11/16(火) 22:51:11
ここにいる時点でお前も
312デフォルトの名無しさん:2010/11/17(水) 00:45:07
http://hibari.2ch.net/test/read.cgi/prog/1289342444/309-319

C++ の throw が Python の raise より遅いという計測結果が出ています。
同等の機能かと思うのですが、これは何の違いに起因しているのでしょうか?
313デフォルトの名無しさん:2010/11/17(水) 06:40:12
>>306
自分は305じゃないけど、
>>304でいうと、i は+1 でインクリメントしているので sizeと等しいときにループから抜けることになる。
だから if(i==size) 。
で要求は i が size と等しいか大きい場合にループの終了なので if(i>=size) 。
もしくは if(i>size-1) 。

>>306の if(i>=size-1) を >>304 に直すと、for(int i=0;i<size-1;++i) になっちまうぜお。
314デフォルトの名無しさん:2010/11/17(水) 10:07:29
gaslighting
315デフォルトの名無しさん:2010/11/17(水) 10:27:18
>>312
実装の違いですね
316デフォルトの名無しさん:2010/11/17(水) 18:33:30
>>312
バカ?
317デフォルトの名無しさん:2010/11/17(水) 23:49:26
あの、今までVC++2008EEを使ってたのですが
この前VisualStudio2010プロの何ヶ月かのお試し版を入れて、期限が切れて、消したのですが
何かの拍子にVisualStudio系のファイルを開いたら、今までは2010で開かれて、「期限が切れてます、アップグレードしてください」
みたいな画面が出て、VC++2008EEで開いてくれません。
プログラムのアンインストールの所にはもう無いのですが完全に消せてないのでしょうか?どうすれば良いですか?
318デフォルトの名無しさん:2010/11/17(水) 23:59:55
VC++2008EEの使用期限すぎたからVC++2010EE
にしてねってこと
319デフォルトの名無しさん:2010/11/18(木) 00:03:06
ええっ!?
320デフォルトの名無しさん:2010/11/18(木) 00:03:52
スマン誤爆
321デフォルトの名無しさん:2010/11/18(木) 00:04:17
>>318
マジ?
2008EEって無期限じゃないんですか?
322デフォルトの名無しさん:2010/11/18(木) 00:22:41
んな訳ねェ
323デフォルトの名無しさん:2010/11/18(木) 01:06:17
visualstudioぐらいかえよ
324デフォルトの名無しさん:2010/11/18(木) 01:15:01
登録済みEEに使用期限なんてねーし
どうにかして関連付け直せばいいだけだろ
325デフォルトの名無しさん:2010/11/18(木) 01:19:40
Proはアンインストール済みなのに何から何に関連づけ直すんだ?
326デフォルトの名無しさん:2010/11/18(木) 01:24:02
この開発環境は…アンインストール出来ない!
327デフォルトの名無しさん:2010/11/18(木) 01:33:47
しかもなんか2010 x86 redistribuableとかいうのもアンインストールできないんですよね
328デフォルトの名無しさん:2010/11/18(木) 01:49:22
エクスプローラでダブルクリックして開かないだけなのか?
2008EE自体が使えなくなったのか?
開発者ならもう少しまともに喋れ
329デフォルトの名無しさん:2010/11/18(木) 01:57:17
なんかアホっぽいからおまえらに任せるよ
330デフォルトの名無しさん:2010/11/18(木) 01:58:45
2008EEは使える
関連付けだろ。わかったよ
331デフォルトの名無しさん:2010/11/18(木) 02:21:46
このスレはバカばっかりですね。
332デフォルトの名無しさん:2010/11/18(木) 10:31:58
vectorやhash_mapにCComPtr<T>をぶち込んだら、メモリー使用量がみるみるうちに上がっていった
clear()を呼び出しても減らないし、どうすればいいの?

std::vector<CComPtr<ColorDrawingEffect>> ColorEffects;
//省略
//ColorDrawingEffectはIUknownを継承している
ColorDrawingEffect* effect = new ColorDrawingEffect(color,backcolor);
ColorEffects.push_back(effect);

DWRITE_TEXT_RANGE textRange = {1,10};
//pTextLayoutはIDWriteTextLayout
pTextLayout_->SetDrawingEffect(effect, textRange);
//省略
ColorEffects.clear()
333デフォルトの名無しさん:2010/11/18(木) 10:49:38
>>332
AddRef、Releaseはちゃんと実装したか?
334デフォルトの名無しさん:2010/11/18(木) 10:57:06
例の場所はこういう感じ

STDMETHODIMP_(unsigned long) ColorDrawingEffect::AddRef()
{
return InterlockedIncrement(&cRefCount_);
}

STDMETHODIMP_(unsigned long) ColorDrawingEffect::Release()
{
unsigned long newCount = InterlockedDecrement(&cRefCount_);

if (newCount == 0)
{
delete this;
return 0;
}

return newCount;
}
335デフォルトの名無しさん:2010/11/18(木) 11:27:55
コピーコンストラクタは?
pushで再配置するときに何か残ってるんじゃないの?
336デフォルトの名無しさん:2010/11/18(木) 11:39:48
cRefCount_を0で初期化してないとか
偽COMなんだしunique_ptrに突っ込んどけば?
337デフォルトの名無しさん:2010/11/18(木) 11:59:45
何故偽COMなんだと思ったらIUknownだった
338デフォルトの名無しさん:2010/11/18(木) 12:13:04
>>335
コピーコンストラクターはない
メンバー変数にポインターを使ってる奴はないから残ってること自体考えにくいと思う
どこか別の場所で残ってるのかな
リークしてると思われるプログラムはDLLなんだが、その場合はどうやってリークしてるところを見つけるの?

>>336
アップしてないが、cRefCount_は0で初期化されてる
http://msdn.microsoft.com/ja-jp/library/dd941709%28v=VS.85%29.aspx
こちらのサンプルを見ると、newで呼び出して、デストラクタ―でrelease()しているようだが、それは不要なのか?
339デフォルトの名無しさん:2010/11/18(木) 14:36:19
340デフォルトの名無しさん:2010/11/18(木) 22:10:04
STLのソースコード読めないんですか?
341デフォルトの名無しさん:2010/11/19(金) 00:06:55
読めるよ馬鹿にすんな。
342デフォルトの名無しさん:2010/11/19(金) 00:13:49
おれだって読めるよ!
343332:2010/11/19(金) 08:43:21
>>339
使ってみたが、メモリリークが収まらない
使い方が間違ってるのか?

ColorDrawingEffect* effect = new ColorDrawingEffect(color,backcolor);
CAdapt<CComPtr<ColorDrawingEffect>> adapter(effect);
ColorEffects.push_back(adapter);
344デフォルトの名無しさん:2010/11/19(金) 13:00:07
キャリーフラグをしらべられますか?
調べる関数とかないんですか?
345デフォルトの名無しさん:2010/11/19(金) 13:02:55
char a=1000;
ってやるとa=-24になることって保障されてるんですか?
346デフォルトの名無しさん:2010/11/19(金) 13:03:33
>>344
調べられるかもしれませんし、調べる関数があるかもしれません。
少なくとも言語仕様には一切含まれていませんので、お使いの環境を当たってください。
347デフォルトの名無しさん:2010/11/19(金) 13:04:50
>>345
いいえ。
348デフォルトの名無しさん:2010/11/19(金) 13:06:50
>>345
charのディフォルトがたまたまsignedで、たまたま8ビット幅で、負の値が2の補数形式で表されている場合は、
-24になることが期待できますが、お使いの環境によっては必ずしもそうではないかもしれませんし、
きちんとそうなるとマニュアルに書かれているかもしれません。
349デフォルトの名無しさん:2010/11/19(金) 13:07:06
機種によりキャリーフラグを使い分けとか出来ませんか?
キャリーフラグの付いてないパソコンでは普通に計算して
付いているパソコンではそれを使うとかいう簡単な方法を教えてください。
350デフォルトの名無しさん:2010/11/19(金) 13:08:21
キャリーフラグのないパソコンは一般的にはないと思いますが、
そもそも使い分ける理由が一般的にはないと思われます。
351デフォルトの名無しさん:2010/11/19(金) 13:16:00
ポインタをビットで考えたとき、必ず使われないビットが
あるって本当ですか?
352デフォルトの名無しさん:2010/11/19(金) 13:16:28
キャリーフラグを調べたいって、多倍長計算をコンパクトにしたいとかか?
それならインラインアセンブラを使うべきだろう
CPUによってはフラグを調べただけで変化してしまう物もあるんだから
353デフォルトの名無しさん:2010/11/19(金) 13:23:33
>>351
C++において、ポインタを整数にキャストした結果は実装依存です。従って、ビット云々に意味はありません。
354345:2010/11/19(金) 13:30:31
>>348
ありがとうございます。
355デフォルトの名無しさん:2010/11/19(金) 14:34:41
class Bar
{
Baz baz;
};

class Foo
{
Bar bar;
};

Foo f1, f2;

この時に
f1, f1.bar, f1.bar.bazはグローバル変数g1にアクセス可能
f2, f2.bar, f2.barbazはグローバル変数g2にアクセス可能
と言った感じでFooのオブジェクトひとつに対してその下位のオブジェクトならばアクセス可能な共有変数を持たせたいのですが
なにかいい実装手段はありますか?
356デフォルトの名無しさん:2010/11/19(金) 14:48:25
static const double aaaaaa =1.0000;
intとenum以外の上みたいな書き方が禁止なのは共通ですか?
共通ではないのなら何が何かおしえてください。
357デフォルトの名無しさん:2010/11/19(金) 14:57:29
>>355
グローバル変数ならどれからでもアクセス可能だから提示された条件は満たせるな

っていうのはともかく継承とかprotectedとかfirendとか使えばなんかいけんじゃね?
言ってることがよく分からないからどうしたらいいかとかは提案できんが
358デフォルトの名無しさん:2010/11/19(金) 14:59:01
>>356
メンバ変数の話か?
359デフォルトの名無しさん:2010/11/19(金) 15:05:23
もちろんだとも
360デフォルトの名無しさん:2010/11/19(金) 15:09:44
>>353
やっぱりそうでしたか。
GCの本にその使ってないビットを使った実装方法法
があるって書いてあったから気になってた。
ありがとう。
361デフォルトの名無しさん:2010/11/19(金) 16:22:06
質問者が環境を提示しないのは粗忽なだけかも知らんが、
回答者が環境依存であることを明言しないのはなんぞ?
362339:2010/11/19(金) 19:55:25
>>343
CAdaptは、STLコンテナから要素独自の&演算子を隠すためのものなので、
コンテナのパラメータで指定する。
std::vector<CAdapt<CComPtr<ColorDrawingEffect>>> ColorEffects;



363339:2010/11/19(金) 21:02:44
>>343
ごめん、CAdaptは関係ないような気がしてきた。
サンプルコード落としていろいろいじってみたけど、自分の環境ではリークは見つからなかった。

cRefCount_は本当に0で初期化されてるか、(全てのコンストラクタで初期化されているか)
pTextLayout_が参照をつかみっぱなしでないか、(pTextLayout_->SetDrawingEffect をコメントアウトしてみるとか)
そもそもリークしているのか、(正しくRelease()->delete this されていれば問題は他)

このあたりを再確認して問題ないのであれば、コードさらしていただければ検証するよ
364デフォルトの名無しさん:2010/11/19(金) 21:45:31
leak が問題なんだよね?
shrink_to_fit を知らないという話じゃないよね
365デフォルトの名無しさん:2010/11/19(金) 22:37:00
clear()でも消えないんだから違うんじゃない
366デフォルトの名無しさん:2010/11/20(土) 02:21:48
配列型を表すテンプレートクラスを作ってみたんですけど問題ありましたら教えてください
template<class T> struct Array {
T* data;
size_t size;
template<typename size_t N>
Array(T (&array)[N]) {
data = array;
size = N;
}
};
367デフォルトの名無しさん:2010/11/20(土) 03:06:29
何に使うのかさっぱりわからない
368デフォルトの名無しさん:2010/11/20(土) 04:13:12
車輪の再発明なんだからテンプレートの勉強だろ
369デフォルトの名無しさん:2010/11/20(土) 06:53:37
参照先が消えたらどうなるんだろー
370デフォルトの名無しさん:2010/11/20(土) 08:37:09
すこしいじれば使い道はあるだろう
begin/endとか追加してラッパー・アダプタ的な使い方をすればいい
boost::arrayは内部にストレージを持ってるから、そこで差別化できる
371デフォルトの名無しさん:2010/11/20(土) 11:11:21
まず、arrayとshared_arrayとscored_arrayのどれを作りたいのかをはっきりさせたほうがいいと思う
372デフォルトの名無しさん:2010/11/20(土) 11:25:43
>>363
全て確認してみましたが、特に怪しいところはありませんでした
思い当たる節があるとすればCComPtr<>を使用するように書き換えたぐらいなんですが…

http://www6.atpages.jp/~autonomydoll/DWriteWarpper.zip
373デフォルトの名無しさん:2010/11/20(土) 16:53:53
クラスの前方参照によるヘッダ依存性除去ってできるだけやったほうがいいの?
循環includeがないときでもヘッダでは

#include "hoge.h"
#include "fuga.h"
Hoge* func(Fuga*);

じゃなくて

class Hoge;
class Fuga;
Hoge* func(Fuga*);

と書くべきかなぁ?
374デフォルトの名無しさん:2010/11/20(土) 17:00:57
>>373
実装隠す必要なくて名前がぶつからなくてビルド時間も長くないなら気にしなくてよくね?
375デフォルトの名無しさん:2010/11/20(土) 17:01:50
Hoge* func(Fuga*);

この関数を外部に公開するのなら、その引数と戻り値で使ってるクラスが入ってるヘッダは
普通に公開しないと拙いと思うよ。
376デフォルトの名無しさん:2010/11/20(土) 17:09:18
>>375補足

// 以下、Huga.hの中身とする。

Class Fuga; // 前方参照(宣言)

Class Hoge
{
private:
  Fuga* m_pFuga; // ←こいつがpublicなメソッドの引数や戻り値で使われていないとする
};
//eof

この場合は前方参照(宣言)で回避しとけば依存が無くなるばかりか、
外部に公開されないので安心だねって感じ。
377デフォルトの名無しさん:2010/11/20(土) 17:17:31
>>375を更に補足。

>>375の場合、funcを使うファイルでfuncのヘッダをインクルードしてやれば、
自動的に公開関数の引数や戻り値で使われてるクラスも扱えるので便利だねって話。

ごめんなバラバラで書いて。
378デフォルトの名無しさん:2010/11/20(土) 17:19:23
ゲームプログラマになる前に〜、に書いてあったな
379デフォルトの名無しさん:2010/11/20(土) 17:19:38
classの間違いだったヒャッホイorz=3
380デフォルトの名無しさん:2010/11/20(土) 17:26:18
>>376修正 × Huga.h ○ Hoge.h 逝ってくる…
381デフォルトの名無しさん:2010/11/20(土) 17:53:01
>>374-377
ありがとう
循環includeのあるヘッダだけ>>377の言う「不便」な状態になるのが気持ち悪いから
いっそ全部不便に揃えようかとも思ったんだけど・・・やっぱり不便なんだよね
別にコンパイル時間に困ってるわけではないから、分けるのはやめとくことにするよ

むしろ循環includeのあるヘッダだけ
class Hoge;
Hoge func();
include "hoge.h"
とかすることにしちゃうかも
382デフォルトの名無しさん:2010/11/20(土) 21:48:07
strstreamとstringstreamって何が違うんですか?
383デフォルトの名無しさん:2010/11/20(土) 21:55:36
>>382
std::strstreamはdeprecated
つまりいつ消えても文句は言えない

それとstd::stringstreamとの違いは、std::strstreamはバッファにchar型の配列を
使うが、std::stringstreamはstd::stringを使用する

std::strstreamはバッファオーバーフローの危険性があったためdeprecatedにされた
384339:2010/11/21(日) 03:09:11
>>372
コード検証してみた。C++/CLIだったのねw

結論から言うと、コードに問題はほとんどないと思うよ。
確かにリークは発生している。
しかし描画ループでのメモリ使用量増加はリークではなく、一時的なマネージドオブジェクトが増えているだけ。
ほっとけばGCで回収されるので問題ない、はず

試しにForm1_Paint()内でGCを強制実行してみると、
{
for (int i = 0; i < 100; ++i) { // 適当な回数ループ
dwrite.BeginDraw();
...
dwrite.EndDraw();
}
GC.Collect(); // GCを強制実行
}
少なくともループ回数に比例したメモリ使用量増加はなくなる。

C++/CLI側を見ると、
ColorDrawingEffectはリークしていない。std::vector::clear()内で正しくRelease()されている。
CustomTextRendererはリークしている。
InitResource()でCComPtr<>::Attach()しているが、それだと参照カウントが増えず整合性が崩れてしまう。
CComPtrの場合、普通に代入すればおk
pTextRenderer_ = new CustomTextRenderer(...)
Factoryで作られたオブジェクトに関しては特に問題はないと思う。DirectWriteが作成したオブジェクトの追跡方法はよく知らないのでスマン

自分が気がついたのはこのくらい

なんでもCComPtrに突っ込むと循環参照が発生してリークしたりするので、
所有権とか意識して、必要なところだけで使うのが良いと思うよ。
385デフォルトの名無しさん:2010/11/21(日) 06:29:27
>>384
トンクス
CustomTextRendererがリークしていたのか
386デフォルトの名無しさん:2010/11/22(月) 13:17:33
http://ja.wikibooks.org/wiki/More_C%2B%2B_Idioms/%E3%83%AA%E3%82%BD%E3%83%BC%E3%82%B9%E3%81%AE%E8%BF%94%E5%80%A4(Resource_Return)
上記のサイトで
ユーザー定義のハンドル・ボディ(Handle Body)イディオム
が選択肢としてありますが、そのばあいどのようにリソースを返せばいいのか教えてください。
387デフォルトの名無しさん:2010/11/22(月) 14:35:50
auto_ptr や shared_ptr に似たものを自分で作るという意味じゃないの
388デフォルトの名無しさん:2010/11/22(月) 14:43:06
ナルヘソ
スマートポインターイディオムが
ハンドルボディーイディオムの特殊化だから
スマートポインターイディオムと書かないでその一般化である
ハンドルボディーイディオムとかいてあるのか・・・・
389デフォルトの名無しさん:2010/11/23(火) 15:07:25
struct point
{
double x;
double y;
}

std::vector<point> p;

このような形で点群データを扱ってます。
ここから-a < x < a, -b < y < b を満たす点を抜き出したいんですけど、何か良い方法はありますか?
390デフォルトの名無しさん:2010/11/23(火) 15:45:27
abs(x)<a abs(y)<bって計算する。
391デフォルトの名無しさん:2010/11/23(火) 16:58:53
bool is_outside(point const & p) { return abs(p.x) > a || abs(p.y) > b; }

p.erase(std::remove_if(p.being(), p.end(), is_outside), p.end());
392デフォルトの名無しさん:2010/11/23(火) 21:41:12
abs() を使う理由が判らん
393デフォルトの名無しさん:2010/11/23(火) 21:44:14
abs使わんとめっちゃ長くなるやん
394デフォルトの名無しさん:2010/11/23(火) 21:54:06
組み込み型でもa<x<bってのを一発で記述できると楽なんだがなぁ
395389:2010/11/23(火) 21:59:54
ありがとうございます。

1つのデータに対して範囲を変えて何回もデータを抜き出したいんですけど、
この場合はremove_copy_if()を使えば、必要なデータだけ取り出せる
(=その他のデータを残せる)で良いんですよね?
396デフォルトの名無しさん:2010/11/23(火) 22:07:10
エスパー検定:
2次元座標の当たり判定のように見えるんだが。
そうなら、それようのアルゴリズムはある。
397389:2010/11/23(火) 22:24:54
すいません。当たり判定ではないです。

点群データをグリッドマップに変換する作業を行ってて、
その中で点群に対して一番近いグリッドを割り出したいのです。
398デフォルトの名無しさん:2010/11/23(火) 22:37:34
効率悪いことしてるねー
399389:2010/11/23(火) 22:41:41
>>398
どうすれば効率よくなりますかね?

とりあえず上から降ってきたプログラムのアルゴリズムをまんま流用してるんですけど
あまりに書き方が酷かったので、せめて綺麗に書いていたのですが・・・。
400デフォルトの名無しさん:2010/11/23(火) 22:49:18
グリッド幅は普通解ってるでしょ
だったらx,yから直接何番目のグリッドにあるかわかるじゃん
なら何度も篩いにかけるようなやり方じゃなくて一回の走査で十分でしょ
401389:2010/11/23(火) 23:28:56
>>400
言われてみれば確かにそうですね。
ありがとうございます。そっちに頑張って書き換えてみます。
402デフォルトの名無しさん:2010/11/23(火) 23:32:12
質問です。size_tに対するprintfの書式指定は%zuであってますか?
GCCだと問題無いのですが、Visual C++だとうまくいかんです。
 std::printf("size = %zu\n", sizeof(int));
403デフォルトの名無しさん:2010/11/23(火) 23:38:10
%dか%u
404デフォルトの名無しさん:2010/11/23(火) 23:39:10
C99なら合ってる
つまりはそういうことだ
VC++なら %Iu かな
405デフォルトの名無しさん:2010/11/23(火) 23:39:07
>>402
z は C99 じゃなかったかな?
現状で移植性を確保したければ unsigned long にキャストして l にしとけばいいと思う。
406デフォルトの名無しさん:2010/11/23(火) 23:42:02
>>393
めっちゃって倍やんか、abs() のコストと条件式が倍になる事を比較したらどっちが得やねんちゅう話や
407デフォルトの名無しさん:2010/11/23(火) 23:45:34
せやな
408デフォルトの名無しさん:2010/11/23(火) 23:47:32
コストww
409402:2010/11/24(水) 00:10:28
みなさんありがとうございます。%zuはC++ではNGということですね。

GCC/Visual C++での移植性を求めて
 std::printf("size = %llu\n", (long long unsigned)sizeof(int));
として動いたものの、long longがC++言語仕様には無いんですよね。

ということで↓こうなりました。
 std::printf("size = %u\n", (unsigned)sizeof(int));
410デフォルトの名無しさん:2010/11/24(水) 00:21:58
stringstreamやBoost.Format (%1%系の型を指定しない記法)という手もある。
もっとも、long longがC++に存在しないことを気にかけるほどだから、これも根本的問題解決と言えないかもしれない。
411デフォルトの名無しさん:2010/11/24(水) 00:26:32
intよりlongにしてしまった方が64ビットWindows以外は正しくなる
412デフォルトの名無しさん:2010/11/24(水) 00:45:08
@各処理系に詳しくなってプリプロセスで分岐
Aテンプレートでクールに決める方法を考える
B決め打ちするけど書き換えが楽になるように一段階間接的な手段をとる

世界中で使われるレベルのライブラリ書くようならまだしも
普通はBで十分だよね
413デフォルトの名無しさん:2010/11/24(水) 18:59:35
template<typename T1,typename T2,typename T3> T3 testtmpfn(T1 a,T2 b)
{
return a*b;
}

int iiii=(int)testtmpfn(15,0);



テンプレート 引数を 'T3' に対して減少できませんでした

というエラーでコンパイルできません

型の自動推定ぐらいしてくれてもいいと思うのですが、
型をこれのように全部指定しないでコードを書く方法ないのでしょうか
414デフォルトの名無しさん:2010/11/24(水) 19:15:48
無い
415413:2010/11/24(水) 19:30:20
>>413

testtmpfn<*,*,int>(15,0);
のように型の部分指定するにはどうすればいいのでしょうか
416デフォルトの名無しさん:2010/11/24(水) 19:33:10
T3を一番前にすりゃいいじゃん
417デフォルトの名無しさん:2010/11/24(水) 19:42:14
OCamlならこのぐらいの型推論は自動でやってくれるのに
C++にもOCamlの機能をとりこんでほしい
418デフォルトの名無しさん:2010/11/24(水) 20:23:47
>>417
template<typename T1, typename T2>
auto Func(T1 a, T2 b) -> decltype(a * b) { return a * b; }
これでおk
419デフォルトの名無しさん:2010/11/24(水) 21:28:51
>>418
0xスレ逝け。
420デフォルトの名無しさん:2010/11/24(水) 21:31:55
取り込んだ結果だろうに
421デフォルトの名無しさん:2010/11/24(水) 22:12:41
お前等って何作ってんの?
422デフォルトの名無しさん:2010/11/24(水) 22:13:29
この世界がどうたら
423デフォルトの名無しさん:2010/11/24(水) 23:59:52
宇宙用戦闘ロボットのOS
424デフォルトの名無しさん:2010/11/25(木) 02:46:14
脳ミソの中の記憶をバックアップするシステムを開発してる
425デフォルトの名無しさん:2010/11/25(木) 12:17:55
悪魔召喚プログラム
426デフォルトの名無しさん:2010/11/25(木) 12:38:00
0xいいな
もう実用しても大丈夫なん?
427デフォルトの名無しさん:2010/11/25(木) 14:07:35
>>426
まだあかん
何かいろいろゴチャゴチャした議論をしてる
moveとcopy回りで収拾が付いてない
428デフォルトの名無しさん:2010/11/25(木) 16:30:23
0xは実用に使えないけどboostの中に型の自動推定ないかな
boost.anyみたいに遅くなるのじゃなくて
429デフォルトの名無しさん:2010/11/25(木) 16:38:58
型出しくらい部分特殊化でちゃちゃっと挟み込めばいいだけだろ
不特定大人数に提供する大作クラスライブラリじゃあるまいし
430デフォルトの名無しさん:2010/11/25(木) 16:43:43
>>427
いつの話をしているんだ。
暗黙のムーブの話なら、すでに決着したぞ。
431デフォルトの名無しさん:2010/11/25(木) 18:56:18
今度は暗黙のコピーに波及したとかどうとか
432デフォルトの名無しさん:2010/11/25(木) 21:12:22
2ちゃんねるブラウザを作るために、独自でスレビューを実装したい
いい感じのライブラリーない?
433デフォルトの名無しさん:2010/11/25(木) 21:15:10
独自でやんのかライブラリ使うのかはっきりしろ
434デフォルトの名無しさん:2010/11/25(木) 21:25:38
IEコンポあたりを乗っけるのが一番
435デフォルトの名無しさん:2010/11/25(木) 21:42:40
OKwaveブラウザ作ってくれないか
ないでしょ
436デフォルトの名無しさん:2010/11/25(木) 21:46:14
iexplorer.exe http://okwave.jp

OKWaveブラウザの完成!
437デフォルトの名無しさん:2010/11/25(木) 21:48:42
いやまじであると便利なのだが、、、はてなも知恵袋も対応してくれると良いなぁ
438デフォルトの名無しさん:2010/11/25(木) 21:48:44
>>433
独自でお願いします
439デフォルトの名無しさん:2010/11/26(金) 00:54:12
>>437
あれ系ってデフォルトだとおしなべて最新の回答が質問の次に来るのがマジでウザい
過程とか回答の順序が大事だろうが!?たまに質問と回答がくっついてて順序が変えられないのもあるし
440デフォルトの名無しさん:2010/11/26(金) 16:25:30
441デフォルトの名無しさん:2010/11/26(金) 17:01:52
このautoってVisualStudio2010限定なの?
http://msdn.microsoft.com/en-us/library/dd293667.aspx
442デフォルトの名無しさん:2010/11/26(金) 17:11:56
>>441
C++0xの機能。
vs2010とかg++の新しいのとかに先行実装されてる。
443デフォルトの名無しさん:2010/11/26(金) 17:17:25
C++0xの機能
gccならとっくに実装されてる。
444デフォルトの名無しさん:2010/11/26(金) 17:47:46
gccよりvsのほうが実装は進んでる。
445デフォルトの名無しさん:2010/11/26(金) 17:58:30
autoすげえ
これで速度落ちないなら常用する
446デフォルトの名無しさん:2010/11/26(金) 18:02:37
当然速度落ちないよ
447デフォルトの名無しさん:2010/11/26(金) 18:03:04
落ちるわけねだろ
448デフォルトの名無しさん:2010/11/26(金) 18:03:26
無駄に長いテンプレートパラメーターがあるとき以外に使うと分かりにくくなるだけだよ。
449デフォルトの名無しさん:2010/11/26(金) 20:39:41
boostのfor_eachなんかパッと使うのは楽になるけど
瞬時に要素がどういう型なのか判別する手間が増えるな
逆に小細工なしで比較的手軽に汎用的なマクロを作れたりする
450デフォルトの名無しさん:2010/11/26(金) 22:30:29
>>445
autoを何だと思っているんだw
451デフォルトの名無しさん:2010/11/26(金) 22:31:44
auto様とか、上手に利用すると本当にTemplMPが書きやすくなるんだろうな。
俺は書いたこと無いけどね!
452デフォルトの名無しさん:2010/11/26(金) 22:44:53
今更な質問で申し訳ないんですが、C++0x ってもう使えるんですか!?
まだ規格はできあがってないと思ってたんですが…。
C++0x に合わせ、VS2010 とかが少しずつ規格を取り入れてるってことなんでしょうか。
今取り入れられてる部分はについてはもう変更されることはないと確定しているんでしょうか?
453デフォルトの名無しさん:2010/11/26(金) 22:48:34
規格も確定してないし、コンパイラの対応も半端、変更されるかもしれない
454デフォルトの名無しさん:2010/11/26(金) 22:57:35
でもまぁ便利だからね
455デフォルトの名無しさん:2010/11/26(金) 23:14:47
まあ、規格はほとんど完成してるよ。
まだ変更される箇所もあるけれど、普通のユーザーがきにするようなことじゃない。
456デフォルトの名無しさん:2010/11/27(土) 00:06:30
autoを使うことで変数名に気を使うようになり、
結果的にコードが読みやすくなったな
457デフォルトの名無しさん:2010/11/27(土) 00:20:47
string内のスペース、タブを全て削除するにはどうするんですか
教えてください
458デフォルトの名無しさん:2010/11/27(土) 00:32:54
remove_ifを使いましょう
459デフォルトの名無しさん:2010/11/27(土) 00:36:44
>>458
それでどうするんですか?
460デフォルトの名無しさん:2010/11/27(土) 00:38:43
スペース、タブをすべて削除するんだよ
461デフォルトの名無しさん:2010/11/27(土) 00:38:48
ggrks
462デフォルトの名無しさん:2010/11/27(土) 00:45:19
463デフォルトの名無しさん:2010/11/27(土) 01:09:41
>>459
#include <iostream>
#include <string>
#include <algorithm>

struct Remove_cntl {
bool operator()(char s) {
return std::iscntrl(s) || std::isspace(s);
}
};

int main()
{
std::string str = "abcdef \t\aghij";

str.erase(std::remove_if(str.begin(), str.end(), Remove_cntl()), str.end());

std::cout << str << std::endl;
}
464デフォルトの名無しさん:2010/11/27(土) 01:16:03
VS2010でラムダ式を使ってみた

#include <iostream>
#include <string>
#include <algorithm>
#include <cctype>

int main()
{
std::string str = "abcdef \t\aghij";

str.erase(std::remove_if(str.begin(), str.end(), [](char c) { return std::iscntrl(c) || std::isspace(c); }), str.end());

std::cout << str << std::endl;
}
465デフォルトの名無しさん:2010/11/27(土) 01:35:52
>>450
typeof(a*b+c) x= a*b+c;
466457:2010/11/27(土) 01:41:57
>>463-464
ありがとう。
remove_ifだと消す対象に次要素の移動コピーだけしかしないのに、なんでそんなアドバイス来るんだ
と思ったが、eraseでremove_ifからの戻り値(strの無要素の先頭)からstrの最後までを消すことで
スペース、タブを除去するのか。これ、定石なんだろうね
それなら、eraseとremove_if使え位言わないと低脳の僕は分からん
467デフォルトの名無しさん:2010/11/27(土) 01:42:07
decltypeでいいじゃん
468デフォルトの名無しさん:2010/11/27(土) 01:44:05
>>466
std::removeとかstd::remove_ifは削除対象の要素を後ろに集めてその先頭イテレータ
を返すだけで、実際の削除はしないのでeraseが必要になる
469デフォルトの名無しさん:2010/11/27(土) 02:15:12
削除対象じゃないものを前に集めてその最後のイテレータを返す
470デフォルトの名無しさん:2010/11/27(土) 02:17:15
スペースとタブ以外の文字をコピーして文字列作った方が
速かったりするのかな
471デフォルトの名無しさん:2010/11/27(土) 02:21:00
>>470
そういう車輪の再発明を極力やめようというのがSTLの基本思想
472デフォルトの名無しさん:2010/11/27(土) 08:38:25
remove_copy_ifなりcopy_ifを使えばいいだろ
なんで車輪の再発明の話になるのかわからん
473デフォルトの名無しさん:2010/11/27(土) 08:57:09
>>470
遅いしメモリの無駄です
474デフォルトの名無しさん:2010/11/27(土) 09:18:14
過去に再発明を経験してないPGほど使えないやつが多い
475デフォルトの名無しさん:2010/11/27(土) 09:33:45
車輪を作らずとも自動車が作れる
そんな時代になるといいですね
476デフォルトの名無しさん:2010/11/27(土) 09:48:18
車輪の作り方は知らなくても自動車は作れる
でも性能の良い自動車は作れない
STLってこんな感じだよね
477デフォルトの名無しさん:2010/11/27(土) 11:30:42
>>476
listでdistanceを平気でやったりとかね。
478デフォルトの名無しさん:2010/11/27(土) 11:30:59
>>476
下手なプログラマが作るより性能はいい
しかもC++0xから右辺値参照がSTLに入れられるので速度も上がる
479デフォルトの名無しさん:2010/11/27(土) 12:10:59
質問よろしいでしょうか。
一時展開バッファとして std::vector<int> を使っているのですが、
やけに速度が遅くボトルネックになっていたため、調べてみました。

[1]
for (int i = 0; i < 100000; i++) {
int* p = new int[100000];
delete[] p;
}

[2]
for (int i = 0; i < 100000; i++) {
std::vector<int> ar;
ar.resize(100000);
}

下の方が100倍以上の時間がかかります。
先に reserve したり、アロケータを実装して再確保をおこさないようにしても、大きな効果はありませんでした。

どうも、メモリ確保後の初期化に時間がかかっているようです。
これがクラスならコンストラクタを実行する必要があるのは分かるのですが、
今回は int 型で、かつ初期化する必要がありません。

・必要サイズは予想できないので、サイズを動的に変更する機能は必須
・解放し忘れを防ぐため、new / delete などを直に使うのは避けたい

この2つを満たす何か代わりの手段はないでしょうか?
boost は使ってるのでその中でも問題ありません。

よろしくお願いします。
480デフォルトの名無しさん:2010/11/27(土) 12:14:29
STLは糞
481デフォルトの名無しさん:2010/11/27(土) 12:14:56
std::vectorをループの外に出せばいいんじゃねーの?
482デフォルトの名無しさん:2010/11/27(土) 12:16:49
>>479
boost::scoped_arrayでも使ってろよ・・・
その話聞くだけだと単に頭悪いようにしか見えんけど
483デフォルトの名無しさん:2010/11/27(土) 12:19:42
>>479
a.resize()する前にa.reserve()やっとけばいいじゃん
メモリの再割り当てが最高1回で済む
ただしコンストラクタが走るのを阻止できないけど
484479:2010/11/27(土) 12:24:17
ありがとうございます。

>>481
実験ではループなのですが、実際は単純なループではありません。
もちろん外部に std::vector を用意するという手はあります。
ただ、実際は関数内で一時バッファを使っているのですが、
内部で一時バッファを使っているということは外部に公開する必要はないのに、
外部から引数で受け取るのも少々気持ちが悪いです。
また、static にしたりグローバルに用意したりすると、マルチスレッド関連がややこしくなります。

>>482
boost::scoped_array だと、固定サイズしか作れなくないですか?

>>483
書いたとおり、ボトルネックになってるのはメモリの確保ではなく、初期化部分です。
reserve を行っても大きくは変わりませんでした。
485デフォルトの名無しさん:2010/11/27(土) 12:25:06
std::vector<int> ar(100000);
for (int i = 0; i < 100000; i++) {
ar.clear();
ar.resize(100000);
}
486デフォルトの名無しさん:2010/11/27(土) 12:25:59
>>484
情報の後出しすんなよ
487デフォルトの名無しさん:2010/11/27(土) 12:28:32
>>478
そういう意味じゃないから勉強しなおしてこい
488デフォルトの名無しさん:2010/11/27(土) 12:28:54
先頭から順番に初期化できるのならば、初期化用のイテレータークラスを書いて渡すとか。
489デフォルトの名無しさん:2010/11/27(土) 12:28:58
[1]はただ領域確保しただけで触ってないし
[2]と動作速度がまるで違うのは当たり前
490デフォルトの名無しさん:2010/11/27(土) 12:29:20
ていうか、なんで初期化の必要ないのにresizeしてんの?
resizeしたら拡張分全部にコンストラクタ走るのは当然じゃん
491479:2010/11/27(土) 12:32:48
>>490
おっしゃるとおりです。なので、

・初期化せずに
・(あらかじめサイズが分からないので)可変長の
・解放し忘れの起きない

メモリを確保する手段はないでしょうか?という質問です。回りくどくて申し訳ありません。
492479:2010/11/27(土) 12:34:22
>>488
ちょっと意味がつかめません…。申し訳ないです。
今回は、そもそも初期化を行う必要はありません。
493デフォルトの名無しさん:2010/11/27(土) 12:35:55
>>479
比べるならこうじゃね?まぁ比べると遅いと思うけど

for (int i = 0; i < 100000; i++) {
std::vector<int> ar(100000);
}
494デフォルトの名無しさん:2010/11/27(土) 12:37:31
>>491
reserveしろ
resizeは指定サイズに達するまで新しい要素を追加するっていう処理だ
本来の引数はvoid resize( size_type size, TYPE val );だしな
vectorの中身の生配列のサイズを拡張したいだけならreserveだろ
495デフォルトの名無しさん:2010/11/27(土) 12:37:54
初期化しないならreserveだけでいいんでは
496479:2010/11/27(土) 12:38:11
>>493
確かにそのとおりでした。
やってみたところ…さらに遅くなってしまいました。原因はわからないです…。
497479:2010/11/27(土) 12:40:39
>>494-495
reserve では内部で領域を確保するだけで、アクセスできないですよね?

std::vector<int> ar;
ar.reserve(10);
ar[0] = 1;

とすると範囲外エラーとなります。(デバッグ時に例外が飛んできます)
498デフォルトの名無しさん:2010/11/27(土) 12:42:29
struct foo {
__int64 start, end, freq;
HANDLE hprocess;
DWORD oldclass;
foo() : hprocess(GetCurrentProcess()), oldclass(GetPriorityClass(hprocess)) {
Sleep(10);
SetPriorityClass(hprocess, REALTIME_PRIORITY_CLASS);
QueryPerformanceFrequency((LARGE_INTEGER*)&freq);
QueryPerformanceCounter((LARGE_INTEGER*)&start);
}
~foo() {
QueryPerformanceCounter((LARGE_INTEGER*)&end);
SetPriorityClass(hprocess, oldclass);
std::cout << (int)(end - start) << std::endl;
}
};
int main()
{
{
foo f;
for (int i = 0; i < 1000; i++) {
int* p = new int[100000];
std::fill_n(p, 100000, 0);
delete[] p;
}
}
{
foo f;
for (int i = 0; i < 1000; i++) {
std::vector<int> ar;
ar.resize(100000);
}}}}
499デフォルトの名無しさん:2010/11/27(土) 12:43:15
>>498
このようにすると速度が逆転するのがわかると思う
std::vectorのデフォルトコンストラクタは十分高速
500デフォルトの名無しさん:2010/11/27(土) 12:43:20
もう自前で書けよ……
どういう処理想定してるか分からないから適当にアドバイスしたら、
それじゃ駄目とかどうしようもない
501デフォルトの名無しさん:2010/11/27(土) 12:45:00
もうmap<int, int>を使えばいいよ
502デフォルトの名無しさん:2010/11/27(土) 12:45:15
>>496-497
vectorの速度を気にする前の問題じゃね?
ちゃんと最適化かけて計測してる?
503デフォルトの名無しさん:2010/11/27(土) 12:49:22
バッファのサイズはどの時点で確定するんだよ・・・
実際の処理を擬似コード化 できてる なら良いけど、そうでないなら無駄すぎ
上に書いてある処理だけなら
int MAX = 100000;
for (int i = 0; i < 100000; i++) {
int* p = new int[MAX];
delete[] p;
}
でいいじゃん・・・
boost::scoped_arrayで包んでもいいし
504デフォルトの名無しさん:2010/11/27(土) 12:49:51
> ar[0] = 1;
なぜ push_back を使わない
505479:2010/11/27(土) 12:50:15
>>499
高速なのは分かりますが、そもそも初期化する必要がないので…。
実際にボトルネックになっていて、>>479 で100倍以上の差が出ています。

>>502
はい、最適化はかけています。
>>496 は reserve するようにという指摘に対するレスです。
506デフォルトの名無しさん:2010/11/27(土) 12:50:24
>>479の1でいいなら、boost::scoped_arrayやboost::shared_arrayをつかえばリークはない。

forの外でvectorで取るのが一番速い。
>>479の2が遅いのは配列の各要素を初期化してるから。1は初期化していないので配列の中身は不定。初期化が必要ならその分遅くなる。
高速で何度も使うなら初期化せずに上書きでよくないか検討してごらん?
507デフォルトの名無しさん:2010/11/27(土) 12:50:56
バッファなのにintってのも不思議
普通char指定しねえ?
508デフォルトの名無しさん:2010/11/27(土) 12:52:03
for(・・・){
int * p = 0;
unique_ptr<int, DelAry> guard(p = new int[size]);
}
509479:2010/11/27(土) 12:55:50
>>503
少なくともコンパイル時には予測できません。
数100MBの巨大なデータが来ても動作するようにする必要があります。

>>504
バッファを用意するのが目的です。
バッファの使う上で、行うのは追加だけとは限りません。
もちろんランダムアクセスする可能性もあります。

>>506
はい、上書きでも構いません。初期化しているから遅いというのも書いてあるとおりです。
初期化せずにバッファを確保する方法はないかという質問です。
510デフォルトの名無しさん:2010/11/27(土) 12:57:12
>>508
unique_ptrなら
unique_ptr<int[]>これでいんだぜ
511デフォルトの名無しさん:2010/11/27(土) 12:59:12
>>509
少なくとも、じゃなくて具体的なことを聞いてるんだよ
関数に入った時点で確定するなら>>503でいいだろ?
512デフォルトの名無しさん:2010/11/27(土) 13:01:46
>>510
へー特殊化されてんのね。じゃ
for(…){ unique_ptr<int[]> p(new int[size]); }
でいいわけか
513デフォルトの名無しさん:2010/11/27(土) 13:06:40
>>506 初期化しないバッファーが欲しいならboost::scoped_arrayやboost::shared_arrayをつかえばリークはない。

514デフォルトの名無しさん:2010/11/27(土) 13:13:37
>>511はつまりhttp://ideone.com/xMVoZ こういうことな
515479:2010/11/27(土) 13:15:31
長々と申し訳ございません…。
顔から火がでそうです。

>int* p = new int[100000];

これが固定サイズしか作れないものと勘違いしてました…。
恥ずかしい限りです。こんなことに何十レスも頂いて…。
boost::scoped_array 何の問題もありませんでした。
関わって頂いた皆様、本当にありがとうございました。勉強しなおします…。
516デフォルトの名無しさん:2010/11/27(土) 13:18:32
お前、切腹な
517デフォルトの名無しさん:2010/11/27(土) 13:20:02
どうにも解決できないため,恥ずかしながら,質問させていただきます.
環境はvc++2008のEEでosはwindows7の64bitのprofessionalです.

作成したいプログラムは,Aのパソコンでマイクから音声情報を取得し,TCPで送信(send)をし,
Bのパソコンで受信(recv)し,再生するというものです.

音声の入出力は以下のサイトをttp://pino.jpn.ph/index.php/archives/377.html/
tcpに関しては,以下のサイトをttp://onishi-lab.jp/programming/tcp_win.html
参考にし,それぞれは動作を確認しました.

その上で,AのパソコンではwaveInStartの後に,sendを,
Bのパソコンでは,recvの後に,waveOutWriteを行う予定です.

その状況で,ご質問させていただきたいのは,
waveInおよびOut関数らで音声データが入る'LPBYTE' と,
sendやrecvらで送受信される 'const char *'との型変換です.

byte配列をいったんchar配列にし,送受信してからchar配列をbyte配列に戻すイメージなのですが.
その部分を上手くプログラミングできません.

具体的には,sendの第2引数にどのように例のプログラムのbyte配列であるlpWaveDataを書けばよいのか.
recvの第2引数をどのように,byte配列であるlpWaveDataへ戻せばよいのかをお教えいただきたいです.

ご意見をいただきたく存じます.よろしくお願いいたします.


518デフォルトの名無しさん:2010/11/27(土) 13:34:07
キャストするだけでよくね?
519デフォルトの名無しさん:2010/11/27(土) 14:05:43
>>518さんへ,ご意見をいただきありがとうございます.

サーバ側の以下の配列に音声のデータが入っていると考えており,
DWORD dwDataSize = 10000;
lpWaveData = (LPBYTE)new BYTE[dwDataSize];を,
&(*lpWaveData)などにして,sendしているのですが,上手くいっておりません

dynamic_castも試したのですが,どうも上手くいきません.

ソースを元にしないといけないと思うのですが,
ここにすべて入力するわけにも行かないので,
dropboxのpublicフォルダを利用しました,以下がソースです.
ttp://dl.dropbox.com/u/6061502/voice_client.cpp
ttp://dl.dropbox.com/u/6061502/voice_server.cpp
もしよろしければご意見をください.
520デフォルトの名無しさん:2010/11/27(土) 14:19:31
>send(dstSocket, &(lpWaveData), sizeof(char)*10000, 0);
ポインタのポインタを指定してどうする
&要らんよ(char*)lpWaveDataでいい
521デフォルトの名無しさん:2010/11/27(土) 14:24:56
>>520さんへ
ご指摘ありがとうございます.
(char*)lpWaveDataにしたうえで,
クライアント側を書き換えて試してみたいと思います.
522デフォルトの名無しさん:2010/11/27(土) 14:47:05
なんか、根本的にポインタを判ってないんじゃね?
なんでdynamic_castが出てくるのかとてもじゃないが、理解できないよ。
523デフォルトの名無しさん:2010/11/27(土) 14:49:41
dynamic_castとか使うのなんて、よっぽど特殊な環境つーか、設計ミスつーか
素直にstatic_castしろよ
524デフォルトの名無しさん:2010/11/27(土) 15:05:03
キャストがあーだこーだの前に、
並のC++使いなら>>517の作ろうとしているプログラムなら軽く作れると思うから聞くけど、
>>519のプログラム構成・手順で音声を途切れなく再生できるの?
低脳の僕はなんか駄目なような気がするんだけど。なんとなくだけどね
525デフォルトの名無しさん:2010/11/27(土) 15:12:44
LAN内なら大丈夫だと思うよ
526デフォルトの名無しさん:2010/11/27(土) 15:17:43
まぁ品質向上はまず動いてからだべ
527デフォルトの名無しさん:2010/11/27(土) 15:24:24
>>522>>523
ご意見ありがとうございます,
ポインタは,「変数のアドレスを入力する変数」程度の知識で,だましだましプログラムを作成してきました.
googleなどで出てきたキーワードを総当りで試しているという状態です.

もう一点,お聞きしたいと思います.
クライアント側の受信を,以下の
recv(dstSocket, (char *)lpWaveData, sizeof(char)*10000, 0);
にすると.コンパイルは通り,動作するように見えるのですが,
waveOutWrite(hwo,&whdr,whdr.dwBufferLength);
のところで,<不適切なptr>というエラーが生じてしまいます.

この意味について,お教えいただけないでしょうか.

528デフォルトの名無しさん:2010/11/27(土) 15:31:11
>>527
> ポインタは,「変数のアドレスを入力する変数」
それであってると思うけど。
529デフォルトの名無しさん:2010/11/27(土) 15:31:22
エラーは省略するな全部貼れ
ttp://msdn.microsoft.com/ja-jp/library/cc428833.aspx
第三引数がおかしいこと以外は分からんが
530デフォルトの名無しさん:2010/11/27(土) 15:31:51
不適切なptr
531デフォルトの名無しさん:2010/11/27(土) 15:43:49
>>528さん,>>529さん,>>530さん.
ありがとうございます.

エラーの現状ですが,ハンドルされていない例外が発生しました.0xC0000005:場所0x00000000を読み込み中にアクセス違反が発生しました。
上記のウィンドウが表示されます.
プロンプトは,waveOutOpenが表示されてとまっており.
また,waveOutWrite(hwo,&whdr,whdr.dwBufferLength);の行の左端に緑の矢印(停止箇所のしるしだと思っています)が表示されています.

そのため,音声のメモリ領域を読み込もうとしたときに,正しい値が入っていないか,初期化されていないのではないかと考えています.
以下の記述が正しくないために,正しい値が変数に入っていないのではないかと考えております.
recv(dstSocket, (char *)lpWaveData, sizeof(char)*10000, 0);
lpWaveData = static_cast<byte *>(lpWaveData);

またとんでもないことをしているかもしれませんが,ご意見をいただければ幸いです.
532デフォルトの名無しさん:2010/11/27(土) 15:54:05
>>531
音声のデータは未初期化ならただの雑音にしかならない。データーのせいじゃない。
0x00000000を読み込み中がでてるんだからパラメータのどれかががNULL何だね。
パラメータ値にNULLがないか確認

533デフォルトの名無しさん:2010/11/27(土) 16:00:59
緑は次に実行される場所だから停止した場所とは違う
>LPBYTE lpWaveData = NULL;
このあとにメモリ確保してないから落ちるに決まってる

>recv(dstSocket, (char *)lpWaveData, sizeof(char)*10000, 0);
>lpWaveData = static_cast<byte *>(lpWaveData);
>>519と書いてることが違うぞ
recvは第四引数で指定した値まで読み込んでくれるとは限らないからちゃんと戻り値見ろ
534デフォルトの名無しさん:2010/11/27(土) 16:11:05
>>532,>>533さんへ
ありがとうございました,動作するようになりました.
dropboxのものを動作したものに差し替えさせていただきました.
恥ずかしいので,すこしたったら消します.

>>皆様へ
このたびは本当にありがとうございました.
はじめて質問したのですが,解決に導いていただき,感謝しております.

それでは失礼いたします.
このたびは本当にありがとうございました.
535デフォルトの名無しさん:2010/11/27(土) 17:27:48
いえいえ
536デフォルトの名無しさん:2010/11/27(土) 17:46:45
まあまあ
537デフォルトの名無しさん:2010/11/27(土) 19:05:43
ポインタのキャストって
static_cast
reinterpret_cast
のどっちを使うの?
で、それを使う理由は何
538デフォルトの名無しさん:2010/11/27(土) 19:13:03
>>537
用途による。ダウンキャストならstatic_castだし(もしくはdynamic_cast)
整数に変換するならreinterpret_castだし
539デフォルトの名無しさん:2010/11/27(土) 19:17:34
>>538
lpWaveData = static_cast<byte *>(lpWaveData);
はstaticで良いんですか? それとも、reinterpret?
540デフォルトの名無しさん:2010/11/27(土) 19:19:27
void * → hoge *
はstatic_castでおk
541デフォルトの名無しさん:2010/11/27(土) 19:24:09
>>539
そのキャスト意味あるのか?
542デフォルトの名無しさん:2010/11/27(土) 20:31:46
稀だけど c style cast でしか出来ないcastもあるお
543デフォルトの名無しさん:2010/11/27(土) 20:36:14
一番いい具体例を頼む
544デフォルトの名無しさん:2010/11/27(土) 20:47:58
C形式のキャストでしかできないキャストというのは、ある限定的な条件下(三種類ある)において、アクセス指定を無視できるというものだぞ。
はっきりいって、こんなキャストを使いたい時点で、すでにまともなプログラムではない。
http://cpplover.blogspot.com/2010/07/c.html
545デフォルトの名無しさん:2010/11/27(土) 20:49:41
まともじゃないコードをいじらないといけないことの方が多いわ
546デフォルトの名無しさん:2010/11/27(土) 22:52:16
つまり>>545はまともじゃないコードを書いることのほうが多いということか
547デフォルトの名無しさん:2010/11/27(土) 22:56:09
仕事だと0からプログラムを書くことはほとんどない
デスマプロジェクトから脱走したやつの尻拭いで数万行クラスのスパコードからバグの原因を見つけ出して修正とかな
548デフォルトの名無しさん:2010/11/27(土) 23:20:54
40秒ほどではなくても、40分でつくらされることもあるからなぁ
時給換算だとうまいけど、もやっとする
549デフォルトの名無しさん:2010/11/27(土) 23:27:12
脱走しているなら未だいい。当の本人から「動かせ、されど修正は最低限で」と言われることの矛盾と来たら。
リファクタリング仕様ものなら激怒され、警告を回避しようものなら蛇蝎の如く嫌われ、成果は全て吸い上げられる。
ま、そういう奴はC++なぞ書こうともしないから未だ救われているが。
550デフォルトの名無しさん:2010/11/27(土) 23:28:39
リファクタリング出来ないのは本当にイライラする…
その理由がステップ数で単価見積りとか…
551デフォルトの名無しさん:2010/11/27(土) 23:38:05
>>549
上司に相談しろよ
瞬間的には必要なのかもしれないけど
長い目で見ればいないほうが良い同僚はさっさとつぶしたほうが良い
552549:2010/11/27(土) 23:58:04
>>551
あーいや、取り引き先だから排除しようがないんだ。ボスがそれだから部下も腐っているんだが、金にはなるんでね。
553デフォルトの名無しさん:2010/11/28(日) 00:00:39
スレ違いだ。マ板行ってくれ。
554デフォルトの名無しさん:2010/11/28(日) 00:04:15
スレ→板
555デフォルトの名無しさん:2010/11/28(日) 01:44:17
class b {};
class d : virtual public b {};

d→bはキャストできても、b→dへのキャストはstaticでもdynamicでもできないのな。
556デフォルトの名無しさん:2010/11/28(日) 02:08:42
は?
557デフォルトの名無しさん:2010/11/28(日) 02:17:29
アップキャストって言いたいんだろきっと
558デフォルトの名無しさん:2010/11/28(日) 03:26:15
static_cast<d*>したければ、仮想継承を止める。
dynamic_cast<d*>したければ、class bに仮想関数を追加する。
559デフォルトの名無しさん:2010/11/28(日) 18:56:24
すいません、VC2008でmapを使ってるんですが、下記コードでコンパイルは通っても、
exeを起動させるとエラーが出て落ちてしまいます。
mapをmap<string,string>ではなくmap<int,string>にすると問題ないんですが、
調べてもよくわかりませんでした。
どなたかアドバイス頂けると助かります。

▼-------------hoge.cpp-------------------
#include <iostream>
#include "stdafx.h"
#include <fstream>
#include <sstream>
#include <cstring>
#include <iomanip>
#include "hoge.h"

void Hoge::Load(const string& file){
 m.insert(pair<string, string>("hoge","hoge2"));
}
▼-------------hoge.h-------------------
#include <string>
#include <map>

using namespace std;

class Hoge
{
private:
map<string,string> m;
public:
void Load(const string& file);
};
560デフォルトの名無しさん:2010/11/28(日) 19:50:00
・なんでエラーメッセージを書かないの? 馬鹿にしてる?
・なんでコードの断片だけなの? 嫌がらせ?
561デフォルトの名無しさん:2010/11/28(日) 20:31:59
>>559
確かにそれでだけは分からん。
というより、そのコードを見る限りでは、その部分に特に間違いは見受けられない気がする。
別の部分で落ちてるのでは?
562デフォルトの名無しさん:2010/11/28(日) 21:14:24
>>560
>>561
すいません、慣れないデバッガで検証してみてるんですが、

m.insert(pair<string, string>("hoge","hoge2"));

の行でブレークポイント設定して、続行して自動変数パネルを見ると
thisの中のmの値が「不適切なptr」となっていました。

firstにはなぜかconst int型の-1163005939という数値が入っていて
secondは[0]〜[14]まで「CXX0030: エラーです: 式を評価できません」というエラー。

なぜかthisの外にthisと並ぶ形でもうひとつmがありましたが、
そっちも同じです。

不思議なことに

m.insert(pair<string, string>("hoge","hoge"));

というように第一引数と第二引数を同じにすると
不適切なptrというエラー?は消えてちゃんとfirstにもsecondにもhogeが入ってます。
まあその場合でもパネルでは赤色のフォントで表示されているのですが。
563デフォルトの名無しさん:2010/11/28(日) 21:15:45
>>559 とりあえずヘッダで using namespace はやめろ。
564デフォルトの名無しさん:2010/11/28(日) 21:18:31
>>559
プログラム削って、 main() 走らせるだけで同じエラーの起こる最小コードを作ってみろ。
565デフォルトの名無しさん:2010/11/28(日) 21:24:45
>>562
> なぜかthisの外にthisと並ぶ形でもうひとつmがありましたが、
!?

何かmapの初期化が上手くいってない気がするので、もう少しソースコードを出してくれ。
566デフォルトの名無しさん:2010/11/28(日) 21:26:24
変数をフルパスで指定したら治るんじゃねーの。たぶん。
567デフォルトの名無しさん:2010/11/28(日) 21:28:47
>>559
自動変数が未初期化のまま動くわけねーだろ。mainの中身をtryで囲ってエラーを晒せ。
#include <exception>
int main()
{
 try
 {
  ...
 }
 catch(const exception &ex)
 {
  cout << ex.what() << endl;
 }
}
568デフォルトの名無しさん:2010/11/28(日) 21:32:17
ソースを全部codepadに貼れ
569デフォルトの名無しさん:2010/11/28(日) 22:01:46
船頭多くして船山に登る。
570デフォルトの名無しさん:2010/11/28(日) 22:06:41
すいません、なんかソースコードもみなさんのレスもいっぱいあるので、
とりあえず.cppと.hファイルを貼ることからはじめようと思います。
手際悪くてもうしわけないです。


hoge.cpp
http://codepad.org/HDuwyyzQ

hoge.h
http://codepad.org/tgicLLGg


namespaceは削ると構文エラーが三十個くらい出たのでとりあえず置いておきました。

>>564
>>567
起こったことをありのままに話すと、main関数がありませんでした。
すみません…
571デフォルトの名無しさん:2010/11/28(日) 22:10:57
ヘッダでusing namespace std;とか
572デフォルトの名無しさん:2010/11/28(日) 22:18:40
>>570
実行時に読み込んでるファイルも晒せ。
573570:2010/11/28(日) 22:18:48
hoge.cppの方、もうちょっと削りました。
http://codepad.org/k0N1eKIZ
574デフォルトの名無しさん:2010/11/28(日) 22:23:37
main()なしでデバッグだとか、未だおちょくっているようにしか見えんな。
575デフォルトの名無しさん:2010/11/28(日) 22:23:39
>>572
どうぞ、こちらです。
・Global.h
http://codepad.org/YOOkQHUu
576デフォルトの名無しさん:2010/11/28(日) 22:26:59
>>570 本当にhogeで落ちてるのか? このコードじゃ落ちないだろ。念のため↓をやれ
#include <exception>
void hoge::Load(const string& file){
::AfxMessageBox("insertします");
try {m.insert(pair<string, string>("hoge","hoge2")); }
catch(const exception &ex) { ::AfxMessageBox(ex.what()); }
}

>>574
Windowsで_tWinMainしかなかったか、MFC使ってるんだろ。
577デフォルトの名無しさん:2010/11/28(日) 22:38:47
>>576
「insertします」
というポップアップが出た後、
自動変数パネルのexの中身を見てみるとやはり「不適切なptr」でした。

thisの中のmを展開しようとすると「このアイテムは1000000個以上の子アイテムが含まれます」という
アラートが出るので展開しませんでした。

出力には
プログラム '[1460] program.exe: ネイティブ' はコード 0 (0x0) で終了しました。
とのこと。

コンパイル時の警告には

cl : コマンド ライン warning D9035 : オプション 'Wp64' の使用は現在推奨されていません。今後のバージョンからは削除されます。

と出ますが多分関係ないですよね。
578デフォルトの名無しさん:2010/11/28(日) 22:52:58
Releaseで動かしてたりして
579デフォルトの名無しさん:2010/11/28(日) 23:00:25
>>578
あ、ほんとうだ、Releaseになってますね。
Debugにするとコンパイルすら通らなくなってしまった…。
codepadに上げたのじゃない他の複数のファイルで
「プリコンパイル ヘッダーを検索中に不明な EOF が見つかりました。'#include "stdafx.h"' をソースに追加しましたか?」
というエラーと
「プリコンパイル済みヘッダーの使用を検索中にスキップされました」
という警告が出ますね…あわわ
580デフォルトの名無しさん:2010/11/28(日) 23:06:56
>>579
プリコンパイル済みヘッダーを使用しない設定に
581デフォルトの名無しさん:2010/11/28(日) 23:14:26
だから初心者はLinuxでgccでやれと言ってるだろうが
582デフォルトの名無しさん:2010/11/28(日) 23:14:47
『コード 0 (0x0) で終了』
落ちてねーぞ。どこが問題なの?
どうなるつもりであって、どうなったので問題だと思ったの?
583デフォルトの名無しさん:2010/11/28(日) 23:15:55
>>580
やりました。
大量の警告とエラーが出ました。涙もちょっと出ました…。
http://codepad.org/7gVrrWj1
584デフォルトの名無しさん:2010/11/28(日) 23:20:18
>>583
winmm.libをリンク
585デフォルトの名無しさん:2010/11/28(日) 23:20:44
>>582
Releaseモードでコンパイルして出来上がったexeをクリックしたら、
先ほどの"insertします"というポップアップが出た後、exeのGUI?が立ち上がらず、
タスクマネージャーのプロセスでは存在するという幽霊みたいな存在になってます。

すぐに「プロセスツリーの終了」で落とすんですが。

最初の方の段階ではexeを立ち上げたとたんランタイムエラーと出て落ちてました。
質問する前に最小限のコメントアウトとかして、上記の幽霊アプリ状態になった感じです。
586デフォルトの名無しさん:2010/11/28(日) 23:24:35
よくわからないものを無理して使うからよ
587デフォルトの名無しさん:2010/11/28(日) 23:26:26
>>584
はじめはVC2003使ってたんですが、VC2008に変更したら、
いつの間にかリンカの追加の依存ファイルがきれいさっぱりなくなってました。

とりあえずwinmm.libだけ追加しておきました。
588デフォルトの名無しさん:2010/11/28(日) 23:36:46
あ、デバグモードとは設定別みたいですね…。
とりあえずデバグモードの設定も追加の依存ファイル全部追加しました。
589デフォルトの名無しさん:2010/11/28(日) 23:45:44

とりあえずデバグ開始したんですが、立ち上がったアプリケーションウィンドウを閉じるとエラーが出るようになりました。

> Windows によって program.exe でブレークポイントが発生しました。
> ヒープが壊れていることが原因として考えられます。program.exe または読み込まれた DLL にバグがあります。

詳細は下記です。
http://codepad.org/9FaXjGof
590デフォルトの名無しさん:2010/11/28(日) 23:51:36
m.insertをコメントアウトしたら正常起動するのかね?
591デフォルトの名無しさん:2010/11/29(月) 00:00:20
>>590
ああ、前までコメントアウトしたら起動してたのに、
あれこれ触ってる内に起動しなくなってしまいました…。

とりあえず今これ以上やってもここの方達振り回すだけになっちゃいそうなので、
自分でもうちょっと検証してみます。

ありがとうございます。
592デフォルトの名無しさん:2010/11/29(月) 00:00:47
>>591
insertの中をpairじゃなくてmake_pairにしてみ
593デフォルトの名無しさん:2010/11/29(月) 00:14:07
>>563
なんで?
594デフォルトの名無しさん:2010/11/29(月) 00:24:25
hoge.hをインクルードしただけでstdの中の名前が取り込まれたら
たまらんだろ刺すぞこの野郎
595デフォルトの名無しさん:2010/11/29(月) 00:30:57
キチガイに刃物
596デフォルトの名無しさん:2010/11/29(月) 00:33:33
すぐ上に刺すと騒いでるのがいるのか。紛らわしい奴だな。

キチガイに刃物。>>589にusing
597デフォルトの名無しさん:2010/11/29(月) 00:35:51
逃げろ!!アイツらが来る
598デフォルトの名無しさん:2010/11/29(月) 00:53:36
ここはハッテン場じゃないんですから刺すとか刺さないとかそういう話はやめてください
599594:2010/11/29(月) 00:54:22
何がキチガイだよ。とあるヘッダに
> #pragma pack(push, 1) // 構造体メンバのアライメントを変更
> struct X {
> }; ←popなし
とか書いてあったら殺したくなるだろう。それと同じ。
600デフォルトの名無しさん:2010/11/29(月) 00:55:36
>>599
お前は「紛らわしい奴」で「キチガイ」じゃないから安心しろ。
601デフォルトの名無しさん:2010/11/29(月) 01:00:37
>>599
キチガイのドカタ
キチガイのドカタ
キチガイのドカタ
職場でも、殺す、刺すとか普通に使ってるんだろ
602デフォルトの名無しさん:2010/11/29(月) 01:01:22
killはよく使うよね
603デフォルトの名無しさん:2010/11/29(月) 01:06:10
>>599
久々のリアル基地外登場
604デフォルトの名無しさん:2010/11/29(月) 01:10:16
生ポインタかスマートポインタにするか迷ってしまいます
指針とかありますでしょうか
605デフォルトの名無しさん:2010/11/29(月) 01:11:28
生にする必要性を説明できなければスマートポインタ。
606デフォルトの名無しさん:2010/11/29(月) 01:11:37
生は避けるに決まっているだろう。
607デフォルトの名無しさん:2010/11/29(月) 01:25:01
ポインタの選択は状況によって異なる
コンテナを選ぶのと同様に特徴を理解して一つ一つのケースで考えるしか無い
608デフォルトの名無しさん:2010/11/29(月) 01:25:26
ありがとうございました
609デフォルトの名無しさん:2010/11/29(月) 01:28:16
vectorとlistは明らかに特性が違うけど、生とスマートポインタの比較で
生が適しているってどんな状況ですか
610デフォルトの名無しさん:2010/11/29(月) 01:32:11
メモリ効率、実行効率がよくて
boost禁止プロジェクトへの移植も余裕でできます
そしてコンパイル時間がアホほど違います
611デフォルトの名無しさん:2010/11/29(月) 01:33:16
で、漏れる危険に直面するんですね。
612デフォルトの名無しさん:2010/11/29(月) 01:39:09
人の頭じゃ管理しきれない複雑な共有関係がなければshared_ptrなんてほとんど害しか無いわ
613デフォルトの名無しさん:2010/11/29(月) 01:42:20
管理から外れたオブジェクトを使い続けてしまう
614デフォルトの名無しさん:2010/11/29(月) 01:42:28
そうやってメモリリークが発生するんですよ
ここテストに出ますから覚えておきましょうねー
615デフォルトの名無しさん:2010/11/29(月) 01:44:11
scoped_ptrで事足りる。
shared_ptr使うことあんま無いわ。
616デフォルトの名無しさん:2010/11/29(月) 01:44:13
リーク予防なんてスマポ以外にもいくらでも手段あるだろwww
スマポやめただけでリークするとかよっぽどレベル低い環境で仕事してるんだな
617デフォルトの名無しさん:2010/11/29(月) 01:45:58
>>616
はい。レベルの低い環境で仕事をしています。
参考までに、リーク防止の方法の例を教えていただけないでしょうか。
618デフォルトの名無しさん:2010/11/29(月) 01:46:00
>>616
こんなこというやつが実際にやらかすんだよな…
死ねばいいのに…
619デフォルトの名無しさん:2010/11/29(月) 01:48:43
2重delete防止にNULLチェックを命令されたプロジェクトあった・・・
620デフォルトの名無しさん:2010/11/29(月) 01:49:08
>>617
デバッガでもアロケーターでもエディタ機能でも他のでも何でもいいよ

>>618
俺は自分の担当でメモリリーク一回もしたことない
621デフォルトの名無しさん:2010/11/29(月) 01:50:26
>>620
(キリッを付け忘れてますよ
622617:2010/11/29(月) 01:55:00
>>620
デバッガですか。スマートポインタは変数を宣言した時点で開放されることが保証されて
いることが大きなメリットだと思っていました。デバッガだと「デバッグ時に発生しなかった」
ことはわかりますが、プログラムの安全性が保証できるわけではないですよね。
Boost禁止されたら、私なら10行くらいでスマートポインタを書きます。
623デフォルトの名無しさん:2010/11/29(月) 01:58:15
保証されてないだろ
そんな考えならGCでも使っとくべき
624デフォルトの名無しさん:2010/11/29(月) 02:02:15
>>620
ちゃんとした現場ならメモリーリークが珍しい事象であるのは確かだな
90年代はほとんどCで開発していたけどメモリーリークを見たのは2〜3回だ
625デフォルトの名無しさん:2010/11/29(月) 02:02:18
設計の問題なんですかね
626デフォルトの名無しさん:2010/11/29(月) 02:59:22
質を問わないのであれば生ポにすることはない
627デフォルトの名無しさん:2010/11/29(月) 05:13:50
using std
はboostのヘッダーに見た記憶あるぞ
628デフォルトの名無しさん:2010/11/29(月) 05:17:52
関数のブロックスコープやクラススコープ、グローバル以外の名前空間スコープの中なら、
たとえヘッダだろうが、好きに書けばいい。

ヘッダのグローバル名前空間スコープに書くのが問題なんだ。
629デフォルトの名無しさん:2010/11/29(月) 05:17:54
boost⊃stdてことじゃねーの?
boostシラネーけど
630デフォルトの名無しさん:2010/11/29(月) 13:38:49
コンソールアプリケーションで画像を出したいんだけど
OPEN GLはコーンソール画面に出せないから
常識的に言って画像ファイルか動画ファイルを書き出す風に
なると思いますが。
それぞれ何形式がよろしいでしょうか?
631デフォルトの名無しさん:2010/11/29(月) 14:04:37
BB ASCII Demo standard size running in Linux (With sound)
http://www.youtube.com/watch?v=9ukhOAUseKY
632デフォルトの名無しさん:2010/11/29(月) 14:19:35
>>622
> プログラムの安全性が保証できるわけではないですよね。
頭おかしいのがまた沸いたか。
633デフォルトの名無しさん:2010/11/29(月) 15:38:39
class Foo
{
  static void boo(){}
};
とやればbooはインライン化されますか?

class Foo
{
  static inline void boo(){}
};
とやらないとだめですか?
634デフォルトの名無しさん:2010/11/29(月) 15:46:24
inlineは書かなくてもいい
635デフォルトの名無しさん:2010/11/29(月) 15:59:12
サンクス
636デフォルトの名無しさん:2010/11/29(月) 18:12:45
>>630をそろそろお願いします。
機種依存ではなくて一番一般性の高いやつがいいです。
637デフォルトの名無しさん:2010/11/29(月) 18:14:42
コーンソールで笑ったから教えてあげないッ!
638デフォルトの名無しさん:2010/11/29(月) 18:15:04
jpgでもpngでも好きにしたまえ
639デフォルトの名無しさん:2010/11/29(月) 18:31:13
>>630
画像なら、名前の通り移植性のある ppm がいい。最強だ。
640デフォルトの名無しさん:2010/11/29(月) 18:42:03
ちなみに圧縮とか分からないんで一番簡単で一番一般的なフォーマットのやつにしてください。
動画の形式が一つもでてないのでそちらもお願いします
641デフォルトの名無しさん:2010/11/29(月) 18:59:04
そんな知能で大丈夫か?
642デフォルトの名無しさん:2010/11/29(月) 19:15:17
ひらめいたけど、
独自の形式を作ってそれをあとで変換すればいいんだ・・・
無駄なこと聞いてしまった自分が情けない。
643デフォルトの名無しさん:2010/11/29(月) 19:50:38
>>642
静止画を高速に連続に表示すれば、動画になるよね
動画するのに必要な分の静止画を作りそれを一つにまとめ
各静止画を1/60sレート位で連続表示すれば良いんじゃないか
644デフォルトの名無しさん:2010/11/29(月) 21:38:39
motion jpeg?
645デフォルトの名無しさん:2010/11/29(月) 22:07:06
motion ppmでしょ
646デフォルトの名無しさん:2010/11/29(月) 22:19:50
ppm画像でもffmpegで普通の動画に変換できるしいいね
647デフォルトの名無しさん:2010/11/29(月) 23:40:50
[OS] Windows Xp 32bit
[開発環境]Visual Stadio 6.0

[やりたい事]コード化のアルゴリズムの実装方法
ttp://www.swetake.com/qr/qr2.htmlの実装をC/C++で行いたいのですが
英数字モードでは、2文字ごとに11bitの2進数に変換して、その後8bitに分割とありますが
どうしたらいいのか分かりません。
そもそも11bitなんて単位では扱えないし、それでどうやって8bitごとのデータを作ればいいのか分かりません。

ヒントでも良いので何か助言をお願いします。
648デフォルトの名無しさん:2010/11/29(月) 23:44:57
boolを配列にして11個ならべれば?
649デフォルトの名無しさん:2010/11/30(火) 00:24:02
>>647
"AB"
は 45*10+11 で
00111001101 になるのは理解できてるか?

それと最終的に
モード指示子、文字数指示子、データ、終端パターン のビット列を並べて
で9バイトになるってのも理解できてるか?
650デフォルトの名無しさん:2010/11/30(火) 00:38:16
馬鹿にしないでください。理解してたら質問しません。
651デフォルトの名無しさん:2010/11/30(火) 00:41:38
つまり馬鹿ということですね?
652デフォルトの名無しさん:2010/11/30(火) 00:47:51
バカにしないでください自分はバカですって書いてるようにしかみえない
653デフォルトの名無しさん:2010/11/30(火) 00:49:18
私は「わバ「バカで「でで」私私ババ「カ」
654デフォルトの名無しさん:2010/11/30(火) 00:59:32
>>647
>そもそも11bitなんて単位では扱えないし

いや、英数字モードを11bitで扱いましょうってそこに書いてあるだろ
00111001101 は11個のbitだろ
655デフォルトの名無しさん:2010/11/30(火) 01:36:10
表2を見てないのか、理解できてないのか、が問題?
656デフォルトの名無しさん:2010/11/30(火) 09:49:39
boost::ptr_list<int> list;
list.Add(new int(10));

上記の要素をeraseした時点で 10が入ってた領域はdelete されてますか?
list自体使われなくなった時点でまとめてdelete?
657デフォルトの名無しさん:2010/11/30(火) 09:51:22
>>656
当然
そのためのptr_container
658656:2010/11/30(火) 09:56:42
ありがとです

ちなみにptr_listはaddないからpush_backでした
659デフォルトの名無しさん:2010/11/30(火) 10:02:06
ptr_container自体、C++が事実上ポインタを通してしかポリフォーリズム
出来ないので(実際は参照でも出来るがほとんど使われない)、コンテナで
ポリフォーリズムをするために用意されたと思われる

何せ標準で用意されているコンテナは同じサイズの物しか入れられず、派生
クラスも入れられない

そこでポインタをコンテナに入れるわけだが、コンテナを操作して使われなくなった
インスタンスはデストラクタを自動的に呼んでくれない(インスタンスが入っていた
場合は呼んでくれるが、ポインタが入っていたら無視される)

そこでboost::ptr_vectorが登場したと考えられる
660デフォルトの名無しさん:2010/11/30(火) 10:02:47
×ptr_vector
○ptr_container
661デフォルトの名無しさん:2010/11/30(火) 10:05:02
なんでそんな説明したの
662デフォルトの名無しさん:2010/11/30(火) 10:10:47
えーん
×ポリフォーリズム
○ポリモーフィズム

>>661
他の説明があったらよろしく
663デフォルトの名無しさん:2010/11/30(火) 10:12:22
誰も聞いてないのに自分の得意分野を空気読まずに延々話し出すオタの典型ですね
664デフォルトの名無しさん:2010/11/30(火) 10:24:17
まあいいじゃない書きたいこと書けば
665デフォルトの名無しさん:2010/11/30(火) 10:27:43
というか常識を(キリッとか言われても
666デフォルトの名無しさん:2010/11/30(火) 10:36:41
uint32_t hash(char const * p);
これプログラム中に1文字列につき1回しか呼ばれないから
どうにかしてコンパイル中に解決して元の文字列をexeから消滅させたいんだけど
そういうことってC++だけで出来る?
667デフォルトの名無しさん:2010/11/30(火) 10:46:16
>>666
C++0xならできそうだけど普通のC++では難しそう
668デフォルトの名無しさん:2010/11/30(火) 11:47:18
いや、ボーストについてまったく知らない俺にはすごくためになったよ。
669デフォルトの名無しさん:2010/11/30(火) 12:51:36
>>666
結果を吐くC++プログラムを書けば良い。
必然的に、二段コンパイルになるだろうけどな。
670デフォルトの名無しさん:2010/11/30(火) 17:25:44
>>659 ためになった

>C++が事実上ポインタを通してしかポリフォーリズム
>出来ないので(実際は参照でも出来るがほとんど使われない)
事実上ポインタを通してしか、出来ない理由は理由は何?
(参照でも出来るのに、ほとんど使われない理由は何?)
671デフォルトの名無しさん:2010/11/30(火) 17:40:15
参照でコンテナって作れたっけ?
672デフォルトの名無しさん:2010/11/30(火) 17:46:56
参照のplacement newができないから無理じゃん?
673デフォルトの名無しさん:2010/11/30(火) 17:56:17
>>670
参照でポリモルフィズムを行うためにはインスタンスを明示して
それの仮想関数を呼び出す必要がある

つまりハードコーディングになるのであまり利用価値がない
というか出番が少ない
674デフォルトの名無しさん:2010/11/30(火) 17:58:43
参照でポリモーフィズムって関数が参照を返してそれの仮想関数を
呼び出すシチュエーションが多いな
675デフォルトの名無しさん:2010/11/30(火) 18:10:49
>>673
インスタンスを明示ってなに?
参照でもポインタと使い方変わんないよ?
676デフォルトの名無しさん:2010/11/30(火) 18:16:30
>>673
インスタンスを明示した場合は例え仮想関数の呼び出しでも直接コールに
コンパイルされるよ

スピードが命のC++だからね
677デフォルトの名無しさん:2010/11/30(火) 18:44:57
一瞬ん?ってなったけど、ポリモーフィズムの話とコンテナの話は別なのか
紛らわしい・・・

参照でポリモーフィズム使う場面って、引数くらいだよね確かに
678デフォルトの名無しさん:2010/11/30(火) 18:48:58
参照で多態使わないとかどこの素人だよ
679デフォルトの名無しさん:2010/11/30(火) 19:02:34
>>673
日本g……コードでおk
680デフォルトの名無しさん:2010/11/30(火) 21:06:16
CでもC++でもいいんだけどfpos_tより大きいファイルって扱う方法ないの?
681デフォルトの名無しさん:2010/11/30(火) 21:07:25
>>680
OSを独自にいじるライブラリに頼るしかない
処理系依存・環境依存
682デフォルトの名無しさん:2010/11/30(火) 21:09:08
環境依存だけど手っ取り早く扱いやすくだとmmapとか
683デフォルトの名無しさん:2010/11/30(火) 22:05:28
UTF-8に対応した文字列クラスってありますか?

std::string str("あいうえお");
std::cout << str.length() << std::endl; // 5になって欲しい
std::cout << str.substr(0, 1) << std::endl; // "あ"が出力されて欲しい

というような使い方ができるやつが希望です。
出来れば、EUCやS-JISなども対応してるとなお嬉しい。
684デフォルトの名無しさん:2010/11/30(火) 22:21:16
ランダムアクセスできないってだけで標準でも2G以上も扱えるよね
685304:2010/11/30(火) 22:39:14
2bitの値(というか、1bitの値をふたつ)を返したい場合、
int型の1,2bit目で判断するのと、pair<bit,bit>を使うのとどっちがスマートでしょうか?
それ以外の方法もあります?
686デフォルトの名無しさん:2010/11/30(火) 22:39:48
>>683
「あいうえお」の長さが5になったらそれは最早UTF-8ではない。
とりあえず
std::wstring str(L"あいうえお");
でどうだ?
687デフォルトの名無しさん:2010/11/30(火) 22:40:32
char型で返す
ビットフィールドを使う
引数に参照を渡して2bit操作する
688デフォルトの名無しさん:2010/11/30(火) 22:41:07
pair<bool,bool>だった
しかもクッキー食べ忘れ
689デフォルトの名無しさん:2010/11/30(火) 22:46:35
質問です
一般にグローバル変数はいけない、という事なのですが、
全てのファイルで一貫して使う定数などはどこにどう定義すればいいのでしょうか?
690デフォルトの名無しさん:2010/11/30(火) 22:48:29
>>685
それぞれの値が数値でなくtrue/falseを意味するなら
struct A { bool flg1; bool flg2; }; だな。
将来的に値が2ビットとか3ビットになる可能性があるならビットフラグかな。
struct A { int flg1: 3; int flg2 : 2; };
691デフォルトの名無しさん:2010/11/30(火) 22:48:55
>>686
>「あいうえお」の長さが5になったらそれは最早UTF-8ではない。

なんでだ。
692デフォルトの名無しさん:2010/11/30(火) 22:51:41
>>689
なぜグローバルがダメなのか分からないレベルの初心者なら気にするな
周りの言葉に惑わされて全然関係ないところで躓く典型だ
693デフォルトの名無しさん:2010/11/30(火) 22:54:39
定数ならヘッダに
namespace foo
{
const int boo = 1000;
}
とかやれば
694デフォルトの名無しさん:2010/11/30(火) 23:02:22
>>692
>>693
ありがとうございます

ちなみに、変数名の重複以外の理由でグローバル変数が駄目な理由って
何があるでしょうか?
695デフォルトの名無しさん:2010/11/30(火) 23:10:20
>>686
回答ありがとうございます。
バイト数ではなく、文字数(=5)を得たいという意味です。

> std::wstring str(L"あいうえお");
> でどうだ?
実際に扱いたいのはリテラルではなくて、UTF-8の入出力なので
その方法だと無理そうです。。
(PCとかならプログラムの入出力に別プログラムでフィルタかませば
済みそうなんですが、組み込みでの使用を考えてるので、それも難しい)
696デフォルトの名無しさん:2010/11/30(火) 23:15:30
>>694
グローバル変数がいつ何処で書き換わるのかを追うことが難しく、読みにくくなるから。
だからグローバルな定数なら文句を言う奴は少ない。
697デフォルトの名無しさん:2010/11/30(火) 23:24:51
なんとなく、処理の前後にUTF-8 <-> UTF-16の変換処理入れて
内部はstd::wstringで表現すれば比較的楽にいけるんじゃないかと
思いついた。
というわけで、そういう方向でやってみますー
698デフォルトの名無しさん:2010/12/01(水) 00:24:56
UTF-16ってWindowsか? 頼むからサロゲートペアはきちんと処理してくれよ。
MultiByteToWideChar呼べば問題無いと思うが。ついでにシフトジスにも対応できる。
699デフォルトの名無しさん:2010/12/01(水) 01:03:53
>>685 std::bitset<2>
700デフォルトの名無しさん:2010/12/01(水) 01:07:11
701デフォルトの名無しさん:2010/12/01(水) 01:10:03
>>673
何言ってやがる。
std::iostream も std::exception も参照でポリモーフィズム利用するのが基本だろ。
702デフォルトの名無しさん:2010/12/01(水) 10:26:05
いつも頭を悩ませるんだけど失敗しうるリソース開放処理ってどう対処してるの?
成功するまで繰りかえす、ログに出力して放置、即落ちる、とか考えたけどどれもいまいちピンとこない
703デフォルトの名無しさん:2010/12/01(水) 10:41:16
どういうソフトで、解放されなかった場合どうなるかを考えて切り替えじゃないかな
基本はログ出力やメッセージ表示して放置でいいと思うけど
704デフォルトの名無しさん:2010/12/01(水) 12:13:48
初歩的な質問なんですけど、浮動小数点型の右シフトって
2で割ると同じことになるんですか?
705デフォルトの名無しさん:2010/12/01(水) 12:17:04
>>704
ならない
706デフォルトの名無しさん:2010/12/01(水) 12:29:11
>>704
実はやってみた事がある
キャリーフラグを通しての回転なのでインラインアセンブラを使った
結果は出力がバグって100桁以上の出力になったっけ
多分IEEE754が意図していない変なビットパターンになっちゃったんだな
707デフォルトの名無しさん:2010/12/01(水) 12:32:42
マジっすか?それはおかしいなぁ
クヌースの1巻の1.2.2の問題25で右シフトして
半分にしてるんだけど。
708デフォルトの名無しさん:2010/12/01(水) 12:34:28
浮動小数点型を2で割ってもビットパターンはまったく回転しないぜ
指数部が1減るだけ
709デフォルトの名無しさん:2010/12/01(水) 12:37:21
もしかして2から1の間ではなりたちますか?
710デフォルトの名無しさん:2010/12/01(水) 12:38:09
>>707
それ多分IEEE754形式じゃないんだよ
エクセス64方式でもそうはならない
711デフォルトの名無しさん:2010/12/01(水) 12:39:01
>>709
だめだと思う
指数部や符号部までシフトされちゃうからおかしくなるよ
712デフォルトの名無しさん:2010/12/01(水) 13:23:29
1.0をシフトした場合を考えてみれ
0.5になると思うか?
713デフォルトの名無しさん:2010/12/01(水) 13:42:03
なるような気がします
714デフォルトの名無しさん:2010/12/01(水) 13:51:39
まず浮動小数点数のビット表現をwikiれ
715デフォルトの名無しさん:2010/12/01(水) 15:32:23
>>713
IA-32 + Windowsの場合だけど、このように滅茶苦茶な値になる

#include <iostream>

void rshift(double& d)
{
asm {
mov ebx, d
shr byte ptr [ebx + 7],1
rcr byte ptr [ebx + 6],1
rcr byte ptr [ebx + 5],1
rcr byte ptr [ebx + 4],1
rcr byte ptr [ebx + 3],1
rcr byte ptr [ebx + 2],1
rcr byte ptr [ebx + 1],1
rcr byte ptr [ebx + 0],1
}
}

int main()
{
double d = 100.0;

std::cout << "Before Right shift : " << d << std::endl;

rshift(d);

std::cout << "After Right shift : " << d << std::endl;
}
716デフォルトの名無しさん:2010/12/01(水) 15:37:19
指数部分だけならいける

http://codepad.org/ayEWJGBS
717デフォルトの名無しさん:2010/12/01(水) 15:43:36
>>716
それは当たり前
718デフォルトの名無しさん:2010/12/01(水) 18:11:58
scheme から可読なc++への変換機
http://www.suri.cs.okayama-u.ac.jp/servlets/APPLICATION.rkt
作ってみた
型推定をC++にまかせるためにautoも時々使うようにした

これの改造なので使い方は同じ
http://people.csail.mit.edu/jaffer/Schlep/scm2c.html
719デフォルトの名無しさん:2010/12/01(水) 20:09:22
>>718
死ね
720デフォルトの名無しさん:2010/12/02(木) 03:56:33
>>716
素直に2で割った方が早いだろJK
721716:2010/12/02(木) 04:00:44
>>720
そんな事は百も承知だカス
>>709に教えてやるためにわざわざやってやってるんだ
低脳は口を出すな
722デフォルトの名無しさん:2010/12/02(木) 06:02:27
double に 2.0 と 1.0 を代入して16進で見ればすぐ理解できると思うんだけど
723デフォルトの名無しさん:2010/12/02(木) 17:43:21
cinからバイナリを読んでみたいんだけど
ストリームの対象を変えずにオープンモードだけ変える方法ってある?
C++でなかったらCでもいいです
724デフォルトの名無しさん:2010/12/02(木) 18:19:12
>>723
処理系に依存しない方法では無理。Visual C++ならこんな感じ。
#include <fcntl.h>
#include <io.h>
#define setbinmode(fp) setmode(fileno(fp), O_BINARY)
725724:2010/12/02(木) 18:23:17
すまん。こいつも必要。
#if (defined(_MSC_VER) && (_MSC_VER > 600))
# define setmode(x, y) _setmode((x), (y))
# define fileno(x) _fileno(x)
# define isatty(x) _isatty(x)
#endif
726デフォルトの名無しさん:2010/12/02(木) 18:23:35
どうせWindows以外はテキストモードとかどうでもいいしなあ
727デフォルトの名無しさん:2010/12/02(木) 19:01:59
マルチプラットフォームに対応したソースを書くにはどうしたらよいでしょうか
728デフォルトの名無しさん:2010/12/02(木) 19:13:10
説明してあるサイト見たこと無いんだ・・・
729デフォルトの名無しさん:2010/12/02(木) 20:22:43
>>726
VMSのことも時々でいいので思い出してあげて下さい
730デフォルトの名無しさん:2010/12/03(金) 06:53:27
>>727
使用する関数や言語機能のドキュメントを読んで、
プラットフォーム依存な部分があるのかないのか確認すれば
よいでしょう。
731デフォルトの名無しさん:2010/12/03(金) 12:37:21
パソコンの性能に依存しない実行速度の測定方法を教えてください。
732デフォルトの名無しさん:2010/12/03(金) 12:44:48
>>731
どう測定したらパソコンの性能に依存なんてするの?
733デフォルトの名無しさん:2010/12/03(金) 12:45:03
?!
734デフォルトの名無しさん:2010/12/03(金) 12:47:49
2つの別々のパソコンで別々のアルゴリズムを測定して2つのアルゴリズムを
どうやって比べるの?
735デフォルトの名無しさん:2010/12/03(金) 12:54:36
>>734
2つのパソコンで2つのアルゴリズムについて std::clock() あたりで実行時間を計測すればいいんじゃないの?
736デフォルトの名無しさん:2010/12/03(金) 13:00:33
>>731
実行速度はパソコン性能に依存するので諦めて下さい
737デフォルトの名無しさん:2010/12/03(金) 13:02:58
>>734
パソコン1でアルゴリズム1を測定、パソコン2でアルゴリズム2を測定して、
その2つの計測結果のみでアルゴリズム1とアルゴリズム2のどちらが速いか
決めたい、ってことなのかな?

それは無理だ。

計算量の話にすれば O(1) とか O(N) とか O(logN) の違いでアルゴリズムを
比較することはできるけど、それがそのままどちらが速いという結果につながる
わけでもないし。
738デフォルトの名無しさん:2010/12/03(金) 13:13:14
OSとかが使う計算とかの、測るアルゴリズム以外の計算は止めておいて
クロック数を測る方法でいいです。
739デフォルトの名無しさん:2010/12/03(金) 13:22:03
>>730
諦めました
740デフォルトの名無しさん:2010/12/03(金) 13:24:02
使用クロック数自体もパソコンによって違うから。主にキャッシュの量の問題な。
741デフォルトの名無しさん:2010/12/03(金) 13:26:35
一クロックでどのくらいのことができるかも、CPUによって違うからな
742デフォルトの名無しさん:2010/12/03(金) 13:27:42
体感しかないな
743デフォルトの名無しさん:2010/12/03(金) 13:28:50
じゃあ駄目だな。
終わりだな。
744デフォルトの名無しさん:2010/12/03(金) 13:59:45
クロックが同一でもCPU内部アーキテクチャ、バスアーキテクチャ、メモリ性能や
メモリ2枚差し3枚差しでも全然違ってくるから、ベンチマークはPCに依存しない
プログラムは原理的に作る事が出来ない
745デフォルトの名無しさん:2010/12/03(金) 14:01:00
ただし計算量O(ビッグ・オー記法)はコンピュータによって変化しないから、
あるアルゴリズムがどの位の計算量を持つのかそのオーダーを知る事は出来る
746デフォルトの名無しさん:2010/12/03(金) 14:38:38
なんで、コンピューターはコンピュータなのに
ビッグ・オーはビッグ・オじゃないの?
なんでオーダーはオーダじゃないの?
747デフォルトの名無しさん:2010/12/03(金) 14:45:23
くだらない
748デフォルトの名無しさん:2010/12/03(金) 15:19:29
ここがC++のスレか・・・
ということで質問です。

Delphiで

TUnkoClass: class of TUnko

type
 TGeri = class(TUnko)


 TIpponGuso = class(TUnko)



function BuildUnko(AType:TUnkoClass):TUnko;
begin
 Result:=AType.Create;
end;

こういうのがあったとして、これをC++でやるにはどうしたらいいんでしょうか。
749デフォルトの名無しさん:2010/12/03(金) 15:32:03
死ね
750デフォルトの名無しさん:2010/12/03(金) 15:56:05
>>748
いくつマルチポストしてるんだカス
ここへ行け

くだすれC++Builder(超初心者用)その4
http://hibari.2ch.net/test/read.cgi/tech/1256256376/

Delphiのプログラムを簡単に移植出来るのはC++Builderしかない
751デフォルトの名無しさん:2010/12/03(金) 21:04:42
これってvecの中はdeleteされずにちゃんと数字入ってる?

vector<char*> vec;
for (int i=0; i<3; i++)
{
 char* ch = new char[2];
 sprintf(ch, "%d", i);
 vec.push_bak=ch;
 delete ch;
}
752デフォルトの名無しさん:2010/12/03(金) 21:06:49
いいえ
753デフォルトの名無しさん:2010/12/03(金) 21:09:39
>>751
vec.push_back(ch);だと思うけど、
ポインタがコピーされるだけだから数字は入ってない
754デフォルトの名無しさん:2010/12/03(金) 21:13:20
これならいける?

vec.push_bak(*ch);
755デフォルトの名無しさん:2010/12/03(金) 21:17:25
ポインタ型のコンテナに値がある訳無かろう
756デフォルトの名無しさん:2010/12/03(金) 21:31:24
なるほど
757デフォルトの名無しさん:2010/12/03(金) 22:34:51
{
 vector<char*> vec;
 for (int i=0; i<3; i++)
 {
  char* ch = new char[2];
  sprintf(ch, "%d", i);
  vec.push_bak=ch;
 }
}
vecがスコープを抜けた時、自動的にchar*のnewで生成の配列をdelete[]
するようにするにはどうすれば良いですか?
758デフォルトの名無しさん:2010/12/03(金) 22:37:25
不可能ですのでほかの言語を勉強しましょう
759デフォルトの名無しさん:2010/12/03(金) 22:39:39
>>757
boost::ptr_vector<char>を使う
760デフォルトの名無しさん:2010/12/03(金) 22:41:48
あれ、ptr_vectorに配列はまずいような気がしてきた
761デフォルトの名無しさん:2010/12/03(金) 22:49:48
入れた分deleteすればいいだけでしょ。
762デフォルトの名無しさん:2010/12/03(金) 22:52:27
newしないでスタック使えよ
763デフォルトの名無しさん:2010/12/03(金) 22:53:47
>>757
関数中に
struct disposer {
disposer(char* p) : p(p) {}
~disposer() { delete [] this->p; }
char* p;
} tmp(new char[2]);
char* ch = tmp.p;
764デフォルトの名無しさん:2010/12/03(金) 23:09:31
C++のnewは何故あんなに遅いのですか?
765デフォルトの名無しさん:2010/12/03(金) 23:11:03
遅いと思うなら、独自メモリー確保作る。
766デフォルトの名無しさん:2010/12/03(金) 23:21:07
>>760
structにでもぶち込もう
767デフォルトの名無しさん:2010/12/03(金) 23:21:20
>>763 感謝上げ
そんなやり方で出来るんですか!
768デフォルトの名無しさん:2010/12/04(土) 02:09:48
newって200ns〜400nsぐらいだろ。そんなに遅いとは思わないが。
それともJava/.NETのnewと比べてる? そりゃまあ遅い罠。
769デフォルトの名無しさん:2010/12/04(土) 02:51:24
あんまり高頻度にnew/deleteするのはヒープ領域を汚すし、boostのpoolでも使えば?
770デフォルトの名無しさん:2010/12/04(土) 02:53:21
ここはC++スレだ。ヒープじゃなくてフリーストアと言え
771デフォルトの名無しさん:2010/12/04(土) 03:14:00
>>757,759,763 std::vector<char> だろjk
772デフォルトの名無しさん:2010/12/04(土) 03:15:02
>>764
どんな計測結果見て「あんなに」と言ってるのか書いてもらわないと、なんとも。
773デフォルトの名無しさん:2010/12/04(土) 10:09:14
テンプレートクラスのテンプレートコンストラクタの
特殊化を宣言したいんですが、どうもうまくいきません。
どう書けばいいか教えてください。VC2010EEです。

template< typename T > float_class
{
T f;
template< typename V > float_class( const V& v );
};

template< > float_class< float >::float_class( const int& v ){ assert(false); }
template< > float_class< float >::float_class( const float& v ) : f(v) {}
774デフォルトの名無しさん:2010/12/04(土) 11:26:38
http://codepad.org/OItN2kVz
iostreamを例外使用で書くとこんな感じですか?
例外使ったサンプルが少なくて困りますわ
775デフォルトの名無しさん:2010/12/04(土) 12:31:28
>>773
二重のテンプレートだから template<> が2つ要るんじゃない?
776デフォルトの名無しさん:2010/12/04(土) 12:57:12
numeric_limitsというものがあるようですが
ある変数fooのnumeric_limits使うときに
わざわざfooの型を見つけてnumeric_limits<double>とかやらないとならんのですか?
numeric_limits<foo>とかできないもんでしょうか。
777デフォルトの名無しさん:2010/12/04(土) 13:13:03
decltype
778デフォルトの名無しさん:2010/12/04(土) 13:45:27
>>771
それって文字列格納できるの?
>>754ができるってこと?
779デフォルトの名無しさん:2010/12/04(土) 14:33:31
ダウンキャストを回避する方法を教えてください
780デフォルトの名無しさん:2010/12/04(土) 14:35:42
継承しなきゃいいんじゃね?
781デフォルトの名無しさん:2010/12/04(土) 14:36:42
死ね
782デフォルトの名無しさん:2010/12/04(土) 14:41:42
>>779
基底クラスにアクセスしようとするとハードディスクをフォーマットするようにしておく
783デフォルトの名無しさん:2010/12/04(土) 14:49:19
そもそもダウンキャスト(基本クラスのポインターやリファレンスから派生クラスのポインターやリファレンスへのキャスト)
させたくないという考えがでる時点で、
すでに基本クラスを使っているだろうから・・・

常にハードディスクをフォーマットするプログラムか。
784デフォルトの名無しさん:2010/12/04(土) 15:19:33
>>778
std::stringを使うという脳みそはないのか
785デフォルトの名無しさん:2010/12/04(土) 16:47:11
cstringってなんだろうと思ったので、googleで検索してもmfcしかヒットしません
なので、linux + gcc環境下で#include <cstring>とやってみましたが、エラーが出ませんでした
cstringはmfcのモノなんですか?
786デフォルトの名無しさん:2010/12/04(土) 16:48:35
<cstring> は <string.h> の C++ 版で
std::strcpy とか std::memcpy とかを使うために必要なヘッダファイルだ
787785:2010/12/04(土) 17:47:27
>>786
string.hってC言語の物なのか?
788デフォルトの名無しさん:2010/12/04(土) 18:00:45
CString って便利よねぇ。
789デフォルトの名無しさん:2010/12/04(土) 18:01:56
C言語のものというかなんというか
C++でも使えることになってるから別に使ってもいい
推奨されてはいないが、気にすることはない
790デフォルトの名無しさん:2010/12/04(土) 18:18:57
string.hはCだけでなくC++にもある。Cのstring.hと同じであるとは限らない。
例えばCのstdlib.hはabs(int)しかないが、C++のstdlib.hはabs(double)があったりする、
はずだが実際には規格に従っていない処理系があったりする。
791デフォルトの名無しさん:2010/12/04(土) 18:29:03
ンモー
792デフォルトの名無しさん:2010/12/04(土) 18:33:57
<cstdlib>で定義されているのは abs(int) と abs(long) の整数型で
abs(doble) は<cmath>じゃね?
Cのmath.hに定義されるfabs()に対応するためのオーバーロード
793デフォルトの名無しさん:2010/12/04(土) 18:38:23
手元に古い1998年版しかないけど、ISO/IEC 14882:1998(E)の
26.5 C Libraryにはcstdlibって書いてある
794デフォルトの名無しさん:2010/12/04(土) 19:05:39
ISO/IEC 14882:2003(E) 26.5 C Library

3. In addition to the int versions of certain math functions in <cstdlib>, C++ adds long overloaded versions
of these functions, with the same semantics.

5. In addition to the double versions of the math functions in <cmath>, C++ adds float and long
double overloaded versions of these functions, with the same semantics.

ISO/IEC 14882:2003(E) D.5 Standard C library headers

2. Every C header, each of which has a name of the form name.h, behaves as if each name placed in the
Standard library namespace by the corresponding cname header is also placed within the namespace scope
of the namespace std and is followed by an explicit using-declaration (7.3.3).
795デフォルトの名無しさん:2010/12/04(土) 20:08:51
>>784
そもそもが敢えてchar*でやるっていうお題なんだけど
自分の脳ミソ疑ったほうが良いんじゃないの?
796デフォルトの名無しさん:2010/12/04(土) 20:11:16
>>777
decltype調べてみましたがC++0xの機能のようですね。
msdn見てみるとVS2010以降で使えるようです。
私の環境はVS2008でなのですが、変わりになるようなものあるでしょうか?
797デフォルトの名無しさん:2010/12/04(土) 20:15:51
>>795 それなら >>758 で終了。
798デフォルトの名無しさん:2010/12/04(土) 20:31:20
>>796
boost::typeof
いまいちだけど
799デフォルトの名無しさん:2010/12/04(土) 20:44:25
#include <cstring>
だろ
え およびでない?
800デフォルトの名無しさん:2010/12/04(土) 20:47:38
>>797
>>763みたいな案もでてんじゃん。
そもそものお題すらぶち壊す代替案しかだせないレベルなら出てこなくて良いよ
ここは質問したいやつとそれに答えれるレベルのやつのスレなんだから
801デフォルトの名無しさん:2010/12/04(土) 20:54:27
>>800
>>763 はダメだろ。
お題は vec のスコープアウトでの破棄なのに、 ch のスコープで破棄されてる。
802デフォルトの名無しさん:2010/12/04(土) 22:46:08
OSのシグナルって割り込みの事だよね
関数ポインタを登録して、コールバックすればいいだけおk?
803802:2010/12/04(土) 22:46:51
コールバックすればいいだけ?
804デフォルトの名無しさん:2010/12/04(土) 22:51:48
>>802 おk日本語で
805デフォルトの名無しさん:2010/12/04(土) 22:58:54
int* p = new int[0];
って要素数ゼロ指定したらどんな良くないこと起きますか?
806デフォルトの名無しさん:2010/12/04(土) 23:07:40
p が NULL になるのは確実だけど例外が生じるかは処理系依存かなぁ
807デフォルトの名無しさん:2010/12/04(土) 23:08:13
>>805
べつに。

「ヌルじゃなければオブジェクトを指しているという」仮定をおいている
コードにそのポインタを渡したときに不正なアクセスとなる可能性は考えられる。
でもどうせ配列アクセスするときにはサイズでチェックするから、それもないか。
808デフォルトの名無しさん:2010/12/04(土) 23:12:06
>>806
ideoneではnullにならないけど。

http://ideone.com/rcLdA
809デフォルトの名無しさん:2010/12/04(土) 23:15:32
>>806
ヌルにはならないよ。

ISO C++ 2003 5.3.4 New p7
> When the value of the expression in a direct-new-declarator is zero,
> the allocation function is called to allocate an array with no elements.

で、 allocation function は成功時にヌルを返しちゃいけない。
3.7.3.1 Allocation functions p2
> ... Even if the size of the space requested is zero, the request can fail.
> If the request succeeds, the value returned shall be a nonnull pointer
> value p0 different from any previously returned value p1, ...
810デフォルトの名無しさん:2010/12/04(土) 23:18:34
>>808
bcc でも NULL にならなかった double* a で sizeof *a が 8 だったから1要素分は alloc されるんだね
知らんかったよ
811デフォルトの名無しさん:2010/12/04(土) 23:27:58
いやそれは・・・
812デフォルトの名無しさん:2010/12/05(日) 00:17:04
int* p = new int[0];
p != NULL
*p == NULL
が正しい
813デフォルトの名無しさん:2010/12/05(日) 00:19:24
>>812
それも違うだろ。
814デフォルトの名無しさん:2010/12/05(日) 00:30:33
>>812 *p で未定義動作。
815デフォルトの名無しさん:2010/12/05(日) 00:38:25
>>800
>>763を試しにやってみたが、その通りだな
結局、ここのスレレベルでは実現出来ない or >>758の通りってことかな
816デフォルトの名無しさん:2010/12/05(日) 00:44:37
>>810
これはひどいな
817デフォルトの名無しさん:2010/12/05(日) 00:53:22
xxx * p = new xxx[0];
*p で未定義動作なのに、なんでp==NULLや例外発生しないの?
あと、どんな時使うの?
818デフォルトの名無しさん:2010/12/05(日) 01:20:40
その*は演算子ではなく、宣言子の一部だ。
819デフォルトの名無しさん:2010/12/05(日) 01:27:10
>>806 >>810 >>812
なぜ勘でここまで断言できちゃうのかのほうが知りたい。
820デフォルトの名無しさん:2010/12/05(日) 01:29:35
×勘
○思い込み
821デフォルトの名無しさん:2010/12/05(日) 01:41:59
>>817
サイズ 0 の配列が欲しいという要求は満たせているのだから、例外が発生しないのは当然。
ヌルを返さないのは「ヌルは確保の失敗を示す」という一般的な意味づけを保つように、だと思う。
822デフォルトの名無しさん:2010/12/05(日) 01:45:45
>>817
サイズ 0 の場合を特別扱いしなくていいように、だろう。
823デフォルトの名無しさん:2010/12/05(日) 01:54:18
>>820
思い込みとも違うような気がする。
824デフォルトの名無しさん:2010/12/05(日) 02:13:04
>>810
sizeof *aはnewしたサイズじゃないぞ。sizeof a[0]と同じ。もちろん実際のメモリアクセスは発生しない。
825デフォルトの名無しさん:2010/12/05(日) 02:15:32
int* p = new int[0];
ってどうゆう意味よ。
int p; じゃまずいの?
new したら deleteするタイミング必要だし。
826デフォルトの名無しさん:2010/12/05(日) 02:27:23
>>825
実際は実行時に決まる要素数がたまたま 0 になる場合の話だろ。
827デフォルトの名無しさん:2010/12/05(日) 02:28:09
>>815
デストラクタ使えば何とでもなるだろ。
struct unko : public vector<char*> {
 ~unko() { for (int i=0; i<size(); i++) delete[] (*this)[i]; }
} vec;
for (int i=0; i<3; i++) {
 vec.reserve(vec.size() + 1);
 vec.push_back(new char[2]);
 char* ch=vec[i];
}
828810:2010/12/05(日) 02:36:08
>>821
malloc() を呼ぶ時に size が0だとNULLになるだろ
size 0 のヒープは確保できないから最低単位、例えば size 1 のヒープを確保するって事か?

>>824
double* a の時、sizeof *a は sizeof double と同じだな、確かに確保した領域とは関係ないや
829デフォルトの名無しさん:2010/12/05(日) 02:37:23
class A;
char buf[1000]:
A* a = new(buf) A[10];
で確保した10個のAのデストラクタを呼び出すにはどうすればいいんでしょうか?
830デフォルトの名無しさん:2010/12/05(日) 02:41:40
>>828
>malloc() を呼ぶ時に size が0だとNULL
それは違う。
C99 7.20.3
『If the size of the space requested is zero, the behavior is implementationdefined』
831デフォルトの名無しさん:2010/12/05(日) 02:45:08
>>829
for (int i=0; i<10; i++) a[i].~A();
832デフォルトの名無しさん:2010/12/05(日) 02:49:29
>>827
vectorって仮想デストラクタ持ってたのか
知らなかった
833827:2010/12/05(日) 02:54:42
>>832
vectorは仮想デストラクタは持ってないよ
834デフォルトの名無しさん:2010/12/05(日) 02:56:08
>>832
継承したからといって virtual デストラクタを持っているとは限らない。
virtual デストラクタを持っていないからといって継承しないとは限らない。
835デフォルトの名無しさん:2010/12/05(日) 02:57:19
>>828 また思い込みで言い切りやがったw
836デフォルトの名無しさん:2010/12/05(日) 03:18:52
>>830
そうは言っても NULL 返さない処理系なんて見た事無いよ
いやまた思い込みって言われるか、確かに過去に扱った処理系全部で size 0 malloc() なんて試してないからなぁ

要点はね bcc だと malloc() は NULL を返し、 new は NULL を返さないって点なんだ
size 0 の場合 new は要素を持たない配列を確保するって言われてもイメージが沸かないでしょ
実装上どういう確保が行われてるか知りたいんだけど....なんかスレ違いみたいだからもう良いや
837デフォルトの名無しさん:2010/12/05(日) 03:29:17
>>836
dlmalloc のソースや libstdc++ のソースを見るといい。
838デフォルトの名無しさん:2010/12/05(日) 03:35:54
サイズ0が指定されたら1に置き換えて確保すりゃいいだけじゃない。
ポインタが以前確保した領域と同じか比較する奴がいて、サイズ0だとNULL
どうしで同じになって困るバカがいたから必ず違うアドレスが返る様にしたと
昔のマイクロソフトのドキュメントに書いてあった。
839デフォルトの名無しさん:2010/12/05(日) 03:41:00
>>838
マジ?
840デフォルトの名無しさん:2010/12/05(日) 03:51:00
>>802
コールバックしてもらえばOK。ただし基本はそこから他の関数を呼んじゃいけない。
841デフォルトの名無しさん:2010/12/05(日) 04:00:15
>>829
bufは動的に確保しろよ。でなきゃアライメントが保証できない。
842デフォルトの名無しさん:2010/12/05(日) 04:24:21
>>841 placement new の意味ねーw
843デフォルトの名無しさん:2010/12/05(日) 04:36:22
placement newでもアライメントは重要だぞ。
C++03では、アライメントというもの自体が規定されていなかったので、実装依存だった、
C++0xでは、alignasというキーワードが導入されたので、ちゃんと指定しろよ。

class A { } ;
alignas(A) char buf[1000] :
A* a = new(buf) A[10] ;
844デフォルトの名無しさん:2010/12/05(日) 05:04:14
>>843
> C++03では、アライメントというもの自体が規定されていなかった
んなこたーない
845デフォルトの名無しさん:2010/12/05(日) 07:49:43
int *p = new int[10];とかやって、detele[]せずに
p = new int[5];ってするとどうなりますか?
一応問題なく動いてるようにみえますが・・・
846デフォルトの名無しさん:2010/12/05(日) 08:12:05
pを保存せずに上書きしたなら
解放できないint10個分の領域が出来るだけ
847デフォルトの名無しさん:2010/12/05(日) 08:19:52
なるほど解放できなくなるのか
ありがとう
848デフォルトの名無しさん:2010/12/05(日) 09:51:33
virtualデストラクタは必ずつけろとか言うアホはなんなの?
849デフォルトの名無しさん:2010/12/05(日) 09:52:51
pは、フリーストアへのポインターの値を格納する変数だ。フリーストアそのものじゃない。
なんだろう。今はメモリーとアドレスといった、プログラミング以前の概念が、分かりにくくなっているんだろうか。
850デフォルトの名無しさん:2010/12/05(日) 10:28:33
>>848
お前がvirtualつけなくていい例を理解してないアホだと思われてるんだろ
851デフォルトの名無しさん:2010/12/05(日) 11:25:03
>>833
そしたらvectorのデストラクタは呼ばれないよね
大丈夫なの?
852デフォルトの名無しさん:2010/12/05(日) 11:31:24
>>851
仕様を勘違いしてない?
 自動変数→OK.必ず全部呼ばれる
 virtualデストラクタ無し、派生クラスのポインタでdelete→OK
 virtualデストラクタ無し、基本クラスのポインタでdelete→NG、基本クラスのデストラクタのみ
 virtualデストラクタ有り、派生クラスのポインタでdelete→OK
 virtualデストラクタ有り、基本クラスのポインタでdelete→OK
853デフォルトの名無しさん:2010/12/05(日) 11:32:56
>>852
揚げ足取りだが二番目は一般的な挙動なだけで
実際は未定義動作だな
854デフォルトの名無しさん:2010/12/05(日) 11:33:58
>>852
ありがとうございます
もっと精進します
855デフォルトの名無しさん:2010/12/05(日) 11:40:54
>>852
そんな面倒な事を覚えなきゃならない欠陥言語をどうして使うんだ?
856デフォルトの名無しさん:2010/12/05(日) 11:51:30
俺はもう覚えてて平気だから気にならない
覚えられない奴は別の言語使えばいいんじゃね
857デフォルトの名無しさん:2010/12/05(日) 13:46:30
virtual関数の仕組みは単純だから基本が分かってれば
個々の場合についていちいち覚えてる必要ないし
858デフォルトの名無しさん:2010/12/05(日) 15:34:00
いっぺんvtableを実装してみれば
あぁそういうことだったのかコンパイラさん面倒なことをいつも引き受けてくれてありがとう
ってなって二度と間違えることはなくなるよ
859デフォルトの名無しさん:2010/12/05(日) 15:38:26
つまり、vtableを実装してみないと使えない欠陥言語という事だね。
860デフォルトの名無しさん:2010/12/05(日) 15:42:57
virtualデストラクタ無し、派生クラスのポインタでdelete→OK

これがOKなのって、派生クラスのポインタを通じた破棄は
正しく派生クラスのオブジェクトの破棄とみなされて
派生クラス部分の破棄(派生クラスのデストラクタ呼び出し)
→基底クラス部分の破棄(基底クラスのデストラクタ呼び出し)の順で行われるからでいいんですか?^^;
861デフォルトの名無しさん:2010/12/05(日) 15:43:14
C系列が欠陥言語なのは昔から常識だろう
862デフォルトの名無しさん:2010/12/05(日) 15:45:04
言語的に自由度が多すぎるのが欠陥なら、アセンブラが一番の欠陥品だな
863デフォルトの名無しさん:2010/12/05(日) 15:49:18
>>860
そうだね

class Hoge
{
~Hoge(void) {}
};
class Fuga : public Hoge
{
~Fuga(void) { /*…*/; /*ここで見えないけど~Hoge()が呼ばれる!*/ }
}

Hoge *h = new Fuga;
Fuga *f = new Fuga;

delete h; // hの型はHoge*だから~Hogeだけが呼ばれる→やばい!
delete f; // fの型はFuga*だから~Fugaが呼ばれる→中の人が~Hogeも呼ぶ
864デフォルトの名無しさん:2010/12/05(日) 15:54:31
欠陥言語ならさらに欠陥方向に振って直前の式からゼロ・オーバーフローフラグを採れる言語にしてほしかったな。
865デフォルトの名無しさん:2010/12/05(日) 15:57:08
>>863
わかりやすい例でサンクスです^^
866デフォルトの名無しさん:2010/12/05(日) 17:01:27
virtal destructor 無い学級は基本的に継承させるな学級
継承しても多相しないのならイラネ
覚えとくように。シャキーーーーン
嘘はシャキーーーーンっと言おう、さればこそ釣が出来る
867デフォルトの名無しさん:2010/12/05(日) 17:11:16
どこで翻訳するとそんな文章になるんだ?
868デフォルトの名無しさん:2010/12/05(日) 17:50:09
よく分からないなら全てのclass のデストラクタに virtual をつければ良いのですが、
そうすることで、コンパイラによりますが、大抵は
vtableという見えないデータメンバを余分に持つことになり、
それが速度に多大な影響を及ぼす場合などもあります。
また、sizeof(クラス名)としても、直感とは違う値が返ってきます。
ですので、C++の高級アセンブラという側面からは、
virtual を言語レベルで強制することは出来なかったです。
869デフォルトの名無しさん:2010/12/05(日) 19:42:02
>>866
クソワロタw
870852:2010/12/05(日) 21:26:37
>>855
俺の場合は仕事だからね。コンパイル時も実行時もエラーを出せないことがある
のは確かに欠陥だとは思うけど、昔は「プログラマーは間違えない」ことを前提とした
仕様がまかり通ってた。面倒だと思ったら
 ・正しい本来の型で開放→問題なし
 ・本来の型と異なる型で開放→virtualデストラクタがないと正しく開放されない
と覚えてくれ。
871デフォルトの名無しさん:2010/12/05(日) 22:14:13
詳しくはEffective C++第3版を読みましょう^^
第2版は古いので、ややいい加減です。
872デフォルトの名無しさん:2010/12/05(日) 23:12:52
>>868
それって静的にわからないもんなのかな?
873デフォルトの名無しさん:2010/12/05(日) 23:19:55
>>872
静的変数や自動変数ならわかるが、newした場合ポインタから指すと
基底クラスと派生クラスのどちらを指しているのかわからない
874デフォルトの名無しさん:2010/12/05(日) 23:20:42
newしなくてもこれでも同じか

Derived drv;
Base* b = &drv;

もうこれだけで静的には解決できない
875デフォルトの名無しさん:2010/12/05(日) 23:54:21
ライブラリに以下の関数を定義したとする。
 void f(Base * pb)
 {
 }
コンパイル時にはpbの実体は決まっていない。ライブラリ作成後に
 struct D : public Base {}; // Dはライブラリ コンパイル時に無かったクラス
 f(new D);
というコードが作成されるかも知れない。
876デフォルトの名無しさん:2010/12/05(日) 23:54:58
更にいうと
>>852 > virtualデストラクタ無し、基本クラスのポインタでdelete→NG、基本クラスのデストラクタのみ
も間違いだよね。
厳密には未定義の動作。

細かいことを申し上げてゴメンよ、と思ったらもう指摘されていた。


877デフォルトの名無しさん:2010/12/06(月) 00:02:05
なん既出に気づいたのに書き込んじゃうかな
878デフォルトの名無しさん:2010/12/06(月) 00:07:50
>>866はどこが嘘?
879デフォルトの名無しさん:2010/12/06(月) 01:36:13
>874
関数内でそのまま並んでる場合ならコンパイラによってはフロー解析して静的に解決するかもしれない。
実際以下のコードで gcc 4.3.4 で -O2 だと直接 B::func() を呼ぶコードが生成されてた。-O なしだと vtbl 経由。

#include <iostream>
using namespace std;

struct A { virtual void func() { cout << "A::func()" << endl; } };

struct B : A { virtual void func() { cout << "B::func()" << endl; } };

int main(void)
{
  B b;
  A *pa = &b;
  pa->func();
  return 0;
}
880デフォルトの名無しさん:2010/12/06(月) 08:55:13
関数ポインタを引数にとる関数があって、その関数の引数に
クラスのメンバ関数を入れたいんですが、エラーが出ます
どうやって書けばいいんですか?
http://codepad.org/iLRdQRAY
881デフォルトの名無しさん:2010/12/06(月) 09:02:57
>>880
ttp://codepad.org/b4iGy7WE
たぶんこうしたいんだろうなぁ
882デフォルトの名無しさん:2010/12/06(月) 13:05:03
iterator traitsのdifference型が満たさなければいけない条件や操作を
全て教えてください。
それとtagを使って多重定義されている関数をコンパイル時に振り分けるとき
スタックにtagをつんだりして実行速度はおそくなりますか?
883デフォルトの名無しさん:2010/12/06(月) 13:12:26
stlのコンテナのイテレータがnext()とか実装されていないのは何故なんでしょうか?
884デフォルトの名無しさん:2010/12/06(月) 13:17:36
>>883
それはいったいなんの役に立つんだ?
885デフォルトの名無しさん:2010/12/06(月) 14:46:49
>>883
すでに ++ があるのになぜわざわざ別に next が必要なのか説明するべき
886デフォルトの名無しさん:2010/12/06(月) 14:49:07
>>884-885
あ、hasNext()みたいなやつです
887デフォルトの名無しさん:2010/12/06(月) 15:25:16
>>886
それはいったいなんの役に立つんだ?
end() と比較するだけでは不十分なのか?
888デフォルトの名無しさん:2010/12/06(月) 16:18:51
そろそろ>>882をよろしくお願いしますね☆
889デフォルトの名無しさん:2010/12/06(月) 16:32:14
実際にはスタックに積むことがあんまりないので
スタックに積んで遅くなることはあんまりない
890デフォルトの名無しさん:2010/12/06(月) 16:42:46
>>888
一つ目の質問。
iterator_traitsにdifferenceというネストされた型名はない。
したがって質問に応えることはできない。

ちなみに、よく似た名前の、difference_typeならある。
これは、signed integral typeと定められている。
したがって、unsignedな整数型はだめだし、浮動小数点数型はもってのほかだし、クラスはありえない。

二つ目の質問。
実装依存であるため、正解はない。
しかし、関数のインライン展開ができるほどのコンパイラなら、まず最適化で消えるだろう。
891デフォルトの名無しさん:2010/12/06(月) 16:43:44
もちろんスタック以外でもOKですよ。
上記の文は遅くなる原因なら何でもOKと言い換えられますよ
892デフォルトの名無しさん:2010/12/06(月) 16:44:55
difference_typeのことでした。
ありがとうございました。
893デフォルトの名無しさん:2010/12/06(月) 19:20:57
>>887
コンテナしらないオブジェクトが使うときあるじゃないですか
894デフォルトの名無しさん:2010/12/06(月) 19:28:02
char a[256]のポインタで
a=new char[10](これはエラーです)
みたいなことはできますか?
固定長の配列を動的確保したいのですが?
895デフォルトの名無しさん:2010/12/06(月) 19:36:24
イミフ
aをヒープ領域としてそっから10個分確保したいってこと?
896デフォルトの名無しさん:2010/12/06(月) 19:38:38
>>894
普通に
char *a;
a = new char[10];
とするのと何が違うのか説明したまえ
897デフォルトの名無しさん:2010/12/06(月) 20:24:20
>>894
二次元配列ということか?
898デフォルトの名無しさん:2010/12/06(月) 20:27:48
>>895-897 低脳過ぎるよ
確かに意味不明だが
ポンタaはchar配列長256のみ指す用にしたいってこと
a=new char[10]
この場合は、aは配列長10を指す用になるから、ダメポにしたいってことだろ
これぐらい分らないか...いまや日本はゆとりだらけだからな
899デフォルトの名無しさん:2010/12/06(月) 20:29:33
>>894
できない。new char[10]の型はchar *なので、配列要素数の情報を持っていない。
これで我慢しろ。
struct array100 { char data[100]; operator char*(){ return data; } };
array100 *pa = new array100;
(*pa)[0];
900デフォルトの名無しさん:2010/12/06(月) 20:44:15
typedef char char256[256];
char256 *a=new char256();
901デフォルトの名無しさん:2010/12/06(月) 20:47:44
>>898
お前が何を言っているのか理解できねーよw
902デフォルトの名無しさん:2010/12/06(月) 20:49:15
template<int n> struct array { char data[n]; operator char*(){ return data; } };
array<100> &a = *new array<100>;
a[0] = '\0';
delete &a;
903デフォルトの名無しさん:2010/12/06(月) 21:01:26
ありがとうございます。
904デフォルトの名無しさん:2010/12/07(火) 01:06:27
>>898
               ∩_
              〈〈〈 ヽ
      ____   〈⊃  }
     /⌒  ⌒\   |   |
   /( ●)  (●)\  !   !
  / :::::⌒(__人__)⌒:::::\|   l
  |     |r┬-|       |  / <こいつ最高にアホ
  \     ` ー'´     //
  / __        /
  (___)      /

905デフォルトの名無しさん:2010/12/07(火) 01:10:53
>>898
>これぐらい分らないか...いまや日本はゆとりだらけだからな
>これぐらい分らないか...いまや日本はゆとりだらけだからな
>これぐらい分らないか...いまや日本はゆとりだらけだからな

        / /      '" /    / ,,-、 /、ヽ\  ゙i;,-''"   / ./  /─''''" ̄ ,,/
        /  ./ /   ,,,-‐'"-/   / ./ ゙" "\  ゙i;,  | 、// /   "    ,,,/
       / ,-''/ /    ,,-''"_ /   //       ヽ  l /  レ'/~       /‐/
      / /  | l|  ,,-'"/゙/,」|    /    ..::;;;,,,  }  /   |~ ,,-‐,,,-'''  //~
     / /-'''''| | /l /‐'''/'' .人   i'    .:: :;'" / / l  ノ゙i// ,,-‐'"──==
     //'"   ゙i;: | /‐' ./,, ,,ノ ゙i;,.  |     _,,-ヾ.// ノ ,-''" l |  ‐'"   ,,,-‐二
     レ'     ヽl:i' ./  )'、‐,\゙i;: | ,,,-‐二-┬ナ" /‐'"‐ 〉 ,i'───'''" ̄~-''"
         ,-‐',ヽ|'"  ./゙ヽ-ゝ='\゙i,'''ヽ -゙=‐'   '" ,‐'ノ,, /‐''" ,,-‐'''"~
        / / ;;:.  ──ヽ, ゙i;'''''' , ゙ "-‐'''''"""    〔_,/ ゙ヽ'-'"~
       / /   / ,; ,,_}_  ゙、 ./__,,  _,,       /      \    
      ,;'  / ,;;;:;:/;: ,,   ~ ヽ ヽ.  ヽニ‐'、     / /       ゙i,_        おめぇ、ここ大丈夫か?
    ./        ''  ,l,,,,,,/ 〉  ゙ヽ、 ''''    ,,-''" /        ゙i.\
    /          / ヽ /     ゙ヽ、--イ~;;:'" //   ::;:;:;:   | \
   i          /  ̄ ゙̄"          |;:" //            ヽ-‐'''"~l|
  ./    ゙''''ヽ、,,-‐''"              .i /,;'"   _,,,,,,,,,_,,,-‐'''-''"~     |
906デフォルトの名無しさん:2010/12/07(火) 03:23:53
if( 904 == 905 )
907デフォルトの名無しさん:2010/12/07(火) 03:34:34
{
908デフォルトの名無しさん:2010/12/07(火) 06:32:00
puts("あんぱん\n");
909デフォルトの名無しさん:2010/12/07(火) 07:26:51
>>908
余計な改行するな。
910デフォルトの名無しさん:2010/12/07(火) 11:29:27
/*
>>909
コメント行にしとけ
コンパイルエラーがでる
*/
911デフォルトの名無しさん:2010/12/07(火) 11:54:25
throw;
912デフォルトの名無しさん:2010/12/07(火) 14:19:50
#if 0
これが便利だ。ぼけども。
#endif
913デフォルトの名無しさん:2010/12/07(火) 14:36:01
int count[152];
for ( int i = 0; i <= 151; i++ ) {
count[i] = 0;}
if (a.jikan[ 1 ].kei >= 420 && a.jikan[ 1 ].kei < 480) {
count[4] += 1;}
cout << count[4] << endl;
一部抜粋しましたが、コマンドプロンプトでは
0
0
0
0
と続いてしまいます。
1
2
3
4
このように1づつ増やしたいのですが、間違っている箇所を教えていただきたいです。
914デフォルトの名無しさん:2010/12/07(火) 14:40:49
削りすぎだろおいwww
915デフォルトの名無しさん:2010/12/07(火) 14:41:50
>if (a.jikan[ 1 ].kei >= 420 && a.jikan[ 1 ].kei < 480) {
>count[4] += 1;}
ここ通らないから+1されないんだろ
916デフォルトの名無しさん:2010/12/07(火) 15:16:32
915の方ありがとうございます。
こちらはCSVから条件の値をとっているのですが、
a.jikan[ 1 ].keiの値をコマンドプロンプトで取り出すと全てマイナスでした。
しかし、CSVを見てみるとその値にはマイナスでなく、
a.jikan[ 1 ].kei >= 420 && a.jikan[ 1 ].kei < 480の条件に合った値が載っています。
何故だかわかる方はいらっしゃいますか?
917デフォルトの名無しさん:2010/12/07(火) 15:17:53
エスパーの登場を待て。
918デフォルトの名無しさん:2010/12/07(火) 15:26:26
一部抜粋には条件のところにしか kei 登場してないもんな
俺らには見えないCSVから値をとる処理とやらが間違ってるんだろうと推測するしかない
919デフォルトの名無しさん:2010/12/07(火) 15:28:44
回答してくださった方々ありがとうございます。
私自身も省略が多い等失礼な事をしました。

みなさんからの助言を下に改めて確認してみたいと思います。
本当にありがとうございました。
920デフォルトの名無しさん:2010/12/07(火) 17:59:22
ファイルの一部分を一つのファイルとして開くことってできますか?
例えば四ギガのファイルを開く→二ギガ目に移動→現在の位置をゼロ点にして二ギガのファイルとして開き直す(この時点でtellするとゼロ、終端位置でtellすると二ギガが返る)
世の中そんなに甘くないですかね?
921デフォルトの名無しさん:2010/12/07(火) 18:02:35
その様に動くファイルアクセスクラスでラップする。
922デフォルトの名無しさん:2010/12/07(火) 18:04:59
特殊な要求は自分で書くしかないね
「開き直す」にどんな意味があるのかよくわからないけど
923デフォルトの名無しさん:2010/12/07(火) 18:09:46
バイナリデータをwchat_tのワイド文字列データーに変換や復号する
アルゴリズムみたいなのが、何処かにありませんか?
バイト文字では有るのですが、それをワイド文字に適用しても2バイトになってしまうので><
924デフォルトの名無しさん:2010/12/07(火) 18:45:56
エスパーするとreinterpret_castすればいいだけ
925デフォルトの名無しさん:2010/12/07(火) 18:50:14
>>921-922
コードはどんな感じになりますか?
926デフォルトの名無しさん:2010/12/07(火) 18:59:08
いやお前が考えるんだよ
927デフォルトの名無しさん:2010/12/07(火) 19:11:02
#include<stdio.h>
#include<limits.h> /* Maximum Definitions */
int main (void)
{
int a,b,c,d,e,f,g,h,i,j;
/* printf("Maximum of int+1:%d\n", INT_MAX+1); /* */
/* printf("Minimum of int-1:%d\n", INT_MIN-1); /* */
/* printf("Maximum of long+1:%ld\n", LONG_MAX+1); /* */
/* printf("Minimum of long-1:%d\n", LONG_MIN-1); /* */
a=INT_MAX;
b=a+1
/* prinf("a=%d, a+1=%d\n,a,b); /* Hint */;
a=2000000004;
b=a/20;
printf("Nov 24 2010: a=%d,b=%d YEN\n",a,b);/* 2010*/
printf("Nov 24 2011:%d YEN\n",a+b);/* 2011*/
c=a+b ;
d=c/20;
printf("Nov 24 2012:%d YEN\n",c+d);/* 2012*/
e=c+d ;
f=e/20;
printf("Nov 24 2013:%d YEN\n",e+f);/* 2013*/
g=e+f ;
h=g/20;
printf("Nov 24 2014:%d YEN\n",g+h);/* 2014*/
i=g+h ;
j=i/20;
printf("Nov 24 2015:%d YEN\n",i+j);/* 2015*/
return 0;
}
これをすると正しい値が出ません。どこが間違っているか分かりませんか?
928デフォルトの名無しさん:2010/12/07(火) 19:14:46
/*/

これマジでやってた奴が元同僚にいる
今思い出しても吐き気がする
929デフォルトの名無しさん:2010/12/07(火) 19:17:26
せやなwwww
930デフォルトの名無しさん:2010/12/07(火) 20:10:37
>>927
回答不能です。
「これ」をするとどんな値が出ますか?
「正しい値」とは何ですか?
931デフォルトの名無しさん:2010/12/07(火) 20:13:43
っていうか、それCのプログラムちゃうんか^^
932デフォルトの名無しさん:2010/12/07(火) 20:31:51
>>923
setlocale(LC_CTYPE, "");
char bin_data[] = "\x83\x7D\x83\x93\x83\x52";
wchar_t a[100];
mbstowcs(a, bin_data, sizeof a / sizeof *a);
wprintf(L">%s<\n", a);
933デフォルトの名無しさん:2010/12/07(火) 20:36:20
>>927
> a=INT_MAX;
> b=a+1
この時点で何が起こるかわからない。
934デフォルトの名無しさん:2010/12/07(火) 20:51:02
>>932
いえ、そのー説明が不備で申し訳ありません。
例えば
0x00ff00ff のようなバイナリーデータが有ったとき。
文字コードに変換し−>”ASASDFDFASASDFDF”(内容は適当)保存して。
復号化は
”ASASDFDFASASDFDF” -> 0x00ff00ff にしてバイナリーにして使用する。
昔で言うishだったかなー、これのワイド文字コード版です。
935デフォルトの名無しさん:2010/12/07(火) 21:00:18
936デフォルトの名無しさん:2010/12/07(火) 21:04:54
なんという宿題マルチ丸投げ
937934:2010/12/07(火) 21:09:31
今のところ、下のような変換テーブル作るしか思いつかなかった…

L"一丁七万丈三上下不与丐丑且丕世丗丘丙丞両並个中丱串丸丹主丼丿乂乃", // 4E00
L"久之乍乎乏乕乖乗乘乙九乞也乢乱乳乾亀亂亅了予争亊事二于云互五井亘", // 4E45
L"亙些亜亞亟亠亡亢交亥亦亨享京亭亮亰亳亶人什仁仂仄仆仇今介仍从仏仔", // 4E99
L"仕他仗付仙仞仟代令以仭仮仰仲件价任企伉伊伍伎伏伐休会伜伝伯估伴伶", // 4ED5
938デフォルトの名無しさん:2010/12/07(火) 21:13:50
Base64?
939934:2010/12/07(火) 21:17:51
Base64はbyte文字コード用なので、それのwchar_t用が無いかなと。
940デフォルトの名無しさん:2010/12/07(火) 21:23:26
一般的なものは無いでしょ
ASCIIみたいにどこでも転送・表示可能な文字に変換するから存在意義があるわけで
941932:2010/12/07(火) 21:27:07
>>934
UTF-16で使っちゃいけなさそうなのは(0000, D800〜DFFFF,FFFE, FFFF)ぐらいで、
殆ど全部のコードが使えるわけだから、効率的なアルゴリズムはないんじゃない?
942934:2010/12/07(火) 21:34:58
>>941
そう思って、簡単な変換作ってprintしたら−>??????????享??????????
になってしまって、対応する漢字がないと印刷できなかった…
やっぱり、テーブル索引しかないかな〜
943デフォルトの名無しさん:2010/12/07(火) 21:45:15
>>942
はぁ? 日本語環境で印刷できる文字だけにしたいなら
ishで漢字にしたのをwchar_tに変換すりゃいいだけでしょ。
wchar_tとか関係ないんじゃ。
944934:2010/12/07(火) 22:09:16
>>943
まあその ishで漢字コミで変換しても↓
!!CK!:9Q!5"XRo),Sa5h/")H^2h|!&"H!W'\\[!!!!MSzQ}s*j!!!!!!!!!!!!!!!!!!!!!!!!m082
!!CK!:9Q!5"XRo),Sa5h/")H^2h|!&"H!W'\\[!!!!MSzQ}s*j!!!!!!!!!!!!!!!!!!!!!!!!m082
!!CK!:9Q!5"XRo),Sa5h/")H^2h|!&"H!W'\\[!!!!MSzQ}s*j!!!!!!!!!!!!!!!!!!!!!!!!m082
%肄捐A=クUメ゙O訶w,ロ戝扼KコEEv娉v_ム嗣ハ」ヨ+ェイククxLP虔4,ムハス憩KチEEvシP5_モ嗣ハ」ヨ/BUEUv嚆aZ
&肄」絎lキホvレO訥ッ吾贊ミル@脚ーH儺肪薇Y肄ゥ暸=クUvレO訶w,ロ戝扼KコEEvワQv_ム.fハ」ヨ+ェイククxL0瓩
'ユラ掫オクDl梳ョqh・(ャユラゥqラャrmJkP6b1L2肄ッXMlキホH?O蘢ッ吾贊ミル@脚ーH儺肪薇Y肄エヘA=クUvレwkA
)ハ」ヨ/BUEUv坩qh・(ュハォゥqラフZノxmTUf銑;ユラ掫オクDl梳ョqh・(ョユラゥqラフrmJkP6b1L2肄コ/Mlキホメ゙bレコ

の物を、wchar_tにしたら、約倍に増えるわけで…
945デフォルトの名無しさん:2010/12/07(火) 22:16:38
プログラマのための文字コード技術入門(技術評論社)をちょうど今読んでるところだから、読み終わったら回答するよ!
946デフォルトの名無しさん:2010/12/07(火) 22:38:16
好きにマッピングしたらいいがな
端末によっては表示不可とか、サイトによっては投稿不可とか、かなり環境選ぶと思うが
947デフォルトの名無しさん:2010/12/07(火) 22:41:35
まずはwchar_t忘れて2バイトを考えろ。
http://www.unicode.org/Public/MAPPINGS/VENDORS/MICSFT/WINDOWS/CP932.TXT
これを見ると、2バイトの内 印刷可能なのは全角が7224文字、半角+半角が189*189=35721
で合計42945のコードポイントが使える。
だから14バイトバイナリ(63356*7=458752)を22バイト(63356*11=472395)にマッピング
してやると効率がいい。あとはマッピングテーブルなんてプログラムで生成すればいい。
948デフォルトの名無しさん:2010/12/07(火) 22:49:18
それって結局ishになるんじゃね
949デフォルトの名無しさん:2010/12/07(火) 22:52:12
enum {test1, test2}みたいな感じで、enumを使っていました
enumの名前が書かれていなかったのですが、何の意味があるのですか?
950デフォルトの名無しさん:2010/12/07(火) 22:56:03
意味がないから書いてないんじゃね
951デフォルトの名無しさん:2010/12/07(火) 22:56:10
>>949
定数を書く時に#defineが嫌いだったに違いない。使う時はint型として使うしかない
952デフォルトの名無しさん:2010/12/07(火) 22:58:14
>>951
thx
953デフォルトの名無しさん:2010/12/07(火) 22:58:47
名前をつけるとそれは型名として使える^^
enum E { yes, no };
bool f( E e ) {
return e != no;
}

Javaなどの場合はさらに名前空間に入ってくれて便利なんだけど
C++にはないんだよねー。
954デフォルトの名無しさん:2010/12/07(火) 23:10:58
>>953
C++でもenumは名前空間に入るだろ。
E::yesみたいに使いたいと言ってるならC++0xを待つしかないな。
955デフォルトの名無しさん:2010/12/07(火) 23:14:30
0x、早くこい!
956デフォルトの名無しさん:2010/12/07(火) 23:20:05
Javaなんて標準ライブラリがfinal intまみれで意味的な分類をしてないゴミだろ。
比較するなら.NET Frameworkの方がいい
957デフォルトの名無しさん:2010/12/07(火) 23:25:15
同意
明らかにCにも劣る糞仕様なのに、ライブラリ作るときに
どうして世に出す前に言語の方を何とかしようという声が挙がらなかったのか不思議でならない
958デフォルトの名無しさん:2010/12/07(火) 23:32:20
メンバへのポインタ、classX::*memberXになぜしたの?
*classX::memberXにしない理由はナニ?
ついでに、
アドレスを取得するのにclassX::&memberXじゃなく
&classX::memberXする理由はナニ?
959デフォルトの名無しさん:2010/12/07(火) 23:58:04
>*classX::memberXにしない理由はナニ?

struct classX { static int* memberX; };
int *classX::memberX;

があるから
960デフォルトの名無しさん:2010/12/08(水) 01:24:43
質問です。

入力された数字が整数か実数で条件分岐したいと思っています。

double d;
cin >> d;
int i=(int)d;
double EPS=0.001;
if( abs(i-d)<EPS ){
 //i を使用して処理
} else {
 //d を使用して処理
}

cinから整数値を入力した場合
『double型に格納された整数は内部で正しく表現されないため、
これをint型にキャストすると、値が入力値より誤って1減るに違いない』
と推測していたのですが、i には入力値が1減らずに入りました。

入力値は1~9999までの整数値を試しましたが、どれも入力値と同じ値が i に格納されました。
推測が外れて不気味です。
なぜ入力値と同じ値が i に格納されるのか、教えていただけませんか?
961デフォルトの名無しさん:2010/12/08(水) 01:55:33
>>960
× double型に格納された整数は内部で正しく表現されない
○ double型に格納された整数は内部で正しく表現されないことがある
ってことかと。
962デフォルトの名無しさん:2010/12/08(水) 01:59:22
i-dってやってる時点で、(double)i - dみたいなコードになるような気がする
というか、目的を達成するなら、文字列で受け取ってから整数かどうかを判定するほうがいいと思う
963デフォルトの名無しさん:2010/12/08(水) 02:02:41
つか
浮動小数の仕組みから考えて
小数点以下の無い整数は誤差なく表現できるだろう?
1.1とかは無理だけど
964デフォルトの名無しさん:2010/12/08(水) 02:14:30
有効桁数を超えたら誤差が出るけど4桁程度じゃな
965デフォルトの名無しさん:2010/12/08(水) 03:03:16
C#のoutの部分,C++/CLIではどう書くのでしょうか?

int sinkCookie;
connectionPoint.Advise( sink, out sinkCookie );
966デフォルトの名無しさん:2010/12/08(水) 08:49:41
引数の宣言は[System::Runtime::InteropServices::OutAttribute] int% sinkCookie
使うときは何もいらない。普通に変数を指定すれば勝手に参照渡しになる。
ソース見ただけじゃ変数の値が変更される可能性があるかどうかわからないので可読性が下がる。
967960:2010/12/08(水) 11:00:04
IEEE754をよく見返してみました。
これ、固定小数点として整数部と小数部をそれぞれ2進変換した後
2進浮動小数点表現にするんですね。
だから整数をそのまま格納するときは誤差が出ない。
10進浮動小数点に変換してから2進変換すると誤解してました。

文字列で受けて判定すれば、doubleの内部表現を気にせず意図通りに動きそうですね。
可読性考えながら両方試してみます。
ありがとうございました。
968デフォルトの名無しさん:2010/12/08(水) 11:08:15
>>966
[System::Runtime::InteropServices::OutAttribute] int% sinkCookie;
connectionPoint->Advise( sink, sinkCookie );

でよろしいでしょうか?さっそくやてみます
969デフォルトの名無しさん:2010/12/08(水) 13:51:08
メモリリークとかメモリ破壊を検出するフリーのツールでいいのないすか
970デフォルトの名無しさん:2010/12/08(水) 14:07:06
まずどのコンパイラを使ってるんだ
971デフォルトの名無しさん:2010/12/08(水) 14:31:17
VC++
972デフォルトの名無しさん:2010/12/08(水) 14:35:23
_CrtSetDbgFlag
973デフォルトの名無しさん:2010/12/08(水) 14:44:38
>>972
これって100%信用していいの?
974デフォルトの名無しさん:2010/12/08(水) 14:48:41
>>973 100% なんて言ったら、そりゃダメに決まってんだろ。
975デフォルトの名無しさん:2010/12/08(水) 15:28:01
>>973
人が作った物使う限り100%なんて無いと思うけど。
976デフォルトの名無しさん:2010/12/08(水) 15:28:36
ソースをいじるタイプじゃなくて実行ファイルを設定して起動したら自動でレポートが出力されるような簡単なタイプの奴がいいんだけど
977デフォルトの名無しさん:2010/12/08(水) 15:40:23
いちいち条件後出しすんなよ馬鹿
978デフォルトの名無しさん:2010/12/08(水) 16:07:11
>>977
うるせーよ
979デフォルトの名無しさん:2010/12/08(水) 16:26:39
ごめんなさい許してくださいすいませんでした
980デフォルトの名無しさん:2010/12/08(水) 17:23:59
まずは100%信頼される書き込みを目指せ
981デフォルトの名無しさん:2010/12/08(水) 18:59:46
ごめんなさい許してください.すいませんでした
>>980、下が目指した書き込みです

すいません、VC++でメモリリークとかメモリ破壊を検出するフリーのツールでいいのないすか
ソースをいじるタイプじゃなくて実行ファイルを設定して起動したら
自動でレポートが出力されるような簡単なタイプの奴がいいんだけど
982デフォルトの名無しさん:2010/12/08(水) 19:08:42
そんなツールねーよ
983デフォルトの名無しさん:2010/12/08(水) 20:07:03
VC++++++++++++++++++++++++++はもともとデバッグビルド時にはメモリリーク表示されるし
AfxSetAllocStop関数とかスナップショットとか使えば任意に調べられるじゃないか^^
984デフォルトの名無しさん:2010/12/08(水) 20:16:21
引数で、ある二つのインターフェースを持ってるものを指定する書き方はありますか?

イメージ的にはfunc(<IA && IB> i)みたいな感じで
985デフォルトの名無しさん:2010/12/08(水) 20:21:49
ない
986デフォルトの名無しさん:2010/12/08(水) 20:23:05
C++ってjavaのthrowsみたいなのありますか?
987デフォルトの名無しさん:2010/12/08(水) 20:45:01
ggr C++ "例外指定"
988デフォルトの名無しさん:2010/12/08(水) 20:55:43
struct IC : IA, IB {};
func( IC& i )
で駄目なん?
989デフォルトの名無しさん:2010/12/08(水) 21:05:06
いろいろな組み合わせに対応できないじゃない
言語レベルの穴だったようだな
990デフォルトの名無しさん:2010/12/08(水) 21:11:20
このスレ住人は言語仕様にはうるさいがバグ解析は不得意みたいだな。メモリ破壊ならappverifier だろ。ダンプ読めないと辛いと思うが、ゆとりはダンプ読めないからなあ。ページヒープでググれ。
991デフォルトの名無しさん:2010/12/08(水) 21:29:30
>>989
enable_if
992デフォルトの名無しさん:2010/12/08(水) 22:13:01
マルチディスパッチもしらんのか
993デフォルトの名無しさん:2010/12/08(水) 23:08:28
>>990
>バグ解析は不得意
だってこのスレ住人はバグなんて恥ずかしいことしないから、解析なんてしたことがないんですよ
ですよね、みなさん
994デフォルトの名無しさん:2010/12/08(水) 23:21:53
たしかに、ミスするやつはバカというやつが多いな。
熟練者ほどミスしない様な、ある意味助長な記述をするが。
ここの連中に言わせると、無駄でバカだそうだ。
↓そらこいw
995デフォルトの名無しさん:2010/12/08(水) 23:24:37
│     _、_
│   ヽ( ,_ノ`)ノ 残念、それは私のおいなりさんだ
│  へノ   /
└→  ω  へノ
996デフォルトの名無しさん:2010/12/09(木) 00:30:09
ワラタ
997デフォルトの名無しさん:2010/12/09(木) 00:34:19
冗長を助長とか書くのは確かに馬鹿だな
998デフォルトの名無しさん:2010/12/09(木) 00:40:06
999デフォルトの名無しさん:2010/12/09(木) 00:42:13
冗長って難しい言葉使わないでよ
1000デフォルトの名無しさん:2010/12/09(木) 01:01:10
>>998
嘘つくなよw
10011001
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。