トップページ⇒tech
1001コメント287KB

C++相談室 part86

レス数が1000を超えています。これ以上書き込みはできません。
0001v(^・^)v2010/11/06(土) 02:03:15
C++に関する質問やら話題やらはこちらへどうぞ。
ただし質問の前にはFAQに一通り目を通してください。
IDE (VC++など)などの使い方の質問はその開発環境のスレに
お願いします。

前スレ
C++相談室 part85
http://hibari.2ch.net/test/read.cgi/tech/1286623355/
0002v(^・^)v2010/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)に対応。
0003v(^・^)v2010/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
0004v(^・^)v2010/11/06(土) 02:10:41
■Books■
amazon C,C++関連書籍
 http://www.amazon.com/exec/obidos/tg/browse/-/3956/ref=br_bx_c_1_3/
 http://www.amazon.co.jp/b/?node=754384

The C++ Programming Language
 http://www.amazon.com/exec/obidos/ASIN/0201700735/
 http://www.amazon.co.jp/exec/obidos/ASIN/475611895X/ (翻訳)
C++ Primer (3rd Edition)
 http://www.amazon.com/exec/obidos/ASIN/0201824701/
 http://www.amazon.co.jp/exec/obidos/ASIN/4756140068/ (翻訳)
The C++ Standard Library
 http://www.amazon.com/exec/obidos/ASIN/0201379260/
 http://www.amazon.co.jp/exec/obidos/ASIN/4756137156/ (翻訳)
Effective C++
 http://www.amazon.com/exec/obidos/ASIN/0201924889/
 http://www.amazon.co.jp/exec/obidos/ASIN/4756118089/ (翻訳)
More Effective C++
 http://www.amazon.com/exec/obidos/ASIN/020163371X/
 http://www.amazon.co.jp/exec/obidos/ASIN/4756118534/ (翻訳)
Exceptional C++
 http://www.amazon.com/exec/obidos/ASIN/0201615622/
 http://www.amazon.co.jp/exec/obidos/ASIN/4894712709/ (翻訳)
More Exceptional C++
 http://www.amazon.com/exec/obidos/ASIN/020170434X/
Exceptional C++ Style
 http://www.amazon.com/exec/obidos/ASIN/0201760428/
0005v(^・^)v2010/11/06(土) 02:13:26
■Books(Templateまわり)■
Effective STL
 http://www.amazon.com/exec/obidos/ASIN/0201749629/
 http://www.amazon.co.jp/exec/obidos/ASIN/4894714108/ (翻訳)
Modern C++ Design
 http://www.amazon.com/exec/obidos/ASIN/0201704315/
 http://www.amazon.co.jp/exec/obidos/ASIN/4894714353/ (翻訳)
C++ Templates
 http://www.amazon.com/exec/obidos/ASIN/0201734842/
C++ Template Metaprogramming
 http://www.amazon.com/exec/obidos/ASIN/0321227255/
0006v(^・^)v2010/11/06(土) 02:17:42
■長いソースを貼るときはここへ。■
 http://codepad.org/
 http://ideone.com/
0007v(^・^)v2010/11/06(土) 02:19:57
STLつかうと一気に実行ファイルサイズが10倍に?!

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

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

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

#include <stdafx.h>
後死ね。

言葉が悪いな。それで教えているつもりか。
まぁヒントぐらいにはなったな。
うむごくろう。
0008デフォルトの名無しさん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/ (翻訳)

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

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

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

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

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

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

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

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

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

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

自分の親のすねはかじれるが
他人の親のすねはかじれない
ただし、友達にたかることはできる
0014デフォルトの名無しさん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を引数に
取るためエラーになる
0015デフォルトの名無しさん2010/11/06(土) 02:49:00
早い話が

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

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

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

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

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


0022デフォルトの名無しさん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 を使う初心者が後を絶たないのか。
0023デフォルトの名無しさん2010/11/06(土) 03:20:18
Applicationのポインタもしくはリファレンスもしくはオブジェクト
を介してしかいじれなく制限されている

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

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

class Basic {
friend class Application ;
protected:
int value;
public:
void Change(Basic& other);
};
0025デフォルトの名無しさん2010/11/06(土) 03:25:56
>>24
そうします。
回答ありがとうございました。
0026デフォルトの名無しさん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メンバ変数をいじる
には自分自身の中でやるしかないわけだ
0027デフォルトの名無しさん2010/11/06(土) 03:30:06
>>24
そやね
手持ちの詳説C++にもfriendクラスとして派生クラスを宣言する事を推奨している
0028デフォルトの名無しさん2010/11/06(土) 03:45:20
>>24-25,27
基底クラスが派生クラスのことを知っている上に friend とか、
protected を使うためにどんだけ犠牲にする気だ。

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

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

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

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

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

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

というか可変長引数は型安全性がダメすぎる
0048デフォルトの名無しさん2010/11/07(日) 13:11:21
~はXORか
じゃあ~double() とかはどうなるんだろう
0049デフォルトの名無しさん2010/11/07(日) 13:11:51
試せよ
0050デフォルトの名無しさん2010/11/07(日) 13:14:39
XORではなくてNEG、そしてdoubleへの~演算子の適用は出来ない
0051デフォルトの名無しさん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です。
0052デフォルトの名無しさん2010/11/07(日) 13:51:36
>>50
ネゲート命令のことならそれは単項マイナス
ハードでいうアサートの反対じゃねえぜ

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

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

void foo(bar* param) {
  param->method();
0059582010/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);

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

myclass obj;

cout << obj;
msgbox << obj;

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

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

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

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

こうなら問題ないのにな
int* p = new int(( 0, 1, 2, 3, 4, 5, 6 ));
0081デフォルトの名無しさん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
0082デフォルトの名無しさん2010/11/07(日) 22:50:34
>>81
>構文解析の時に)に一番近い6しか選択されないようになってるだけでしょ
それはバグじゃね?普通にクラスだとそんな動作しないぞ
0083デフォルトの名無しさん2010/11/07(日) 22:57:01
VC2008EEでも問題なし
0084デフォルトの名無しさん2010/11/07(日) 22:59:49
バグだな
こういう致命的なバグを持っているとBoostで通らない場合が出て来たりして
都合が悪い
MSに報告しとくか
0085デフォルトの名無しさん2010/11/07(日) 23:11:32
まて規格を見るのが先だ、いやそれよりも腹がへった飯が先だ
0086デフォルトの名無しさん2010/11/07(日) 23:21:07
バグ報告して規格通りだったら恥ずかしいw
0087デフォルトの名無しさん2010/11/07(日) 23:47:28
intのときだけカンマ演算子になるのが規格どおりだとしたら、それによる何らかのメリットがあるはずだ

なんだ?
0088デフォルトの名無しさん2010/11/07(日) 23:52:52
だけ、じゃない
0089デフォルトの名無しさん2010/11/08(月) 00:29:18
>>86
gccよりVSが規格に近かったって聞いた試しがないけど・・・
0090デフォルトの名無しさん2010/11/08(月) 00:31:21
C++/CLIの規格なんじゃないの?
0091デフォルトの名無しさん2010/11/08(月) 00:38:00
いやC++で通っちまうんだよコンパイルが
0092デフォルトの名無しさん2010/11/08(月) 00:49:14
new-initializerからprimary-expressionまで辿ったけどカンマは出てこないな
間違いでいいんじゃないか
0093デフォルトの名無しさん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のどれが駄目な処理で、どれが問題無い処理なのか
0094デフォルトの名無しさん2010/11/08(月) 07:45:39
>>93
自分をdeleteするのは構わないが
その時点で開放されてるので
以後仮想メンバ関数や非staticメンバ変数へのアクセスはしていけない
1,2,3は全部ダメな可能性があるし大丈夫かもしれない
0095デフォルトの名無しさん2010/11/08(月) 07:54:32
クラス内関数ってのが引っかかるな
static もクラス内ではあるわけで

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

0102デフォルトの名無しさん2010/11/08(月) 13:53:53
delete this;を書かなければ民がどうなっても知らんぞ
民のためぇ…これは民のためなんだからぁ〜ん…カタカタ
0103デフォルトの名無しさん2010/11/08(月) 13:56:36
MFC使うと強制的に書く羽目になった気がする
0104デフォルトの名無しさん2010/11/08(月) 15:50:46
STLのvectorをXcodeで使用したいのですがエラーが出ます...
解決法ってありますか?
0105sage2010/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:」

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

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

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

でも普通はgetterとsetterを使う。
0117デフォルトの名無しさん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);
}
}

どこかおかしい点があれば指摘してくれませんか?
0118デフォルトの名無しさん2010/11/08(月) 21:06:33
scanfは悪魔にとりつかれておる
悪いことは言わん。素人のみでそれを使うのはやめなされ…
0119デフォルトの名無しさん2010/11/08(月) 21:07:12
scanfは悪魔にとりつかれておる
悪いことは言わん。素人のみでそれを使うのはやめなされ…
0120デフォルトの名無しさん2010/11/08(月) 21:10:11
for(i=1; i<=x; i++){
printf("x = %d", i);
}
0121デフォルトの名無しさん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;
}
0122デフォルトの名無しさん2010/11/08(月) 21:19:11
>>117
xをせっかく0で初期化してんのにscanfでxに値代入してるじゃん。
0123デフォルトの名無しさん2010/11/08(月) 21:22:40
>>122
できれば値はxとiのみで書きたいのですが
どこを直せばいいでしょうか?
0124デフォルトの名無しさん2010/11/08(月) 21:24:06
>>123
>>120
0125デフォルトの名無しさん2010/11/08(月) 21:24:55
>>116
ありがとうございます。
コンパイラ依存は面倒ですね・・・

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

>>127
int型1つで十分だお
0130デフォルトの名無しさん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;
}
0131デフォルトの名無しさん2010/11/08(月) 21:58:23
>>129は凄いけどソースが汚いしダメだな。
0132デフォルトの名無しさん2010/11/08(月) 22:00:22
>>130
きれいにまとまってるな
どうしてfor文のiに--がつくんだろう
0133デフォルトの名無しさん2010/11/08(月) 22:02:54
変数iに入力した値をデクリメントで0になるまでxに足していくだけ
0134デフォルトの名無しさん2010/11/08(月) 22:07:10
環境依存すれってどこいっちゃったんだ・・・
0135デフォルトの名無しさん2010/11/08(月) 22:48:41
xml関係の処理をするために、sax関係のクラスを継承しています
gccが使っていない変数(パラーメータ)があるよと警告してきますが、
どのようにすれば黙らせることができるのでしょうか?
0136デフォルトの名無しさん2010/11/08(月) 23:05:09
man gcc
0137質問です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;
}

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

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

