C++相談室 part86
レス数が1000を超えています。これ以上書き込みはできません。
0001v(^・^)v
2010/11/06(土) 02:03:15ただし質問の前にはFAQに一通り目を通してください。
IDE (VC++など)などの使い方の質問はその開発環境のスレに
お願いします。
前スレ
C++相談室 part85
http://hibari.2ch.net/test/read.cgi/tech/1286623355/
0002v(^・^)v
2010/11/06(土) 02:05:59[C++ FAQ]
http://www.parashift.com/c++-faq/
http://www.bohyoh.com/CandCPP/FAQ/ (日本語)
Cとその仕様を比較しながらの解説なので分かりやすい。
***** 質問の前に必ずこの二つに目を通してください *****
[C/C++ リファレンス]
http://www.cppreference.com/ (英語)
http://www.cppreference.com/wiki/jp/ (↑の日本語訳だけどまだ未完)
[禿 Stroustrup]
http://www.research.att.com/~bs/
[C++ International Standard]
http://www.iso.org/iso/iso_catalogue/catalogue_tc/catalogue_detail.htm?csnumber=38110
[JTC1/SC22/WG21 - C++]
http://www.open-std.org/jtc1/sc22/wg21/
ここから規格の最新(2003より新しい)ドラフトがダウンロードできる。
[JIS X3014]
http://www.jisc.go.jp/app/pager?id=15868
ISO規格の日本語訳。JIS X 3014:2003はISO/IEC 14882:2003 (E)に対応。
0003v(^・^)v
2010/11/06(土) 02:07:02[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(^・^)v
2010/11/06(土) 02:10:41amazon 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(^・^)v
2010/11/06(土) 02:13:26Effective 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(^・^)v
2010/11/06(土) 02:17:42http://codepad.org/
http://ideone.com/
0007v(^・^)v
2010/11/06(土) 02:19:57環境によるだろ。
俺はBorland-C++5.6.2に -D_RTLDLL オプションを指定して、極力
ランタイムを使用するようにして使っているが、例えばstd::vectorを
使っても使わない時と比べ10Kほどしか増えない
すげえ。ダイナミックリンクしといてファイルサイズが増えないとかいってるよ。この人。
C1010: プリコンパイル済みヘッダーの検索中に予期しない EOF を検出しました。
とかいうエラーが出るんだけどこれってどうすればいいの?
#include <stdafx.h>
後死ね。
言葉が悪いな。それで教えているつもりか。
まぁヒントぐらいにはなったな。
うむごくろう。
0008デフォルトの名無しさん
2010/11/06(土) 02:22:23スレ立て乙だが、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(^・^)v
2010/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:12protecteed で許されるアクセスは this を通してのみ。
そんなわけで、よく見る「派生クラスからアクセスできる」という説明は不十分。
おとなしく private/public で済ませるのがおすすめ。ほんとうに protected が
使いたいとしても、メンバ変数直はやめとけ。
0012デフォルトの名無しさん
2010/11/06(土) 02:32:57>やっぱりそれ要るの?
いや単なる地鎮祭w
不要だと思うけど面白いじゃんw
0013デフォルトの名無しさん
2010/11/06(土) 02:34:47こういうことじゃね?
自分の親のすねはかじれるが
他人の親のすねはかじれない
ただし、友達にたかることはできる
0014デフォルトの名無しさん
2010/11/06(土) 02:47:2811.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:00void Application::Change(Application& other) {
other.value = value;
}
これなら問題ないわけだ
0016デフォルトの名無しさん
2010/11/06(土) 02:53:270018デフォルトの名無しさん
2010/11/06(土) 03:03:11Applicationから派生したクラスのポインタもしくはリファレンスもしくはオブジェクト
を通してもアクセス出来るが、この場合どのようにクラス階層を重ねればいいのか
俺にはわからん
先行宣言しようとするとエラーになるし
0019デフォルトの名無しさん
2010/11/06(土) 03:04:46通してアクセス出来るという意味ならそうなのかもしれん
というかそれしかコンパイル出来ないしな
0020デフォルトの名無しさん
2010/11/06(土) 03:06:22要するにこういう事だと思う
0021デフォルトの名無しさん
2010/11/06(土) 03:07:48取りあえず今はもう一つメンバ関数作ってそこから値を操作するようにしていますがもう少し勉強してから再度読み直してみます。
詳しく解説頂き感謝です。
0022デフォルトの名無しさん
2010/11/06(土) 03:07:53> 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のポインタやリファレンスだと親クラスのBasicを引数に取れないのでBasicのメンバ変数を操作しようがないように思うのですがどうなんでしょうか。
続けて質問で申し訳ないです。
void Application::Change(Application& other) {
other.value = value;
}
0024デフォルトの名無しさん
2010/11/06(土) 03:24:26class Basic {
friend class Application ;
protected:
int value;
public:
void Change(Basic& other);
};
0025デフォルトの名無しさん
2010/11/06(土) 03:25:56そうします。
回答ありがとうございました。
0026デフォルトの名無しさん
2010/11/06(土) 03:28:29http://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そやね
手持ちの詳説C++にもfriendクラスとして派生クラスを宣言する事を推奨している
0028デフォルトの名無しさん
2010/11/06(土) 03:45:20基底クラスが派生クラスのことを知っている上に friend とか、
protected を使うためにどんだけ犠牲にする気だ。
おとなしく private/public で組めよ。
0029デフォルトの名無しさん
2010/11/06(土) 03:46:380030デフォルトの名無しさん
2010/11/06(土) 03:47:14方針としては中途半端。
「見えちゃ嫌だけどちょっとは見えたほうが」
そんなの微妙すぎ。
0031デフォルトの名無しさん
2010/11/06(土) 03:50:550032デフォルトの名無しさん
2010/11/06(土) 03:54:07これでいいだろ
0033デフォルトの名無しさん
2010/11/06(土) 12:47:26これで問題ないですか?
INT value;
do {value=genrand_int31()%n;}
while(value>=0x0fffffff-value%n);
0034デフォルトの名無しさん
2010/11/06(土) 15:15:08ループなんかまわしたらダメに決まってるだろ。
その処理が終わったときの擬似乱数発生器の状態に
一定の制約がかかることになるんだから。
スレ違いなんで、まだなんかあるなら↓へどうぞ。
疑似乱数2
http://hibari.2ch.net/test/read.cgi/tech/1192628099/
0035デフォルトの名無しさん
2010/11/06(土) 22:37:59レスサンクス
どうやって直せばいいか分からないので聞いてきます。
0036デフォルトの名無しさん
2010/11/06(土) 22:48:240037デフォルトの名無しさん
2010/11/07(日) 08:47:44Messageboxのタイトルとか、ボタンのスタイルなどは、マニュピレーターにして変更できるようにしたほうが良いのでしょうか?
例)
msgbox << _T("こんにちは、世界!") << mb_title(_T("テストだよ〜ん")) << mb_style(MB_OK) << std::endl;
こんな感じで利用できるように
0038デフォルトの名無しさん
2010/11/07(日) 08:49:08普通に関数でいいやん
0039デフォルトの名無しさん
2010/11/07(日) 09:13:550040デフォルトの名無しさん
2010/11/07(日) 09:34:240041デフォルトの名無しさん
2010/11/07(日) 09:41:540042デフォルトの名無しさん
2010/11/07(日) 10:59:14おかしいと思うのは俺だけか
0043デフォルトの名無しさん
2010/11/07(日) 11:30:13それだけでよかったのに
0044デフォルトの名無しさん
2010/11/07(日) 12:29:10これってどういう意味ですか。
0045デフォルトの名無しさん
2010/11/07(日) 12:36:200046デフォルトの名無しさん
2010/11/07(日) 12:37:100047デフォルトの名無しさん
2010/11/07(日) 12:38:40個数だけじゃダメだろ。型情報がないと非PODが渡されたときに困る。
というか可変長引数は型安全性がダメすぎる
0048デフォルトの名無しさん
2010/11/07(日) 13:11:21じゃあ~double() とかはどうなるんだろう
0049デフォルトの名無しさん
2010/11/07(日) 13:11:510050デフォルトの名無しさん
2010/11/07(日) 13:14:390051デフォルトの名無しさん
2010/11/07(日) 13:40:24{
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ネゲート命令のことならそれは単項マイナス
ハードでいうアサートの反対じゃねえぜ
NEG ではなく NOT な
0053デフォルトの名無しさん
2010/11/07(日) 13:53:37だから~int()はデストラクタじゃないから
0054デフォルトの名無しさん
2010/11/07(日) 13:55:09intもplacement newできるのに、~int()が通らないってなんだろね。
0055デフォルトの名無しさん
2010/11/07(日) 13:56:41>>51はテンプレートパラメータならintを通せるのはなぜ?って言ってるんじゃないか?
0056デフォルトの名無しさん
2010/11/07(日) 14:12:59禿本に書いてあるやん
0057デフォルトの名無しさん
2010/11/07(日) 14:51:37いちいち、wsprintfとか使って出力を整形するのに疲れた
msgbox << _T("変数xの値:") << x << std::endl;
これで済むなら、この方が楽で良いと思うの
0058デフォルトの名無しさん
2010/11/07(日) 14:57:12void foo(bar* param) {
param->method();
005958
2010/11/07(日) 15:00:03void 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:440061デフォルトの名無しさん
2010/11/07(日) 15:28:20char_array<100> a;
char_array<333> b;
char_array<555> c;
のように使いたいのですが、うまいtypedefの仕方ありますか?
0062デフォルトの名無しさん
2010/11/07(日) 15:33:55俺なら
MessageBox("変数xの値:%d", x);
とできるようにするけどそれじゃダメなんか
0063デフォルトの名無しさん
2010/11/07(日) 15:54:42ポインタだとnullが渡される可能性が生じるのでは
0064デフォルトの名無しさん
2010/11/07(日) 16:16:500065デフォルトの名無しさん
2010/11/07(日) 16:32:54それだと、変数の型に縛られるのがいまいちだなぁと思うの
0066デフォルトの名無しさん
2010/11/07(日) 16:34:400067デフォルトの名無しさん
2010/11/07(日) 16:53:31いや、boost::formatを参考にして作るぐらいなら、boost::formatがそのまま利用できるようにした方がいいのでは?
0068デフォルトの名無しさん
2010/11/07(日) 16:55:54オレはCStringで充分だな
0069デフォルトの名無しさん
2010/11/07(日) 16:58:06myclass obj;
cout << obj;
msgbox << obj;
試したこと無いけど
こうすれば汎用性が高くなるかな?
0070デフォルトの名無しさん
2010/11/07(日) 18:46:36boost::formatはstringが返されるんだからc_strすればMessageBoxに直接渡せるだろ。
0071デフォルトの名無しさん
2010/11/07(日) 20:29:05そんなこと言ったら、stringstreamだってstr()でstringが返るんだから、c_str()でMessageBoxに直接渡せるじゃん
で、そんな野暮ったいことをするぐらいなら、ストリーム化したほうが格好良いじゃんってなって、以下ループじゃないの?
0072デフォルトの名無しさん
2010/11/07(日) 21:12:060073デフォルトの名無しさん
2010/11/07(日) 21:15:34int型のコンストラクタにいくらでも引数渡せるのは何故ですか
0074デフォルトの名無しさん
2010/11/07(日) 21:23:580075デフォルトの名無しさん
2010/11/07(日) 21:26:470076デフォルトの名無しさん
2010/11/07(日) 21:46:02通らんが
0077デフォルトの名無しさん
2010/11/07(日) 22:03:00p = new int(6);
ってやってるのと一緒なんだけどな
0078デフォルトの名無しさん
2010/11/07(日) 22:24:480079デフォルトの名無しさん
2010/11/07(日) 22:37:28多分VC独自の拡張だと思うけど、本来のC++の文法から逸脱している
0080デフォルトの名無しさん
2010/11/07(日) 22:45:56VC10で試したけど、VCの拡張ですって警告も出ないな。
>>78
残念なことに>>77のいうとおりカンマ演算子の動作をしてるっぽい。バグじゃないのか?
こうなら問題ないのにな
int* p = new int(( 0, 1, 2, 3, 4, 5, 6 ));
0081デフォルトの名無しさん
2010/11/07(日) 22:45:56int* 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>構文解析の時に)に一番近い6しか選択されないようになってるだけでしょ
それはバグじゃね?普通にクラスだとそんな動作しないぞ
0083デフォルトの名無しさん
2010/11/07(日) 22:57:010084デフォルトの名無しさん
2010/11/07(日) 22:59:49こういう致命的なバグを持っているとBoostで通らない場合が出て来たりして
都合が悪い
MSに報告しとくか
0085デフォルトの名無しさん
2010/11/07(日) 23:11:320086デフォルトの名無しさん
2010/11/07(日) 23:21:070087デフォルトの名無しさん
2010/11/07(日) 23:47:28なんだ?
0088デフォルトの名無しさん
2010/11/07(日) 23:52:520089デフォルトの名無しさん
2010/11/08(月) 00:29:18gccよりVSが規格に近かったって聞いた試しがないけど・・・
0090デフォルトの名無しさん
2010/11/08(月) 00:31:210091デフォルトの名無しさん
2010/11/08(月) 00:38:000092デフォルトの名無しさん
2010/11/08(月) 00:49:14間違いでいいんじゃないか
0093デフォルトの名無しさん
2010/11/08(月) 07:29:58例えば以下クラス内関数
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自分をdeleteするのは構わないが
その時点で開放されてるので
以後仮想メンバ関数や非staticメンバ変数へのアクセスはしていけない
1,2,3は全部ダメな可能性があるし大丈夫かもしれない
0095デフォルトの名無しさん
2010/11/08(月) 07:54:32static もクラス内ではあるわけで
外部の関数ってのは
::func3(); と書けばコメントは必要ない
0096デフォルトの名無しさん
2010/11/08(月) 08:04:12delete this の後にある、 this に対する非 static メンバアクセスは
メンバ関数呼び出しも含めてすべて未定義動作になる。
0097デフォルトの名無しさん
2010/11/08(月) 08:11:59ありがとう、自分をdeleteするのは問題ないけれど、delete後はstaticで宣言されていない
自分の変数,関数に触るのはいけないのね。
0098デフォルトの名無しさん
2010/11/08(月) 12:00:450099デフォルトの名無しさん
2010/11/08(月) 13:09:05「delete thisを書け!さもなくば人質を殺す!」
って言われた場合とか??
0100デフォルトの名無しさん
2010/11/08(月) 13:11:340101デフォルトの名無しさん
2010/11/08(月) 13:23:280102デフォルトの名無しさん
2010/11/08(月) 13:53:53民のためぇ…これは民のためなんだからぁ〜ん…カタカタ
0103デフォルトの名無しさん
2010/11/08(月) 13:56:360104デフォルトの名無しさん
2010/11/08(月) 15:50:46解決法ってありますか?
0105sage
2010/11/08(月) 16:22:01*.cppのファイルをコンパイルしたときに
「致命的エラー F1003 c:\Borland\Bcc55\include\stdcomp.h 5: error 指令: Must use C+
+ for STDCOMP.H
*** 1 errors in Compile ***
new_dog.cpp:」
上記のようなエラーが出たのですが、なぜでしょうか?
0106デフォルトの名無しさん
2010/11/08(月) 16:41:21ピリオドが2個ついてたり全角小文字になってたりしないか?
ちゃんと合ってるなら後はコンパイルオプションで -P を付けるとか
0107デフォルトの名無しさん
2010/11/08(月) 16:47:48コンパイルが通りました!ありがとうございました
致命的エラー F1003 ←このエラーって.cファイルのときに出るもんだと
思っていたんですが、.cppファイルでも出るとは思いませんでした。
new_dog.cpp ファイル名は正しいはずなんですが・・・
0108デフォルトの名無しさん
2010/11/08(月) 16:52:380109デフォルトの名無しさん
2010/11/08(月) 16:56:09.txtになってなかったです。一瞬ヒヤっとしました。
0110デフォルトの名無しさん
2010/11/08(月) 17:21:02ppc.god_wen
0111デフォルトの名無しさん
2010/11/08(月) 17:40:390112デフォルトの名無しさん
2010/11/08(月) 17:51:040113デフォルトの名無しさん
2010/11/08(月) 18:13:020114デフォルトの名無しさん
2010/11/08(月) 18:14:490115デフォルトの名無しさん
2010/11/08(月) 20:33:08C++にはC#のプロパティに近い機能かそれを再現するライブラリはありますでしょうか?
0116デフォルトの名無しさん
2010/11/08(月) 20:51:07http://www.codeproject.com/KB/cpp/properties.aspx
でも普通はgetterとsetterを使う。
0117デフォルトの名無しさん
2010/11/08(月) 21:04:301からその整数までの和を出させるプログラムを書きたいのですが
うまく動きません
#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悪いことは言わん。素人のみでそれを使うのはやめなされ…
0119デフォルトの名無しさん
2010/11/08(月) 21:07:12悪いことは言わん。素人のみでそれを使うのはやめなされ…
0120デフォルトの名無しさん
2010/11/08(月) 21:10:11printf("x = %d", i);
}
0121デフォルトの名無しさん
2010/11/08(月) 21:10:52#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:11xをせっかく0で初期化してんのにscanfでxに値代入してるじゃん。
0123デフォルトの名無しさん
2010/11/08(月) 21:22:40できれば値はxとiのみで書きたいのですが
どこを直せばいいでしょうか?
0124デフォルトの名無しさん
2010/11/08(月) 21:24:06>>120
0125デフォルトの名無しさん
2010/11/08(月) 21:24:55ありがとうございます。
コンパイラ依存は面倒ですね・・・
クラス外部から書き換え不可(読み取り専用)なメンバってのも指定出来ませんか
0126デフォルトの名無しさん
2010/11/08(月) 21:27:13できれば全文書いていただけるとありがたいです
0127デフォルトの名無しさん
2010/11/08(月) 21:30:260128デフォルトの名無しさん
2010/11/08(月) 21:30:54for文は何ヶ所もねえだろ
ちったぁ自分で考えろ
0129デフォルトの名無しさん
2010/11/08(月) 21:50:55>>127
int型1つで十分だお
0130デフォルトの名無しさん
2010/11/08(月) 21:53:06#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:230132デフォルトの名無しさん
2010/11/08(月) 22:00:22きれいにまとまってるな
どうしてfor文のiに--がつくんだろう
0133デフォルトの名無しさん
2010/11/08(月) 22:02:540134デフォルトの名無しさん
2010/11/08(月) 22:07:100135デフォルトの名無しさん
2010/11/08(月) 22:48:41gccが使っていない変数(パラーメータ)があるよと警告してきますが、
どのようにすれば黙らせることができるのでしょうか?
0136デフォルトの名無しさん
2010/11/08(月) 23:05:090137質問です
2010/11/08(月) 23:17:49普通なら下のように実装するのでしようが、
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:090139>>137
2010/11/08(月) 23:26:48× bool GetValue(int& pValue) const
○ bool GetValue(int* pValue) const // まぁint&の方がいいのでしょうけど
>>138
なるほどその手もありますね。
0140デフォルトの名無しさん
2010/11/08(月) 23:27:400141デフォルトの名無しさん
2010/11/08(月) 23:44:270142デフォルトの名無しさん
2010/11/08(月) 23:51:14例外かエラーコードかどっちなの?ってだけでしょ
0143デフォルトの名無しさん
2010/11/08(月) 23:54:32おいおいどこがポインタだよ
0144デフォルトの名無しさん
2010/11/09(火) 00:00:16他の関数でのエラー通知法とあわせるって話じゃないの
0145デフォルトの名無しさん
2010/11/09(火) 01:35:21class 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:030147デフォルトの名無しさん
2010/11/09(火) 02:00:28単純に以下の形ではだめなの?
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:510149デフォルトの名無しさん
2010/11/09(火) 06:53:342-3週間ぐらい前に落ちてそれっきり。
0150デフォルトの名無しさん
2010/11/09(火) 15:46:22ありがとう。p*をclassのなかに追加することにしました。
bにもp*を持つことになるけど、bは次のcについて最も近い点(Xc,YcZc)の情報を保持
するのに使うので無駄にはならないかなぁと。
0151デフォルトの名無しさん
2010/11/09(火) 18:43:12実行してもうまくいきません
どこがおかしいのか指摘してくれませんか?
#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:560153デフォルトの名無しさん
2010/11/09(火) 19:15:240154デフォルトの名無しさん
2010/11/09(火) 19:44:590155デフォルトの名無しさん
2010/11/09(火) 19:46:540156デフォルトの名無しさん
2010/11/09(火) 20:04:180157デフォルトの名無しさん
2010/11/09(火) 20:35:530158デフォルトの名無しさん
2010/11/09(火) 20:38:02うっかり min や max をつぶしてしまったことがありました。
0159デフォルトの名無しさん
2010/11/09(火) 20:41:22kwsk
0160デフォルトの名無しさん
2010/11/09(火) 20:59:16stdはものすごい広いので、把握できないほど大量の物が定義されており
うっかり被って怒られることがあるのでやめたほうがいい
特にグローバル領域でやるのは
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:340164デフォルトの名無しさん
2010/11/09(火) 21:55:490165デフォルトの名無しさん
2010/11/09(火) 21:57:400166デフォルトの名無しさん
2010/11/09(火) 22:07:23はげしくダメだろう。
0167デフォルトの名無しさん
2010/11/09(火) 22:23:44C++ではあまりディレクトリに分割しないんですか?
0168デフォルトの名無しさん
2010/11/09(火) 22:27:400169デフォルトの名無しさん
2010/11/09(火) 23:14:17g++かVC++を想定しています
0170デフォルトの名無しさん
2010/11/09(火) 23:38:180171デフォルトの名無しさん
2010/11/09(火) 23:43:24スタックをスタックにとるかヒープにとるかの違いに意味があるのか
0172デフォルトの名無しさん
2010/11/09(火) 23:54:260173デフォルトの名無しさん
2010/11/10(水) 01:00:280174デフォルトの名無しさん
2010/11/11(木) 03:46:22例えば
int* a,b;
としたとき、これは
int *a;//aはポインタ
int b;//bは実体
こういう解釈になるらしい?
0175デフォルトの名無しさん
2010/11/11(木) 03:49:420176デフォルトの名無しさん
2010/11/11(木) 03:52:55ご返答感謝
ということは全部ポインタにしたい場合
int *a,*b;
ですね
0177デフォルトの名無しさん
2010/11/11(木) 06:15:55int* a;
int* b;
でおねがいします。
0178デフォルトの名無しさん
2010/11/11(木) 08:11:22素人か?
力抜けよ
0179デフォルトの名無しさん
2010/11/11(木) 09:04:030180デフォルトの名無しさん
2010/11/11(木) 12:11:39C++の開発現場に回されることになりそうなんですが、
OSがAIXということで、気をつけなくてはいけないところがありますか?
今まではUNIXやsolarisでmakefileを使ってコンパイルしてました。
0181デフォルトの名無しさん
2010/11/11(木) 12:19:42IBMのコンパイラのマニュアルでも斜め読みしておけば?
0182デフォルトの名無しさん
2010/11/11(木) 13:06:43話の流れでそれがふと思い浮かんだけどできなかった
そのためのtypedefか
0183デフォルトの名無しさん
2010/11/11(木) 14:36:430184デフォルトの名無しさん
2010/11/11(木) 15:04:39環境依存スレが立ったようなのでそっちで聞いた方が良い
0185デフォルトの名無しさん
2010/11/11(木) 17:03:43ネットにAIXのマニュアルが転がってたので見てみることにします
マニュアルの癖に読みづらいな〜w
0186デフォルトの名無しさん
2010/11/13(土) 05:30:18これはC言語のstrcpy()やstrcmp()と同じヘッダーファイル
なんだろうか。
0187デフォルトの名無しさん
2010/11/13(土) 07:09:100188デフォルトの名無しさん
2010/11/13(土) 09:00:370189デフォルトの名無しさん
2010/11/13(土) 11:15:15pimplで翻訳単位を分割してコンパイルを早くしたい
だけど実行効率も無視できない部分なのでnew/deleteを削りたい
こんな時はどうすればいいですか?
0190デフォルトの名無しさん
2010/11/13(土) 11:58:41pimplとnew/deleteが競合する理由がわからない
0191デフォルトの名無しさん
2010/11/13(土) 12:16:06class 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:52ENEOUGN_LENGTHがサイズを無駄にする可能性があるけど、重いヘッダーに対してnew(普通の)のコストは誤差レベルが多いだろうからshared_ptrでpimplれば十分だと思う。
0193デフォルトの名無しさん
2010/11/14(日) 13:10:170194デフォルトの名無しさん
2010/11/14(日) 14:04:330195デフォルトの名無しさん
2010/11/14(日) 14:08:440196デフォルトの名無しさん
2010/11/14(日) 14:37:23{
T< S > v;
};
Foo< std::vector, int > foo;
これ出来ないんですが解決する方法教えてください
0197デフォルトの名無しさん
2010/11/14(日) 14:48:50http://codepad.org/ZfbUNorW
0198デフォルトの名無しさん
2010/11/14(日) 14:50:090199デフォルトの名無しさん
2010/11/14(日) 15:45:58意味は普通の const と同じ
特徴は次のようなのがある
・メンバー変数を変更される恐れがない
・ (a + b).hoge() といった使い方ができない
0200デフォルトの名無しさん
2010/11/14(日) 16:17:05mutableを使うとconstメンバーだと思ったら、状態が変わっていたということになる。だから、状態が変わったことがクラスの外からは無関係な場合に使用する。たとえばキャッシュとか。
マルチスレッドでは、constメンバー関数は再入可能な実装が多いが、mutableがあるとconstメンバー関数も再入不可になる可能性がある。再入可能にするためにはmutex等でmutexメンバーを保護する必要がある。
0202デフォルトの名無しさん
2010/11/14(日) 17:29:44その関数を呼び出してもメンバ変数が書き換わらないことを意味する
0204デフォルトの名無しさん
2010/11/14(日) 17:44:29→ メンバー変数を変更される恐れがない
それじゃ、std::string func() const;と何が違うのですか
→ その関数を呼び出してもメンバ変数が書き換わらないことを意味する
???
0205デフォルトの名無しさん
2010/11/14(日) 17:49:53>>199の・メンバー変数を変更される恐れがない は
const hoge& getHoge()const{return m_hoge;}
のことを言ってると思われ
constつけないと戻りの参照でメンバーを変更できるでしょ
0206デフォルトの名無しさん
2010/11/14(日) 17:55:34→ 返り値が変更される恐れがない
ex) if(func() = 1){}っていうミス防止
std::string func() const;は?
→ その関数を呼び出してもメンバ変数が書き換わらないことを意味する
の間違いじゃねえのか
0207デフォルトの名無しさん
2010/11/14(日) 17:58:220208デフォルトの名無しさん
2010/11/14(日) 18:01:270209デフォルトの名無しさん
2010/11/14(日) 18:26:04前のconstは戻り値がconstになる
後のconstはUの全メンバ変数がconstになる
0210デフォルトの名無しさん
2010/11/14(日) 18:35:03>>193>>200はその布石だったのだよ!!
0211デフォルトの名無しさん
2010/11/14(日) 18:59:47結局、矛盾を取り繕うための対処策なんだよな
0212デフォルトの名無しさん
2010/11/14(日) 19:55:070213デフォルトの名無しさん
2010/11/14(日) 21:42:30そうそう。
奥が深いんだと勘違いしているだけだろう。
いや引き返せなくなっちゃっているからその仕事は大事なんだけどさ。
0214デフォルトの名無しさん
2010/11/14(日) 21:50:240215デフォルトの名無しさん
2010/11/14(日) 22:08:20#define HAIR TEXT("ふさふさ")
#endif
0216デフォルトの名無しさん
2010/11/14(日) 23:15:57#undef HAIR
0217デフォルトの名無しさん
2010/11/14(日) 23:18:12C++を助ければいいのか頭髪を助ければいいのか。
0218デフォルトの名無しさん
2010/11/14(日) 23:20:310219デフォルトの名無しさん
2010/11/14(日) 23:23:26安全性にも気遣って欲しいお…
0220デフォルトの名無しさん
2010/11/14(日) 23:25:060221デフォルトの名無しさん
2010/11/14(日) 23:29:43それじゃあC++が進歩せんだろ。
lambda取り入れたぐらいだし、
もうどんどん他の言語の良いとこ取り込んだ方がいいと思うぜ。
0222デフォルトの名無しさん
2010/11/14(日) 23:40:050223デフォルトの名無しさん
2010/11/14(日) 23:40:36or .NETのexeからネイティブexeを生成する。
0224デフォルトの名無しさん
2010/11/14(日) 23:48:36サンクス
オナってくる
やはりC++は豊穣やな
0225デフォルトの名無しさん
2010/11/15(月) 00:01:15特に矛盾なく実装できそうなんだが…
private なメンバ関数を増やすだけなんてインターフェイスを変えずに実装を変えてるだけなのに、
その都度ヘッダを見てるソース全コンパイルなんてどう考えてもおかしいだろう
何のためのインターフェイス分離だ
pimpl 使うのはいいけどコピーコンストラクタとか書くの面倒だし、
なによりコンパイル速度を上げるためだけに、実行速度を犠牲にしてまで構造を変えるってのが気持ち悪い
でも実装されないってことは何か理由があるんだと思うんだが
実際に何があるの?
0226デフォルトの名無しさん
2010/11/15(月) 00:07:570227デフォルトの名無しさん
2010/11/15(月) 00:10:44純粋仮想関数だけ宣言したクラスで、何か不満か?
0228デフォルトの名無しさん
2010/11/15(月) 00:12:080229デフォルトの名無しさん
2010/11/15(月) 00:15:12でもC#使ってると、如実にその力を感じるわよ。
IListとかIDisposableとか、何のインターフェイスがあるかで機能がすぐ分かるし、
それに何より安心感がある。
ドキュメント見ながら修正〜みたいな事も減るし、良い事づくめの様に思えるが?
今までのままでなんとかなるっつーても、それはそうだけど、
オブジェクト指向の精神から言うと絶対に入れるべき機能に思えるんだぜ。
開発者が楽するためにってのもすごく重要だし。
0230デフォルトの名無しさん
2010/11/15(月) 00:17:180231デフォルトの名無しさん
2010/11/15(月) 00:19:140232デフォルトの名無しさん
2010/11/15(月) 00:19:420233デフォルトの名無しさん
2010/11/15(月) 00:21:380234デフォルトの名無しさん
2010/11/15(月) 00:25:08C++でダックタイピングってどうなの?
あれは動的言語じゃなきゃ出来ないかと思ってたんだけど…。
確かにテンプレートを知った時は、
「うはwwwwこれでダックタイピング出来るじゃんwww」
って思ったけど、C++って一応静的言語だよね…?
実行時型判断とかやってるの?
初心者の質問ごめんなさい。でも誰か答えてたもれ。
0235デフォルトの名無しさん
2010/11/15(月) 00:28:230236デフォルトの名無しさん
2010/11/15(月) 00:29:13生ポインタはunsafeコンテキスト外で使用禁止とかさ
0237デフォルトの名無しさん
2010/11/15(月) 00:31:290238デフォルトの名無しさん
2010/11/15(月) 00:33:30それはそうなんだけど、その静的動作がダックタイピングって言えるのかなっていう疑問です。
ダック"タイピング"だから、打ち込む時の扱いでダックタイピングだと決めていいのかな…?
>>236
それC#…ってツッコミを待っているのか貴様ッ!
C#はVS2010でやっとポインタインデックスに対する加算からアドレスを求めるメソッドが実装されましたよヤレヤレ…
危険な機能でもC系列の末裔なんだからさっさと欲しかったです…
0239デフォルトの名無しさん
2010/11/15(月) 00:36:30.NETでポインタ演算したいならC++/CLI使おうよ
0240デフォルトの名無しさん
2010/11/15(月) 00:39:170241デフォルトの名無しさん
2010/11/15(月) 00:40:52C的キャストにおいてC++キャストに置き換え可能なときはエラー
とかしても良かったと思う。
下請けがCキャスト使いすぎだってばよ!
0242デフォルトの名無しさん
2010/11/15(月) 00:42:190243デフォルトの名無しさん
2010/11/15(月) 00:42:580244デフォルトの名無しさん
2010/11/15(月) 00:45:34何となく木構造の構築する手順は解ったんだけど、
実際に最近傍探索をどうやるのかが解らない。詳しい人居ますかね?
0245デフォルトの名無しさん
2010/11/15(月) 00:45:58dynamic
0246デフォルトの名無しさん
2010/11/15(月) 00:46:51じゃあなんか適当に西洋人に受けそうな名前をつければいいよ。
「チャイニーズダックタイピング」とかなんとか。
0247デフォルトの名無しさん
2010/11/15(月) 00:47:09どうせならコンパイルエラー吐いてくれれば最高だ
ウチで採用する
0248デフォルトの名無しさん
2010/11/15(月) 00:51:38面倒な奴だな。その言葉遊びにどれほどの実益があるのかしらんけど
Matzとでも語ってりゃいいんじゃね?
http://jp.rubyist.net/magazine/?0018-Legwork
0249デフォルトの名無しさん
2010/11/15(月) 00:52:02逆だろ
C++キャスト"に"、だよ
0250デフォルトの名無しさん
2010/11/15(月) 01:03:28いや単純に疑問でさ…ごめんよ。そういうトリヴィアルな所が気になっちゃうんだ。
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非ダックタイピングてのはduckはwalkとquackのメソッドを持つと予め宣言する必要があるものをいう。
C++ではコンセプトだな。流れたが。
0253デフォルトの名無しさん
2010/11/15(月) 01:44:57TCHARってのは
ユニコード環境でもマルチバイト環境でも使えるようにっていうWindows定義の型
VSならプロジェクトの構成プロパティに
文字セットをどちらにするかの設定がある
Unicode文字セットを使用するなら
typedef wchar_t TCHAR;
マルチバイト文字セットなら
typedef char TCHAR;
となる
同様に、LPTSTRも文字セットの違いによって
wchar_t*型かchar*型の違いがでる
なのでTCHARにしとかないと
どちらかの環境ではエラーがでることになるのでたぶん正しいんじゃない?
全コード見たわけじゃないからなんともいえないけど
0254デフォルトの名無しさん
2010/11/15(月) 01:45:00とりあえず書かれた内容にあからさまな間違いは見当たらないから大丈夫じゃね?
やってみるといいよ。
ただし std::vector か std::string の使用を強くお勧めするよ。
0255デフォルトの名無しさん
2010/11/15(月) 01:48:24Win95/98/Meなんて誰も使ってないんだから
0256デフォルトの名無しさん
2010/11/15(月) 01:49:30前半はいいけど
> 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>>254
大変心強いお言葉をいただきありがとうございます。
とりあえずやってみてダメなところが見つかったら
試行錯誤してみます。
それにstd::vector、とstd::stringでやりたいことが出来そうであることがわかりました。
重ねてありがとうございます。
0258デフォルトの名無しさん
2010/11/15(月) 02:00:11void UniteMessages(LPTSTR&united, LPCTSTR msg1, LPCTSTR msg2)
でしょ
0259デフォルトの名無しさん
2010/11/15(月) 02:02:41ご指摘ありがとうございます。
void MessageUnited( TCHAR *&unit , LPCTSTR mes1 , LPCTSTR mes2 )
とするときには
呼び出し側で
MessageUnited( &lpszUnited , lpcszMes1 , lpcszMes2 ) ;
とすれば正しく文字列参照ができる、というかんじでしょうか。
そのときでも
TCHAR* lpszUnited ;
としているときには
delete [] lpszUnited ;
でメモリ解放は完了するということであってますでしょうか。
ポインタがこんがらがってきました。
>>255
ところがどっこい
0260デフォルトの名無しさん
2010/11/15(月) 02:04:07自分で試してから聞けよ。
0261デフォルトの名無しさん
2010/11/15(月) 02:12:000262デフォルトの名無しさん
2010/11/15(月) 02:12:14それとどこのスレで質問するにしても最低限MSDNで検索してからにしろよ
TCHARの説明もあるし、TCHAR用の文字列結合関数もあるぞ
っつかTCHAR使ってるのに触りも説明しないなんて本あるのか?
今までオレが購入したWindowsのAPIを扱う本ではそんなの一冊もなかったが
0263デフォルトの名無しさん
2010/11/15(月) 02:15:270264デフォルトの名無しさん
2010/11/15(月) 02:19:45なにかしら事情があるのだろう察してやれリョ
0265デフォルトの名無しさん
2010/11/15(月) 02:22:15TCHARに含められるんじゃないか?
0266デフォルトの名無しさん
2010/11/15(月) 02:22:52○よ
0267デフォルトの名無しさん
2010/11/15(月) 02:32:08WindowsプログラミングどころかC/C++もロクにわかってなさそう
0268デフォルトの名無しさん
2010/11/15(月) 03:13:260269デフォルトの名無しさん
2010/11/15(月) 03:17:500270デフォルトの名無しさん
2010/11/15(月) 06:11:36レス感謝
その定義だと一応C++もダックタイピング可って事になりますね。
http://en.wikipedia.org/wiki/Duck_typing
けどwikipediaによると、やっぱり動的ってのは必須らしい(宗教論争中なのかもだけど)。
けど同時にJava,C++,Dは静的にunreachableやらが検出できる(当然だけど)と書いてて、
定義はともかく、静的にやれた方が便利みたいなニュアンスを感じる。
タイピング時の動作で言うならテンプレートもダックタイピングなのに、
動的じゃないからダックタイピングじゃないって言われるのはなんか不合理な気もするんだぜ。
動的型検査はダックタイピングの本来的な要素じゃないだろうに。
でもこれよりも流れてほしくないのがインターフェイスについての話についてです。
C++でC++0xにも取り込まれてないのはなんで?
大規模開発可能な言語を自称するんなら必須の機能に思えるのに。
設計と進化にはその理由とか載ってるんでしょうか?
0271デフォルトの名無しさん
2010/11/15(月) 06:20:03まあ大抵の処理系なら[[interface]]あたりでも用意するだろう。
0272デフォルトの名無しさん
2010/11/15(月) 07:16:04char[100] moji = "プログラム中でいろいろ入れる"みたな感じでやってて
ボタン->Text = moji のようにしたいのですがString^型がうんたらかんたらと出て変換できません
どうやって変換すれば良いのでしょうか?
0273デフォルトの名無しさん
2010/11/15(月) 07:27:18ボタン->Text = moji;
0274デフォルトの名無しさん
2010/11/15(月) 07:50:00ありがとうございます
String^ out = gcnew String(moji)でやったのですが
自分のはString^ 型のoutを使うのが少なくて、char型のmojiを使うのは多かったのですが(strcpyとかやたらある)
その方法ならchar[100]型使ってたところは全部そのままでいけたのでしょうか?
0275デフォルトの名無しさん
2010/11/15(月) 08:21:04多重継承でもしてろ
0276デフォルトの名無しさん
2010/11/15(月) 10:53:44・現状で十分機能する代替案がある
よって追加する必要なし
0277デフォルトの名無しさん
2010/11/15(月) 11:05:02http://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:210280デフォルトの名無しさん
2010/11/15(月) 15:37:260281デフォルトの名無しさん
2010/11/15(月) 15:40:16そうなんだ
ごめんね
0282デフォルトの名無しさん
2010/11/15(月) 15:44:080283デフォルトの名無しさん
2010/11/15(月) 15:46:01ありがとうございました。
少なくともVS2010では
extern enum HogeA;
(略)
enum HogeA
{
foo = 0
};
が可能でした。
externとは思いつきませんでしたが、関数とかでは「宣言」できるわけですから、想像してしかるべきでした。
本当にありがとうございました!
0284デフォルトの名無しさん
2010/11/15(月) 19:14:39http://d.hatena.ne.jp/faith_and_brave/20090318/1237371641
0285デフォルトの名無しさん
2010/11/15(月) 23:06:060286デフォルトの名無しさん
2010/11/15(月) 23:07:140287デフォルトの名無しさん
2010/11/15(月) 23:15:230288デフォルトの名無しさん
2010/11/15(月) 23:16:120289デフォルトの名無しさん
2010/11/15(月) 23:24:460290デフォルトの名無しさん
2010/11/15(月) 23:30:400291デフォルトの名無しさん
2010/11/16(火) 00:00:17と
void classA::funcB(const int& C)
の引数ってどうやって使い分けるの?
上はインクリメントができるとかそういうこと?
0292デフォルトの名無しさん
2010/11/16(火) 00:14:160293デフォルトの名無しさん
2010/11/16(火) 00:46:20{
//〜
}
void func(int const & n)
{
int m = n;
//〜
};
まあこれでほぼ等価と考えていい
ただ上のほうが最適化しやすいので上で書いて玄人ぶる人もいる
0294デフォルトの名無しさん
2010/11/16(火) 01:03:580295デフォルトの名無しさん
2010/11/16(火) 01:09:340296デフォルトの名無しさん
2010/11/16(火) 01:14:460297デフォルトの名無しさん
2010/11/16(火) 02:03:180298デフォルトの名無しさん
2010/11/16(火) 02:12:570299デフォルトの名無しさん
2010/11/16(火) 03:17:12ただし、「STLよるコンポーネントデザイン」や「Generic Programming
- STLによる汎用プログラミング -」の日本語訳者でもある人で、C++を
専門的に執筆してる人の著書だけは、良書だと思うが。
0300デフォルトの名無しさん
2010/11/16(火) 10:08:28ご丁寧にありがとうございます。
こちらも参考にさせていただきますね。
C++0xは色々便利になっていて素敵ですね。はやくVSとかに適用されてくれればなぁ(2010への適用度がかなり低い…)
0301デフォルトの名無しさん
2010/11/16(火) 10:25:250302デフォルトの名無しさん
2010/11/16(火) 11:24:48後ろ置きだと意味が変わるような
0303デフォルトの名無しさん
2010/11/16(火) 12:02:37�Aint const *const *const *const p;
どう考えても�Aの方が統一性がある。
0304デフォルトの名無しさん
2010/11/16(火) 16:03:22if(array[i]==0)
goto label1;
}
return false;
label1:
/*...*/
っていう処理を書いたんですけど、gotoなしで書き直すにはどうしたらいいでしょうか?
0305デフォルトの名無しさん
2010/11/16(火) 16:05:06if(i>=size)return false;
/*...*/
0306304
2010/11/16(火) 16:31:52じゃね?
0307304
2010/11/16(火) 16:33:570308デフォルトの名無しさん
2010/11/16(火) 18:26:350309デフォルトの名無しさん
2010/11/16(火) 19:43:35設計は違うスレで聞いたほうがいいと思う。。。
0310デフォルトの名無しさん
2010/11/16(火) 22:48:210311デフォルトの名無しさん
2010/11/16(火) 22:51:110312デフォルトの名無しさん
2010/11/17(水) 00:45:07C++ の throw が Python の raise より遅いという計測結果が出ています。
同等の機能かと思うのですが、これは何の違いに起因しているのでしょうか?
0313デフォルトの名無しさん
2010/11/17(水) 06:40:12自分は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:290315デフォルトの名無しさん
2010/11/17(水) 10:27:18実装の違いですね
0316デフォルトの名無しさん
2010/11/17(水) 18:33:30バカ?
0317デフォルトの名無しさん
2010/11/17(水) 23:49:26この前VisualStudio2010プロの何ヶ月かのお試し版を入れて、期限が切れて、消したのですが
何かの拍子にVisualStudio系のファイルを開いたら、今までは2010で開かれて、「期限が切れてます、アップグレードしてください」
みたいな画面が出て、VC++2008EEで開いてくれません。
プログラムのアンインストールの所にはもう無いのですが完全に消せてないのでしょうか?どうすれば良いですか?
0318デフォルトの名無しさん
2010/11/17(水) 23:59:55にしてねってこと
0319デフォルトの名無しさん
2010/11/18(木) 00:03:060320デフォルトの名無しさん
2010/11/18(木) 00:03:520321デフォルトの名無しさん
2010/11/18(木) 00:04:17マジ?
2008EEって無期限じゃないんですか?
0322デフォルトの名無しさん
2010/11/18(木) 00:22:410323デフォルトの名無しさん
2010/11/18(木) 01:06:170324デフォルトの名無しさん
2010/11/18(木) 01:15:01どうにかして関連付け直せばいいだけだろ
0325デフォルトの名無しさん
2010/11/18(木) 01:19:400326デフォルトの名無しさん
2010/11/18(木) 01:24:020327デフォルトの名無しさん
2010/11/18(木) 01:33:470328デフォルトの名無しさん
2010/11/18(木) 01:49:222008EE自体が使えなくなったのか?
開発者ならもう少しまともに喋れ
0329デフォルトの名無しさん
2010/11/18(木) 01:57:170330デフォルトの名無しさん
2010/11/18(木) 01:58:45関連付けだろ。わかったよ
0331デフォルトの名無しさん
2010/11/18(木) 02:21:460332デフォルトの名無しさん
2010/11/18(木) 10:31:58clear()を呼び出しても減らないし、どうすればいいの?
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:38AddRef、Releaseはちゃんと実装したか?
0334デフォルトの名無しさん
2010/11/18(木) 10:57:06STDMETHODIMP_(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:55pushで再配置するときに何か残ってるんじゃないの?
0336デフォルトの名無しさん
2010/11/18(木) 11:39:48偽COMなんだしunique_ptrに突っ込んどけば?
0337デフォルトの名無しさん
2010/11/18(木) 11:59:450338デフォルトの名無しさん
2010/11/18(木) 12:13:04コピーコンストラクターはない
メンバー変数にポインターを使ってる奴はないから残ってること自体考えにくいと思う
どこか別の場所で残ってるのかな
リークしてると思われるプログラムは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:19http://msdn.microsoft.com/ja-jp/library/bs6acf5x.aspx
0340デフォルトの名無しさん
2010/11/18(木) 22:10:040341デフォルトの名無しさん
2010/11/19(金) 00:06:550342デフォルトの名無しさん
2010/11/19(金) 00:13:490343332
2010/11/19(金) 08:43:21使ってみたが、メモリリークが収まらない
使い方が間違ってるのか?
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ってやるとa=-24になることって保障されてるんですか?
0346デフォルトの名無しさん
2010/11/19(金) 13:03:33調べられるかもしれませんし、調べる関数があるかもしれません。
少なくとも言語仕様には一切含まれていませんので、お使いの環境を当たってください。
0347デフォルトの名無しさん
2010/11/19(金) 13:04:50いいえ。
0348デフォルトの名無しさん
2010/11/19(金) 13:06:50charのディフォルトがたまたま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:33C++において、ポインタを整数にキャストした結果は実装依存です。従って、ビット云々に意味はありません。
0355デフォルトの名無しさん
2010/11/19(金) 14:34:41{
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:25intとenum以外の上みたいな書き方が禁止なのは共通ですか?
共通ではないのなら何が何かおしえてください。
0357デフォルトの名無しさん
2010/11/19(金) 14:57:29グローバル変数ならどれからでもアクセス可能だから提示された条件は満たせるな
っていうのはともかく継承とかprotectedとかfirendとか使えばなんかいけんじゃね?
言ってることがよく分からないからどうしたらいいかとかは提案できんが
0358デフォルトの名無しさん
2010/11/19(金) 14:59:01メンバ変数の話か?
0359デフォルトの名無しさん
2010/11/19(金) 15:05:230360デフォルトの名無しさん
2010/11/19(金) 15:09:44やっぱりそうでしたか。
GCの本にその使ってないビットを使った実装方法法
があるって書いてあったから気になってた。
ありがとう。
0361デフォルトの名無しさん
2010/11/19(金) 16:22:06回答者が環境依存であることを明言しないのはなんぞ?
0362339
2010/11/19(金) 19:55:25CAdaptは、STLコンテナから要素独自の&演算子を隠すためのものなので、
コンテナのパラメータで指定する。
std::vector<CAdapt<CComPtr<ColorDrawingEffect>>> ColorEffects;
0363339
2010/11/19(金) 21:02:44ごめん、CAdaptは関係ないような気がしてきた。
サンプルコード落としていろいろいじってみたけど、自分の環境ではリークは見つからなかった。
cRefCount_は本当に0で初期化されてるか、(全てのコンストラクタで初期化されているか)
pTextLayout_が参照をつかみっぱなしでないか、(pTextLayout_->SetDrawingEffect をコメントアウトしてみるとか)
そもそもリークしているのか、(正しくRelease()->delete this されていれば問題は他)
このあたりを再確認して問題ないのであれば、コードさらしていただければ検証するよ
0364デフォルトの名無しさん
2010/11/19(金) 21:45:31shrink_to_fit を知らないという話じゃないよね
0365デフォルトの名無しさん
2010/11/19(金) 22:37:000366デフォルトの名無しさん
2010/11/20(土) 02:21:48template<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:290368デフォルトの名無しさん
2010/11/20(土) 04:13:120369デフォルトの名無しさん
2010/11/20(土) 06:53:370370デフォルトの名無しさん
2010/11/20(土) 08:37:09begin/endとか追加してラッパー・アダプタ的な使い方をすればいい
boost::arrayは内部にストレージを持ってるから、そこで差別化できる
0371デフォルトの名無しさん
2010/11/20(土) 11:11:210372デフォルトの名無しさん
2010/11/20(土) 11:25:43全て確認してみましたが、特に怪しいところはありませんでした
思い当たる節があるとすれば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実装隠す必要なくて名前がぶつからなくてビルド時間も長くないなら気にしなくてよくね?
0375デフォルトの名無しさん
2010/11/20(土) 17:01:50この関数を外部に公開するのなら、その引数と戻り値で使ってるクラスが入ってるヘッダは
普通に公開しないと拙いと思うよ。
0376デフォルトの名無しさん
2010/11/20(土) 17:09:18// 以下、Huga.hの中身とする。
Class Fuga; // 前方参照(宣言)
Class Hoge
{
private:
Fuga* m_pFuga; // ←こいつがpublicなメソッドの引数や戻り値で使われていないとする
};
//eof
この場合は前方参照(宣言)で回避しとけば依存が無くなるばかりか、
外部に公開されないので安心だねって感じ。
0377デフォルトの名無しさん
2010/11/20(土) 17:17:31>>375の場合、funcを使うファイルでfuncのヘッダをインクルードしてやれば、
自動的に公開関数の引数や戻り値で使われてるクラスも扱えるので便利だねって話。
ごめんなバラバラで書いて。
0378デフォルトの名無しさん
2010/11/20(土) 17:19:230379デフォルトの名無しさん
2010/11/20(土) 17:19:380380デフォルトの名無しさん
2010/11/20(土) 17:26:180381デフォルトの名無しさん
2010/11/20(土) 17:53:01ありがとう
循環includeのあるヘッダだけ>>377の言う「不便」な状態になるのが気持ち悪いから
いっそ全部不便に揃えようかとも思ったんだけど・・・やっぱり不便なんだよね
別にコンパイル時間に困ってるわけではないから、分けるのはやめとくことにするよ
むしろ循環includeのあるヘッダだけ
class Hoge;
Hoge func();
include "hoge.h"
とかすることにしちゃうかも
0382デフォルトの名無しさん
2010/11/20(土) 21:48:070383デフォルトの名無しさん
2010/11/20(土) 21:55:36std::strstreamはdeprecated
つまりいつ消えても文句は言えない
それとstd::stringstreamとの違いは、std::strstreamはバッファにchar型の配列を
使うが、std::stringstreamはstd::stringを使用する
std::strstreamはバッファオーバーフローの危険性があったためdeprecatedにされた
0384339
2010/11/21(日) 03:09:11コード検証してみた。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トンクス
CustomTextRendererがリークしていたのか
0386デフォルトの名無しさん
2010/11/22(月) 13:17:33上記のサイトで
ユーザー定義のハンドル・ボディ(Handle Body)イディオム
が選択肢としてありますが、そのばあいどのようにリソースを返せばいいのか教えてください。
0387デフォルトの名無しさん
2010/11/22(月) 14:35:500388デフォルトの名無しさん
2010/11/22(月) 14:43:06スマートポインターイディオムが
ハンドルボディーイディオムの特殊化だから
スマートポインターイディオムと書かないでその一般化である
ハンドルボディーイディオムとかいてあるのか・・・・
0389デフォルトの名無しさん
2010/11/23(火) 15:07:25{
double x;
double y;
}
std::vector<point> p;
このような形で点群データを扱ってます。
ここから-a < x < a, -b < y < b を満たす点を抜き出したいんですけど、何か良い方法はありますか?
0390デフォルトの名無しさん
2010/11/23(火) 15:45:270391デフォルトの名無しさん
2010/11/23(火) 16:58:53p.erase(std::remove_if(p.being(), p.end(), is_outside), p.end());
0392デフォルトの名無しさん
2010/11/23(火) 21:41:120393デフォルトの名無しさん
2010/11/23(火) 21:44:140394デフォルトの名無しさん
2010/11/23(火) 21:54:060395389
2010/11/23(火) 21:59:541つのデータに対して範囲を変えて何回もデータを抜き出したいんですけど、
この場合はremove_copy_if()を使えば、必要なデータだけ取り出せる
(=その他のデータを残せる)で良いんですよね?
0396デフォルトの名無しさん
2010/11/23(火) 22:07:102次元座標の当たり判定のように見えるんだが。
そうなら、それようのアルゴリズムはある。
0397389
2010/11/23(火) 22:24:54点群データをグリッドマップに変換する作業を行ってて、
その中で点群に対して一番近いグリッドを割り出したいのです。
0398デフォルトの名無しさん
2010/11/23(火) 22:37:340399389
2010/11/23(火) 22:41:41どうすれば効率よくなりますかね?
とりあえず上から降ってきたプログラムのアルゴリズムをまんま流用してるんですけど
あまりに書き方が酷かったので、せめて綺麗に書いていたのですが・・・。
0400デフォルトの名無しさん
2010/11/23(火) 22:49:18だったらx,yから直接何番目のグリッドにあるかわかるじゃん
なら何度も篩いにかけるようなやり方じゃなくて一回の走査で十分でしょ
0402デフォルトの名無しさん
2010/11/23(火) 23:32:12GCCだと問題無いのですが、Visual C++だとうまくいかんです。
std::printf("size = %zu\n", sizeof(int));
0403デフォルトの名無しさん
2010/11/23(火) 23:38:100404デフォルトの名無しさん
2010/11/23(火) 23:39:10つまりはそういうことだ
VC++なら %Iu かな
0405デフォルトの名無しさん
2010/11/23(火) 23:39:07z は C99 じゃなかったかな?
現状で移植性を確保したければ unsigned long にキャストして l にしとけばいいと思う。
0406デフォルトの名無しさん
2010/11/23(火) 23:42:02めっちゃって倍やんか、abs() のコストと条件式が倍になる事を比較したらどっちが得やねんちゅう話や
0407デフォルトの名無しさん
2010/11/23(火) 23:45:340408デフォルトの名無しさん
2010/11/23(火) 23:47:320409402
2010/11/24(水) 00:10:28GCC/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もっとも、long longがC++に存在しないことを気にかけるほどだから、これも根本的問題解決と言えないかもしれない。
0411デフォルトの名無しさん
2010/11/24(水) 00:26:320412デフォルトの名無しさん
2010/11/24(水) 00:45:08�Aテンプレートでクールに決める方法を考える
�B決め打ちするけど書き換えが楽になるように一段階間接的な手段をとる
世界中で使われるレベルのライブラリ書くようならまだしも
普通は�Bで十分だよね
0413デフォルトの名無しさん
2010/11/24(水) 18:59:35{
return a*b;
}
int iiii=(int)testtmpfn(15,0);
テンプレート 引数を 'T3' に対して減少できませんでした
というエラーでコンパイルできません
型の自動推定ぐらいしてくれてもいいと思うのですが、
型をこれのように全部指定しないでコードを書く方法ないのでしょうか
0414デフォルトの名無しさん
2010/11/24(水) 19:15:480416デフォルトの名無しさん
2010/11/24(水) 19:33:100417デフォルトの名無しさん
2010/11/24(水) 19:42:14C++にもOCamlの機能をとりこんでほしい
0418デフォルトの名無しさん
2010/11/24(水) 20:23:47template<typename T1, typename T2>
auto Func(T1 a, T2 b) -> decltype(a * b) { return a * b; }
これでおk
0419デフォルトの名無しさん
2010/11/24(水) 21:28:510xスレ逝け。
0420デフォルトの名無しさん
2010/11/24(水) 21:31:550421デフォルトの名無しさん
2010/11/24(水) 22:12:410422デフォルトの名無しさん
2010/11/24(水) 22:13:290423デフォルトの名無しさん
2010/11/24(水) 23:59:520424デフォルトの名無しさん
2010/11/25(木) 02:46:140425デフォルトの名無しさん
2010/11/25(木) 12:17:550426デフォルトの名無しさん
2010/11/25(木) 12:38:00もう実用しても大丈夫なん?
0427デフォルトの名無しさん
2010/11/25(木) 14:07:35まだあかん
何かいろいろゴチャゴチャした議論をしてる
moveとcopy回りで収拾が付いてない
0428デフォルトの名無しさん
2010/11/25(木) 16:30:23boost.anyみたいに遅くなるのじゃなくて
0429デフォルトの名無しさん
2010/11/25(木) 16:38:58不特定大人数に提供する大作クラスライブラリじゃあるまいし
0430デフォルトの名無しさん
2010/11/25(木) 16:43:43いつの話をしているんだ。
暗黙のムーブの話なら、すでに決着したぞ。
0431デフォルトの名無しさん
2010/11/25(木) 18:56:180432デフォルトの名無しさん
2010/11/25(木) 21:12:22いい感じのライブラリーない?
0433デフォルトの名無しさん
2010/11/25(木) 21:15:100434デフォルトの名無しさん
2010/11/25(木) 21:25:380435デフォルトの名無しさん
2010/11/25(木) 21:42:40ないでしょ
0436デフォルトの名無しさん
2010/11/25(木) 21:46:14OKWaveブラウザの完成!
0437デフォルトの名無しさん
2010/11/25(木) 21:48:420438デフォルトの名無しさん
2010/11/25(木) 21:48:44独自でお願いします
0439デフォルトの名無しさん
2010/11/26(金) 00:54:12あれ系ってデフォルトだとおしなべて最新の回答が質問の次に来るのがマジでウザい
過程とか回答の順序が大事だろうが!?たまに質問と回答がくっついてて順序が変えられないのもあるし
0440デフォルトの名無しさん
2010/11/26(金) 16:25:30>>428
http://www.boost.org/doc/libs/1_36_0/doc/html/lambda/extending.html
0441デフォルトの名無しさん
2010/11/26(金) 17:01:52http://msdn.microsoft.com/en-us/library/dd293667.aspx
0442デフォルトの名無しさん
2010/11/26(金) 17:11:56C++0xの機能。
vs2010とかg++の新しいのとかに先行実装されてる。
0443デフォルトの名無しさん
2010/11/26(金) 17:17:25gccならとっくに実装されてる。
0444デフォルトの名無しさん
2010/11/26(金) 17:47:460445デフォルトの名無しさん
2010/11/26(金) 17:58:30これで速度落ちないなら常用する
0446デフォルトの名無しさん
2010/11/26(金) 18:02:370447デフォルトの名無しさん
2010/11/26(金) 18:03:040448デフォルトの名無しさん
2010/11/26(金) 18:03:260449デフォルトの名無しさん
2010/11/26(金) 20:39:41瞬時に要素がどういう型なのか判別する手間が増えるな
逆に小細工なしで比較的手軽に汎用的なマクロを作れたりする
0450デフォルトの名無しさん
2010/11/26(金) 22:30:29autoを何だと思っているんだw
0451デフォルトの名無しさん
2010/11/26(金) 22:31:44俺は書いたこと無いけどね!
0452デフォルトの名無しさん
2010/11/26(金) 22:44:53まだ規格はできあがってないと思ってたんですが…。
C++0x に合わせ、VS2010 とかが少しずつ規格を取り入れてるってことなんでしょうか。
今取り入れられてる部分はについてはもう変更されることはないと確定しているんでしょうか?
0453デフォルトの名無しさん
2010/11/26(金) 22:48:340454デフォルトの名無しさん
2010/11/26(金) 22:57:350455デフォルトの名無しさん
2010/11/26(金) 23:14:47まだ変更される箇所もあるけれど、普通のユーザーがきにするようなことじゃない。
0456デフォルトの名無しさん
2010/11/27(土) 00:06:30結果的にコードが読みやすくなったな
0457デフォルトの名無しさん
2010/11/27(土) 00:20:47教えてください
0458デフォルトの名無しさん
2010/11/27(土) 00:32:540459デフォルトの名無しさん
2010/11/27(土) 00:36:44それでどうするんですか?
0460デフォルトの名無しさん
2010/11/27(土) 00:38:430461デフォルトの名無しさん
2010/11/27(土) 00:38:480462デフォルトの名無しさん
2010/11/27(土) 00:45:19http://lmgtfy.com/?q=remove_if
0463デフォルトの名無しさん
2010/11/27(土) 01:09:41#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#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:52typeof(a*b+c) x= a*b+c;
0466457
2010/11/27(土) 01:41:57ありがとう。
remove_ifだと消す対象に次要素の移動コピーだけしかしないのに、なんでそんなアドバイス来るんだ
と思ったが、eraseでremove_ifからの戻り値(strの無要素の先頭)からstrの最後までを消すことで
スペース、タブを除去するのか。これ、定石なんだろうね
それなら、eraseとremove_if使え位言わないと低脳の僕は分からん
0467デフォルトの名無しさん
2010/11/27(土) 01:42:070468デフォルトの名無しさん
2010/11/27(土) 01:44:05std::removeとかstd::remove_ifは削除対象の要素を後ろに集めてその先頭イテレータ
を返すだけで、実際の削除はしないのでeraseが必要になる
0469デフォルトの名無しさん
2010/11/27(土) 02:15:120470デフォルトの名無しさん
2010/11/27(土) 02:17:15速かったりするのかな
0471デフォルトの名無しさん
2010/11/27(土) 02:21:00そういう車輪の再発明を極力やめようというのがSTLの基本思想
0472デフォルトの名無しさん
2010/11/27(土) 08:38:25なんで車輪の再発明の話になるのかわからん
0473デフォルトの名無しさん
2010/11/27(土) 08:57:09遅いしメモリの無駄です
0474デフォルトの名無しさん
2010/11/27(土) 09:18:140475デフォルトの名無しさん
2010/11/27(土) 09:33:45そんな時代になるといいですね
0476デフォルトの名無しさん
2010/11/27(土) 09:48:18でも性能の良い自動車は作れない
STLってこんな感じだよね
0477デフォルトの名無しさん
2010/11/27(土) 11:30:42listでdistanceを平気でやったりとかね。
0478デフォルトの名無しさん
2010/11/27(土) 11:30:59下手なプログラマが作るより性能はいい
しかも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:290481デフォルトの名無しさん
2010/11/27(土) 12:14:560482デフォルトの名無しさん
2010/11/27(土) 12:16:49boost::scoped_arrayでも使ってろよ・・・
その話聞くだけだと単に頭悪いようにしか見えんけど
0483デフォルトの名無しさん
2010/11/27(土) 12:19:42a.resize()する前にa.reserve()やっとけばいいじゃん
メモリの再割り当てが最高1回で済む
ただしコンストラクタが走るのを阻止できないけど
0484479
2010/11/27(土) 12:24:17>>481
実験ではループなのですが、実際は単純なループではありません。
もちろん外部に std::vector を用意するという手はあります。
ただ、実際は関数内で一時バッファを使っているのですが、
内部で一時バッファを使っているということは外部に公開する必要はないのに、
外部から引数で受け取るのも少々気持ちが悪いです。
また、static にしたりグローバルに用意したりすると、マルチスレッド関連がややこしくなります。
>>482
boost::scoped_array だと、固定サイズしか作れなくないですか?
>>483
書いたとおり、ボトルネックになってるのはメモリの確保ではなく、初期化部分です。
reserve を行っても大きくは変わりませんでした。
0485デフォルトの名無しさん
2010/11/27(土) 12:25:06for (int i = 0; i < 100000; i++) {
ar.clear();
ar.resize(100000);
}
0486デフォルトの名無しさん
2010/11/27(土) 12:25:59情報の後出しすんなよ
0487デフォルトの名無しさん
2010/11/27(土) 12:28:32そういう意味じゃないから勉強しなおしてこい
0488デフォルトの名無しさん
2010/11/27(土) 12:28:540489デフォルトの名無しさん
2010/11/27(土) 12:28:58[2]と動作速度がまるで違うのは当たり前
0490デフォルトの名無しさん
2010/11/27(土) 12:29:20resizeしたら拡張分全部にコンストラクタ走るのは当然じゃん
0491479
2010/11/27(土) 12:32:48おっしゃるとおりです。なので、
・初期化せずに
・(あらかじめサイズが分からないので)可変長の
・解放し忘れの起きない
メモリを確保する手段はないでしょうか?という質問です。回りくどくて申し訳ありません。
0493デフォルトの名無しさん
2010/11/27(土) 12:35:55比べるならこうじゃね?まぁ比べると遅いと思うけど
for (int i = 0; i < 100000; i++) {
std::vector<int> ar(100000);
}
0494デフォルトの名無しさん
2010/11/27(土) 12:37:31reserveしろ
resizeは指定サイズに達するまで新しい要素を追加するっていう処理だ
本来の引数はvoid resize( size_type size, TYPE val );だしな
vectorの中身の生配列のサイズを拡張したいだけならreserveだろ
0495デフォルトの名無しさん
2010/11/27(土) 12:37:540497479
2010/11/27(土) 12:40:39reserve では内部で領域を確保するだけで、アクセスできないですよね?
std::vector<int> ar;
ar.reserve(10);
ar[0] = 1;
とすると範囲外エラーとなります。(デバッグ時に例外が飛んできます)
0498デフォルトの名無しさん
2010/11/27(土) 12:42:29__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このようにすると速度が逆転するのがわかると思う
std::vectorのデフォルトコンストラクタは十分高速
0500デフォルトの名無しさん
2010/11/27(土) 12:43:20どういう処理想定してるか分からないから適当にアドバイスしたら、
それじゃ駄目とかどうしようもない
0501デフォルトの名無しさん
2010/11/27(土) 12:45:000502デフォルトの名無しさん
2010/11/27(土) 12:45:15vectorの速度を気にする前の問題じゃね?
ちゃんと最適化かけて計測してる?
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なぜ push_back を使わない
0505479
2010/11/27(土) 12:50:15高速なのは分かりますが、そもそも初期化する必要がないので…。
実際にボトルネックになっていて、>>479 で100倍以上の差が出ています。
>>502
はい、最適化はかけています。
>>496 は reserve するようにという指摘に対するレスです。
0506デフォルトの名無しさん
2010/11/27(土) 12:50:24forの外でvectorで取るのが一番速い。
>>479の2が遅いのは配列の各要素を初期化してるから。1は初期化していないので配列の中身は不定。初期化が必要ならその分遅くなる。
高速で何度も使うなら初期化せずに上書きでよくないか検討してごらん?
0507デフォルトの名無しさん
2010/11/27(土) 12:50:56普通char指定しねえ?
0508デフォルトの名無しさん
2010/11/27(土) 12:52:03int * p = 0;
unique_ptr<int, DelAry> guard(p = new int[size]);
}
0509479
2010/11/27(土) 12:55:50少なくともコンパイル時には予測できません。
数100MBの巨大なデータが来ても動作するようにする必要があります。
>>504
バッファを用意するのが目的です。
バッファの使う上で、行うのは追加だけとは限りません。
もちろんランダムアクセスする可能性もあります。
>>506
はい、上書きでも構いません。初期化しているから遅いというのも書いてあるとおりです。
初期化せずにバッファを確保する方法はないかという質問です。
0510デフォルトの名無しさん
2010/11/27(土) 12:57:12unique_ptrなら
unique_ptr<int[]>これでいんだぜ
0511デフォルトの名無しさん
2010/11/27(土) 12:59:12少なくとも、じゃなくて具体的なことを聞いてるんだよ
関数に入った時点で確定するなら>>503でいいだろ?
0512デフォルトの名無しさん
2010/11/27(土) 13:01:46へー特殊化されてんのね。じゃ
for(…){ unique_ptr<int[]> p(new int[size]); }
でいいわけか
0513デフォルトの名無しさん
2010/11/27(土) 13:06:400514デフォルトの名無しさん
2010/11/27(土) 13:13:370515479
2010/11/27(土) 13:15:31顔から火がでそうです。
>int* p = new int[100000];
これが固定サイズしか作れないものと勘違いしてました…。
恥ずかしい限りです。こんなことに何十レスも頂いて…。
boost::scoped_array 何の問題もありませんでした。
関わって頂いた皆様、本当にありがとうございました。勉強しなおします…。
0516デフォルトの名無しさん
2010/11/27(土) 13:18:320517デフォルトの名無しさん
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:070519デフォルトの名無しさん
2010/11/27(土) 14:05:43サーバ側の以下の配列に音声のデータが入っていると考えており,
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ポインタのポインタを指定してどうする
&要らんよ(char*)lpWaveDataでいい
0521デフォルトの名無しさん
2010/11/27(土) 14:24:56ご指摘ありがとうございます.
(char*)lpWaveDataにしたうえで,
クライアント側を書き換えて試してみたいと思います.
0522デフォルトの名無しさん
2010/11/27(土) 14:47:05なんでdynamic_castが出てくるのかとてもじゃないが、理解できないよ。
0523デフォルトの名無しさん
2010/11/27(土) 14:49:41素直にstatic_castしろよ
0524デフォルトの名無しさん
2010/11/27(土) 15:05:03並のC++使いなら>>517の作ろうとしているプログラムなら軽く作れると思うから聞くけど、
>>519のプログラム構成・手順で音声を途切れなく再生できるの?
低脳の僕はなんか駄目なような気がするんだけど。なんとなくだけどね
0525デフォルトの名無しさん
2010/11/27(土) 15:12:440526デフォルトの名無しさん
2010/11/27(土) 15:17:430527デフォルトの名無しさん
2010/11/27(土) 15:24:24ご意見ありがとうございます,
ポインタは,「変数のアドレスを入力する変数」程度の知識で,だましだましプログラムを作成してきました.
googleなどで出てきたキーワードを総当りで試しているという状態です.
もう一点,お聞きしたいと思います.
クライアント側の受信を,以下の
recv(dstSocket, (char *)lpWaveData, sizeof(char)*10000, 0);
にすると.コンパイルは通り,動作するように見えるのですが,
waveOutWrite(hwo,&whdr,whdr.dwBufferLength);
のところで,<不適切なptr>というエラーが生じてしまいます.
この意味について,お教えいただけないでしょうか.
0528デフォルトの名無しさん
2010/11/27(土) 15:31:11> ポインタは,「変数のアドレスを入力する変数」
それであってると思うけど。
0529デフォルトの名無しさん
2010/11/27(土) 15:31:22ttp://msdn.microsoft.com/ja-jp/library/cc428833.aspx
第三引数がおかしいこと以外は分からんが
0530デフォルトの名無しさん
2010/11/27(土) 15:31:510531デフォルトの名無しさん
2010/11/27(土) 15:43:49ありがとうございます.
エラーの現状ですが,ハンドルされていない例外が発生しました.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音声のデータは未初期化ならただの雑音にしかならない。データーのせいじゃない。
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ありがとうございました,動作するようになりました.
dropboxのものを動作したものに差し替えさせていただきました.
恥ずかしいので,すこしたったら消します.
>>皆様へ
このたびは本当にありがとうございました.
はじめて質問したのですが,解決に導いていただき,感謝しております.
それでは失礼いたします.
このたびは本当にありがとうございました.
0535デフォルトの名無しさん
2010/11/27(土) 17:27:480536デフォルトの名無しさん
2010/11/27(土) 17:46:450537デフォルトの名無しさん
2010/11/27(土) 19:05:43static_cast
reinterpret_cast
のどっちを使うの?
で、それを使う理由は何
0538デフォルトの名無しさん
2010/11/27(土) 19:13:03用途による。ダウンキャストならstatic_castだし(もしくはdynamic_cast)
整数に変換するならreinterpret_castだし
0539デフォルトの名無しさん
2010/11/27(土) 19:17:34lpWaveData = static_cast<byte *>(lpWaveData);
はstaticで良いんですか? それとも、reinterpret?
0540デフォルトの名無しさん
2010/11/27(土) 19:19:27はstatic_castでおk
0541デフォルトの名無しさん
2010/11/27(土) 19:24:09そのキャスト意味あるのか?
0542デフォルトの名無しさん
2010/11/27(土) 20:31:460543デフォルトの名無しさん
2010/11/27(土) 20:36:140544デフォルトの名無しさん
2010/11/27(土) 20:47:58はっきりいって、こんなキャストを使いたい時点で、すでにまともなプログラムではない。
http://cpplover.blogspot.com/2010/07/c.html
0545デフォルトの名無しさん
2010/11/27(土) 20:49:410546デフォルトの名無しさん
2010/11/27(土) 22:52:160547デフォルトの名無しさん
2010/11/27(土) 22:56:09デスマプロジェクトから脱走したやつの尻拭いで数万行クラスのスパコードからバグの原因を見つけ出して修正とかな
0548デフォルトの名無しさん
2010/11/27(土) 23:20:54時給換算だとうまいけど、もやっとする
0549デフォルトの名無しさん
2010/11/27(土) 23:27:12リファクタリング仕様ものなら激怒され、警告を回避しようものなら蛇蝎の如く嫌われ、成果は全て吸い上げられる。
ま、そういう奴はC++なぞ書こうともしないから未だ救われているが。
0550デフォルトの名無しさん
2010/11/27(土) 23:28:39その理由がステップ数で単価見積りとか…
0551デフォルトの名無しさん
2010/11/27(土) 23:38:05上司に相談しろよ
瞬間的には必要なのかもしれないけど
長い目で見ればいないほうが良い同僚はさっさとつぶしたほうが良い
0553デフォルトの名無しさん
2010/11/28(日) 00:00:390554デフォルトの名無しさん
2010/11/28(日) 00:04:150555デフォルトの名無しさん
2010/11/28(日) 01:44:17class d : virtual public b {};
d→bはキャストできても、b→dへのキャストはstaticでもdynamicでもできないのな。
0556デフォルトの名無しさん
2010/11/28(日) 02:08:420557デフォルトの名無しさん
2010/11/28(日) 02:17:290558デフォルトの名無しさん
2010/11/28(日) 03:26:15dynamic_cast<d*>したければ、class bに仮想関数を追加する。
0559デフォルトの名無しさん
2010/11/28(日) 18:56:24exeを起動させるとエラーが出て落ちてしまいます。
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確かにそれでだけは分からん。
というより、そのコードを見る限りでは、その部分に特に間違いは見受けられない気がする。
別の部分で落ちてるのでは?
0562デフォルトの名無しさん
2010/11/28(日) 21:14:24>>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:450564デフォルトの名無しさん
2010/11/28(日) 21:18:31プログラム削って、 main() 走らせるだけで同じエラーの起こる最小コードを作ってみろ。
0565デフォルトの名無しさん
2010/11/28(日) 21:24:45> なぜかthisの外にthisと並ぶ形でもうひとつmがありましたが、
!?
何かmapの初期化が上手くいってない気がするので、もう少しソースコードを出してくれ。
0566デフォルトの名無しさん
2010/11/28(日) 21:26:240567デフォルトの名無しさん
2010/11/28(日) 21:28:47自動変数が未初期化のまま動くわけねーだろ。mainの中身をtryで囲ってエラーを晒せ。
#include <exception>
int main()
{
try
{
...
}
catch(const exception &ex)
{
cout << ex.what() << endl;
}
}
0568デフォルトの名無しさん
2010/11/28(日) 21:32:170569デフォルトの名無しさん
2010/11/28(日) 22:01:460570デフォルトの名無しさん
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:570572デフォルトの名無しさん
2010/11/28(日) 22:18:40実行時に読み込んでるファイルも晒せ。
0573570
2010/11/28(日) 22:18:48http://codepad.org/k0N1eKIZ
0574デフォルトの名無しさん
2010/11/28(日) 22:23:370575デフォルトの名無しさん
2010/11/28(日) 22:23:39どうぞ、こちらです。
・Global.h
http://codepad.org/YOOkQHUu
0576デフォルトの名無しさん
2010/11/28(日) 22:26:59#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「insertします」
というポップアップが出た後、
自動変数パネルのexの中身を見てみるとやはり「不適切なptr」でした。
thisの中のmを展開しようとすると「このアイテムは1000000個以上の子アイテムが含まれます」という
アラートが出るので展開しませんでした。
出力には
プログラム '[1460] program.exe: ネイティブ' はコード 0 (0x0) で終了しました。
とのこと。
コンパイル時の警告には
cl : コマンド ライン warning D9035 : オプション 'Wp64' の使用は現在推奨されていません。今後のバージョンからは削除されます。
と出ますが多分関係ないですよね。
0578デフォルトの名無しさん
2010/11/28(日) 22:52:580579デフォルトの名無しさん
2010/11/28(日) 23:00:25あ、ほんとうだ、Releaseになってますね。
Debugにするとコンパイルすら通らなくなってしまった…。
codepadに上げたのじゃない他の複数のファイルで
「プリコンパイル ヘッダーを検索中に不明な EOF が見つかりました。'#include "stdafx.h"' をソースに追加しましたか?」
というエラーと
「プリコンパイル済みヘッダーの使用を検索中にスキップされました」
という警告が出ますね…あわわ
0580デフォルトの名無しさん
2010/11/28(日) 23:06:56プリコンパイル済みヘッダーを使用しない設定に
0581デフォルトの名無しさん
2010/11/28(日) 23:14:260582デフォルトの名無しさん
2010/11/28(日) 23:14:47落ちてねーぞ。どこが問題なの?
どうなるつもりであって、どうなったので問題だと思ったの?
0583デフォルトの名無しさん
2010/11/28(日) 23:15:55やりました。
大量の警告とエラーが出ました。涙もちょっと出ました…。
http://codepad.org/7gVrrWj1
0584デフォルトの名無しさん
2010/11/28(日) 23:20:18winmm.libをリンク
0585デフォルトの名無しさん
2010/11/28(日) 23:20:44Releaseモードでコンパイルして出来上がったexeをクリックしたら、
先ほどの"insertします"というポップアップが出た後、exeのGUI?が立ち上がらず、
タスクマネージャーのプロセスでは存在するという幽霊みたいな存在になってます。
すぐに「プロセスツリーの終了」で落とすんですが。
最初の方の段階ではexeを立ち上げたとたんランタイムエラーと出て落ちてました。
質問する前に最小限のコメントアウトとかして、上記の幽霊アプリ状態になった感じです。
0586デフォルトの名無しさん
2010/11/28(日) 23:24:350587デフォルトの名無しさん
2010/11/28(日) 23:26:26はじめは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:360591デフォルトの名無しさん
2010/11/29(月) 00:00:20ああ、前までコメントアウトしたら起動してたのに、
あれこれ触ってる内に起動しなくなってしまいました…。
とりあえず今これ以上やってもここの方達振り回すだけになっちゃいそうなので、
自分でもうちょっと検証してみます。
ありがとうございます。
0592デフォルトの名無しさん
2010/11/29(月) 00:00:47insertの中をpairじゃなくてmake_pairにしてみ
0593デフォルトの名無しさん
2010/11/29(月) 00:14:07なんで?
0594デフォルトの名無しさん
2010/11/29(月) 00:24:25たまらんだろ刺すぞこの野郎
0595デフォルトの名無しさん
2010/11/29(月) 00:30:570596デフォルトの名無しさん
2010/11/29(月) 00:33:33キチガイに刃物。>>589にusing
0597デフォルトの名無しさん
2010/11/29(月) 00:35:510598デフォルトの名無しさん
2010/11/29(月) 00:53:360599594
2010/11/29(月) 00:54:22> #pragma pack(push, 1) // 構造体メンバのアライメントを変更
> struct X {
> }; ←popなし
とか書いてあったら殺したくなるだろう。それと同じ。
0600デフォルトの名無しさん
2010/11/29(月) 00:55:36お前は「紛らわしい奴」で「キチガイ」じゃないから安心しろ。
0601デフォルトの名無しさん
2010/11/29(月) 01:00:37キチガイのドカタ
キチガイのドカタ
キチガイのドカタ
職場でも、殺す、刺すとか普通に使ってるんだろ
0602デフォルトの名無しさん
2010/11/29(月) 01:01:220603デフォルトの名無しさん
2010/11/29(月) 01:06:10久々のリアル基地外登場
0604デフォルトの名無しさん
2010/11/29(月) 01:10:16指針とかありますでしょうか
0605デフォルトの名無しさん
2010/11/29(月) 01:11:280606デフォルトの名無しさん
2010/11/29(月) 01:11:370607デフォルトの名無しさん
2010/11/29(月) 01:25:01コンテナを選ぶのと同様に特徴を理解して一つ一つのケースで考えるしか無い
0608デフォルトの名無しさん
2010/11/29(月) 01:25:260609デフォルトの名無しさん
2010/11/29(月) 01:28:16生が適しているってどんな状況ですか
0610デフォルトの名無しさん
2010/11/29(月) 01:32:11boost禁止プロジェクトへの移植も余裕でできます
そしてコンパイル時間がアホほど違います
0611デフォルトの名無しさん
2010/11/29(月) 01:33:160612デフォルトの名無しさん
2010/11/29(月) 01:39:090613デフォルトの名無しさん
2010/11/29(月) 01:42:200614デフォルトの名無しさん
2010/11/29(月) 01:42:28ここテストに出ますから覚えておきましょうねー
0615デフォルトの名無しさん
2010/11/29(月) 01:44:11shared_ptr使うことあんま無いわ。
0616デフォルトの名無しさん
2010/11/29(月) 01:44:13スマポやめただけでリークするとかよっぽどレベル低い環境で仕事してるんだな
0617デフォルトの名無しさん
2010/11/29(月) 01:45:58はい。レベルの低い環境で仕事をしています。
参考までに、リーク防止の方法の例を教えていただけないでしょうか。
0618デフォルトの名無しさん
2010/11/29(月) 01:46:00こんなこというやつが実際にやらかすんだよな…
死ねばいいのに…
0619デフォルトの名無しさん
2010/11/29(月) 01:48:430620デフォルトの名無しさん
2010/11/29(月) 01:49:08デバッガでもアロケーターでもエディタ機能でも他のでも何でもいいよ
>>618
俺は自分の担当でメモリリーク一回もしたことない
0621デフォルトの名無しさん
2010/11/29(月) 01:50:26(キリッを付け忘れてますよ
0622617
2010/11/29(月) 01:55:00デバッガですか。スマートポインタは変数を宣言した時点で開放されることが保証されて
いることが大きなメリットだと思っていました。デバッガだと「デバッグ時に発生しなかった」
ことはわかりますが、プログラムの安全性が保証できるわけではないですよね。
Boost禁止されたら、私なら10行くらいでスマートポインタを書きます。
0623デフォルトの名無しさん
2010/11/29(月) 01:58:15そんな考えならGCでも使っとくべき
0624デフォルトの名無しさん
2010/11/29(月) 02:02:15ちゃんとした現場ならメモリーリークが珍しい事象であるのは確かだな
90年代はほとんどCで開発していたけどメモリーリークを見たのは2〜3回だ
0625デフォルトの名無しさん
2010/11/29(月) 02:02:180626デフォルトの名無しさん
2010/11/29(月) 02:59:220627デフォルトの名無しさん
2010/11/29(月) 05:13:50はboostのヘッダーに見た記憶あるぞ
0628デフォルトの名無しさん
2010/11/29(月) 05:17:52たとえヘッダだろうが、好きに書けばいい。
ヘッダのグローバル名前空間スコープに書くのが問題なんだ。
0629デフォルトの名無しさん
2010/11/29(月) 05:17:54boostシラネーけど
0630デフォルトの名無しさん
2010/11/29(月) 13:38:49OPEN GLはコーンソール画面に出せないから
常識的に言って画像ファイルか動画ファイルを書き出す風に
なると思いますが。
それぞれ何形式がよろしいでしょうか?
0631デフォルトの名無しさん
2010/11/29(月) 14:04:37http://www.youtube.com/watch?v=9ukhOAUseKY
0632デフォルトの名無しさん
2010/11/29(月) 14:19:35> プログラムの安全性が保証できるわけではないですよね。
頭おかしいのがまた沸いたか。
0633デフォルトの名無しさん
2010/11/29(月) 15:38:39{
static void boo(){}
};
とやればbooはインライン化されますか?
class Foo
{
static inline void boo(){}
};
とやらないとだめですか?
0634デフォルトの名無しさん
2010/11/29(月) 15:46:240635デフォルトの名無しさん
2010/11/29(月) 15:59:120636デフォルトの名無しさん
2010/11/29(月) 18:12:45機種依存ではなくて一番一般性の高いやつがいいです。
0637デフォルトの名無しさん
2010/11/29(月) 18:14:420638デフォルトの名無しさん
2010/11/29(月) 18:15:040639デフォルトの名無しさん
2010/11/29(月) 18:31:13画像なら、名前の通り移植性のある ppm がいい。最強だ。
0640デフォルトの名無しさん
2010/11/29(月) 18:42:03動画の形式が一つもでてないのでそちらもお願いします
0641デフォルトの名無しさん
2010/11/29(月) 18:59:040642デフォルトの名無しさん
2010/11/29(月) 19:15:17独自の形式を作ってそれをあとで変換すればいいんだ・・・
無駄なこと聞いてしまった自分が情けない。
0643デフォルトの名無しさん
2010/11/29(月) 19:50:38静止画を高速に連続に表示すれば、動画になるよね
動画するのに必要な分の静止画を作りそれを一つにまとめ
各静止画を1/60sレート位で連続表示すれば良いんじゃないか
0644デフォルトの名無しさん
2010/11/29(月) 21:38:390645デフォルトの名無しさん
2010/11/29(月) 22:07:060646デフォルトの名無しさん
2010/11/29(月) 22:19:500647デフォルトの名無しさん
2010/11/29(月) 23:40:50[開発環境]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:570649デフォルトの名無しさん
2010/11/30(火) 00:24:02"AB"
は 45*10+11 で
00111001101 になるのは理解できてるか?
それと最終的に
モード指示子、文字数指示子、データ、終端パターン のビット列を並べて
で9バイトになるってのも理解できてるか?
0650デフォルトの名無しさん
2010/11/30(火) 00:38:160651デフォルトの名無しさん
2010/11/30(火) 00:41:380652デフォルトの名無しさん
2010/11/30(火) 00:47:510653デフォルトの名無しさん
2010/11/30(火) 00:49:180654デフォルトの名無しさん
2010/11/30(火) 00:59:32>そもそも11bitなんて単位では扱えないし
いや、英数字モードを11bitで扱いましょうってそこに書いてあるだろ
00111001101 は11個のbitだろ
0655デフォルトの名無しさん
2010/11/30(火) 01:36:100656デフォルトの名無しさん
2010/11/30(火) 09:49:39list.Add(new int(10));
上記の要素をeraseした時点で 10が入ってた領域はdelete されてますか?
list自体使われなくなった時点でまとめてdelete?
0657デフォルトの名無しさん
2010/11/30(火) 09:51:22当然
そのためのptr_container
0658656
2010/11/30(火) 09:56:42ちなみにptr_listはaddないからpush_backでした
0659デフォルトの名無しさん
2010/11/30(火) 10:02:06出来ないので(実際は参照でも出来るがほとんど使われない)、コンテナで
ポリフォーリズムをするために用意されたと思われる
何せ標準で用意されているコンテナは同じサイズの物しか入れられず、派生
クラスも入れられない
そこでポインタをコンテナに入れるわけだが、コンテナを操作して使われなくなった
インスタンスはデストラクタを自動的に呼んでくれない(インスタンスが入っていた
場合は呼んでくれるが、ポインタが入っていたら無視される)
そこでboost::ptr_vectorが登場したと考えられる
0660デフォルトの名無しさん
2010/11/30(火) 10:02:47○ptr_container
0661デフォルトの名無しさん
2010/11/30(火) 10:05:020662デフォルトの名無しさん
2010/11/30(火) 10:10:47×ポリフォーリズム
○ポリモーフィズム
>>661
他の説明があったらよろしく
0663デフォルトの名無しさん
2010/11/30(火) 10:12:220664デフォルトの名無しさん
2010/11/30(火) 10:24:170665デフォルトの名無しさん
2010/11/30(火) 10:27:430666デフォルトの名無しさん
2010/11/30(火) 10:36:41これプログラム中に1文字列につき1回しか呼ばれないから
どうにかしてコンパイル中に解決して元の文字列をexeから消滅させたいんだけど
そういうことってC++だけで出来る?
0667デフォルトの名無しさん
2010/11/30(火) 10:46:16C++0xならできそうだけど普通のC++では難しそう
0668デフォルトの名無しさん
2010/11/30(火) 11:47:180669デフォルトの名無しさん
2010/11/30(火) 12:51:36結果を吐くC++プログラムを書けば良い。
必然的に、二段コンパイルになるだろうけどな。
0670デフォルトの名無しさん
2010/11/30(火) 17:25:44>C++が事実上ポインタを通してしかポリフォーリズム
>出来ないので(実際は参照でも出来るがほとんど使われない)
事実上ポインタを通してしか、出来ない理由は理由は何?
(参照でも出来るのに、ほとんど使われない理由は何?)
0671デフォルトの名無しさん
2010/11/30(火) 17:40:150672デフォルトの名無しさん
2010/11/30(火) 17:46:560673デフォルトの名無しさん
2010/11/30(火) 17:56:17参照でポリモルフィズムを行うためにはインスタンスを明示して
それの仮想関数を呼び出す必要がある
つまりハードコーディングになるのであまり利用価値がない
というか出番が少ない
0674デフォルトの名無しさん
2010/11/30(火) 17:58:43呼び出すシチュエーションが多いな
0675デフォルトの名無しさん
2010/11/30(火) 18:10:49インスタンスを明示ってなに?
参照でもポインタと使い方変わんないよ?
0676デフォルトの名無しさん
2010/11/30(火) 18:16:30インスタンスを明示した場合は例え仮想関数の呼び出しでも直接コールに
コンパイルされるよ
スピードが命のC++だからね
0677デフォルトの名無しさん
2010/11/30(火) 18:44:57紛らわしい・・・
参照でポリモーフィズム使う場面って、引数くらいだよね確かに
0678デフォルトの名無しさん
2010/11/30(火) 18:48:580679デフォルトの名無しさん
2010/11/30(火) 19:02:34日本g……コードでおk
0680デフォルトの名無しさん
2010/11/30(火) 21:06:160681デフォルトの名無しさん
2010/11/30(火) 21:07:25OSを独自にいじるライブラリに頼るしかない
処理系依存・環境依存
0682デフォルトの名無しさん
2010/11/30(火) 21:09:080683デフォルトの名無しさん
2010/11/30(火) 22:05:28std::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:160685304
2010/11/30(火) 22:39:14int型の1,2bit目で判断するのと、pair<bit,bit>を使うのとどっちがスマートでしょうか?
それ以外の方法もあります?
0686デフォルトの名無しさん
2010/11/30(火) 22:39:48「あいうえお」の長さが5になったらそれは最早UTF-8ではない。
とりあえず
std::wstring str(L"あいうえお");
でどうだ?
0687デフォルトの名無しさん
2010/11/30(火) 22:40:32ビットフィールドを使う
引数に参照を渡して2bit操作する
0688デフォルトの名無しさん
2010/11/30(火) 22:41:07しかもクッキー食べ忘れ
0689デフォルトの名無しさん
2010/11/30(火) 22:46:35一般にグローバル変数はいけない、という事なのですが、
全てのファイルで一貫して使う定数などはどこにどう定義すればいいのでしょうか?
0690デフォルトの名無しさん
2010/11/30(火) 22:48:29それぞれの値が数値でなく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>「あいうえお」の長さが5になったらそれは最早UTF-8ではない。
なんでだ。
0692デフォルトの名無しさん
2010/11/30(火) 22:51:41なぜグローバルがダメなのか分からないレベルの初心者なら気にするな
周りの言葉に惑わされて全然関係ないところで躓く典型だ
0693デフォルトの名無しさん
2010/11/30(火) 22:54:39namespace foo
{
const int boo = 1000;
}
とかやれば
0694デフォルトの名無しさん
2010/11/30(火) 23:02:22>>693
ありがとうございます
ちなみに、変数名の重複以外の理由でグローバル変数が駄目な理由って
何があるでしょうか?
0695デフォルトの名無しさん
2010/11/30(火) 23:10:20回答ありがとうございます。
バイト数ではなく、文字数(=5)を得たいという意味です。
> std::wstring str(L"あいうえお");
> でどうだ?
実際に扱いたいのはリテラルではなくて、UTF-8の入出力なので
その方法だと無理そうです。。
(PCとかならプログラムの入出力に別プログラムでフィルタかませば
済みそうなんですが、組み込みでの使用を考えてるので、それも難しい)
0696デフォルトの名無しさん
2010/11/30(火) 23:15:30グローバル変数がいつ何処で書き換わるのかを追うことが難しく、読みにくくなるから。
だからグローバルな定数なら文句を言う奴は少ない。
0697デフォルトの名無しさん
2010/11/30(火) 23:24:51内部はstd::wstringで表現すれば比較的楽にいけるんじゃないかと
思いついた。
というわけで、そういう方向でやってみますー
0698デフォルトの名無しさん
2010/12/01(水) 00:24:56MultiByteToWideChar呼べば問題無いと思うが。ついでにシフトジスにも対応できる。
0699デフォルトの名無しさん
2010/12/01(水) 01:03:530700デフォルトの名無しさん
2010/12/01(水) 01:07:110701デフォルトの名無しさん
2010/12/01(水) 01:10:03何言ってやがる。
std::iostream も std::exception も参照でポリモーフィズム利用するのが基本だろ。
0702デフォルトの名無しさん
2010/12/01(水) 10:26:05成功するまで繰りかえす、ログに出力して放置、即落ちる、とか考えたけどどれもいまいちピンとこない
0703デフォルトの名無しさん
2010/12/01(水) 10:41:16基本はログ出力やメッセージ表示して放置でいいと思うけど
0704デフォルトの名無しさん
2010/12/01(水) 12:13:482で割ると同じことになるんですか?
0705デフォルトの名無しさん
2010/12/01(水) 12:17:04ならない
0706デフォルトの名無しさん
2010/12/01(水) 12:29:11実はやってみた事がある
キャリーフラグを通しての回転なのでインラインアセンブラを使った
結果は出力がバグって100桁以上の出力になったっけ
多分IEEE754が意図していない変なビットパターンになっちゃったんだな
0707デフォルトの名無しさん
2010/12/01(水) 12:32:42クヌースの1巻の1.2.2の問題25で右シフトして
半分にしてるんだけど。
0708デフォルトの名無しさん
2010/12/01(水) 12:34:28指数部が1減るだけ
0709デフォルトの名無しさん
2010/12/01(水) 12:37:210710デフォルトの名無しさん
2010/12/01(水) 12:38:09それ多分IEEE754形式じゃないんだよ
エクセス64方式でもそうはならない
0711デフォルトの名無しさん
2010/12/01(水) 12:39:01だめだと思う
指数部や符号部までシフトされちゃうからおかしくなるよ
0712デフォルトの名無しさん
2010/12/01(水) 13:23:290.5になると思うか?
0713デフォルトの名無しさん
2010/12/01(水) 13:42:030714デフォルトの名無しさん
2010/12/01(水) 13:51:390715デフォルトの名無しさん
2010/12/01(水) 15:32:23IA-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:19http://codepad.org/ayEWJGBS
0717デフォルトの名無しさん
2010/12/01(水) 15:43:36それは当たり前
0718デフォルトの名無しさん
2010/12/01(水) 18:11:58http://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死ね
0720デフォルトの名無しさん
2010/12/02(木) 03:56:33素直に2で割った方が早いだろJK
0722デフォルトの名無しさん
2010/12/02(木) 06:02:270723デフォルトの名無しさん
2010/12/02(木) 17:43:21ストリームの対象を変えずにオープンモードだけ変える方法ってある?
C++でなかったらCでもいいです
0724デフォルトの名無しさん
2010/12/02(木) 18:19:12処理系に依存しない方法では無理。Visual C++ならこんな感じ。
#include <fcntl.h>
#include <io.h>
#define setbinmode(fp) setmode(fileno(fp), O_BINARY)
0725724
2010/12/02(木) 18:23:17#if (defined(_MSC_VER) && (_MSC_VER > 600))
# define setmode(x, y) _setmode((x), (y))
# define fileno(x) _fileno(x)
# define isatty(x) _isatty(x)
#endif
0726デフォルトの名無しさん
2010/12/02(木) 18:23:350727デフォルトの名無しさん
2010/12/02(木) 19:01:590728デフォルトの名無しさん
2010/12/02(木) 19:13:100729デフォルトの名無しさん
2010/12/02(木) 20:22:43VMSのことも時々でいいので思い出してあげて下さい
0730デフォルトの名無しさん
2010/12/03(金) 06:53:27使用する関数や言語機能のドキュメントを読んで、
プラットフォーム依存な部分があるのかないのか確認すれば
よいでしょう。
0731デフォルトの名無しさん
2010/12/03(金) 12:37:210732デフォルトの名無しさん
2010/12/03(金) 12:44:48どう測定したらパソコンの性能に依存なんてするの?
0733デフォルトの名無しさん
2010/12/03(金) 12:45:030734デフォルトの名無しさん
2010/12/03(金) 12:47:49どうやって比べるの?
0735デフォルトの名無しさん
2010/12/03(金) 12:54:362つのパソコンで2つのアルゴリズムについて std::clock() あたりで実行時間を計測すればいいんじゃないの?
0736デフォルトの名無しさん
2010/12/03(金) 13:00:33実行速度はパソコン性能に依存するので諦めて下さい
0737デフォルトの名無しさん
2010/12/03(金) 13:02:58パソコン1でアルゴリズム1を測定、パソコン2でアルゴリズム2を測定して、
その2つの計測結果のみでアルゴリズム1とアルゴリズム2のどちらが速いか
決めたい、ってことなのかな?
それは無理だ。
計算量の話にすれば O(1) とか O(N) とか O(logN) の違いでアルゴリズムを
比較することはできるけど、それがそのままどちらが速いという結果につながる
わけでもないし。
0738デフォルトの名無しさん
2010/12/03(金) 13:13:14クロック数を測る方法でいいです。
0739デフォルトの名無しさん
2010/12/03(金) 13:22:03諦めました
0740デフォルトの名無しさん
2010/12/03(金) 13:24:020741デフォルトの名無しさん
2010/12/03(金) 13:26:350742デフォルトの名無しさん
2010/12/03(金) 13:27:420743デフォルトの名無しさん
2010/12/03(金) 13:28:50終わりだな。
0744デフォルトの名無しさん
2010/12/03(金) 13:59:45メモリ2枚差し3枚差しでも全然違ってくるから、ベンチマークはPCに依存しない
プログラムは原理的に作る事が出来ない
0745デフォルトの名無しさん
2010/12/03(金) 14:01:00あるアルゴリズムがどの位の計算量を持つのかそのオーダーを知る事は出来る
0746デフォルトの名無しさん
2010/12/03(金) 14:38:38ビッグ・オーはビッグ・オじゃないの?
なんでオーダーはオーダじゃないの?
0747デフォルトの名無しさん
2010/12/03(金) 14:45:230748デフォルトの名無しさん
2010/12/03(金) 15:19:29ということで質問です。
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:030750デフォルトの名無しさん
2010/12/03(金) 15:56:05いくつマルチポストしてるんだカス
ここへ行け
くだすれC++Builder(超初心者用)その4
http://hibari.2ch.net/test/read.cgi/tech/1256256376/
Delphiのプログラムを簡単に移植出来るのはC++Builderしかない
0751デフォルトの名無しさん
2010/12/03(金) 21:04:42vector<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:490753デフォルトの名無しさん
2010/12/03(金) 21:09:39vec.push_back(ch);だと思うけど、
ポインタがコピーされるだけだから数字は入ってない
0754デフォルトの名無しさん
2010/12/03(金) 21:13:20vec.push_bak(*ch);
0755デフォルトの名無しさん
2010/12/03(金) 21:17:250756デフォルトの名無しさん
2010/12/03(金) 21:31:240757デフォルトの名無しさん
2010/12/03(金) 22:34:51vector<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:250759デフォルトの名無しさん
2010/12/03(金) 22:39:39boost::ptr_vector<char>を使う
0760デフォルトの名無しさん
2010/12/03(金) 22:41:480761デフォルトの名無しさん
2010/12/03(金) 22:49:480762デフォルトの名無しさん
2010/12/03(金) 22:52:270763デフォルトの名無しさん
2010/12/03(金) 22:53:47関数中に
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:310765デフォルトの名無しさん
2010/12/03(金) 23:11:030766デフォルトの名無しさん
2010/12/03(金) 23:21:07structにでもぶち込もう
0767デフォルトの名無しさん
2010/12/03(金) 23:21:20そんなやり方で出来るんですか!
0768デフォルトの名無しさん
2010/12/04(土) 02:09:48それともJava/.NETのnewと比べてる? そりゃまあ遅い罠。
0769デフォルトの名無しさん
2010/12/04(土) 02:51:240770デフォルトの名無しさん
2010/12/04(土) 02:53:210771デフォルトの名無しさん
2010/12/04(土) 03:14:000772デフォルトの名無しさん
2010/12/04(土) 03:15:02どんな計測結果見て「あんなに」と言ってるのか書いてもらわないと、なんとも。
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:38iostreamを例外使用で書くとこんな感じですか?
例外使ったサンプルが少なくて困りますわ
0775デフォルトの名無しさん
2010/12/04(土) 12:31:28二重のテンプレートだから template<> が2つ要るんじゃない?
0776デフォルトの名無しさん
2010/12/04(土) 12:57:12ある変数fooのnumeric_limits使うときに
わざわざfooの型を見つけてnumeric_limits<double>とかやらないとならんのですか?
numeric_limits<foo>とかできないもんでしょうか。
0777デフォルトの名無しさん
2010/12/04(土) 13:13:030778デフォルトの名無しさん
2010/12/04(土) 13:45:27それって文字列格納できるの?
>>754ができるってこと?
0779デフォルトの名無しさん
2010/12/04(土) 14:33:310780デフォルトの名無しさん
2010/12/04(土) 14:35:420781デフォルトの名無しさん
2010/12/04(土) 14:36:420782デフォルトの名無しさん
2010/12/04(土) 14:41:42基底クラスにアクセスしようとするとハードディスクをフォーマットするようにしておく
0783デフォルトの名無しさん
2010/12/04(土) 14:49:19させたくないという考えがでる時点で、
すでに基本クラスを使っているだろうから・・・
常にハードディスクをフォーマットするプログラムか。
0784デフォルトの名無しさん
2010/12/04(土) 15:19:33std::stringを使うという脳みそはないのか
0785デフォルトの名無しさん
2010/12/04(土) 16:47:11なので、linux + gcc環境下で#include <cstring>とやってみましたが、エラーが出ませんでした
cstringはmfcのモノなんですか?
0786デフォルトの名無しさん
2010/12/04(土) 16:48:35std::strcpy とか std::memcpy とかを使うために必要なヘッダファイルだ
0788デフォルトの名無しさん
2010/12/04(土) 18:00:450789デフォルトの名無しさん
2010/12/04(土) 18:01:56C++でも使えることになってるから別に使ってもいい
推奨されてはいないが、気にすることはない
0790デフォルトの名無しさん
2010/12/04(土) 18:18:57例えばCのstdlib.hはabs(int)しかないが、C++のstdlib.hはabs(double)があったりする、
はずだが実際には規格に従っていない処理系があったりする。
0791デフォルトの名無しさん
2010/12/04(土) 18:29:030792デフォルトの名無しさん
2010/12/04(土) 18:33:57abs(doble) は<cmath>じゃね?
Cのmath.hに定義されるfabs()に対応するためのオーバーロード
0793デフォルトの名無しさん
2010/12/04(土) 18:38:2326.5 C Libraryにはcstdlibって書いてある
0794デフォルトの名無しさん
2010/12/04(土) 19:05:393. 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そもそもが敢えてchar*でやるっていうお題なんだけど
自分の脳ミソ疑ったほうが良いんじゃないの?
0796デフォルトの名無しさん
2010/12/04(土) 20:11:16decltype調べてみましたがC++0xの機能のようですね。
msdn見てみるとVS2010以降で使えるようです。
私の環境はVS2008でなのですが、変わりになるようなものあるでしょうか?
0797デフォルトの名無しさん
2010/12/04(土) 20:15:510798デフォルトの名無しさん
2010/12/04(土) 20:31:20boost::typeof
いまいちだけど
0799デフォルトの名無しさん
2010/12/04(土) 20:44:25だろ
え およびでない?
0800デフォルトの名無しさん
2010/12/04(土) 20:47:38>>763みたいな案もでてんじゃん。
そもそものお題すらぶち壊す代替案しかだせないレベルなら出てこなくて良いよ
ここは質問したいやつとそれに答えれるレベルのやつのスレなんだから
0801デフォルトの名無しさん
2010/12/04(土) 20:54:27>>763 はダメだろ。
お題は vec のスコープアウトでの破棄なのに、 ch のスコープで破棄されてる。
0802デフォルトの名無しさん
2010/12/04(土) 22:46:08関数ポインタを登録して、コールバックすればいいだけおk?
0803802
2010/12/04(土) 22:46:510804デフォルトの名無しさん
2010/12/04(土) 22:51:480805デフォルトの名無しさん
2010/12/04(土) 22:58:54って要素数ゼロ指定したらどんな良くないこと起きますか?
0806デフォルトの名無しさん
2010/12/04(土) 23:07:400807デフォルトの名無しさん
2010/12/04(土) 23:08:13べつに。
「ヌルじゃなければオブジェクトを指しているという」仮定をおいている
コードにそのポインタを渡したときに不正なアクセスとなる可能性は考えられる。
でもどうせ配列アクセスするときにはサイズでチェックするから、それもないか。
0808デフォルトの名無しさん
2010/12/04(土) 23:12:06ideoneではnullにならないけど。
http://ideone.com/rcLdA
0809デフォルトの名無しさん
2010/12/04(土) 23:15:32ヌルにはならないよ。
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:34bcc でも NULL にならなかった double* a で sizeof *a が 8 だったから1要素分は alloc されるんだね
知らんかったよ
0811デフォルトの名無しさん
2010/12/04(土) 23:27:580812デフォルトの名無しさん
2010/12/05(日) 00:17:04p != NULL
*p == NULL
が正しい
0813デフォルトの名無しさん
2010/12/05(日) 00:19:24それも違うだろ。
0814デフォルトの名無しさん
2010/12/05(日) 00:30:330815デフォルトの名無しさん
2010/12/05(日) 00:38:25>>763を試しにやってみたが、その通りだな
結局、ここのスレレベルでは実現出来ない or >>758の通りってことかな
0816デフォルトの名無しさん
2010/12/05(日) 00:44:37これはひどいな
0817デフォルトの名無しさん
2010/12/05(日) 00:53:22*p で未定義動作なのに、なんでp==NULLや例外発生しないの?
あと、どんな時使うの?
0818デフォルトの名無しさん
2010/12/05(日) 01:20:400819デフォルトの名無しさん
2010/12/05(日) 01:27:10なぜ勘でここまで断言できちゃうのかのほうが知りたい。
0820デフォルトの名無しさん
2010/12/05(日) 01:29:35○思い込み
0821デフォルトの名無しさん
2010/12/05(日) 01:41:59サイズ 0 の配列が欲しいという要求は満たせているのだから、例外が発生しないのは当然。
ヌルを返さないのは「ヌルは確保の失敗を示す」という一般的な意味づけを保つように、だと思う。
0822デフォルトの名無しさん
2010/12/05(日) 01:45:45サイズ 0 の場合を特別扱いしなくていいように、だろう。
0823デフォルトの名無しさん
2010/12/05(日) 01:54:18思い込みとも違うような気がする。
0824デフォルトの名無しさん
2010/12/05(日) 02:13:04sizeof *aはnewしたサイズじゃないぞ。sizeof a[0]と同じ。もちろん実際のメモリアクセスは発生しない。
0825デフォルトの名無しさん
2010/12/05(日) 02:15:32ってどうゆう意味よ。
int p; じゃまずいの?
new したら deleteするタイミング必要だし。
0826デフォルトの名無しさん
2010/12/05(日) 02:27:23実際は実行時に決まる要素数がたまたま 0 になる場合の話だろ。
0827デフォルトの名無しさん
2010/12/05(日) 02:28:09デストラクタ使えば何とでもなるだろ。
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];
}
0828810
2010/12/05(日) 02:36:08malloc() を呼ぶ時に size が0だとNULLになるだろ
size 0 のヒープは確保できないから最低単位、例えば size 1 のヒープを確保するって事か?
>>824
double* a の時、sizeof *a は sizeof double と同じだな、確かに確保した領域とは関係ないや
0829デフォルトの名無しさん
2010/12/05(日) 02:37:23char buf[1000]:
A* a = new(buf) A[10];
で確保した10個のAのデストラクタを呼び出すにはどうすればいいんでしょうか?
0830デフォルトの名無しさん
2010/12/05(日) 02:41:40>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:08for (int i=0; i<10; i++) a[i].~A();
0832デフォルトの名無しさん
2010/12/05(日) 02:49:29vectorって仮想デストラクタ持ってたのか
知らなかった
0834デフォルトの名無しさん
2010/12/05(日) 02:56:08継承したからといって virtual デストラクタを持っているとは限らない。
virtual デストラクタを持っていないからといって継承しないとは限らない。
0835デフォルトの名無しさん
2010/12/05(日) 02:57:190836デフォルトの名無しさん
2010/12/05(日) 03:18:52そうは言っても NULL 返さない処理系なんて見た事無いよ
いやまた思い込みって言われるか、確かに過去に扱った処理系全部で size 0 malloc() なんて試してないからなぁ
要点はね bcc だと malloc() は NULL を返し、 new は NULL を返さないって点なんだ
size 0 の場合 new は要素を持たない配列を確保するって言われてもイメージが沸かないでしょ
実装上どういう確保が行われてるか知りたいんだけど....なんかスレ違いみたいだからもう良いや
0837デフォルトの名無しさん
2010/12/05(日) 03:29:17dlmalloc のソースや libstdc++ のソースを見るといい。
0838デフォルトの名無しさん
2010/12/05(日) 03:35:54ポインタが以前確保した領域と同じか比較する奴がいて、サイズ0だとNULL
どうしで同じになって困るバカがいたから必ず違うアドレスが返る様にしたと
昔のマイクロソフトのドキュメントに書いてあった。
0839デフォルトの名無しさん
2010/12/05(日) 03:41:00マジ?
0840デフォルトの名無しさん
2010/12/05(日) 03:51:00コールバックしてもらえばOK。ただし基本はそこから他の関数を呼んじゃいけない。
0841デフォルトの名無しさん
2010/12/05(日) 04:00:15bufは動的に確保しろよ。でなきゃアライメントが保証できない。
0842デフォルトの名無しさん
2010/12/05(日) 04:24:210843デフォルトの名無しさん
2010/12/05(日) 04:36:22C++03では、アライメントというもの自体が規定されていなかったので、実装依存だった、
C++0xでは、alignasというキーワードが導入されたので、ちゃんと指定しろよ。
class A { } ;
alignas(A) char buf[1000] :
A* a = new(buf) A[10] ;
0844デフォルトの名無しさん
2010/12/05(日) 05:04:14> C++03では、アライメントというもの自体が規定されていなかった
んなこたーない
0845デフォルトの名無しさん
2010/12/05(日) 07:49:43p = new int[5];ってするとどうなりますか?
一応問題なく動いてるようにみえますが・・・
0846デフォルトの名無しさん
2010/12/05(日) 08:12:05解放できないint10個分の領域が出来るだけ
0847デフォルトの名無しさん
2010/12/05(日) 08:19:52ありがとう
0848デフォルトの名無しさん
2010/12/05(日) 09:51:330849デフォルトの名無しさん
2010/12/05(日) 09:52:51なんだろう。今はメモリーとアドレスといった、プログラミング以前の概念が、分かりにくくなっているんだろうか。
0850デフォルトの名無しさん
2010/12/05(日) 10:28:33お前がvirtualつけなくていい例を理解してないアホだと思われてるんだろ
0851デフォルトの名無しさん
2010/12/05(日) 11:25:03そしたらvectorのデストラクタは呼ばれないよね
大丈夫なの?
0852デフォルトの名無しさん
2010/12/05(日) 11:31:24仕様を勘違いしてない?
自動変数→OK.必ず全部呼ばれる
virtualデストラクタ無し、派生クラスのポインタでdelete→OK
virtualデストラクタ無し、基本クラスのポインタでdelete→NG、基本クラスのデストラクタのみ
virtualデストラクタ有り、派生クラスのポインタでdelete→OK
virtualデストラクタ有り、基本クラスのポインタでdelete→OK
0853デフォルトの名無しさん
2010/12/05(日) 11:32:56揚げ足取りだが二番目は一般的な挙動なだけで
実際は未定義動作だな
0854デフォルトの名無しさん
2010/12/05(日) 11:33:58ありがとうございます
もっと精進します
0855デフォルトの名無しさん
2010/12/05(日) 11:40:54そんな面倒な事を覚えなきゃならない欠陥言語をどうして使うんだ?
0856デフォルトの名無しさん
2010/12/05(日) 11:51:30覚えられない奴は別の言語使えばいいんじゃね
0857デフォルトの名無しさん
2010/12/05(日) 13:46:30個々の場合についていちいち覚えてる必要ないし
0858デフォルトの名無しさん
2010/12/05(日) 15:34:00あぁそういうことだったのかコンパイラさん面倒なことをいつも引き受けてくれてありがとう
ってなって二度と間違えることはなくなるよ
0859デフォルトの名無しさん
2010/12/05(日) 15:38:260860デフォルトの名無しさん
2010/12/05(日) 15:42:57これがOKなのって、派生クラスのポインタを通じた破棄は
正しく派生クラスのオブジェクトの破棄とみなされて
派生クラス部分の破棄(派生クラスのデストラクタ呼び出し)
→基底クラス部分の破棄(基底クラスのデストラクタ呼び出し)の順で行われるからでいいんですか?^^;
0861デフォルトの名無しさん
2010/12/05(日) 15:43:140862デフォルトの名無しさん
2010/12/05(日) 15:45:040863デフォルトの名無しさん
2010/12/05(日) 15:49:18そうだね
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:310865デフォルトの名無しさん
2010/12/05(日) 15:57:08わかりやすい例でサンクスです^^
0866デフォルトの名無しさん
2010/12/05(日) 17:01:27継承しても多相しないのならイラネ
覚えとくように。シャキーーーーン
嘘はシャキーーーーンっと言おう、さればこそ釣が出来る
0867デフォルトの名無しさん
2010/12/05(日) 17:11:160868デフォルトの名無しさん
2010/12/05(日) 17:50:09そうすることで、コンパイラによりますが、大抵は
vtableという見えないデータメンバを余分に持つことになり、
それが速度に多大な影響を及ぼす場合などもあります。
また、sizeof(クラス名)としても、直感とは違う値が返ってきます。
ですので、C++の高級アセンブラという側面からは、
virtual を言語レベルで強制することは出来なかったです。
0869デフォルトの名無しさん
2010/12/05(日) 19:42:02クソワロタw
0870852
2010/12/05(日) 21:26:37俺の場合は仕事だからね。コンパイル時も実行時もエラーを出せないことがある
のは確かに欠陥だとは思うけど、昔は「プログラマーは間違えない」ことを前提とした
仕様がまかり通ってた。面倒だと思ったら
・正しい本来の型で開放→問題なし
・本来の型と異なる型で開放→virtualデストラクタがないと正しく開放されない
と覚えてくれ。
0871デフォルトの名無しさん
2010/12/05(日) 22:14:13第2版は古いので、ややいい加減です。
0872デフォルトの名無しさん
2010/12/05(日) 23:12:52それって静的にわからないもんなのかな?
0873デフォルトの名無しさん
2010/12/05(日) 23:19:55静的変数や自動変数ならわかるが、newした場合ポインタから指すと
基底クラスと派生クラスのどちらを指しているのかわからない
0874デフォルトの名無しさん
2010/12/05(日) 23:20:42Derived drv;
Base* b = &drv;
もうこれだけで静的には解決できない
0875デフォルトの名無しさん
2010/12/05(日) 23:54:21void 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:050878デフォルトの名無しさん
2010/12/06(月) 00:07:500879デフォルトの名無しさん
2010/12/06(月) 01:36:13関数内でそのまま並んでる場合ならコンパイラによってはフロー解析して静的に解決するかもしれない。
実際以下のコードで 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:57ttp://codepad.org/b4iGy7WE
たぶんこうしたいんだろうなぁ
0882デフォルトの名無しさん
2010/12/06(月) 13:05:03全て教えてください。
それとtagを使って多重定義されている関数をコンパイル時に振り分けるとき
スタックにtagをつんだりして実行速度はおそくなりますか?
0883デフォルトの名無しさん
2010/12/06(月) 13:12:260884デフォルトの名無しさん
2010/12/06(月) 13:17:36それはいったいなんの役に立つんだ?
0885デフォルトの名無しさん
2010/12/06(月) 14:46:49すでに ++ があるのになぜわざわざ別に next が必要なのか説明するべき
0886デフォルトの名無しさん
2010/12/06(月) 14:49:07あ、hasNext()みたいなやつです
0887デフォルトの名無しさん
2010/12/06(月) 15:25:16それはいったいなんの役に立つんだ?
end() と比較するだけでは不十分なのか?
0888デフォルトの名無しさん
2010/12/06(月) 16:18:510889デフォルトの名無しさん
2010/12/06(月) 16:32:14スタックに積んで遅くなることはあんまりない
0890デフォルトの名無しさん
2010/12/06(月) 16:42:46一つ目の質問。
iterator_traitsにdifferenceというネストされた型名はない。
したがって質問に応えることはできない。
ちなみに、よく似た名前の、difference_typeならある。
これは、signed integral typeと定められている。
したがって、unsignedな整数型はだめだし、浮動小数点数型はもってのほかだし、クラスはありえない。
二つ目の質問。
実装依存であるため、正解はない。
しかし、関数のインライン展開ができるほどのコンパイラなら、まず最適化で消えるだろう。
0891デフォルトの名無しさん
2010/12/06(月) 16:43:44上記の文は遅くなる原因なら何でもOKと言い換えられますよ
0892デフォルトの名無しさん
2010/12/06(月) 16:44:55ありがとうございました。
0893デフォルトの名無しさん
2010/12/06(月) 19:20:57コンテナしらないオブジェクトが使うときあるじゃないですか
0894デフォルトの名無しさん
2010/12/06(月) 19:28:02a=new char[10](これはエラーです)
みたいなことはできますか?
固定長の配列を動的確保したいのですが?
0895デフォルトの名無しさん
2010/12/06(月) 19:36:24aをヒープ領域としてそっから10個分確保したいってこと?
0896デフォルトの名無しさん
2010/12/06(月) 19:38:38普通に
char *a;
a = new char[10];
とするのと何が違うのか説明したまえ
0897デフォルトの名無しさん
2010/12/06(月) 20:24:20二次元配列ということか?
0898デフォルトの名無しさん
2010/12/06(月) 20:27:48確かに意味不明だが
ポンタaはchar配列長256のみ指す用にしたいってこと
a=new char[10]
この場合は、aは配列長10を指す用になるから、ダメポにしたいってことだろ
これぐらい分らないか...いまや日本はゆとりだらけだからな
0899デフォルトの名無しさん
2010/12/06(月) 20:29:33できない。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:15char256 *a=new char256();
0901デフォルトの名無しさん
2010/12/06(月) 20:47:44お前が何を言っているのか理解できねーよw
0902デフォルトの名無しさん
2010/12/06(月) 20:49:15array<100> &a = *new array<100>;
a[0] = '\0';
delete &a;
0903デフォルトの名無しさん
2010/12/06(月) 21:01:260904デフォルトの名無しさん
2010/12/07(火) 01:06:27∩_
〈〈〈 ヽ
____ 〈⊃ }
/⌒ ⌒\ | |
/( ●) (●)\ ! !
/ :::::⌒(__人__)⌒:::::\| l
| |r┬-| | / <こいつ最高にアホ
\ ` ー'´ //
/ __ /
(___) /
0905デフォルトの名無しさん
2010/12/07(火) 01:10:53>これぐらい分らないか...いまや日本はゆとりだらけだからな
>これぐらい分らないか...いまや日本はゆとりだらけだからな
>これぐらい分らないか...いまや日本はゆとりだらけだからな
/ / '" / / ,,-、 /、ヽ\ ゙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:530907デフォルトの名無しさん
2010/12/07(火) 03:34:340908デフォルトの名無しさん
2010/12/07(火) 06:32:000909デフォルトの名無しさん
2010/12/07(火) 07:26:51余計な改行するな。
0910デフォルトの名無しさん
2010/12/07(火) 11:29:27>>909
コメント行にしとけ
コンパイルエラーがでる
*/
0911デフォルトの名無しさん
2010/12/07(火) 11:54:250912デフォルトの名無しさん
2010/12/07(火) 14:19:50これが便利だ。ぼけども。
#endif
0913デフォルトの名無しさん
2010/12/07(火) 14:36:01for ( 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:490915デフォルトの名無しさん
2010/12/07(火) 14:41:50>count[4] += 1;}
ここ通らないから+1されないんだろ
0916デフォルトの名無しさん
2010/12/07(火) 15:16:32こちらはCSVから条件の値をとっているのですが、
a.jikan[ 1 ].keiの値をコマンドプロンプトで取り出すと全てマイナスでした。
しかし、CSVを見てみるとその値にはマイナスでなく、
a.jikan[ 1 ].kei >= 420 && a.jikan[ 1 ].kei < 480の条件に合った値が載っています。
何故だかわかる方はいらっしゃいますか?
0917デフォルトの名無しさん
2010/12/07(火) 15:17:530918デフォルトの名無しさん
2010/12/07(火) 15:26:26俺らには見えないCSVから値をとる処理とやらが間違ってるんだろうと推測するしかない
0919デフォルトの名無しさん
2010/12/07(火) 15:28:44私自身も省略が多い等失礼な事をしました。
みなさんからの助言を下に改めて確認してみたいと思います。
本当にありがとうございました。
0920デフォルトの名無しさん
2010/12/07(火) 17:59:22例えば四ギガのファイルを開く→二ギガ目に移動→現在の位置をゼロ点にして二ギガのファイルとして開き直す(この時点でtellするとゼロ、終端位置でtellすると二ギガが返る)
世の中そんなに甘くないですかね?
0921デフォルトの名無しさん
2010/12/07(火) 18:02:350922デフォルトの名無しさん
2010/12/07(火) 18:04:59「開き直す」にどんな意味があるのかよくわからないけど
0923デフォルトの名無しさん
2010/12/07(火) 18:09:46アルゴリズムみたいなのが、何処かにありませんか?
バイト文字では有るのですが、それをワイド文字に適用しても2バイトになってしまうので><
0924デフォルトの名無しさん
2010/12/07(火) 18:45:560925デフォルトの名無しさん
2010/12/07(火) 18:50:14コードはどんな感じになりますか?
0926デフォルトの名無しさん
2010/12/07(火) 18:59:080927デフォルトの名無しさん
2010/12/07(火) 19:11:02#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:260930デフォルトの名無しさん
2010/12/07(火) 20:10:37回答不能です。
「これ」をするとどんな値が出ますか?
「正しい値」とは何ですか?
0931デフォルトの名無しさん
2010/12/07(火) 20:13:430932デフォルトの名無しさん
2010/12/07(火) 20:31:51setlocale(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> a=INT_MAX;
> b=a+1
この時点で何が起こるかわからない。
0934デフォルトの名無しさん
2010/12/07(火) 20:51:02いえ、そのー説明が不備で申し訳ありません。
例えば
0x00ff00ff のようなバイナリーデータが有ったとき。
文字コードに変換し−>”ASASDFDFASASDFDF”(内容は適当)保存して。
復号化は
”ASASDFDFASASDFDF” -> 0x00ff00ff にしてバイナリーにして使用する。
昔で言うishだったかなー、これのワイド文字コード版です。
0935デフォルトの名無しさん
2010/12/07(火) 21:00:180936デフォルトの名無しさん
2010/12/07(火) 21:04:540937934
2010/12/07(火) 21:09:31L"一丁七万丈三上下不与丐丑且丕世丗丘丙丞両並个中丱串丸丹主丼丿乂乃", // 4E00
L"久之乍乎乏乕乖乗乘乙九乞也乢乱乳乾亀亂亅了予争亊事二于云互五井亘", // 4E45
L"亙些亜亞亟亠亡亢交亥亦亨享京亭亮亰亳亶人什仁仂仄仆仇今介仍从仏仔", // 4E99
L"仕他仗付仙仞仟代令以仭仮仰仲件价任企伉伊伍伎伏伐休会伜伝伯估伴伶", // 4ED5
0938デフォルトの名無しさん
2010/12/07(火) 21:13:500939934
2010/12/07(火) 21:17:510940デフォルトの名無しさん
2010/12/07(火) 21:23:26ASCIIみたいにどこでも転送・表示可能な文字に変換するから存在意義があるわけで
0941932
2010/12/07(火) 21:27:07UTF-16で使っちゃいけなさそうなのは(0000, D800〜DFFFF,FFFE, FFFF)ぐらいで、
殆ど全部のコードが使えるわけだから、効率的なアルゴリズムはないんじゃない?
0942934
2010/12/07(火) 21:34:58そう思って、簡単な変換作ってprintしたら−>??????????享??????????
になってしまって、対応する漢字がないと印刷できなかった…
やっぱり、テーブル索引しかないかな〜
0943デフォルトの名無しさん
2010/12/07(火) 21:45:15はぁ? 日本語環境で印刷できる文字だけにしたいなら
ishで漢字にしたのをwchar_tに変換すりゃいいだけでしょ。
wchar_tとか関係ないんじゃ。
0944934
2010/12/07(火) 22:09:16まあその 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:380946デフォルトの名無しさん
2010/12/07(火) 22:38:16端末によっては表示不可とか、サイトによっては投稿不可とか、かなり環境選ぶと思うが
0947デフォルトの名無しさん
2010/12/07(火) 22:41:35http://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:180949デフォルトの名無しさん
2010/12/07(火) 22:52:12enumの名前が書かれていなかったのですが、何の意味があるのですか?
0950デフォルトの名無しさん
2010/12/07(火) 22:56:030951デフォルトの名無しさん
2010/12/07(火) 22:56:10定数を書く時に#defineが嫌いだったに違いない。使う時はint型として使うしかない
0952デフォルトの名無しさん
2010/12/07(火) 22:58:14thx
0953デフォルトの名無しさん
2010/12/07(火) 22:58:47enum E { yes, no };
bool f( E e ) {
return e != no;
}
Javaなどの場合はさらに名前空間に入ってくれて便利なんだけど
C++にはないんだよねー。
0954デフォルトの名無しさん
2010/12/07(火) 23:10:58C++でもenumは名前空間に入るだろ。
E::yesみたいに使いたいと言ってるならC++0xを待つしかないな。
0955デフォルトの名無しさん
2010/12/07(火) 23:14:300956デフォルトの名無しさん
2010/12/07(火) 23:20:05比較するなら.NET Frameworkの方がいい
0957デフォルトの名無しさん
2010/12/07(火) 23:25:15明らかにCにも劣る糞仕様なのに、ライブラリ作るときに
どうして世に出す前に言語の方を何とかしようという声が挙がらなかったのか不思議でならない
0958デフォルトの名無しさん
2010/12/07(火) 23:32:20*classX::memberXにしない理由はナニ?
ついでに、
アドレスを取得するのにclassX::&memberXじゃなく
&classX::memberXする理由はナニ?
0959デフォルトの名無しさん
2010/12/07(火) 23:58:04struct 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× double型に格納された整数は内部で正しく表現されない
○ double型に格納された整数は内部で正しく表現されないことがある
ってことかと。
0962デフォルトの名無しさん
2010/12/08(水) 01:59:22というか、目的を達成するなら、文字列で受け取ってから整数かどうかを判定するほうがいいと思う
0963デフォルトの名無しさん
2010/12/08(水) 02:02:41浮動小数の仕組みから考えて
小数点以下の無い整数は誤差なく表現できるだろう?
1.1とかは無理だけど
0964デフォルトの名無しさん
2010/12/08(水) 02:14:300965デフォルトの名無しさん
2010/12/08(水) 03:03:16int sinkCookie;
connectionPoint.Advise( sink, out sinkCookie );
0966デフォルトの名無しさん
2010/12/08(水) 08:49:41使うときは何もいらない。普通に変数を指定すれば勝手に参照渡しになる。
ソース見ただけじゃ変数の値が変更される可能性があるかどうかわからないので可読性が下がる。
0967960
2010/12/08(水) 11:00:04これ、固定小数点として整数部と小数部をそれぞれ2進変換した後
2進浮動小数点表現にするんですね。
だから整数をそのまま格納するときは誤差が出ない。
10進浮動小数点に変換してから2進変換すると誤解してました。
文字列で受けて判定すれば、doubleの内部表現を気にせず意図通りに動きそうですね。
可読性考えながら両方試してみます。
ありがとうございました。
0968デフォルトの名無しさん
2010/12/08(水) 11:08:15[System::Runtime::InteropServices::OutAttribute] int% sinkCookie;
connectionPoint->Advise( sink, sinkCookie );
でよろしいでしょうか?さっそくやてみます
0969デフォルトの名無しさん
2010/12/08(水) 13:51:080970デフォルトの名無しさん
2010/12/08(水) 14:07:060971デフォルトの名無しさん
2010/12/08(水) 14:31:170972デフォルトの名無しさん
2010/12/08(水) 14:35:230973デフォルトの名無しさん
2010/12/08(水) 14:44:38これって100%信用していいの?
0974デフォルトの名無しさん
2010/12/08(水) 14:48:410975デフォルトの名無しさん
2010/12/08(水) 15:28:01人が作った物使う限り100%なんて無いと思うけど。
0976デフォルトの名無しさん
2010/12/08(水) 15:28:360977デフォルトの名無しさん
2010/12/08(水) 15:40:230978デフォルトの名無しさん
2010/12/08(水) 16:07:11うるせーよ
0979デフォルトの名無しさん
2010/12/08(水) 16:26:390980デフォルトの名無しさん
2010/12/08(水) 17:23:590981デフォルトの名無しさん
2010/12/08(水) 18:59:46>>980、下が目指した書き込みです
すいません、VC++でメモリリークとかメモリ破壊を検出するフリーのツールでいいのないすか
ソースをいじるタイプじゃなくて実行ファイルを設定して起動したら
自動でレポートが出力されるような簡単なタイプの奴がいいんだけど
0982デフォルトの名無しさん
2010/12/08(水) 19:08:420983デフォルトの名無しさん
2010/12/08(水) 20:07:03AfxSetAllocStop関数とかスナップショットとか使えば任意に調べられるじゃないか^^
0984デフォルトの名無しさん
2010/12/08(水) 20:16:21イメージ的にはfunc(<IA && IB> i)みたいな感じで
0985デフォルトの名無しさん
2010/12/08(水) 20:21:490986デフォルトの名無しさん
2010/12/08(水) 20:23:050987デフォルトの名無しさん
2010/12/08(水) 20:45:010988デフォルトの名無しさん
2010/12/08(水) 20:55:43func( IC& i )
で駄目なん?
0989デフォルトの名無しさん
2010/12/08(水) 21:05:06言語レベルの穴だったようだな
0990デフォルトの名無しさん
2010/12/08(水) 21:11:200991デフォルトの名無しさん
2010/12/08(水) 21:29:30enable_if
0992デフォルトの名無しさん
2010/12/08(水) 22:13:010993デフォルトの名無しさん
2010/12/08(水) 23:08:28>バグ解析は不得意
だってこのスレ住人はバグなんて恥ずかしいことしないから、解析なんてしたことがないんですよ
ですよね、みなさん
0994デフォルトの名無しさん
2010/12/08(水) 23:21:53熟練者ほどミスしない様な、ある意味助長な記述をするが。
ここの連中に言わせると、無駄でバカだそうだ。
↓そらこいw
0995デフォルトの名無しさん
2010/12/08(水) 23:24:37│ ヽ( ,_ノ`)ノ 残念、それは私のおいなりさんだ
│ へノ /
└→ ω へノ
0996デフォルトの名無しさん
2010/12/09(木) 00:30:090997デフォルトの名無しさん
2010/12/09(木) 00:34:190998デフォルトの名無しさん
2010/12/09(木) 00:40:06http://hibari.2ch.net/test/read.cgi/tech/1289292155/l50
0999デフォルトの名無しさん
2010/12/09(木) 00:42:131000デフォルトの名無しさん
2010/12/09(木) 01:01:10嘘つくなよw
10011001
Over 1000Threadもう書けないので、新しいスレッドを立ててくださいです。。。
レス数が1000を超えています。これ以上書き込みはできません。