>>138
なるほどその手もありますね。
0140デフォルトの名無しさん2010/11/08(月) 23:27:40
エラーが出るようなものはgetterにしない
0141デフォルトの名無しさん2010/11/08(月) 23:44:27
検索、追加とか
0142デフォルトの名無しさん2010/11/08(月) 23:51:14
というかgetterとか関係なくね?
例外かエラーコードかどっちなの?ってだけでしょ
0143デフォルトの名無しさん2010/11/08(月) 23:54:32
>引数で得たポインタに値を代入し
おいおいどこがポインタだよ
0144デフォルトの名無しさん2010/11/09(火) 00:00:16
エラーが出るような処理をするならその処理の名前を付けて
他の関数でのエラー通知法とあわせるって話じゃないの
0145デフォルトの名無しさん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の要素のアドレスを保管する変数を定義したいのですが、
うまい方法無いでしょうか?
0146デフォルトの名無しさん2010/11/09(火) 01:56:03
p* nearest;
0147デフォルトの名無しさん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>で覚えておくことも出来る。
0148デフォルトの名無しさん2010/11/09(火) 02:01:51
リロードしてなかったorz
0149デフォルトの名無しさん2010/11/09(火) 06:53:34
>>134
2-3週間ぐらい前に落ちてそれっきり。
0150デフォルトの名無しさん2010/11/09(火) 15:46:22
>>146-147
ありがとう。p*をclassのなかに追加することにしました。

bにもp*を持つことになるけど、bは次のcについて最も近い点(Xc,YcZc)の情報を保持
するのに使うので無駄にはならないかなぁと。
0151デフォルトの名無しさん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;
}
}
}
0152デフォルトの名無しさん2010/11/09(火) 18:45:56
c の初期値がない
0153デフォルトの名無しさん2010/11/09(火) 19:15:24
釣りじゃないか?
0154デフォルトの名無しさん2010/11/09(火) 19:44:59
まずベクトルクラスを作るんだ
0155デフォルトの名無しさん2010/11/09(火) 19:46:54
そして次にPCの電源を切ります
0156デフォルトの名無しさん2010/11/09(火) 20:04:18
物でベクトル作ってみろや!!
0157デフォルトの名無しさん2010/11/09(火) 20:35:53
using namespace std;があまり良くないってホントですか?
0158デフォルトの名無しさん2010/11/09(火) 20:38:02
>>157
うっかり min や max をつぶしてしまったことがありました。
0159デフォルトの名無しさん2010/11/09(火) 20:41:22
>>158
kwsk
0160デフォルトの名無しさん2010/11/09(火) 20:59:16
>>157
stdはものすごい広いので、把握できないほど大量の物が定義されており
うっかり被って怒られることがあるのでやめたほうがいい
特にグローバル領域でやるのは
0161デフォルトの名無しさん2010/11/09(火) 21:02:52
個人レベルで作るくらいならたいした問題じゃないと思うけど
たとえばboostライブラリを使ってて、stdとboostで同じ名前のクラスが定義されてたりするとコンパイル通らない

using std::cout;

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

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

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

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

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

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

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

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

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




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

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

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

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

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

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

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

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

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

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

http://jp.rubyist.net/magazine/?0018-Legwork
0249デフォルトの名無しさん2010/11/15(月) 00:52:02
>>245
逆だろ
C++キャスト"に"、だよ
0250デフォルトの名無しさん2010/11/15(月) 01:03:28
>>246 >>248
いや単純に疑問でさ…ごめんよ。そういうトリヴィアルな所が気になっちゃうんだ。
0251デフォルトの名無しさん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したいのです。
私の頭は大丈夫でしょうか。
0252デフォルトの名無しさん2010/11/15(月) 01:43:36
>>238
非ダックタイピングてのはduckはwalkとquackのメソッドを持つと予め宣言する必要があるものをいう。
C++ではコンセプトだな。流れたが。
0253デフォルトの名無しさん2010/11/15(月) 01:44:57
>>251
TCHARってのは
ユニコード環境でもマルチバイト環境でも使えるようにっていうWindows定義の型
VSならプロジェクトの構成プロパティに
文字セットをどちらにするかの設定がある

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

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

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

ただし std::vector か std::string の使用を強くお勧めするよ。
0255デフォルトの名無しさん2010/11/15(月) 01:48:24
TCHARなんて忘れたほうがいいよ
Win95/98/Meなんて誰も使ってないんだから
0256デフォルトの名無しさん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 )
とします
0257デフォルトの名無しさん2010/11/15(月) 01:55:01
>>253
>>254
大変心強いお言葉をいただきありがとうございます。
とりあえずやってみてダメなところが見つかったら
試行錯誤してみます。

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

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

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

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

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

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

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

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


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

よって追加する必要なし
0277デフォルトの名無しさん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種類です。
0278デフォルトの名無しさん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は定義済みとしてエラーになってしまいます。
0279デフォルトの名無しさん2010/11/15(月) 15:35:21
最初の方を宣言のみにしとけばいいだけじゃないのか
0280デフォルトの名無しさん2010/11/15(月) 15:37:26
>>279 それ、現行の標準には含まれてない。拡張で受け付けるコンパイラもあるけど。
0281デフォルトの名無しさん2010/11/15(月) 15:40:16
>>280
そうなんだ
ごめんね
0282デフォルトの名無しさん2010/11/15(月) 15:44:08
enum fuckってやつか
0283デフォルトの名無しさん2010/11/15(月) 15:46:01
>>279-281
ありがとうございました。
少なくともVS2010では
extern enum HogeA;
(略)
enum HogeA
{
foo = 0
};

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

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

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

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

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

C++ の throw が Python の raise より遅いという計測結果が出ています。
同等の機能かと思うのですが、これは何の違いに起因しているのでしょうか?
0313デフォルトの名無しさん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) になっちまうぜお。
0314デフォルトの名無しさん2010/11/17(水) 10:07:29
gaslighting
0315デフォルトの名無しさん2010/11/17(水) 10:27:18
>>312
実装の違いですね
0316デフォルトの名無しさん2010/11/17(水) 18:33:30
>>312
バカ?
0317デフォルトの名無しさん2010/11/17(水) 23:49:26
あの、今までVC++2008EEを使ってたのですが
この前VisualStudio2010プロの何ヶ月かのお試し版を入れて、期限が切れて、消したのですが
何かの拍子にVisualStudio系のファイルを開いたら、今までは2010で開かれて、「期限が切れてます、アップグレードしてください」
みたいな画面が出て、VC++2008EEで開いてくれません。
プログラムのアンインストールの所にはもう無いのですが完全に消せてないのでしょうか?どうすれば良いですか?
0318デフォルトの名無しさん2010/11/17(水) 23:59:55
VC++2008EEの使用期限すぎたからVC++2010EE
にしてねってこと
0319デフォルトの名無しさん2010/11/18(木) 00:03:06
ええっ!?
0320デフォルトの名無しさん2010/11/18(木) 00:03:52
スマン誤爆
0321デフォルトの名無しさん2010/11/18(木) 00:04:17
>>318
マジ?
2008EEって無期限じゃないんですか?
0322デフォルトの名無しさん2010/11/18(木) 00:22:41
んな訳ねェ
0323デフォルトの名無しさん2010/11/18(木) 01:06:17
visualstudioぐらいかえよ
0324デフォルトの名無しさん2010/11/18(木) 01:15:01
登録済みEEに使用期限なんてねーし
どうにかして関連付け直せばいいだけだろ
0325デフォルトの名無しさん2010/11/18(木) 01:19:40
Proはアンインストール済みなのに何から何に関連づけ直すんだ?
0326デフォルトの名無しさん2010/11/18(木) 01:24:02
この開発環境は…アンインストール出来ない!
0327デフォルトの名無しさん2010/11/18(木) 01:33:47
しかもなんか2010 x86 redistribuableとかいうのもアンインストールできないんですよね
0328デフォルトの名無しさん2010/11/18(木) 01:49:22
エクスプローラでダブルクリックして開かないだけなのか?
2008EE自体が使えなくなったのか?
開発者ならもう少しまともに喋れ
0329デフォルトの名無しさん2010/11/18(木) 01:57:17
なんかアホっぽいからおまえらに任せるよ
0330デフォルトの名無しさん2010/11/18(木) 01:58:45
2008EEは使える
関連付けだろ。わかったよ
0331デフォルトの名無しさん2010/11/18(木) 02:21:46
このスレはバカばっかりですね。
0332デフォルトの名無しさん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()
0333デフォルトの名無しさん2010/11/18(木) 10:49:38
>>332
AddRef、Releaseはちゃんと実装したか?
0334デフォルトの名無しさん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;
}
0335デフォルトの名無しさん2010/11/18(木) 11:27:55
コピーコンストラクタは?
pushで再配置するときに何か残ってるんじゃないの?
0336デフォルトの名無しさん2010/11/18(木) 11:39:48
cRefCount_を0で初期化してないとか
偽COMなんだしunique_ptrに突っ込んどけば?
0337デフォルトの名無しさん2010/11/18(木) 11:59:45
何故偽COMなんだと思ったらIUknownだった
0338デフォルトの名無しさん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()しているようだが、それは不要なのか?
0339デフォルトの名無しさん2010/11/18(木) 14:36:19
CAdapt 使ってみたら?
http://msdn.microsoft.com/ja-jp/library/bs6acf5x.aspx
0340デフォルトの名無しさん2010/11/18(木) 22:10:04
STLのソースコード読めないんですか?
0341デフォルトの名無しさん2010/11/19(金) 00:06:55
読めるよ馬鹿にすんな。
0342デフォルトの名無しさん2010/11/19(金) 00:13:49
おれだって読めるよ!
03433322010/11/19(金) 08:43:21
>>339
使ってみたが、メモリリークが収まらない
使い方が間違ってるのか?

ColorDrawingEffect* effect = new ColorDrawingEffect(color,backcolor);
CAdapt<CComPtr<ColorDrawingEffect>> adapter(effect);
ColorEffects.push_back(adapter);
0344デフォルトの名無しさん2010/11/19(金) 13:00:07
キャリーフラグをしらべられますか?
調べる関数とかないんですか?
0345デフォルトの名無しさん2010/11/19(金) 13:02:55
char a=1000;
ってやるとa=-24になることって保障されてるんですか?
0346デフォルトの名無しさん2010/11/19(金) 13:03:33
>>344
調べられるかもしれませんし、調べる関数があるかもしれません。
少なくとも言語仕様には一切含まれていませんので、お使いの環境を当たってください。
0347デフォルトの名無しさん2010/11/19(金) 13:04:50
>>345
いいえ。
0348デフォルトの名無しさん2010/11/19(金) 13:06:50
>>345
charのディフォルトがたまたまsignedで、たまたま8ビット幅で、負の値が2の補数形式で表されている場合は、
-24になることが期待できますが、お使いの環境によっては必ずしもそうではないかもしれませんし、
きちんとそうなるとマニュアルに書かれているかもしれません。
0349デフォルトの名無しさん2010/11/19(金) 13:07:06
機種によりキャリーフラグを使い分けとか出来ませんか?
キャリーフラグの付いてないパソコンでは普通に計算して
付いているパソコンではそれを使うとかいう簡単な方法を教えてください。
0350デフォルトの名無しさん2010/11/19(金) 13:08:21
キャリーフラグのないパソコンは一般的にはないと思いますが、
そもそも使い分ける理由が一般的にはないと思われます。
0351デフォルトの名無しさん2010/11/19(金) 13:16:00
ポインタをビットで考えたとき、必ず使われないビットが
あるって本当ですか?
0352デフォルトの名無しさん2010/11/19(金) 13:16:28
キャリーフラグを調べたいって、多倍長計算をコンパクトにしたいとかか?
それならインラインアセンブラを使うべきだろう
CPUによってはフラグを調べただけで変化してしまう物もあるんだから
0353デフォルトの名無しさん2010/11/19(金) 13:23:33
>>351
C++において、ポインタを整数にキャストした結果は実装依存です。従って、ビット云々に意味はありません。
03543452010/11/19(金) 13:30:31
>>348
ありがとうございます。
0355デフォルトの名無しさん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のオブジェクトひとつに対してその下位のオブジェクトならばアクセス可能な共有変数を持たせたいのですが
なにかいい実装手段はありますか?
0356デフォルトの名無しさん2010/11/19(金) 14:48:25
static const double aaaaaa =1.0000;
intとenum以外の上みたいな書き方が禁止なのは共通ですか?
共通ではないのなら何が何かおしえてください。
0357デフォルトの名無しさん2010/11/19(金) 14:57:29
>>355
グローバル変数ならどれからでもアクセス可能だから提示された条件は満たせるな

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



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

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

このあたりを再確認して問題ないのであれば、コードさらしていただければ検証するよ
0364デフォルトの名無しさん2010/11/19(金) 21:45:31
leak が問題なんだよね?
shrink_to_fit を知らないという話じゃないよね
0365デフォルトの名無しさん2010/11/19(金) 22:37:00
clear()でも消えないんだから違うんじゃない
0366デフォルトの名無しさん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;
}
};
0367デフォルトの名無しさん2010/11/20(土) 03:06:29
何に使うのかさっぱりわからない
0368デフォルトの名無しさん2010/11/20(土) 04:13:12
車輪の再発明なんだからテンプレートの勉強だろ
0369デフォルトの名無しさん2010/11/20(土) 06:53:37
参照先が消えたらどうなるんだろー
0370デフォルトの名無しさん2010/11/20(土) 08:37:09
すこしいじれば使い道はあるだろう
begin/endとか追加してラッパー・アダプタ的な使い方をすればいい
boost::arrayは内部にストレージを持ってるから、そこで差別化できる
0371デフォルトの名無しさん2010/11/20(土) 11:11:21
まず、arrayとshared_arrayとscored_arrayのどれを作りたいのかをはっきりさせたほうがいいと思う
0372デフォルトの名無しさん2010/11/20(土) 11:25:43
>>363
全て確認してみましたが、特に怪しいところはありませんでした
思い当たる節があるとすればCComPtr<>を使用するように書き換えたぐらいなんですが…

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

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

じゃなくて

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

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

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

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

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

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

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

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

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

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

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

std::strstreamはバッファオーバーフローの危険性があったためdeprecatedにされた
03843392010/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に突っ込むと循環参照が発生してリークしたりするので、
所有権とか意識して、必要なところだけで使うのが良いと思うよ。
0385デフォルトの名無しさん2010/11/21(日) 06:29:27
>>384
トンクス
CustomTextRendererがリークしていたのか
0386デフォルトの名無しさん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)イディオム
が選択肢としてありますが、そのばあいどのようにリソースを返せばいいのか教えてください。
0387デフォルトの名無しさん2010/11/22(月) 14:35:50
auto_ptr や shared_ptr に似たものを自分で作るという意味じゃないの
0388デフォルトの名無しさん2010/11/22(月) 14:43:06
ナルヘソ
スマートポインターイディオムが
ハンドルボディーイディオムの特殊化だから
スマートポインターイディオムと書かないでその一般化である
ハンドルボディーイディオムとかいてあるのか・・・・
0389デフォルトの名無しさん2010/11/23(火) 15:07:25
struct point
{
double x;
double y;
}

std::vector<point> p;

このような形で点群データを扱ってます。
ここから-a < x < a, -b < y < b を満たす点を抜き出したいんですけど、何か良い方法はありますか?
0390デフォルトの名無しさん2010/11/23(火) 15:45:27
abs(x)<a abs(y)<bって計算する。
0391デフォルトの名無しさん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());
0392デフォルトの名無しさん2010/11/23(火) 21:41:12
abs() を使う理由が判らん
0393デフォルトの名無しさん2010/11/23(火) 21:44:14
abs使わんとめっちゃ長くなるやん
0394デフォルトの名無しさん2010/11/23(火) 21:54:06
組み込み型でもa<x<bってのを一発で記述できると楽なんだがなぁ
03953892010/11/23(火) 21:59:54
ありがとうございます。

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

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

とりあえず上から降ってきたプログラムのアルゴリズムをまんま流用してるんですけど
あまりに書き方が酷かったので、せめて綺麗に書いていたのですが・・・。
0400デフォルトの名無しさん2010/11/23(火) 22:49:18
グリッド幅は普通解ってるでしょ
だったらx,yから直接何番目のグリッドにあるかわかるじゃん
なら何度も篩いにかけるようなやり方じゃなくて一回の走査で十分でしょ
04013892010/11/23(火) 23:28:56
>>400
言われてみれば確かにそうですね。
ありがとうございます。そっちに頑張って書き換えてみます。
0402デフォルトの名無しさん2010/11/23(火) 23:32:12
質問です。size_tに対するprintfの書式指定は%zuであってますか?
GCCだと問題無いのですが、Visual C++だとうまくいかんです。
 std::printf("size = %zu\n", sizeof(int));
0403デフォルトの名無しさん2010/11/23(火) 23:38:10
%dか%u
0404デフォルトの名無しさん2010/11/23(火) 23:39:10
C99なら合ってる
つまりはそういうことだ
VC++なら %Iu かな
0405デフォルトの名無しさん2010/11/23(火) 23:39:07
>>402
z は C99 じゃなかったかな?
現状で移植性を確保したければ unsigned long にキャストして l にしとけばいいと思う。
0406デフォルトの名無しさん2010/11/23(火) 23:42:02
>>393
めっちゃって倍やんか、abs() のコストと条件式が倍になる事を比較したらどっちが得やねんちゅう話や
0407デフォルトの名無しさん2010/11/23(火) 23:45:34
せやな
0408デフォルトの名無しさん2010/11/23(火) 23:47:32
コストww
04094022010/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));
0410デフォルトの名無しさん2010/11/24(水) 00:21:58
stringstreamやBoost.Format (%1%系の型を指定しない記法)という手もある。
もっとも、long longがC++に存在しないことを気にかけるほどだから、これも根本的問題解決と言えないかもしれない。
0411デフォルトの名無しさん2010/11/24(水) 00:26:32
intよりlongにしてしまった方が64ビットWindows以外は正しくなる
0412デフォルトの名無しさん2010/11/24(水) 00:45:08
�@各処理系に詳しくなってプリプロセスで分岐
�Aテンプレートでクールに決める方法を考える
�B決め打ちするけど書き換えが楽になるように一段階間接的な手段をとる

世界中で使われるレベルのライブラリ書くようならまだしも
普通は�Bで十分だよね
0413デフォルトの名無しさん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' に対して減少できませんでした

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

型の自動推定ぐらいしてくれてもいいと思うのですが、
型をこれのように全部指定しないでコードを書く方法ないのでしょうか
0414デフォルトの名無しさん2010/11/24(水) 19:15:48
無い
04154132010/11/24(水) 19:30:20
>>413
で
testtmpfn<*,*,int>(15,0);
のように型の部分指定するにはどうすればいいのでしょうか
0416デフォルトの名無しさん2010/11/24(水) 19:33:10
T3を一番前にすりゃいいじゃん
0417デフォルトの名無しさん2010/11/24(水) 19:42:14
OCamlならこのぐらいの型推論は自動でやってくれるのに
C++にもOCamlの機能をとりこんでほしい
0418デフォルトの名無しさん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
0419デフォルトの名無しさん2010/11/24(水) 21:28:51
>>418
0xスレ逝け。
0420デフォルトの名無しさん2010/11/24(水) 21:31:55
取り込んだ結果だろうに
0421デフォルトの名無しさん2010/11/24(水) 22:12:41
お前等って何作ってんの?
0422デフォルトの名無しさん2010/11/24(水) 22:13:29
この世界がどうたら
0423デフォルトの名無しさん2010/11/24(水) 23:59:52
宇宙用戦闘ロボットのOS
0424デフォルトの名無しさん2010/11/25(木) 02:46:14
脳ミソの中の記憶をバックアップするシステムを開発してる
0425デフォルトの名無しさん2010/11/25(木) 12:17:55
悪魔召喚プログラム
0426デフォルトの名無しさん2010/11/25(木) 12:38:00
0xいいな
もう実用しても大丈夫なん?
0427デフォルトの名無しさん2010/11/25(木) 14:07:35
>>426
まだあかん
何かいろいろゴチャゴチャした議論をしてる
moveとcopy回りで収拾が付いてない
0428デフォルトの名無しさん2010/11/25(木) 16:30:23
0xは実用に使えないけどboostの中に型の自動推定ないかな
boost.anyみたいに遅くなるのじゃなくて
0429デフォルトの名無しさん2010/11/25(木) 16:38:58
型出しくらい部分特殊化でちゃちゃっと挟み込めばいいだけだろ
不特定大人数に提供する大作クラスライブラリじゃあるまいし
0430デフォルトの名無しさん2010/11/25(木) 16:43:43
>>427
いつの話をしているんだ。
暗黙のムーブの話なら、すでに決着したぞ。
0431デフォルトの名無しさん2010/11/25(木) 18:56:18
今度は暗黙のコピーに波及したとかどうとか
0432デフォルトの名無しさん2010/11/25(木) 21:12:22
2ちゃんねるブラウザを作るために、独自でスレビューを実装したい
いい感じのライブラリーない?
0433デフォルトの名無しさん2010/11/25(木) 21:15:10
独自でやんのかライブラリ使うのかはっきりしろ
0434デフォルトの名無しさん2010/11/25(木) 21:25:38
IEコンポあたりを乗っけるのが一番
0435デフォルトの名無しさん2010/11/25(木) 21:42:40
OKwaveブラウザ作ってくれないか
ないでしょ
0436デフォルトの名無しさん2010/11/25(木) 21:46:14
iexplorer.exe http://okwave.jp

OKWaveブラウザの完成!
0437デフォルトの名無しさん2010/11/25(木) 21:48:42
いやまじであると便利なのだが、、、はてなも知恵袋も対応してくれると良いなぁ
0438デフォルトの名無しさん2010/11/25(木) 21:48:44
>>433
独自でお願いします
0439デフォルトの名無しさん2010/11/26(金) 00:54:12
>>437
あれ系ってデフォルトだとおしなべて最新の回答が質問の次に来るのがマジでウザい
過程とか回答の順序が大事だろうが!?たまに質問と回答がくっついてて順序が変えられないのもあるし
0440デフォルトの名無しさん2010/11/26(金) 16:25:30
>>418
>>428
http://www.boost.org/doc/libs/1_36_0/doc/html/lambda/extending.html
0441デフォルトの名無しさん2010/11/26(金) 17:01:52
このautoってVisualStudio2010限定なの?
http://msdn.microsoft.com/en-us/library/dd293667.aspx
0442デフォルトの名無しさん2010/11/26(金) 17:11:56
>>441
C++0xの機能。
vs2010とかg++の新しいのとかに先行実装されてる。
0443デフォルトの名無しさん2010/11/26(金) 17:17:25
C++0xの機能
gccならとっくに実装されてる。
0444デフォルトの名無しさん2010/11/26(金) 17:47:46
gccよりvsのほうが実装は進んでる。
0445デフォルトの名無しさん2010/11/26(金) 17:58:30
autoすげえ
これで速度落ちないなら常用する
0446デフォルトの名無しさん2010/11/26(金) 18:02:37
当然速度落ちないよ
0447デフォルトの名無しさん2010/11/26(金) 18:03:04
落ちるわけねだろ
0448デフォルトの名無しさん2010/11/26(金) 18:03:26
無駄に長いテンプレートパラメーターがあるとき以外に使うと分かりにくくなるだけだよ。
0449デフォルトの名無しさん2010/11/26(金) 20:39:41
boostのfor_eachなんかパッと使うのは楽になるけど
瞬時に要素がどういう型なのか判別する手間が増えるな
逆に小細工なしで比較的手軽に汎用的なマクロを作れたりする
0450デフォルトの名無しさん2010/11/26(金) 22:30:29
>>445
autoを何だと思っているんだw
0451デフォルトの名無しさん2010/11/26(金) 22:31:44
auto様とか、上手に利用すると本当にTemplMPが書きやすくなるんだろうな。
俺は書いたこと無いけどね!
0452デフォルトの名無しさん2010/11/26(金) 22:44:53
今更な質問で申し訳ないんですが、C++0x ってもう使えるんですか!?
まだ規格はできあがってないと思ってたんですが…。
C++0x に合わせ、VS2010 とかが少しずつ規格を取り入れてるってことなんでしょうか。
今取り入れられてる部分はについてはもう変更されることはないと確定しているんでしょうか?
0453デフォルトの名無しさん2010/11/26(金) 22:48:34
規格も確定してないし、コンパイラの対応も半端、変更されるかもしれない
0454デフォルトの名無しさん2010/11/26(金) 22:57:35
でもまぁ便利だからね
0455デフォルトの名無しさん2010/11/26(金) 23:14:47
まあ、規格はほとんど完成してるよ。
まだ変更される箇所もあるけれど、普通のユーザーがきにするようなことじゃない。
0456デフォルトの名無しさん2010/11/27(土) 00:06:30
autoを使うことで変数名に気を使うようになり、
結果的にコードが読みやすくなったな
0457デフォルトの名無しさん2010/11/27(土) 00:20:47
string内のスペース、タブを全て削除するにはどうするんですか
教えてください
0458デフォルトの名無しさん2010/11/27(土) 00:32:54
remove_ifを使いましょう
0459デフォルトの名無しさん2010/11/27(土) 00:36:44
>>458
それでどうするんですか?
0460デフォルトの名無しさん2010/11/27(土) 00:38:43
スペース、タブをすべて削除するんだよ
0461デフォルトの名無しさん2010/11/27(土) 00:38:48
ggrks
0462デフォルトの名無しさん2010/11/27(土) 00:45:19
>>459
http://lmgtfy.com/?q=remove_if
0463デフォルトの名無しさん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;
}
0464デフォルトの名無しさん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;
}
0465デフォルトの名無しさん2010/11/27(土) 01:35:52
>>450
typeof(a*b+c) x= a*b+c;
04664572010/11/27(土) 01:41:57
>>463-464
ありがとう。
remove_ifだと消す対象に次要素の移動コピーだけしかしないのに、なんでそんなアドバイス来るんだ
と思ったが、eraseでremove_ifからの戻り値(strの無要素の先頭)からstrの最後までを消すことで
スペース、タブを除去するのか。これ、定石なんだろうね
それなら、eraseとremove_if使え位言わないと低脳の僕は分からん
0467デフォルトの名無しさん2010/11/27(土) 01:42:07
decltypeでいいじゃん
0468デフォルトの名無しさん2010/11/27(土) 01:44:05
>>466
std::removeとかstd::remove_ifは削除対象の要素を後ろに集めてその先頭イテレータ
を返すだけで、実際の削除はしないのでeraseが必要になる
0469デフォルトの名無しさん2010/11/27(土) 02:15:12
削除対象じゃないものを前に集めてその最後のイテレータを返す
0470デフォルトの名無しさん2010/11/27(土) 02:17:15
スペースとタブ以外の文字をコピーして文字列作った方が
速かったりするのかな
0471デフォルトの名無しさん2010/11/27(土) 02:21:00
>>470
そういう車輪の再発明を極力やめようというのがSTLの基本思想
0472デフォルトの名無しさん2010/11/27(土) 08:38:25
remove_copy_ifなりcopy_ifを使えばいいだろ
なんで車輪の再発明の話になるのかわからん
0473デフォルトの名無しさん2010/11/27(土) 08:57:09
>>470
遅いしメモリの無駄です
0474デフォルトの名無しさん2010/11/27(土) 09:18:14
過去に再発明を経験してないPGほど使えないやつが多い
0475デフォルトの名無しさん2010/11/27(土) 09:33:45
車輪を作らずとも自動車が作れる
そんな時代になるといいですね
0476デフォルトの名無しさん2010/11/27(土) 09:48:18
車輪の作り方は知らなくても自動車は作れる
でも性能の良い自動車は作れない
STLってこんな感じだよね
0477デフォルトの名無しさん2010/11/27(土) 11:30:42
>>476
listでdistanceを平気でやったりとかね。
0478デフォルトの名無しさん2010/11/27(土) 11:30:59
>>476
下手なプログラマが作るより性能はいい
しかもC++0xから右辺値参照がSTLに入れられるので速度も上がる
0479デフォルトの名無しさん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 は使ってるのでその中でも問題ありません。

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

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

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

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

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

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

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

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

とすると範囲外エラーとなります。(デバッグ時に例外が飛んできます)
0498デフォルトの名無しさん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);
}}}}
0499デフォルトの名無しさん2010/11/27(土) 12:43:15
>>498
このようにすると速度が逆転するのがわかると思う
std::vectorのデフォルトコンストラクタは十分高速
0500デフォルトの名無しさん2010/11/27(土) 12:43:20
もう自前で書けよ……
どういう処理想定してるか分からないから適当にアドバイスしたら、
それじゃ駄目とかどうしようもない
0501デフォルトの名無しさん2010/11/27(土) 12:45:00
もうmap<int, int>を使えばいいよ
0502デフォルトの名無しさん2010/11/27(土) 12:45:15
>>496-497
vectorの速度を気にする前の問題じゃね?
ちゃんと最適化かけて計測してる?
0503デフォルトの名無しさん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で包んでもいいし
0504デフォルトの名無しさん2010/11/27(土) 12:49:51
> ar[0] = 1;
なぜ push_back を使わない
05054792010/11/27(土) 12:50:15
>>499
高速なのは分かりますが、そもそも初期化する必要がないので…。
実際にボトルネックになっていて、>>479 で100倍以上の差が出ています。

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

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

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

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

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

>int* p = new int[100000];

これが固定サイズしか作れないものと勘違いしてました…。
恥ずかしい限りです。こんなことに何十レスも頂いて…。
boost::scoped_array 何の問題もありませんでした。
関わって頂いた皆様、本当にありがとうございました。勉強しなおします…。
0516デフォルトの名無しさん2010/11/27(土) 13:18:32
お前、切腹な
0517デフォルトの名無しさん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へ戻せばよいのかをお教えいただきたいです.

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


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

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

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

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

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

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

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

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

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

d→bはキャストできても、b→dへのキャストはstaticでもdynamicでもできないのな。
0556デフォルトの名無しさん2010/11/28(日) 02:08:42
は?
0557デフォルトの名無しさん2010/11/28(日) 02:17:29
アップキャストって言いたいんだろきっと
0558デフォルトの名無しさん2010/11/28(日) 03:26:15
static_cast<d*>したければ、仮想継承を止める。
dynamic_cast<d*>したければ、class bに仮想関数を追加する。
0559デフォルトの名無しさん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);
};
0560デフォルトの名無しさん2010/11/28(日) 19:50:00
・なんでエラーメッセージを書かないの? 馬鹿にしてる?
・なんでコードの断片だけなの? 嫌がらせ?
0561デフォルトの名無しさん2010/11/28(日) 20:31:59
>>559
確かにそれでだけは分からん。
というより、そのコードを見る限りでは、その部分に特に間違いは見受けられない気がする。
別の部分で落ちてるのでは?
0562デフォルトの名無しさん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が入ってます。
まあその場合でもパネルでは赤色のフォントで表示されているのですが。
0563デフォルトの名無しさん2010/11/28(日) 21:15:45
>>559 とりあえずヘッダで using namespace はやめろ。
0564デフォルトの名無しさん2010/11/28(日) 21:18:31
>>559
プログラム削って、 main() 走らせるだけで同じエラーの起こる最小コードを作ってみろ。
0565デフォルトの名無しさん2010/11/28(日) 21:24:45
>>562
> なぜかthisの外にthisと並ぶ形でもうひとつmがありましたが、
!?

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


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

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


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

>>564
>>567
起こったことをありのままに話すと、main関数がありませんでした。
すみません…
0571デフォルトの名無しさん2010/11/28(日) 22:10:57
ヘッダでusing namespace std;とか
0572デフォルトの名無しさん2010/11/28(日) 22:18:40
>>570
実行時に読み込んでるファイルも晒せ。
05735702010/11/28(日) 22:18:48
hoge.cppの方、もうちょっと削りました。
http://codepad.org/k0N1eKIZ
0574デフォルトの名無しさん2010/11/28(日) 22:23:37
main()なしでデバッグだとか、未だおちょくっているようにしか見えんな。
0575デフォルトの名無しさん2010/11/28(日) 22:23:39
>>572
どうぞ、こちらです。
・Global.h
http://codepad.org/YOOkQHUu
0576デフォルトの名無しさん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使ってるんだろ。
0577デフォルトの名無しさん2010/11/28(日) 22:38:47
>>576
「insertします」
というポップアップが出た後、
自動変数パネルのexの中身を見てみるとやはり「不適切なptr」でした。

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

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

コンパイル時の警告には

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

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

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

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

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

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

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

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

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

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

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

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

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

class Foo
{
  static inline void boo(){}
};
とやらないとだめですか?
0634デフォルトの名無しさん2010/11/29(月) 15:46:24
inlineは書かなくてもいい
0635デフォルトの名無しさん2010/11/29(月) 15:59:12
サンクス
0636デフォルトの名無しさん2010/11/29(月) 18:12:45
>>630をそろそろお願いします。
機種依存ではなくて一番一般性の高いやつがいいです。
0637デフォルトの名無しさん2010/11/29(月) 18:14:42
コーンソールで笑ったから教えてあげないッ!
0638デフォルトの名無しさん2010/11/29(月) 18:15:04
jpgでもpngでも好きにしたまえ
0639デフォルトの名無しさん2010/11/29(月) 18:31:13
>>630
画像なら、名前の通り移植性のある ppm がいい。最強だ。
0640デフォルトの名無しさん2010/11/29(月) 18:42:03
ちなみに圧縮とか分からないんで一番簡単で一番一般的なフォーマットのやつにしてください。
動画の形式が一つもでてないのでそちらもお願いします
0641デフォルトの名無しさん2010/11/29(月) 18:59:04
そんな知能で大丈夫か?
0642デフォルトの名無しさん2010/11/29(月) 19:15:17
ひらめいたけど、
独自の形式を作ってそれをあとで変換すればいいんだ・・・
無駄なこと聞いてしまった自分が情けない。
0643デフォルトの名無しさん2010/11/29(月) 19:50:38
>>642
静止画を高速に連続に表示すれば、動画になるよね
動画するのに必要な分の静止画を作りそれを一つにまとめ
各静止画を1/60sレート位で連続表示すれば良いんじゃないか
0644デフォルトの名無しさん2010/11/29(月) 21:38:39
motion jpeg?
0645デフォルトの名無しさん2010/11/29(月) 22:07:06
motion ppmでしょ
0646デフォルトの名無しさん2010/11/29(月) 22:19:50
ppm画像でもffmpegで普通の動画に変換できるしいいね
0647デフォルトの名無しさん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ごとのデータを作ればいいのか分かりません。

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

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

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

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

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

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

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

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

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

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

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

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

参照でポリモーフィズム使う場面って、引数くらいだよね確かに
0678デフォルトの名無しさん2010/11/30(火) 18:48:58
参照で多態使わないとかどこの素人だよ
0679デフォルトの名無しさん2010/11/30(火) 19:02:34
>>673
日本g……コードでおk
0680デフォルトの名無しさん2010/11/30(火) 21:06:16
CでもC++でもいいんだけどfpos_tより大きいファイルって扱う方法ないの?
0681デフォルトの名無しさん2010/11/30(火) 21:07:25
>>680
OSを独自にいじるライブラリに頼るしかない
処理系依存・環境依存
0682デフォルトの名無しさん2010/11/30(火) 21:09:08
環境依存だけど手っ取り早く扱いやすくだとmmapとか
0683デフォルトの名無しさん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なども対応してるとなお嬉しい。
0684デフォルトの名無しさん2010/11/30(火) 22:21:16
ランダムアクセスできないってだけで標準でも2G以上も扱えるよね
06853042010/11/30(火) 22:39:14
2bitの値(というか、1bitの値をふたつ)を返したい場合、
int型の1,2bit目で判断するのと、pair<bit,bit>を使うのとどっちがスマートでしょうか?
それ以外の方法もあります?
0686デフォルトの名無しさん2010/11/30(火) 22:39:48
>>683
「あいうえお」の長さが5になったらそれは最早UTF-8ではない。
とりあえず
std::wstring str(L"あいうえお");
でどうだ?
0687デフォルトの名無しさん2010/11/30(火) 22:40:32
char型で返す
ビットフィールドを使う
引数に参照を渡して2bit操作する
0688デフォルトの名無しさん2010/11/30(火) 22:41:07
pair<bool,bool>だった
しかもクッキー食べ忘れ
0689デフォルトの名無しさん2010/11/30(火) 22:46:35
質問です
一般にグローバル変数はいけない、という事なのですが、
全てのファイルで一貫して使う定数などはどこにどう定義すればいいのでしょうか?
0690デフォルトの名無しさん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; };
0691デフォルトの名無しさん2010/11/30(火) 22:48:55
>>686
>「あいうえお」の長さが5になったらそれは最早UTF-8ではない。

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

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

> std::wstring str(L"あいうえお");
> でどうだ?
実際に扱いたいのはリテラルではなくて、UTF-8の入出力なので
その方法だと無理そうです。。
(PCとかならプログラムの入出力に別プログラムでフィルタかませば
済みそうなんですが、組み込みでの使用を考えてるので、それも難しい)
0696デフォルトの名無しさん2010/11/30(火) 23:15:30
>>694
グローバル変数がいつ何処で書き換わるのかを追うことが難しく、読みにくくなるから。
だからグローバルな定数なら文句を言う奴は少ない。
0697デフォルトの名無しさん2010/11/30(火) 23:24:51
なんとなく、処理の前後にUTF-8 <-> UTF-16の変換処理入れて
内部はstd::wstringで表現すれば比較的楽にいけるんじゃないかと
思いついた。
というわけで、そういう方向でやってみますー
0698デフォルトの名無しさん2010/12/01(水) 00:24:56
UTF-16ってWindowsか? 頼むからサロゲートペアはきちんと処理してくれよ。
MultiByteToWideChar呼べば問題無いと思うが。ついでにシフトジスにも対応できる。
0699デフォルトの名無しさん2010/12/01(水) 01:03:53
>>685 std::bitset<2>
0700デフォルトの名無しさん2010/12/01(水) 01:07:11
>>694 http://ja.lmgtfy.com/?q=%E3%82%B0%E3%83%AD%E3%83%BC%E3%83%90%E3%83%AB%E5%A4%89%E6%95%B0
0701デフォルトの名無しさん2010/12/01(水) 01:10:03
>>673
何言ってやがる。
std::iostream も std::exception も参照でポリモーフィズム利用するのが基本だろ。
0702デフォルトの名無しさん2010/12/01(水) 10:26:05
いつも頭を悩ませるんだけど失敗しうるリソース開放処理ってどう対処してるの?
成功するまで繰りかえす、ログに出力して放置、即落ちる、とか考えたけどどれもいまいちピンとこない
0703デフォルトの名無しさん2010/12/01(水) 10:41:16
どういうソフトで、解放されなかった場合どうなるかを考えて切り替えじゃないかな
基本はログ出力やメッセージ表示して放置でいいと思うけど
0704デフォルトの名無しさん2010/12/01(水) 12:13:48
初歩的な質問なんですけど、浮動小数点型の右シフトって
2で割ると同じことになるんですか?
0705デフォルトの名無しさん2010/12/01(水) 12:17:04
>>704
ならない
0706デフォルトの名無しさん2010/12/01(水) 12:29:11
>>704
実はやってみた事がある
キャリーフラグを通しての回転なのでインラインアセンブラを使った
結果は出力がバグって100桁以上の出力になったっけ
多分IEEE754が意図していない変なビットパターンになっちゃったんだな
0707デフォルトの名無しさん2010/12/01(水) 12:32:42
マジっすか?それはおかしいなぁ
クヌースの1巻の1.2.2の問題25で右シフトして
半分にしてるんだけど。
0708デフォルトの名無しさん2010/12/01(水) 12:34:28
浮動小数点型を2で割ってもビットパターンはまったく回転しないぜ
指数部が1減るだけ
0709デフォルトの名無しさん2010/12/01(水) 12:37:21
もしかして2から1の間ではなりたちますか?
0710デフォルトの名無しさん2010/12/01(水) 12:38:09
>>707
それ多分IEEE754形式じゃないんだよ
エクセス64方式でもそうはならない
0711デフォルトの名無しさん2010/12/01(水) 12:39:01
>>709
だめだと思う
指数部や符号部までシフトされちゃうからおかしくなるよ
0712デフォルトの名無しさん2010/12/01(水) 13:23:29
1.0をシフトした場合を考えてみれ
0.5になると思うか?
0713デフォルトの名無しさん2010/12/01(水) 13:42:03
なるような気がします
0714デフォルトの名無しさん2010/12/01(水) 13:51:39
まず浮動小数点数のビット表現をwikiれ
0715デフォルトの名無しさん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;
}
0716デフォルトの名無しさん2010/12/01(水) 15:37:19
指数部分だけならいける

http://codepad.org/ayEWJGBS
0717デフォルトの名無しさん2010/12/01(水) 15:43:36
>>716
それは当たり前
0718デフォルトの名無しさん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
0719デフォルトの名無しさん2010/12/01(水) 20:09:22
>>718
死ね
0720デフォルトの名無しさん2010/12/02(木) 03:56:33
>>716
素直に2で割った方が早いだろJK
07217162010/12/02(木) 04:00:44
>>720
そんな事は百も承知だカス
>>709に教えてやるためにわざわざやってやってるんだ
低脳は口を出すな
0722デフォルトの名無しさん2010/12/02(木) 06:02:27
double に 2.0 と 1.0 を代入して16進で見ればすぐ理解できると思うんだけど
0723デフォルトの名無しさん2010/12/02(木) 17:43:21
cinからバイナリを読んでみたいんだけど
ストリームの対象を変えずにオープンモードだけ変える方法ってある?
C++でなかったらCでもいいです
0724デフォルトの名無しさん2010/12/02(木) 18:19:12
>>723
処理系に依存しない方法では無理。Visual C++ならこんな感じ。
#include <fcntl.h>
#include <io.h>
#define setbinmode(fp) setmode(fileno(fp), O_BINARY)
07257242010/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
0726デフォルトの名無しさん2010/12/02(木) 18:23:35
どうせWindows以外はテキストモードとかどうでもいいしなあ
0727デフォルトの名無しさん2010/12/02(木) 19:01:59
マルチプラットフォームに対応したソースを書くにはどうしたらよいでしょうか
0728デフォルトの名無しさん2010/12/02(木) 19:13:10
説明してあるサイト見たこと無いんだ・・・
0729デフォルトの名無しさん2010/12/02(木) 20:22:43
>>726
VMSのことも時々でいいので思い出してあげて下さい
0730デフォルトの名無しさん2010/12/03(金) 06:53:27
>>727
使用する関数や言語機能のドキュメントを読んで、
プラットフォーム依存な部分があるのかないのか確認すれば
よいでしょう。
0731デフォルトの名無しさん2010/12/03(金) 12:37:21
パソコンの性能に依存しない実行速度の測定方法を教えてください。
0732デフォルトの名無しさん2010/12/03(金) 12:44:48
>>731
どう測定したらパソコンの性能に依存なんてするの?
0733デフォルトの名無しさん2010/12/03(金) 12:45:03
?!
0734デフォルトの名無しさん2010/12/03(金) 12:47:49
2つの別々のパソコンで別々のアルゴリズムを測定して2つのアルゴリズムを
どうやって比べるの?
0735デフォルトの名無しさん2010/12/03(金) 12:54:36
>>734
2つのパソコンで2つのアルゴリズムについて std::clock() あたりで実行時間を計測すればいいんじゃないの?
0736デフォルトの名無しさん2010/12/03(金) 13:00:33
>>731
実行速度はパソコン性能に依存するので諦めて下さい
0737デフォルトの名無しさん2010/12/03(金) 13:02:58
>>734
パソコン1でアルゴリズム1を測定、パソコン2でアルゴリズム2を測定して、
その2つの計測結果のみでアルゴリズム1とアルゴリズム2のどちらが速いか
決めたい、ってことなのかな?

それは無理だ。

計算量の話にすれば O(1) とか O(N) とか O(logN) の違いでアルゴリズムを
比較することはできるけど、それがそのままどちらが速いという結果につながる
わけでもないし。
0738デフォルトの名無しさん2010/12/03(金) 13:13:14
OSとかが使う計算とかの、測るアルゴリズム以外の計算は止めておいて
クロック数を測る方法でいいです。
0739デフォルトの名無しさん2010/12/03(金) 13:22:03
>>730
諦めました
0740デフォルトの名無しさん2010/12/03(金) 13:24:02
使用クロック数自体もパソコンによって違うから。主にキャッシュの量の問題な。
0741デフォルトの名無しさん2010/12/03(金) 13:26:35
一クロックでどのくらいのことができるかも、CPUによって違うからな
0742デフォルトの名無しさん2010/12/03(金) 13:27:42
体感しかないな
0743デフォルトの名無しさん2010/12/03(金) 13:28:50
じゃあ駄目だな。
終わりだな。
0744デフォルトの名無しさん2010/12/03(金) 13:59:45
クロックが同一でもCPU内部アーキテクチャ、バスアーキテクチャ、メモリ性能や
メモリ2枚差し3枚差しでも全然違ってくるから、ベンチマークはPCに依存しない
プログラムは原理的に作る事が出来ない
0745デフォルトの名無しさん2010/12/03(金) 14:01:00
ただし計算量O(ビッグ・オー記法)はコンピュータによって変化しないから、
あるアルゴリズムがどの位の計算量を持つのかそのオーダーを知る事は出来る
0746デフォルトの名無しさん2010/12/03(金) 14:38:38
なんで、コンピューターはコンピュータなのに
ビッグ・オーはビッグ・オじゃないの?
なんでオーダーはオーダじゃないの?
0747デフォルトの名無しさん2010/12/03(金) 14:45:23
くだらない
0748デフォルトの名無しさん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++でやるにはどうしたらいいんでしょうか。
0749デフォルトの名無しさん2010/12/03(金) 15:32:03
死ね
0750デフォルトの名無しさん2010/12/03(金) 15:56:05
>>748
いくつマルチポストしてるんだカス
ここへ行け

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

Delphiのプログラムを簡単に移植出来るのはC++Builderしかない
0751デフォルトの名無しさん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;
}
0752デフォルトの名無しさん2010/12/03(金) 21:06:49
いいえ
0753デフォルトの名無しさん2010/12/03(金) 21:09:39
>>751
vec.push_back(ch);だと思うけど、
ポインタがコピーされるだけだから数字は入ってない
0754デフォルトの名無しさん2010/12/03(金) 21:13:20
これならいける?

vec.push_bak(*ch);
0755デフォルトの名無しさん2010/12/03(金) 21:17:25
ポインタ型のコンテナに値がある訳無かろう
0756デフォルトの名無しさん2010/12/03(金) 21:31:24
なるほど
0757デフォルトの名無しさん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[]
するようにするにはどうすれば良いですか?
0758デフォルトの名無しさん2010/12/03(金) 22:37:25
不可能ですのでほかの言語を勉強しましょう
0759デフォルトの名無しさん2010/12/03(金) 22:39:39
>>757
boost::ptr_vector<char>を使う
0760デフォルトの名無しさん2010/12/03(金) 22:41:48
あれ、ptr_vectorに配列はまずいような気がしてきた
0761デフォルトの名無しさん2010/12/03(金) 22:49:48
入れた分deleteすればいいだけでしょ。
0762デフォルトの名無しさん2010/12/03(金) 22:52:27
newしないでスタック使えよ
0763デフォルトの名無しさん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;
0764デフォルトの名無しさん2010/12/03(金) 23:09:31
C++のnewは何故あんなに遅いのですか?
0765デフォルトの名無しさん2010/12/03(金) 23:11:03
遅いと思うなら、独自メモリー確保作る。
0766デフォルトの名無しさん2010/12/03(金) 23:21:07
>>760
structにでもぶち込もう
0767デフォルトの名無しさん2010/12/03(金) 23:21:20
>>763 感謝上げ
そんなやり方で出来るんですか!
0768デフォルトの名無しさん2010/12/04(土) 02:09:48
newって200ns〜400nsぐらいだろ。そんなに遅いとは思わないが。
それともJava/.NETのnewと比べてる? そりゃまあ遅い罠。
0769デフォルトの名無しさん2010/12/04(土) 02:51:24
あんまり高頻度にnew/deleteするのはヒープ領域を汚すし、boostのpoolでも使えば?
0770デフォルトの名無しさん2010/12/04(土) 02:53:21
ここはC++スレだ。ヒープじゃなくてフリーストアと言え
0771デフォルトの名無しさん2010/12/04(土) 03:14:00
>>757,759,763 std::vector<char> だろjk
0772デフォルトの名無しさん2010/12/04(土) 03:15:02
>>764
どんな計測結果見て「あんなに」と言ってるのか書いてもらわないと、なんとも。
0773デフォルトの名無しさん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) {}
0774デフォルトの名無しさん2010/12/04(土) 11:26:38
http://codepad.org/OItN2kVz
iostreamを例外使用で書くとこんな感じですか?
例外使ったサンプルが少なくて困りますわ
0775デフォルトの名無しさん2010/12/04(土) 12:31:28
>>773
二重のテンプレートだから template<> が2つ要るんじゃない?
0776デフォルトの名無しさん2010/12/04(土) 12:57:12
numeric_limitsというものがあるようですが
ある変数fooのnumeric_limits使うときに
わざわざfooの型を見つけてnumeric_limits<double>とかやらないとならんのですか?
numeric_limits<foo>とかできないもんでしょうか。
0777デフォルトの名無しさん2010/12/04(土) 13:13:03
decltype
0778デフォルトの名無しさん2010/12/04(土) 13:45:27
>>771
それって文字列格納できるの?
>>754ができるってこと?
0779デフォルトの名無しさん2010/12/04(土) 14:33:31
ダウンキャストを回避する方法を教えてください
0780デフォルトの名無しさん2010/12/04(土) 14:35:42
継承しなきゃいいんじゃね?
0781デフォルトの名無しさん2010/12/04(土) 14:36:42
死ね
0782デフォルトの名無しさん2010/12/04(土) 14:41:42
>>779
基底クラスにアクセスしようとするとハードディスクをフォーマットするようにしておく
0783デフォルトの名無しさん2010/12/04(土) 14:49:19
そもそもダウンキャスト(基本クラスのポインターやリファレンスから派生クラスのポインターやリファレンスへのキャスト)
させたくないという考えがでる時点で、
すでに基本クラスを使っているだろうから・・・

常にハードディスクをフォーマットするプログラムか。
0784デフォルトの名無しさん2010/12/04(土) 15:19:33
>>778
std::stringを使うという脳みそはないのか
0785デフォルトの名無しさん2010/12/04(土) 16:47:11
cstringってなんだろうと思ったので、googleで検索してもmfcしかヒットしません
なので、linux + gcc環境下で#include <cstring>とやってみましたが、エラーが出ませんでした
cstringはmfcのモノなんですか?
0786デフォルトの名無しさん2010/12/04(土) 16:48:35
<cstring> は <string.h> の C++ 版で
std::strcpy とか std::memcpy とかを使うために必要なヘッダファイルだ
07877852010/12/04(土) 17:47:27
>>786
string.hってC言語の物なのか?
0788デフォルトの名無しさん2010/12/04(土) 18:00:45
CString って便利よねぇ。
0789デフォルトの名無しさん2010/12/04(土) 18:01:56
C言語のものというかなんというか
C++でも使えることになってるから別に使ってもいい
推奨されてはいないが、気にすることはない
0790デフォルトの名無しさん2010/12/04(土) 18:18:57
string.hはCだけでなくC++にもある。Cのstring.hと同じであるとは限らない。
例えばCのstdlib.hはabs(int)しかないが、C++のstdlib.hはabs(double)があったりする、
はずだが実際には規格に従っていない処理系があったりする。
0791デフォルトの名無しさん2010/12/04(土) 18:29:03
ンモー
0792デフォルトの名無しさん2010/12/04(土) 18:33:57
<cstdlib>で定義されているのは abs(int) と abs(long) の整数型で
abs(doble) は<cmath>じゃね?
Cのmath.hに定義されるfabs()に対応するためのオーバーロード
0793デフォルトの名無しさん2010/12/04(土) 18:38:23
手元に古い1998年版しかないけど、ISO/IEC 14882:1998(E)の
26.5 C Libraryにはcstdlibって書いてある
0794デフォルトの名無しさん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).
0795デフォルトの名無しさん2010/12/04(土) 20:08:51
>>784
そもそもが敢えてchar*でやるっていうお題なんだけど
自分の脳ミソ疑ったほうが良いんじゃないの?
0796デフォルトの名無しさん2010/12/04(土) 20:11:16
>>777
decltype調べてみましたがC++0xの機能のようですね。
msdn見てみるとVS2010以降で使えるようです。
私の環境はVS2008でなのですが、変わりになるようなものあるでしょうか?
0797デフォルトの名無しさん2010/12/04(土) 20:15:51
>>795 それなら >>758 で終了。
0798デフォルトの名無しさん2010/12/04(土) 20:31:20
>>796
boost::typeof
いまいちだけど
0799デフォルトの名無しさん2010/12/04(土) 20:44:25
#include <cstring>
だろ
え およびでない?
0800デフォルトの名無しさん2010/12/04(土) 20:47:38
>>797
>>763みたいな案もでてんじゃん。
そもそものお題すらぶち壊す代替案しかだせないレベルなら出てこなくて良いよ
ここは質問したいやつとそれに答えれるレベルのやつのスレなんだから
0801デフォルトの名無しさん2010/12/04(土) 20:54:27
>>800
>>763 はダメだろ。
お題は vec のスコープアウトでの破棄なのに、 ch のスコープで破棄されてる。
0802デフォルトの名無しさん2010/12/04(土) 22:46:08
OSのシグナルって割り込みの事だよね
関数ポインタを登録して、コールバックすればいいだけおk?
08038022010/12/04(土) 22:46:51
コールバックすればいいだけ?
0804デフォルトの名無しさん2010/12/04(土) 22:51:48
>>802 おk日本語で
0805デフォルトの名無しさん2010/12/04(土) 22:58:54
int* p = new int[0];
って要素数ゼロ指定したらどんな良くないこと起きますか?
0806デフォルトの名無しさん2010/12/04(土) 23:07:40
p が NULL になるのは確実だけど例外が生じるかは処理系依存かなぁ
0807デフォルトの名無しさん2010/12/04(土) 23:08:13
>>805
べつに。

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

http://ideone.com/rcLdA
0809デフォルトの名無しさん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, ...
0810デフォルトの名無しさん2010/12/04(土) 23:18:34
>>808
bcc でも NULL にならなかった double* a で sizeof *a が 8 だったから1要素分は alloc されるんだね
知らんかったよ
0811デフォルトの名無しさん2010/12/04(土) 23:27:58
いやそれは・・・
0812デフォルトの名無しさん2010/12/05(日) 00:17:04
int* p = new int[0];
p != NULL
*p == NULL
が正しい
0813デフォルトの名無しさん2010/12/05(日) 00:19:24
>>812
それも違うだろ。
0814デフォルトの名無しさん2010/12/05(日) 00:30:33
>>812 *p で未定義動作。
0815デフォルトの名無しさん2010/12/05(日) 00:38:25
>>800
>>763を試しにやってみたが、その通りだな
結局、ここのスレレベルでは実現出来ない or >>758の通りってことかな
0816デフォルトの名無しさん2010/12/05(日) 00:44:37
>>810
これはひどいな
0817デフォルトの名無しさん2010/12/05(日) 00:53:22
xxx * p = new xxx[0];
*p で未定義動作なのに、なんでp==NULLや例外発生しないの?
あと、どんな時使うの?
0818デフォルトの名無しさん2010/12/05(日) 01:20:40
その*は演算子ではなく、宣言子の一部だ。
0819デフォルトの名無しさん2010/12/05(日) 01:27:10
>>806 >>810 >>812
なぜ勘でここまで断言できちゃうのかのほうが知りたい。
0820デフォルトの名無しさん2010/12/05(日) 01:29:35
×勘
○思い込み
0821デフォルトの名無しさん2010/12/05(日) 01:41:59
>>817
サイズ 0 の配列が欲しいという要求は満たせているのだから、例外が発生しないのは当然。
ヌルを返さないのは「ヌルは確保の失敗を示す」という一般的な意味づけを保つように、だと思う。
0822デフォルトの名無しさん2010/12/05(日) 01:45:45
>>817
サイズ 0 の場合を特別扱いしなくていいように、だろう。
0823デフォルトの名無しさん2010/12/05(日) 01:54:18
>>820
思い込みとも違うような気がする。
0824デフォルトの名無しさん2010/12/05(日) 02:13:04
>>810
sizeof *aはnewしたサイズじゃないぞ。sizeof a[0]と同じ。もちろん実際のメモリアクセスは発生しない。
0825デフォルトの名無しさん2010/12/05(日) 02:15:32
int* p = new int[0];
ってどうゆう意味よ。
int p; じゃまずいの?
new したら deleteするタイミング必要だし。
0826デフォルトの名無しさん2010/12/05(日) 02:27:23
>>825
実際は実行時に決まる要素数がたまたま 0 になる場合の話だろ。
0827デフォルトの名無しさん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];
}
08288102010/12/05(日) 02:36:08
>>821
malloc() を呼ぶ時に size が0だとNULLになるだろ
size 0 のヒープは確保できないから最低単位、例えば size 1 のヒープを確保するって事か?

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

要点はね bcc だと malloc() は NULL を返し、 new は NULL を返さないって点なんだ
size 0 の場合 new は要素を持たない配列を確保するって言われてもイメージが沸かないでしょ
実装上どういう確保が行われてるか知りたいんだけど....なんかスレ違いみたいだからもう良いや
0837デフォルトの名無しさん2010/12/05(日) 03:29:17
>>836
dlmalloc のソースや libstdc++ のソースを見るといい。
0838デフォルトの名無しさん2010/12/05(日) 03:35:54
サイズ0が指定されたら1に置き換えて確保すりゃいいだけじゃない。
ポインタが以前確保した領域と同じか比較する奴がいて、サイズ0だとNULL
どうしで同じになって困るバカがいたから必ず違うアドレスが返る様にしたと
昔のマイクロソフトのドキュメントに書いてあった。
0839デフォルトの名無しさん2010/12/05(日) 03:41:00
>>838
マジ?
0840デフォルトの名無しさん2010/12/05(日) 03:51:00
>>802
コールバックしてもらえばOK。ただし基本はそこから他の関数を呼んじゃいけない。
0841デフォルトの名無しさん2010/12/05(日) 04:00:15
>>829
bufは動的に確保しろよ。でなきゃアライメントが保証できない。
0842デフォルトの名無しさん2010/12/05(日) 04:24:21
>>841 placement new の意味ねーw
0843デフォルトの名無しさん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] ;
0844デフォルトの名無しさん2010/12/05(日) 05:04:14
>>843
> C++03では、アライメントというもの自体が規定されていなかった
んなこたーない
0845デフォルトの名無しさん2010/12/05(日) 07:49:43
int *p = new int[10];とかやって、detele[]せずに
p = new int[5];ってするとどうなりますか?
一応問題なく動いてるようにみえますが・・・
0846デフォルトの名無しさん2010/12/05(日) 08:12:05
pを保存せずに上書きしたなら
解放できないint10個分の領域が出来るだけ
0847デフォルトの名無しさん2010/12/05(日) 08:19:52
なるほど解放できなくなるのか
ありがとう
0848デフォルトの名無しさん2010/12/05(日) 09:51:33
virtualデストラクタは必ずつけろとか言うアホはなんなの?
0849デフォルトの名無しさん2010/12/05(日) 09:52:51
pは、フリーストアへのポインターの値を格納する変数だ。フリーストアそのものじゃない。
なんだろう。今はメモリーとアドレスといった、プログラミング以前の概念が、分かりにくくなっているんだろうか。
0850デフォルトの名無しさん2010/12/05(日) 10:28:33
>>848
お前がvirtualつけなくていい例を理解してないアホだと思われてるんだろ
0851デフォルトの名無しさん2010/12/05(日) 11:25:03
>>833
そしたらvectorのデストラクタは呼ばれないよね
大丈夫なの?
0852デフォルトの名無しさん2010/12/05(日) 11:31:24
>>851
仕様を勘違いしてない?
 自動変数→OK.必ず全部呼ばれる
 virtualデストラクタ無し、派生クラスのポインタでdelete→OK
 virtualデストラクタ無し、基本クラスのポインタでdelete→NG、基本クラスのデストラクタのみ
 virtualデストラクタ有り、派生クラスのポインタでdelete→OK
 virtualデストラクタ有り、基本クラスのポインタでdelete→OK
0853デフォルトの名無しさん2010/12/05(日) 11:32:56
>>852
揚げ足取りだが二番目は一般的な挙動なだけで
実際は未定義動作だな
0854デフォルトの名無しさん2010/12/05(日) 11:33:58
>>852
ありがとうございます
もっと精進します
0855デフォルトの名無しさん2010/12/05(日) 11:40:54
>>852
そんな面倒な事を覚えなきゃならない欠陥言語をどうして使うんだ?
0856デフォルトの名無しさん2010/12/05(日) 11:51:30
俺はもう覚えてて平気だから気にならない
覚えられない奴は別の言語使えばいいんじゃね
0857デフォルトの名無しさん2010/12/05(日) 13:46:30
virtual関数の仕組みは単純だから基本が分かってれば
個々の場合についていちいち覚えてる必要ないし
0858デフォルトの名無しさん2010/12/05(日) 15:34:00
いっぺんvtableを実装してみれば
あぁそういうことだったのかコンパイラさん面倒なことをいつも引き受けてくれてありがとう
ってなって二度と間違えることはなくなるよ
0859デフォルトの名無しさん2010/12/05(日) 15:38:26
つまり、vtableを実装してみないと使えない欠陥言語という事だね。
0860デフォルトの名無しさん2010/12/05(日) 15:42:57
virtualデストラクタ無し、派生クラスのポインタでdelete→OK

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

Derived drv;
Base* b = &drv;

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

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


0877デフォルトの名無しさん2010/12/06(月) 00:02:05
なん既出に気づいたのに書き込んじゃうかな
0878デフォルトの名無しさん2010/12/06(月) 00:07:50
>>866はどこが嘘?
0879デフォルトの名無しさん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;
}
0880デフォルトの名無しさん2010/12/06(月) 08:55:13
関数ポインタを引数にとる関数があって、その関数の引数に
クラスのメンバ関数を入れたいんですが、エラーが出ます
どうやって書けばいいんですか?
http://codepad.org/iLRdQRAY
0881デフォルトの名無しさん2010/12/06(月) 09:02:57
>>880
ttp://codepad.org/b4iGy7WE
たぶんこうしたいんだろうなぁ
0882デフォルトの名無しさん2010/12/06(月) 13:05:03
iterator traitsのdifference型が満たさなければいけない条件や操作を
全て教えてください。
それとtagを使って多重定義されている関数をコンパイル時に振り分けるとき
スタックにtagをつんだりして実行速度はおそくなりますか?
0883デフォルトの名無しさん2010/12/06(月) 13:12:26
stlのコンテナのイテレータがnext()とか実装されていないのは何故なんでしょうか?
0884デフォルトの名無しさん2010/12/06(月) 13:17:36
>>883
それはいったいなんの役に立つんだ?
0885デフォルトの名無しさん2010/12/06(月) 14:46:49
>>883
すでに ++ があるのになぜわざわざ別に next が必要なのか説明するべき
0886デフォルトの名無しさん2010/12/06(月) 14:49:07
>>884-885
あ、hasNext()みたいなやつです
0887デフォルトの名無しさん2010/12/06(月) 15:25:16
>>886
それはいったいなんの役に立つんだ?
end() と比較するだけでは不十分なのか?
0888デフォルトの名無しさん2010/12/06(月) 16:18:51
そろそろ>>882をよろしくお願いしますね☆
0889デフォルトの名無しさん2010/12/06(月) 16:32:14
実際にはスタックに積むことがあんまりないので
スタックに積んで遅くなることはあんまりない
0890デフォルトの名無しさん2010/12/06(月) 16:42:46
>>888
一つ目の質問。
iterator_traitsにdifferenceというネストされた型名はない。
したがって質問に応えることはできない。

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

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

0905デフォルトの名無しさん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 /,;'"   _,,,,,,,,,_,,,-‐'''-''"~     |
0906デフォルトの名無しさん2010/12/07(火) 03:23:53
if( 904 == 905 )
0907デフォルトの名無しさん2010/12/07(火) 03:34:34
{
0908デフォルトの名無しさん2010/12/07(火) 06:32:00
puts("あんぱん\n");
0909デフォルトの名無しさん2010/12/07(火) 07:26:51
>>908
余計な改行するな。
0910デフォルトの名無しさん2010/12/07(火) 11:29:27
/*
>>909
コメント行にしとけ
コンパイルエラーがでる
*/
0911デフォルトの名無しさん2010/12/07(火) 11:54:25
throw;
0912デフォルトの名無しさん2010/12/07(火) 14:19:50
#if 0
これが便利だ。ぼけども。
#endif
0913デフォルトの名無しさん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づつ増やしたいのですが、間違っている箇所を教えていただきたいです。
0914デフォルトの名無しさん2010/12/07(火) 14:40:49
削りすぎだろおいwww
0915デフォルトの名無しさん2010/12/07(火) 14:41:50
>if (a.jikan[ 1 ].kei >= 420 && a.jikan[ 1 ].kei < 480) {
>count[4] += 1;}
ここ通らないから+1されないんだろ
0916デフォルトの名無しさん2010/12/07(火) 15:16:32
915の方ありがとうございます。
こちらはCSVから条件の値をとっているのですが、
a.jikan[ 1 ].keiの値をコマンドプロンプトで取り出すと全てマイナスでした。
しかし、CSVを見てみるとその値にはマイナスでなく、
a.jikan[ 1 ].kei >= 420 && a.jikan[ 1 ].kei < 480の条件に合った値が載っています。
何故だかわかる方はいらっしゃいますか?
0917デフォルトの名無しさん2010/12/07(火) 15:17:53
エスパーの登場を待て。
0918デフォルトの名無しさん2010/12/07(火) 15:26:26
一部抜粋には条件のところにしか kei 登場してないもんな
俺らには見えないCSVから値をとる処理とやらが間違ってるんだろうと推測するしかない
0919デフォルトの名無しさん2010/12/07(火) 15:28:44
回答してくださった方々ありがとうございます。
私自身も省略が多い等失礼な事をしました。

みなさんからの助言を下に改めて確認してみたいと思います。
本当にありがとうございました。
0920デフォルトの名無しさん2010/12/07(火) 17:59:22
ファイルの一部分を一つのファイルとして開くことってできますか?
例えば四ギガのファイルを開く→二ギガ目に移動→現在の位置をゼロ点にして二ギガのファイルとして開き直す(この時点でtellするとゼロ、終端位置でtellすると二ギガが返る)
世の中そんなに甘くないですかね?
0921デフォルトの名無しさん2010/12/07(火) 18:02:35
その様に動くファイルアクセスクラスでラップする。
0922デフォルトの名無しさん2010/12/07(火) 18:04:59
特殊な要求は自分で書くしかないね
「開き直す」にどんな意味があるのかよくわからないけど
0923デフォルトの名無しさん2010/12/07(火) 18:09:46
バイナリデータをwchat_tのワイド文字列データーに変換や復号する
アルゴリズムみたいなのが、何処かにありませんか?
バイト文字では有るのですが、それをワイド文字に適用しても2バイトになってしまうので><
0924デフォルトの名無しさん2010/12/07(火) 18:45:56
エスパーするとreinterpret_castすればいいだけ
0925デフォルトの名無しさん2010/12/07(火) 18:50:14
>>921-922
コードはどんな感じになりますか?
0926デフォルトの名無しさん2010/12/07(火) 18:59:08
いやお前が考えるんだよ
0927デフォルトの名無しさん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;
}
これをすると正しい値が出ません。どこが間違っているか分かりませんか?
0928デフォルトの名無しさん2010/12/07(火) 19:14:46
/*/
↑
これマジでやってた奴が元同僚にいる
今思い出しても吐き気がする
0929デフォルトの名無しさん2010/12/07(火) 19:17:26
せやなwwww
0930デフォルトの名無しさん2010/12/07(火) 20:10:37
>>927
回答不能です。
「これ」をするとどんな値が出ますか?
「正しい値」とは何ですか?
0931デフォルトの名無しさん2010/12/07(火) 20:13:43
っていうか、それCのプログラムちゃうんか^^
0932デフォルトの名無しさん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);
0933デフォルトの名無しさん2010/12/07(火) 20:36:20
>>927
> a=INT_MAX;
> b=a+1
この時点で何が起こるかわからない。
0934デフォルトの名無しさん2010/12/07(火) 20:51:02
>>932
いえ、そのー説明が不備で申し訳ありません。
例えば
0x00ff00ff のようなバイナリーデータが有ったとき。
文字コードに変換し−>”ASASDFDFASASDFDF”(内容は適当)保存して。
復号化は
”ASASDFDFASASDFDF” -> 0x00ff00ff にしてバイナリーにして使用する。
昔で言うishだったかなー、これのワイド文字コード版です。
0935デフォルトの名無しさん2010/12/07(火) 21:00:18
http://hibari.2ch.net/test/read.cgi/tech/1287477677/843
0936デフォルトの名無しさん2010/12/07(火) 21:04:54
なんという宿題マルチ丸投げ
09379342010/12/07(火) 21:09:31
今のところ、下のような変換テーブル作るしか思いつかなかった…

L"一丁七万丈三上下不与丐丑且丕世丗丘丙丞両並个中丱串丸丹主丼丿乂乃", // 4E00
L"久之乍乎乏乕乖乗乘乙九乞也乢乱乳乾亀亂亅了予争亊事二于云互五井亘", // 4E45
L"亙些亜亞亟亠亡亢交亥亦亨享京亭亮亰亳亶人什仁仂仄仆仇今介仍从仏仔", // 4E99
L"仕他仗付仙仞仟代令以仭仮仰仲件价任企伉伊伍伎伏伐休会伜伝伯估伴伶", // 4ED5
0938デフォルトの名無しさん2010/12/07(火) 21:13:50
Base64?
09399342010/12/07(火) 21:17:51
Base64はbyte文字コード用なので、それのwchar_t用が無いかなと。
0940デフォルトの名無しさん2010/12/07(火) 21:23:26
一般的なものは無いでしょ
ASCIIみたいにどこでも転送・表示可能な文字に変換するから存在意義があるわけで
09419322010/12/07(火) 21:27:07
>>934
UTF-16で使っちゃいけなさそうなのは(0000, D800〜DFFFF,FFFE, FFFF)ぐらいで、
殆ど全部のコードが使えるわけだから、効率的なアルゴリズムはないんじゃない?
09429342010/12/07(火) 21:34:58
>>941
そう思って、簡単な変換作ってprintしたら−>??????????享??????????
になってしまって、対応する漢字がないと印刷できなかった…
やっぱり、テーブル索引しかないかな〜
0943デフォルトの名無しさん2010/12/07(火) 21:45:15
>>942
はぁ? 日本語環境で印刷できる文字だけにしたいなら
ishで漢字にしたのをwchar_tに変換すりゃいいだけでしょ。
wchar_tとか関係ないんじゃ。
09449342010/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にしたら、約倍に増えるわけで…
0945デフォルトの名無しさん2010/12/07(火) 22:16:38
プログラマのための文字コード技術入門(技術評論社)をちょうど今読んでるところだから、読み終わったら回答するよ!
0946デフォルトの名無しさん2010/12/07(火) 22:38:16
好きにマッピングしたらいいがな
端末によっては表示不可とか、サイトによっては投稿不可とか、かなり環境選ぶと思うが
0947デフォルトの名無しさん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)にマッピング
してやると効率がいい。あとはマッピングテーブルなんてプログラムで生成すればいい。
0948デフォルトの名無しさん2010/12/07(火) 22:49:18
それって結局ishになるんじゃね
0949デフォルトの名無しさん2010/12/07(火) 22:52:12
enum {test1, test2}みたいな感じで、enumを使っていました
enumの名前が書かれていなかったのですが、何の意味があるのですか?
0950デフォルトの名無しさん2010/12/07(火) 22:56:03
意味がないから書いてないんじゃね
0951デフォルトの名無しさん2010/12/07(火) 22:56:10
>>949
定数を書く時に#defineが嫌いだったに違いない。使う時はint型として使うしかない
0952デフォルトの名無しさん2010/12/07(火) 22:58:14
>>951
thx
0953デフォルトの名無しさん2010/12/07(火) 22:58:47
名前をつけるとそれは型名として使える^^
enum E { yes, no };
bool f( E e ) {
return e != no;
}

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

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

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

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

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

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

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

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