C++相談室 part94
レス数が1000を超えています。これ以上書き込みはできません。
0001デフォルトの名無しさん
2012/02/18(土) 06:07:36.70ただし質問の前にはFAQに一通り目を通してください。
IDE (VC++など)などの使い方の質問はその開発環境のスレに
お願いします。
前スレ
C++相談室 part93
http://toro.2ch.net/test/read.cgi/tech/1324922431/
このスレもよろしくね。
【初心者歓迎】C/C++室 Ver.77【環境依存OK】
http://toro.2ch.net/test/read.cgi/tech/1323692486/
■長いソースを貼るときはここへ。■
http://codepad.org/
http://ideone.com/
0002デフォルトの名無しさん
2012/02/18(土) 06:08:02.58[C++ FAQ]
http://www.parashift.com/c++-faq/
http://www.bohyoh.com/CandCPP/FAQ/ (日本語)
Cとその仕様を比較しながらの解説なので分かりやすい。
***** 質問の前に必ずこの二つに目を通してください *****
[C/C++ リファレンス]
http://en.cppreference.com/w/cpp (英語)
http://ja.cppreference.com/w/cpp (↑の日本語訳だけどまだ未完)
[Stroustrup]
http://www2.research.att.com/~bs/
[C++ International Standard]
http://www.iso.org/iso/iso_catalogue/catalogue_ics/catalogue_detail_ics.htm?csnumber=50372
[JTC1/SC22/WG21 - C++]
http://www.open-std.org/jtc1/sc22/wg21/
ここから規格の最新ドラフトがダウンロードできる。
[JIS X3014]
http://www.jisc.go.jp/app/pager?%23jps.JPSH0090D:JPSO0020:/JPS/JPSO0090.jsp=&RKKNP_vJISJISNO=X3014
ISO規格の日本語訳。JIS X3014:2003はISO/IEC 14882:2003 (E)に対応。
0003デフォルトの名無しさん
2012/02/18(土) 06:08:18.34[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
0004デフォルトの名無しさん
2012/02/18(土) 06:09:42.63amazon 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/
http://www.amazon.co.jp/exec/obidos/ASIN/4894714833/ (翻訳)
Exceptional C++ Style
http://www.amazon.com/exec/obidos/ASIN/0201760428/
http://www.amazon.co.jp/exec/obidos/ASIN/4894714663/ (翻訳)
0005デフォルトの名無しさん
2012/02/18(土) 06:10:08.52Effective 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/
0006デフォルトの名無しさん
2012/02/18(土) 12:27:29.38| ^o^ | < はんにんは このなかにいます
\_/
/ ヽ
| | | |
| | | |
|| ||
し| i |J=二フ
.| ||
| ノ ノ
.| .| (
/ |\.\
し'  ̄
_
| / ̄\
 ̄| |
_| ̄ \_/
0007デフォルトの名無しさん
2012/02/18(土) 12:28:57.890008デフォルトの名無しさん
2012/02/18(土) 14:44:40.01switch(id) {
case HOGE0: return shared_ptr<IHoge>(new Hoge0);
case 〜
}
}
上のようにポリモーフィックな返り値を返す関数があるんだけどnewのコストを削りたい
アロケーターを使う他になにかいい手はないですか?
標準で可変長のスタック領域を扱えたりすると便利なんですが…
0009デフォルトの名無しさん
2012/02/18(土) 15:04:50.540010デフォルトの名無しさん
2012/02/18(土) 15:29:32.500011デフォルトの名無しさん
2012/02/18(土) 17:17:53.40何故shared_ptr側にオブジェクトを自動アロケートする
メソッドが無いのでしょうか?
引数でオブジェクトのポインタを渡すよりshared_ptr側で
オブジェクトを生成させた方が安全だと思うのですが?
0012デフォルトの名無しさん
2012/02/18(土) 17:19:38.08make_sharedがあるから
0013デフォルトの名無しさん
2012/02/18(土) 17:46:14.86あっなるほど・・・
make_sharedってCustom Deleter使いたい時は
自前でAllocator作るしかないですかね?
0014デフォルトの名無しさん
2012/02/18(土) 17:59:13.89public:
Hoge(int x);
void func(void) ;
};
template <class Del> class HogeEx : public Hoge {
public:
HogeEx(int x, Del const & del) : Hoge(x), mDel(del) {}
~HogeEx(void) { mDel(this); }
private:
Del mDel;
} ;
shared_ptr<Hoge> p =
make_shared<HogeEx<DelType> >(100, deleter) ;
適当に書くとこんな感じかな
HogeExとmake_sharedはもう少し工夫して汎用化してもいい
0015デフォルトの名無しさん
2012/02/18(土) 21:29:49.91を
{7,3,4,6,0,0}
のように0を後ろに移動させるようなSTLのアルゴリズムありますか?
0016デフォルトの名無しさん
2012/02/18(土) 21:31:34.470017デフォルトの名無しさん
2012/02/18(土) 21:40:24.180018デフォルトの名無しさん
2012/02/18(土) 21:43:14.150019デフォルトの名無しさん
2012/02/18(土) 21:56:33.440020デフォルトの名無しさん
2012/02/18(土) 22:05:16.24自作マニピュレータでストリームのモードを一時的に変えて、元に戻したいのですが
std::ios::dec等、引数の無い書式フラグの戻し方はわかったのですが、
(例えばlong sv_f = setf(ios::hex, basefileld); →自作処理後、最後に setf(sv_f)で戻す)
setfill('0')の戻し方がわかりませんボスケテ、
0021デフォルトの名無しさん
2012/02/18(土) 22:14:33.09002220
2012/02/18(土) 22:23:38.25ostream::fill()を使うらしいですた、
つまり、次のでおk
ios_base::fmtflags sv_f = stream.setf(ios::dec, ios::basefield);
char sv_ch = stream.fill('0');
stream << setw(2) << s << setw(2) << d << /* ... */ << ends; // 自作処理の一例
stream.setf(sv_f);
stream.fill(sv_ch);
return stream;
0023デフォルトの名無しさん
2012/02/18(土) 23:12:12.49removeが確実に移動・コピーするのは残す値のみで、除去する値をわざわざ末尾の方に移動・コピーするかは実装依存。
int a[] = {7,0,3,4,0,6};
のときにremoveで0を除去した場合
{7,3,4,6,0,6}
のようになる実装もある。
0024デフォルトの名無しさん
2012/02/18(土) 23:35:57.33なるほど
0025デフォルトの名無しさん
2012/02/19(日) 03:18:16.37あるC++のコードでは、次行で即代入を行うような変数もわざわざ宣言を分けてスコープの先頭に置いていました。
{
int a;
a = some_process();
}
こうすることの意味を私なりに考えてみましたが、
・C言語からの移行・もしくは癖
・コーディングルールによるため
・非POD型との統一のため
・デバッグのし易さ(?)
・表記ミス
個人的には可読性の面からも宣言と初期化をまとめたくなりますが、
int a = some_process();
何か意味があれば教えてください。
0026デフォルトの名無しさん
2012/02/19(日) 03:23:50.70int a;と
a = some_process();の間に変数aを使うコードがあったが削除されて無くなった
つまり分けてる意味は特にない
0027デフォルトの名無しさん
2012/02/19(日) 04:05:48.290028デフォルトの名無しさん
2012/02/19(日) 04:09:05.43特に意味は無いのですね。ありがとうございます。
0029デフォルトの名無しさん
2012/02/19(日) 04:36:16.67(3)(4)のようにメンバ関数を引数とする場合には、&が無いと動作しません。
これはなぜでしょうか?
---------------------------------
struct Test{
void testFunc( ){ cout << "Test::func()" << endl; }
};
void func( ){ cout << "::func()" << endl; }
template<class T>
void XXX( T f ){ f( ); }
template<class T, class U>
void YYY( T obj, U f ){ (obj.*f)( ); }
int main( )
{
XXX( &func ); // (1)OK
XXX( func ); // (2)OK
YYY( Test(), &Test::testFunc ); // (3)OK
//YYY( Test(), Test::testFunc ); // (4)NG
return 0;
}
0030デフォルトの名無しさん
2012/02/19(日) 12:25:40.500031デフォルトの名無しさん
2012/02/19(日) 13:19:14.41XXX( **********func );
これでもOKだ
0032デフォルトの名無しさん
2012/02/19(日) 13:27:27.810033デフォルトの名無しさん
2012/02/19(日) 14:18:30.050034デフォルトの名無しさん
2012/02/19(日) 14:23:11.14メンバ関数は必須
0035デフォルトの名無しさん
2012/02/20(月) 02:19:13.380036デフォルトの名無しさん
2012/02/20(月) 18:06:44.33ここの FILE * のところには stdout も使えると思いますが、
この部分に指定するストリームを自作したいのですが、どんな感じにするんでしょうか。
とりあえず手始めに
fprintf したら指定ファイルのほか、同時に stdout にも出力するような拡張ストリーム作りたいです。
0037デフォルトの名無しさん
2012/02/20(月) 18:44:58.480038デフォルトの名無しさん
2012/02/20(月) 18:46:31.55方法が無いわけではないけど、出来ないと思った方がいい
標準Cライブラリ(printf系)でなく標準C++ライブラリ(iostream)を使うこと
もしくは単にfprintfを2回(ファイルとstdout)呼ぶ
fprintfに指定するのはOSが管理するファイルディスクリプタなので
介入するには低レイヤーなライブラリを使うか、fprintfを自作関数として置き換えるか
環境依存な方法(ファイルシステムソケットなど)を使うか、など
・・・普通はやらない
0039デフォルトの名無しさん
2012/02/20(月) 19:36:56.53streambufを自作してiostreamに食わせりゃいい
0040デフォルトの名無しさん
2012/02/20(月) 21:24:02.82オペレーターがキモいのはわかるんだけどでも標準なんだから仕方ないじゃんみたいな
0041デフォルトの名無しさん
2012/02/20(月) 21:27:38.01printf形式が楽なんだよね
boost::format使えばいいんだろうけど
0042デフォルトの名無しさん
2012/02/20(月) 22:12:49.62新旧標準出力同士なぜ上位互換的使い勝手は目指さなかったのか
0043デフォルトの名無しさん
2012/02/20(月) 22:36:18.95ちょっとはしゃいじゃったんだよ
0044デフォルトの名無しさん
2012/02/21(火) 00:24:46.790045デフォルトの名無しさん
2012/02/21(火) 07:23:50.170046デフォルトの名無しさん
2012/02/21(火) 08:02:00.07プラグインスクリプトか諦めてC++素直に使い括弧バカで通すほうがマシだわ
0047デフォルトの名無しさん
2012/02/21(火) 09:34:44.74<<のオーバーロードはホントはしゃいじゃった感じだな
0048デフォルトの名無しさん
2012/02/21(火) 10:45:14.600049デフォルトの名無しさん
2012/02/21(火) 11:03:37.930050デフォルトの名無しさん
2012/02/21(火) 11:06:33.300051デフォルトの名無しさん
2012/02/21(火) 11:37:04.470052デフォルトの名無しさん
2012/02/21(火) 12:05:10.54サイズはbool*size()じゃないでしょ?
0053デフォルトの名無しさん
2012/02/21(火) 20:18:00.370054デフォルトの名無しさん
2012/02/21(火) 20:24:00.490055デフォルトの名無しさん
2012/02/21(火) 20:25:14.970056デフォルトの名無しさん
2012/02/21(火) 20:25:54.46論理的な機能と物理的な実装を切り分ける好例ではある
0057デフォルトの名無しさん
2012/02/21(火) 20:35:09.590058デフォルトの名無しさん
2012/02/21(火) 20:35:45.520059デフォルトの名無しさん
2012/02/21(火) 20:38:47.850060デフォルトの名無しさん
2012/02/21(火) 20:48:19.890061デフォルトの名無しさん
2012/02/21(火) 20:59:10.80俺できないから、そういうクラス作るとどうしても無駄が出来る。
0062デフォルトの名無しさん
2012/02/22(水) 00:05:39.34グラフ構造、論理閉包
0063デフォルトの名無しさん
2012/02/22(水) 12:31:04.89勝手になっているんですけど、改行だけにすることはどうやればできますか?
0064デフォルトの名無しさん
2012/02/22(水) 12:39:34.030065デフォルトの名無しさん
2012/02/22(水) 12:40:11.97それなら<<ですけど。
0066デフォルトの名無しさん
2012/02/22(水) 12:40:27.36>>でした。
0067デフォルトの名無しさん
2012/02/22(水) 13:07:43.750068デフォルトの名無しさん
2012/02/22(水) 13:16:21.910069デフォルトの名無しさん
2012/02/22(水) 14:40:33.95intの代わりにlong longを使い
floatの代わりにdoubleを使うという選択で
最高のパフォーマンスが出せるという
認識であってますか?
0070デフォルトの名無しさん
2012/02/22(水) 14:41:50.410071デフォルトの名無しさん
2012/02/22(水) 14:42:56.61詳しく教えてください。
0072デフォルトの名無しさん
2012/02/22(水) 14:46:21.220073デフォルトの名無しさん
2012/02/22(水) 14:51:58.61ちょっと考えればわかる
解らなければ向いてないから違う業界に行ったほうが君のためだよ
0074デフォルトの名無しさん
2012/02/22(水) 15:07:06.870075デフォルトの名無しさん
2012/02/22(水) 15:09:49.990076デフォルトの名無しさん
2012/02/22(水) 15:10:19.500077デフォルトの名無しさん
2012/02/22(水) 15:21:18.75void hoge(const T&, const U&){} //A
template<typename T>
void hoge(const T&, const int&){} //B
template<typename U>
void hoge(const int&, const U&){} //C
template<>
void hoge(const int&, const int&){} //D
BとCを定義すると、Dは特殊化ではないとなりました。
BかCのどちらかを削除するとコンパイルできたのですが
DはAの特殊化なのか、BまたはCの特殊化なのか
どちらですか? (区別する必要性はおいといて)
0078デフォルトの名無しさん
2012/02/22(水) 15:43:17.65template<>
void hoge<int,int>(const int&, const int&){} //D
0079デフォルトの名無しさん
2012/02/22(水) 16:02:07.82わかっているなら教えてくださいよ。
008077
2012/02/22(水) 17:07:46.65引数が2つあるので、Aの特殊化になるみたいですね。
BとCを定義した状態で
void hoge<int>(const int&, const int&){} //D
としたら、特殊化できませんでした。
曖昧な場合は特殊化できないみたいですね。
しかも、どうやっても明示できない状況もあるようです。
0081デフォルトの名無しさん
2012/02/22(水) 18:03:26.58intの定義を調べましょう
intが32bitだと断定してるところはクソサイトだと思って構いません
0082デフォルトの名無しさん
2012/02/22(水) 18:05:20.01それは知ってます。
16ビットが32ビットになったときみたいに64ビットになったと思っていたら
32ビットだったという経験をしたからlong longを使うという発想にいたったわけです。
0083デフォルトの名無しさん
2012/02/22(水) 18:36:04.78intは「処理系に最適なサイズ」になります
コンパイラ開発者達が最適だと判断したものよりも
long longの方が最適であると思うのならばそちらを使うのも良いでしょう
その際は実測してから使うことを勧めます
0084デフォルトの名無しさん
2012/02/22(水) 18:52:27.95ケースバイケースで実測する他無い
0085デフォルトの名無しさん
2012/02/22(水) 19:17:29.75実測するしかない
0086デフォルトの名無しさん
2012/02/22(水) 19:21:42.18数値演算の速度と64bitアプリかどうかは無関係
「64bitアプリ」の「64bit」はアドレス空間のこと
int, long long, float, doubleには関係ない
関係あるのはポインタ
0087デフォルトの名無しさん
2012/02/22(水) 20:01:13.58そうでなければ変わらない
0088デフォルトの名無しさん
2012/02/22(水) 20:04:21.14その実測も注意が必要だな
仮に算術演算で64bit整数の方が良い性能だったとしても
配列などで要素数が多い箇所を64bit整数にすると逆に性能が劣化するということがあり得る
単純なケースでの実測結果があらゆるケースに適用出来るとは限らないことを
認識しておく必要がある
0089デフォルトの名無しさん
2012/02/22(水) 21:58:51.0064bit環境なら、intは64bitにするというのが普通。
処理系によっては、わざと32bitにしてるかもしれん。
じゃあ、64bit環境でのlong longは何bitなのか?
処理系依存だよなぁ、わからん。
> floatの代わりにdoubleを使うという選択で
昔のC処理系の仕様では、内部演算はdoubleで行うことになってた。
floatでの演算には、必ずdoubleとの型変換が介在した。
なので、floatよりdoubleの方が速かった。
今のC++処理系の実装は、知らん。
どっちみち、処理系の実装に依存することに変わりはないわけだ。
0090デフォルトの名無しさん
2012/02/22(水) 22:01:01.440091デフォルトの名無しさん
2012/02/22(水) 22:09:43.570092デフォルトの名無しさん
2012/02/22(水) 22:10:38.42ILP64の実例なんて聞いた事無いぞ
0093デフォルトの名無しさん
2012/02/22(水) 22:10:41.85データモデル short int long long long ポインタ 処理系
LLP64 16 32 32 64 64 Microsoft Win64 (X64/IA64)
LP64 16 32 64 64 64 ほとんどのUnixとUnix風OS (Solaris, Linux, etc.)
IP64 16 64 32 64 64 ?
ILP64 16 64 64 64 64 HAL
SILP64 64 64 64 64 64 ?
0094デフォルトの名無しさん
2012/02/22(水) 22:12:00.330095デフォルトの名無しさん
2012/02/22(水) 22:12:07.990096デフォルトの名無しさん
2012/02/22(水) 22:15:27.44拡張整数作らないと使えないからねえ
0097デフォルトの名無しさん
2012/02/23(木) 09:32:31.60long longより速いなんてことないですよね?
0098デフォルトの名無しさん
2012/02/23(木) 09:33:59.990099デフォルトの名無しさん
2012/02/23(木) 09:37:22.820100デフォルトの名無しさん
2012/02/23(木) 09:42:30.050101デフォルトの名無しさん
2012/02/23(木) 09:44:38.00そんなあなたにMMX?
0102デフォルトの名無しさん
2012/02/23(木) 11:21:14.88プリミティブなdoubleが何の単位を表しているか分からずにデバッグに苦労したことがあります。
書店で立ち読みしてたら、ドメイン固有の型を取り込めなんて金言を読みました。
class Ampere;
class Ohm;
class Volt;
上みたいな型があったら、V=RIに相当する
複数のオペレータをオーバーロードしろってことであってるでしょうか?
0103デフォルトの名無しさん
2012/02/23(木) 11:29:00.96その本の内容はその事例には当てはまらないっぽいよ。
0104デフォルトの名無しさん
2012/02/23(木) 12:13:53.94もうちょっと汎用的な話だと思ってました。
Volt operator*(Ampere,Ohm);
みたいなの書いてたら、コンストラクタの呼び出しが遅いだろうなとか思ったので、
誰かexpression templateみたくアレゲなサンプルコードを書いて欲しいな、なんて。
(実際は面倒だろうから本番用だけtypedefでdoubleにするけども)
0105デフォルトの名無しさん
2012/02/23(木) 12:27:21.59実装が知りたければboostを読めばいいよ
0106デフォルトの名無しさん
2012/02/23(木) 12:43:57.570107デフォルトの名無しさん
2012/02/24(金) 08:47:15.96Cを読むくらいならできるけど、Cで書くなんてバカらしくてやってらんない
0108デフォルトの名無しさん
2012/02/24(金) 09:10:08.24コールバック先が普通の関数のときは上手くできましたが、クラスの中のメンバ関数のときの方法がよく分かりません。
class test {
public:
test();
void attach( void (*_fptr)(void)) {fptr = _fptr;} ←●成功
template<typename T> void attach(T *_tptr, void (T::*_mptr)(void)) {tptr=_tptr;mptr=_mptr;} ←★エラー
void main_no_syori();
private:
void (*fptr)(void); ←●成功
template<typename T> T *tptr; ←★エラー
template<typename T> (T::*mptr)(void); ←★エラー
}
とテキトーに書きましたが、★の書き方が違うようでコンパイルエラー
どんな風に書くといいんでしょうか
0109デフォルトの名無しさん
2012/02/24(金) 09:15:32.96boost::functionとかstd::functionとか使えばいいんじゃない?
0110デフォルトの名無しさん
2012/02/24(金) 09:35:52.43たとえば先ほどの例だ
void callback() {
処理;
}
void main() {
test t;
t.attach(&callback);
}
と普通に利用できますが、オブジェクトの中で利用するとき
class main {
public:
main() {t.attach(this, &main::callback);}
private:
test t;
callback();
}
こんな風に使いたいと思うのですが・・・
0111デフォルトの名無しさん
2012/02/24(金) 09:46:52.64void attach(boost::function<void ()> func) { m_callback = func; }
private:
boost::function<void ()> m_callback;
};
class main {
public:
main() {t.attach(boost::bind(&main::callback, this));}
private:
test t;
void callback();
}
これで m_callback();とすれば呼び出せる
0112デフォルトの名無しさん
2012/02/24(金) 09:48:49.33class test { ... }
みたく書けばいいのじゃないか?
0113デフォルトの名無しさん
2012/02/24(金) 10:33:33.42イベントハンドラのように複数のデリゲートならsignals2 + bind
0114デフォルトの名無しさん
2012/02/24(金) 22:18:45.67どうすれば使えるようになるでしょうか?
class Str{
public:
Str();
void Count();
private:
string hoge;
};
void Str::Count(){
fstream file;
file.open("hoge.txt" , ios::in);
getline(file, hoge); ←ここ
}
0115デフォルトの名無しさん
2012/02/24(金) 22:25:49.820116デフォルトの名無しさん
2012/02/25(土) 01:26:45.970117デフォルトの名無しさん
2012/02/25(土) 08:38:52.67スペースも読み込むようにできませんか?
0118デフォルトの名無しさん
2012/02/25(土) 08:39:27.35std::cin>>aをstd::cin.getline(a)と同じ様に改行まで読み込めて
スペースも読み込むようにできませんか?
0119デフォルトの名無しさん
2012/02/25(土) 08:43:01.49class Line { ... };
std::istream& operator >> (std::istream& s, Line& a) { return s.getline(a....); }
0120デフォルトの名無しさん
2012/02/25(土) 08:46:44.290121デフォルトの名無しさん
2012/02/25(土) 10:00:36.01何かの途中で使いたいのかな
0122デフォルトの名無しさん
2012/02/25(土) 10:04:08.25cin>>a
cin>>a
cin.getline(a)
ってやるとなぜかgetline(a)が4行目になっているんですよ。
不思議ですね。
0123デフォルトの名無しさん
2012/02/25(土) 10:05:07.22としか使わないな
何か昔cin.getline(a);として
思い通りの動きにならなかった記憶がある
0124デフォルトの名無しさん
2012/02/25(土) 12:53:37.04C++のストリームの機能全然使いこなせてない
iteratorとか使ってドヤ顔したい
0125デフォルトの名無しさん
2012/02/25(土) 14:02:40.51自分の意図通りの細かいことをやりたければ、結局そこに行き着くんだが。>自前処理
0126デフォルトの名無しさん
2012/02/25(土) 14:11:47.17読み込ませているファイルも提示しないで何言ってるんだか。
取り敢えず、全てgetline()で試してみたらどうだ?
0127デフォルトの名無しさん
2012/02/25(土) 14:35:31.8411111111111111111111111
11111111111111111
111111111111111111111
111111111111111111
111111111111111111111
11111111111111111
みたいなスペースも何も無いファイルなんですけど・・・・
改行文字が\r\nじゃなくて\nだからですかね?
0128デフォルトの名無しさん
2012/02/25(土) 15:16:55.62だとしたら、ios::inだけでなくios::binaryも指定してみたらどうだろう。
0129デフォルトの名無しさん
2012/02/25(土) 15:42:24.95どうしても動かない機器があるので仕方なくwindows7使ってます。
スミマセンでした。
あとは言われたとおりにして見ます。
ありがとうございました。
0130デフォルトの名無しさん
2012/02/26(日) 12:05:50.97class B {
virtual void foo();
};
class D : public B {
void foo();
};
↑こんな感じのクラス階層でBやDに変数や関数を追加しようと思ったら
class B2 : public B {
bool b;
void bar();
};
class D2 : public D {
void ahn();
};
こうなると思うんだ。
で、
�@BやDは色々な部分で使い回したい。(だから上の例では継承して変数関数を追加した)
�A全てのクラスをBへのポインタで多態的に操作したい(ダウンキャストもしたくない)
を満たすよううまいこと改良できないでしょうか。テンプレートとか使えないかな。
BにB2、DにD2の機能を纏めてしまえば上手くいくんだけど、それだと�@が満たせなくて困ってます。
B2にBという機能を持たせたくて、それでいてD2との継承構造も保っていたいみたいな。
B←B2
↑ ↑
D←D2
こんなイメージにしたいんだがここまで書いて自分の説明の下手さに絶望した。
エスパーさん助けてください。
0131デフォルトの名無しさん
2012/02/26(日) 12:11:52.310132デフォルトの名無しさん
2012/02/26(日) 13:07:16.66SmartPtr<D> m_pD ;
public:
D2(void) : m_pD(new D) { }
void bar(void) { m_pD->bar() ; }
void ahn(void) ;
} ;
ヒント: ブリッジパターン
0133デフォルトの名無しさん
2012/02/26(日) 13:12:13.01class D2 : public D {
B2 m_b2 ;
public :
void bar(void) { m_b2.bar() ; }
void ahn(void) ;
} ;
これでおk
B にアップキャスト可能
foo , bar , ahn を使用可能
B , D には変更なし
0134デフォルトの名無しさん
2012/02/26(日) 17:07:23.73test[15][20] =
{
0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0,
0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0,
0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0,
0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0,
0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0,
0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0,
0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0,
0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0,
0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0,
0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0,
0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0,
0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0,
0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0,
0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0,
0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0,
} ;
このような形ではエラーが出るので、どうすればいいですか?
不規則なので1個1個入れるのは大変です。
0135デフォルトの名無しさん
2012/02/26(日) 17:09:58.920136デフォルトの名無しさん
2012/02/26(日) 17:11:03.730137デフォルトの名無しさん
2012/02/26(日) 17:12:47.54最後の要素のカンマはアウツ
0138デフォルトの名無しさん
2012/02/26(日) 17:17:18.710139デフォルトの名無しさん
2012/02/26(日) 17:20:42.42アウツじゃないよ
アウツなのはenum
C++11でOKになったけど
0140デフォルトの名無しさん
2012/02/26(日) 17:23:08.80>>134
二重に括弧が必要。
0141デフォルトの名無しさん
2012/02/26(日) 18:00:01.16すべきだけど
0142デフォルトの名無しさん
2012/02/26(日) 18:04:30.80: a(),
b(),
c(),
{}
も認めて欲しい。
0143デフォルトの名無しさん
2012/02/26(日) 18:09:03.38a(),
b(),
c(),
{}
の方が統一性があっていいな
0144デフォルトの名無しさん
2012/02/26(日) 18:10:08.30: a()
, b()
, c()
{}
0145デフォルトの名無しさん
2012/02/26(日) 18:22:35.19の記述でOKと成るようにメンバ初期化ツリーの構築くらいコンパイラ側で面倒見てくれればよかったのに
0146デフォルトの名無しさん
2012/02/26(日) 18:26:14.89: a()
: b()
: c()
{}
がいい
0147デフォルトの名無しさん
2012/02/26(日) 18:53:19.38if (
a ||
b ||
c ||
) {
}
とか
hoge(
a,
b,
c,
);
とか
0148デフォルトの名無しさん
2012/02/26(日) 19:09:42.74コロン ( : ) とカンマ ( , ) で意味が違うものをそろえてもしょうがない、
て言うか単なる馬鹿。
0149デフォルトの名無しさん
2012/02/26(日) 19:10:56.50int hoge()
return 0;
class hoge
int a;
0150デフォルトの名無しさん
2012/02/26(日) 19:33:15.03意外と見かけるというか
VC自体がそういうインデントに対応してた気がする
0151デフォルトの名無しさん
2012/02/26(日) 19:55:28.610152デフォルトの名無しさん
2012/02/26(日) 20:30:17.350153デフォルトの名無しさん
2012/02/26(日) 20:34:16.850154デフォルトの名無しさん
2012/02/26(日) 20:34:30.72素人ほどくだらない形式にこだわる
0155デフォルトの名無しさん
2012/02/26(日) 21:09:26.880156デフォルトの名無しさん
2012/02/26(日) 21:17:34.51ttp://ideone.com/JnDx7
0157デフォルトの名無しさん
2012/02/26(日) 21:36:14.75struct MyFunc : ??? {
template <class Object> void operator (Object const & object) const {
DoSomething(object);
}
};
MyFuncのようにオーバーライドされた関数オブジェクトの場合
ベースとなる関数オブジェクトアダプタをどう書けばいいのかわかりません
0158デフォルトの名無しさん
2012/02/26(日) 22:13:12.65> STLアルゴリズムの関数オブジェクトってunary_functionとかbinary_functionの継承って必須ですか?
98のころのファンクションアダプタ(bind1stやnot1とか)に引数と戻り値の型を知らせるのに使ってただけだから
そういったものを使わないならいらない。
(そして11ではunary_function、binary_functionやそういった古いアダプタは将来廃止予定になった)
0159デフォルトの名無しさん
2012/02/27(月) 14:25:04.76WCHAR str[100];_swprintf_l(str,L"x: %ld y: %ld " ,long(pos.x),long(pos.y));
としたのですが
: error C2665: '_swprintf_l' : 2 オーバーロードのどれも、すべての引数の型を変換できませんでした
int _swprintf_l(wchar_t *,size_t,const wchar_t *,_locale_t,...)' の可能性があります。
または 'int _swprintf_l(wchar_t *,const wchar_t *,_locale_t,...)'
引数リスト '(WCHAR [100], const wchar_t [15], long, long)' を一致させようとしているとき
となります。助けてください
0160デフォルトの名無しさん
2012/02/27(月) 14:32:40.430161デフォルトの名無しさん
2012/02/27(月) 14:40:35.23error C2220: 警告をエラーとして扱いました。'object' ファイルは生成されません。
warning C4996: 'swprintf': swprintf has been changed to conform with the ISO C standard, adding an extra character count parameter. To use traditional Microsoft swprintf, set _CRT_NON_CONFORMING_SWPRINTFS.
'swprintf' の宣言を確認してください。
となりました。どうすればいいのでしょうか?
0162デフォルトの名無しさん
2012/02/27(月) 14:41:49.580163デフォルトの名無しさん
2012/02/27(月) 14:44:57.72どうしてなんでしょうか!?
0164デフォルトの名無しさん
2012/02/27(月) 14:48:02.76コンパイルが失敗した
0165デフォルトの名無しさん
2012/02/27(月) 14:50:30.350166デフォルトの名無しさん
2012/02/28(火) 02:38:25.61void func(const T0& val0...)
みたいな引数の型と引数を延々と伸ばしていくようなプリプロセス処理はどのようい書けばいいんでしょうか?
以下のような意図です
http://ideone.com/U2XMN
Boost.PP使うと楽という話は聞いたことがあるんですが、
Boostが使用できない環境なので、C++標準の方法でなんとかする書き方を知っている方がいれば、是非お願いします。
0167デフォルトの名無しさん
2012/02/28(火) 03:48:39.640168デフォルトの名無しさん
2012/02/28(火) 07:18:45.90コンパイラが対応していない場合はどうしようもないが
可変引数テンプレートが使えるような環境なら対応してるんじゃないの?
__VA_ARGS__でググれ
0169デフォルトの名無しさん
2012/02/28(火) 07:32:15.09マクロじゃなくてテンプレート使えとも思うけど
0170166
2012/02/28(火) 11:02:20.46コンパイラはMSVC10です
C++11への対応やその他の要素と可搬性考えて、C++03の範囲でなんとか...
0171デフォルトの名無しさん
2012/02/28(火) 11:21:50.91基本クラスにその関数がなければコンパイルエラーとなるような
指定方法って無いものですか?
なんで仮想関数なのに基本クラスのほうが呼ばれるのか延々と悩んでいたら、
関数名のスペルミスだった、なんてことがあったので。
0172デフォルトの名無しさん
2012/02/28(火) 11:44:27.09C++11#明示的な仮想関数オーバーライド
http://ja.wikipedia.org/wiki/C%2B%2B11#.E6.98.8E.E7.A4.BA.E7.9A.84.E3.81.AA.E4.BB.AE.E6.83.B3.E9.96.A2.E6.95.B0.E3.82.AA.E3.83.BC.E3.83.90.E3.83.BC.E3.83.A9.E3.82.A4.E3.83.89
>C++11では、overrideキーワードの導入により、このような問題が解消された
C++11で良いなら出来る
0173デフォルトの名無しさん
2012/02/28(火) 12:00:37.54相手のデータと交換するんですか?
0174デフォルトの名無しさん
2012/02/28(火) 12:05:19.740175デフォルトの名無しさん
2012/02/28(火) 12:22:42.65どうもです。
最新仕様に組み込まれたということは、やっぱりそういう仕組みが求められてたのか。
純粋仮想関数をオーバライドした派生クラスをさらに派生するときには
必ずその関数を再オーバライドしなければいけない
という指定もできればよかったな。
0176デフォルトの名無しさん
2012/02/28(火) 13:04:57.73関数に静的なID振ってそれを保存するしかないですかね?
この場合template関数の場合にどうするべきか・・・
0177デフォルトの名無しさん
2012/02/28(火) 13:54:54.53でいいだろ。テンプレートだろうと。
何を問題にしているのかわからん
0178デフォルトの名無しさん
2012/02/28(火) 14:28:34.48意味不明
0179デフォルトの名無しさん
2012/02/28(火) 14:30:58.80むしろswapによる効率化を標準化した結果moveが出来上がったようなもの
0180デフォルトの名無しさん
2012/02/28(火) 14:34:25.13関数ポインタ諦めて関数オブジェクト持たせるようにするとか……
>>177
関数のアドレスが変化しないなら良いのかもしれんが、それはどうだろう
>>178
アドレスを書きだせって意味でしょ
0181デフォルトの名無しさん
2012/02/28(火) 14:36:13.79削除するコストが無駄だから
移動跡地のオブジェクトは使われないっていう前提だし
0182デフォルトの名無しさん
2012/02/28(火) 14:56:22.44例えばポインタを持つクラスを移動する場合
移動先(自分)が管理するポインタをdelete、移動元が管理するポインタをもらう、移動元のポインタをNULLにする
その後移動元のデストラクタが起動してNULLにdeleteして終わり
delete pTo;
pTo = pFrom;
pFrom = NULL;
delete pFrom;
移動元のデストラクタは否応無しに動くんだから
自分のポインタを渡してdeleteしてもらえばいい
swap(pTo, pFrom);
delete pFrom;
0183デフォルトの名無しさん
2012/02/28(火) 20:25:48.06C++03だと無理だねえ
#define hoge(a) printf a
hoge(("hoge%d", 9));
のような事ならできるけど、
結局関数が必要になるので
根本的な解決にはなってないだろうし
0184デフォルトの名無しさん
2012/02/28(火) 21:16:09.51やるならboost.PP見てマネするしか・・・
0185デフォルトの名無しさん
2012/02/29(水) 00:45:10.62スクリプトで我慢しろよ
0186デフォルトの名無しさん
2012/02/29(水) 14:04:47.98教えてください。
0187デフォルトの名無しさん
2012/02/29(水) 14:49:45.630188デフォルトの名無しさん
2012/02/29(水) 16:03:13.600189デフォルトの名無しさん
2012/03/01(木) 15:14:43.41class Test{
bool po;
public:
Test()
:po(NULL)
{
0190デフォルトの名無しさん
2012/03/01(木) 15:16:01.15引数ありのコンストラクタが引数無しのコンストラクタ呼ぶことって可能ですか?
class Test{
bool po;
public:
Test()
:po(NULL)
{
}
Test( int i )
{
// ここでTest()のやつをうごかしたい
}
};
0191デフォルトの名無しさん
2012/03/01(木) 15:19:07.74bool po;
public:
Test(void) { initialize(); }
Test(int i) { initialize(i); }
private:
void initialize(void) { po = false; }
void initialize(int i) {
// ここでinitialize()のやつをうごかす
}
};
0192デフォルトの名無しさん
2012/03/01(木) 16:06:49.620193デフォルトの名無しさん
2012/03/01(木) 17:40:26.300194デフォルトの名無しさん
2012/03/01(木) 17:46:44.470195デフォルトの名無しさん
2012/03/01(木) 18:08:49.02配置newを使えば出来ないことも無いだろ
PODじゃないメンバーを持っているとちょっとまずいが
0196デフォルトの名無しさん
2012/03/01(木) 18:09:39.11184じゃなくて194だ
0197デフォルトの名無しさん
2012/03/01(木) 18:21:56.39スタック配置不可クラスにするならいいけど
0198デフォルトの名無しさん
2012/03/01(木) 19:28:11.11struct Test {
Test(){
TRACE( "コンストラクタ\n" );
}
Test(const Test& src){
TRACE( "コピーコンストラクタ\n" );
}
~Test(){
TRACE( "デストラクタ\n" );
}
void operator=( const Test& src ){
TRACE( "オペレータ\n" );
}
};
:
:
Test a = Test();
:
:
右辺のコンストラクタ → 左辺のコピーコンストラクタ → 右辺のデストラクタ
の順に呼ばれると想像しましたが、実際は右辺のコンストラクタしか呼ばれませんでした。
また、Test& a = Test();
とやっても、右辺のコンストラクタしか呼ばれませんでした。
(失効参照が得られると思っていた)
なぜでしょうか?
0199デフォルトの名無しさん
2012/03/01(木) 19:32:07.960200デフォルトの名無しさん
2012/03/01(木) 19:39:23.03Test()はどうせすぐに消えてなくなるオブジェクトだからいちいちコピーしないで横取りしてしまおうとコンパイラが気を利かせてくれた
0201デフォルトの名無しさん
2012/03/01(木) 20:05:01.908.5 Initializer 12
The initialization that occurs in argument passing, function return, throwing an exception (15.1), handling
an exception (15.3), and brace-enclosed initializer lists (8.5.1) is called copy-initialization and is equivalent
to the form
T x = a;
The initialization that occurs in new expressions (5.3.4), static_cast expressions (5.2.9), functional
notation type conversions (5.2.3), and base and member initializers (12.6.2) is called direct-initialization
and is equivalent to the form
T x(a);
0203デフォルトの名無しさん
2012/03/04(日) 09:41:25.32└B
├C1
└C2
というような継承関係になっていて、
A*型のポインタの先が「Bそのもの」かを判定したい場合、
どのような方法がありますか?
dynamic_cast<B*>だとC1やC2だったときにも成功してしまうと思うのですが。
0204デフォルトの名無しさん
2012/03/04(日) 10:43:47.110206デフォルトの名無しさん
2012/03/05(月) 14:06:02.61void moge(){return hoge();}
ってVC2008だとエラーでないんですけど正しい文法ですか?
0207デフォルトの名無しさん
2012/03/05(月) 14:06:33.830208デフォルトの名無しさん
2012/03/05(月) 14:47:26.660209デフォルトの名無しさん
2012/03/05(月) 15:22:12.070210デフォルトの名無しさん
2012/03/05(月) 15:30:47.00ありがとうございます。
0211デフォルトの名無しさん
2012/03/05(月) 15:31:58.500212デフォルトの名無しさん
2012/03/09(金) 13:45:52.33charを使ったc言語風の文字列操作がc++ではできずに困っています
初心者過ぎる質問で申し訳ない
0213デフォルトの名無しさん
2012/03/09(金) 13:49:27.600214デフォルトの名無しさん
2012/03/09(金) 15:48:20.680215デフォルトの名無しさん
2012/03/09(金) 16:44:30.170216デフォルトの名無しさん
2012/03/09(金) 20:45:34.99どぴゅっ
0217デフォルトの名無しさん
2012/03/09(金) 22:30:54.38使い方知らんヤツ多いな。すぐ解る話だろうになんでだろ。
0218デフォルトの名無しさん
2012/03/09(金) 22:46:47.920219デフォルトの名無しさん
2012/03/09(金) 22:48:18.770220デフォルトの名無しさん
2012/03/09(金) 22:50:43.14そうそう
union X{ struct{int a;}; struct{char b}; };
ってのが用途だよな。
0221デフォルトの名無しさん
2012/03/09(金) 23:15:17.620222デフォルトの名無しさん
2012/03/09(金) 23:19:27.29typedef struct {
...
} hoge;
とか
0223デフォルトの名無しさん
2012/03/09(金) 23:22:12.450224デフォルトの名無しさん
2012/03/09(金) 23:26:49.810225デフォルトの名無しさん
2012/03/09(金) 23:27:45.21for (int i;i<AMOUNT;++i)x[f(i)]=0;
0226デフォルトの名無しさん
2012/03/09(金) 23:36:05.83あれは規格違反だな
0227デフォルトの名無しさん
2012/03/09(金) 23:38:24.390228デフォルトの名無しさん
2012/03/09(金) 23:40:56.37ダイレクトにわかんねーやつは禿本をもっと読んだほうがいい
0229デフォルトの名無しさん
2012/03/09(金) 23:44:05.460230デフォルトの名無しさん
2012/03/09(金) 23:44:54.47了解。
0231デフォルトの名無しさん
2012/03/09(金) 23:46:04.780232デフォルトの名無しさん
2012/03/10(土) 00:04:51.06この会話の意味を知りたい
0233デフォルトの名無しさん
2012/03/10(土) 00:08:41.16struct Example{int x;};
struct Holder{Example};
Holder holder;
holder.x = 10;
こういう匿名構造体とは違うぞ。
0234デフォルトの名無しさん
2012/03/10(土) 00:14:08.15共用体の中に即席の構造体を作れる。
共用体以外で用の無い構造体を使うときに使う物。
例えば、X11風のWindow Messageはこう書ける。
struct Message
{
int type;
union
{
struct{ /* マウスイベント用 */ };
struct{ /* キーボードイベント用 */ }
/*** その他イベント用構造体が続く ***/
};
};
0235デフォルトの名無しさん
2012/03/10(土) 00:17:56.33エラー
0236デフォルトの名無しさん
2012/03/10(土) 00:23:05.86コンパイラによっちゃ引っかかるわな
0237デフォルトの名無しさん
2012/03/10(土) 00:25:44.820238デフォルトの名無しさん
2012/03/10(土) 00:26:10.240239デフォルトの名無しさん
2012/03/10(土) 00:28:52.44コレは拡張だろうけど、exportもコンパイラによって実装具合が違うよな。
0240デフォルトの名無しさん
2012/03/10(土) 00:29:23.870241デフォルトの名無しさん
2012/03/10(土) 00:30:38.07Messageのポインタを
struct MouseMessage { int a; int b; Point p; };
型のポインタに変換して使わせるとかそういう目的のテクニックという認識でいいの?
0242デフォルトの名無しさん
2012/03/10(土) 00:34:07.09うんにゃ。
Message message;
message.構造体のメンバー名;
って事で、直接構造体メンバーを指定すれば操作できる。
んで、同じ構造体のメンバーを操作する限りは、
タダの構造体と同じだけど、違う構造体のメンバーに触った場合は、
メモリー上同じ位置にある構造体のメンバーすべてが書き換わる。
0243デフォルトの名無しさん
2012/03/10(土) 00:43:39.63同じメンバ変数名を持つけれども順番が違う構造体同士が入っている場合の挙動はどうなっちゃうの?
struct Message{
int type;
union{
struct{ Target target; int i; float f; };
struct{int j; short s; Target target};
};
};
こういう場合の Message m; m.target の扱いとか
0244デフォルトの名無しさん
2012/03/10(土) 00:45:51.26だからエラーだって
VC++とかの糞環境じゃないと無名構造体は使えないの
0245デフォルトの名無しさん
2012/03/10(土) 00:47:28.25VCより遥かに準拠率高いBorland C++ Builder XとComeau C/C++馬鹿にすんな
0246デフォルトの名無しさん
2012/03/10(土) 00:47:42.060247デフォルトの名無しさん
2012/03/10(土) 00:47:51.460248デフォルトの名無しさん
2012/03/10(土) 00:48:13.37使える環境でのはなししてんだろ
コミュ障かよ
0249デフォルトの名無しさん
2012/03/10(土) 00:49:10.46名前重複させられないのでエラー
0250デフォルトの名無しさん
2012/03/10(土) 00:49:40.29お前ってかわいそうだな
0251デフォルトの名無しさん
2012/03/10(土) 00:53:04.76アスペは黙ってろ
0252デフォルトの名無しさん
2012/03/10(土) 00:53:52.53心理学では研究され尽くしてメジャーなネタだけど知ってるか?
議論口論で論理的に勝てないとなったら人間って無意識に人格攻撃を始めるんだぜ
解りやすいやつだなお前は
0253デフォルトの名無しさん
2012/03/10(土) 00:55:06.540254デフォルトの名無しさん
2012/03/10(土) 00:55:26.20「空気」⇦読めますか?
0255デフォルトの名無しさん
2012/03/10(土) 00:57:25.03何のために環境依存OKのスレがあると思ってるんだ
0256デフォルトの名無しさん
2012/03/10(土) 11:07:19.90short ax;
struct {
signed char al;
signed char ah;
} s;
} r;
で r.s.al とかやるより
union reg_t {
short ax;
struct {
signed char al;
signed char ah;
};
} r;
で r.al とする方が楽という単にそれだけのもの
>>255
ガチ規格準拠C専用スレとは違って
このスレは別に環境依存を禁止はしてないよ
0257デフォルトの名無しさん
2012/03/10(土) 11:14:12.58だったらスレ統一しろ
分かれてるってことは暗黙に禁止されてるってことだよ
そんなこともわからねーのか
喫煙室があるのに共同スペースでタバコふかす汚物並に調子乗ってんなお前らって
0258デフォルトの名無しさん
2012/03/10(土) 11:38:01.76悔しいのぉ悔しいのぉ
0259デフォルトの名無しさん
2012/03/10(土) 11:39:51.46そういう幼稚なあおりしかできないわけ?
放射能に頭やられちまったみたいだな
0260デフォルトの名無しさん
2012/03/10(土) 11:42:37.440261デフォルトの名無しさん
2012/03/10(土) 12:00:01.52OpenGLだけど
const char* pVer = glGetString(GL_VERSION);
printf("version is %s¥n",pVer);
これだとOKで
printf("version is %s¥n",glGetString(GL_VERSION));
これだとダメだったんだが、もしかして返り値の寿命が関係してるの?
だとすると寿命はどう捉えるべき?
0262デフォルトの名無しさん
2012/03/10(土) 12:37:41.70内部で参照カウントされてるから問題ないよ
それとは関係ないところでミスってる可能性大
0263デフォルトの名無しさん
2012/03/10(土) 12:45:05.47( ´,_ゝ`)プッ
0264デフォルトの名無しさん
2012/03/10(土) 13:18:59.12なんだBOTか
相手して損したわ
0265デフォルトの名無しさん
2012/03/10(土) 14:24:34.52そうすか
ちょっと見なおしてみます
0266デフォルトの名無しさん
2012/03/10(土) 15:35:03.730267デフォルトの名無しさん
2012/03/10(土) 21:28:09.73_endthreadexでここのスレッドを判別するにはどうしたら良いのでしょうか?
0268デフォルトの名無しさん
2012/03/10(土) 21:45:29.47判別もなにもないぞ
0269デフォルトの名無しさん
2012/03/10(土) 22:09:55.29_beginthreadexは方言の話以上に、OS依存の話だからな。
0270デフォルトの名無しさん
2012/03/10(土) 22:12:09.75スレッドのポインタを使う
0271デフォルトの名無しさん
2012/03/10(土) 22:19:41.380272デフォルトの名無しさん
2012/03/10(土) 22:30:04.82_endthreadexにはバグがあって100%メモリリークするから
常にCloseHandleを使う方法を利用するほうがいい
_endthreadexは忘れてもいいよ
0273デフォルトの名無しさん
2012/03/10(土) 22:33:09.91マジですか?
有用な情報ありがとう!
0274デフォルトの名無しさん
2012/03/10(土) 22:33:21.03普通にreturn 0;で戻ればいいだけじゃね?
0275デフォルトの名無しさん
2012/03/10(土) 22:36:21.65それだとスレッドが永遠に走り続けるからヤバイ
0276デフォルトの名無しさん
2012/03/10(土) 23:01:52.31うそん
http://msdn.microsoft.com/ja-jp/library/hw264s73(v=vs.80).aspx
0277デフォルトの名無しさん
2012/03/10(土) 23:04:37.17return;でスレッド関数終了するとちゃんとデストラクター呼ばれるし、そのあと自動で_
endthreadex呼ばれてスレッド自体もちゃんと破棄されるじゃん。
0278デフォルトの名無しさん
2012/03/10(土) 23:06:13.69ハンドルのリソース解放するもんで_endthreadexとは毛色がちがうじゃん。
0279デフォルトの名無しさん
2012/03/10(土) 23:26:04.51他のが使えるなら他の使うのが良い
0280デフォルトの名無しさん
2012/03/10(土) 23:42:01.49代替手段を考えるにしても_exitthreadexを使おうと思うに至る事自体が稀だと思うが。
0281デフォルトの名無しさん
2012/03/11(日) 00:04:45.82スレッド内でcatchされない例外があるとプログラムが死ぬ
0282デフォルトの名無しさん
2012/03/11(日) 02:25:57.18_endthreadexとCloseHandleを同列に見るやつ前もいたけどcalleeとcallerの区別もついてないのかよ
0283デフォルトの名無しさん
2012/03/11(日) 04:20:10.08「callerください。あ、calleeは抜きで!」
0284デフォルトの名無しさん
2012/03/11(日) 05:46:41.760285デフォルトの名無しさん
2012/03/11(日) 07:57:50.53operator =を書くときに困っています。
たとえば内部に持つバッファのサイズなどはコンストラクタで決まり、以後変更されないのでconstにしています。
が、そうするとconst_castでconstをはがさないと代入演算子が書けないわけで・・・
こういうときはどうするべきなのでしょう。
1.constではなくmutableにすべき
2.代入演算子を書くべきでない。使うときはコピーコンストラクタで済ませるべき
3.そもそもその程度の不変性ならconstにするな
アドバイスいただけると嬉しいです。
0286デフォルトの名無しさん
2012/03/11(日) 09:34:11.030287デフォルトの名無しさん
2012/03/11(日) 12:02:34.88コンパイル時定数ぐらい
0288デフォルトの名無しさん
2012/03/11(日) 12:06:44.760289デフォルトの名無しさん
2012/03/11(日) 12:14:39.10コピーコストの大きなオブジェクトを
コンストラクタのconst参照で受け取って保持するときくらいだな。
寿命の管理に気をつけないといけないけど。
0290デフォルトの名無しさん
2012/03/11(日) 12:17:04.810291285
2012/03/11(日) 12:25:51.16constつけないように変更してみます、ありがとうございました。
0292デフォルトの名無しさん
2012/03/11(日) 12:30:29.300293デフォルトの名無しさん
2012/03/11(日) 17:16:33.24代入演算系をprivateにして制限するのも手よ。
imutableオブジェクトの完成だ。
0294デフォルトの名無しさん
2012/03/11(日) 21:34:23.89↑が直らないんですが、どうやって対処すれば良いのでしょうか・・・
0295デフォルトの名無しさん
2012/03/11(日) 21:53:56.51例外をハンドルすればいいと思うよ。
0296デフォルトの名無しさん
2012/03/11(日) 22:31:10.52日本語でおk
0297デフォルトの名無しさん
2012/03/11(日) 22:42:45.650298デフォルトの名無しさん
2012/03/11(日) 22:47:22.51教えてもらおうとしても駄目
このスレには屑しかいないんだから
0299デフォルトの名無しさん
2012/03/11(日) 22:48:11.87例外の中身を調べてみろよ
0300デフォルトの名無しさん
2012/03/11(日) 23:35:07.570301デフォルトの名無しさん
2012/03/11(日) 23:40:03.44catchする時、型が解ってなけりゃいつまで経っても
ハンドルできんだろう
0302デフォルトの名無しさん
2012/03/12(月) 00:01:33.950303デフォルトの名無しさん
2012/03/12(月) 01:41:36.01listである条件に当てはまるものを削除したいときは
remove_if()を使えばいいらしいのですが、使い方が分かりません。
0304デフォルトの名無しさん
2012/03/12(月) 01:56:24.450305デフォルトの名無しさん
2012/03/12(月) 09:01:46.79此処読んでみな。
http://marupeke296.com/TIPS_No12_ListElementErase.html
0306デフォルトの名無しさん
2012/03/12(月) 11:22:45.030307デフォルトの名無しさん
2012/03/12(月) 18:29:50.20ありがとうございます
これで大方理解できました。
>>306
[](int val){ return val == 2 || val == 3; }のようにわざわざ他で関数を作らなくてもできるんですね。参考になります。
[](type n){}の書き方の[]の意味は戻り値の型の略称ということでいいんでしょうか。
0308デフォルトの名無しさん
2012/03/12(月) 18:36:26.000309デフォルトの名無しさん
2012/03/12(月) 18:38:07.37特に[]の中の指定は結構特殊だから
0310デフォルトの名無しさん
2012/03/12(月) 18:38:16.120311デフォルトの名無しさん
2012/03/12(月) 19:53:31.50普通に使う分にはある程度できるようになりました。
ありがとうございます。
あとはクラスがどうのこうのを学ばないとなぁ
0312デフォルトの名無しさん
2012/03/12(月) 20:53:36.74uBlus or Blits++
0313デフォルトの名無しさん
2012/03/13(火) 19:05:49.64フレームワークに設けられている便利に使っていいvoid*なんですが
&でアドレス取得して入れたら、うまく動作しませんでした。
&でアドレス取得する場合、参照カウントが増えなくて消えちゃうみたいです。
こういう時ってどう実装するものなのでしょう?。。
0314デフォルトの名無しさん
2012/03/13(火) 19:21:32.290315デフォルトの名無しさん
2012/03/13(火) 19:55:09.32ありがとうございます。試してみます。
0316デフォルトの名無しさん
2012/03/13(火) 20:21:24.590317デフォルトの名無しさん
2012/03/13(火) 22:35:58.79ソースを貼らせてください
http://codepad.org/C3hsBjQo
余計な部分は省略しています。
これで、コンパイル時のエラーはないのですが、scanfが実行される前に、
プログラムが止まってしまいます。
本当に稚拙なプログラムで済みません、初心者なもので。
どなたか問題点を教えていただけないでしょうか。
0318デフォルトの名無しさん
2012/03/13(火) 22:39:51.790319デフォルトの名無しさん
2012/03/13(火) 22:40:09.290320デフォルトの名無しさん
2012/03/13(火) 22:52:01.51「-1」と入力すると”数が正しくありません〜”とでて次の”数を入力してください->”に戻るけど
「a」と入力すると”数が正しく〜”と”数を入力〜”がずっとでつづけます
なぜなんでしょうか?
while(1) {
cout << "数を入力してください->";
cin >> num;
state =cin.rdstate();
if (num <= 0 || state != std::ios_base::goodbit){
cout << "数が正しくありません。最初に戻ります。\n" << endl;
continue;
}
…
}
0321デフォルトの名無しさん
2012/03/13(火) 23:12:41.47エラーを clear() してから a を読み捨てないと、
永遠に先まで読み進められない
0322デフォルトの名無しさん
2012/03/13(火) 23:24:47.10>>319さん
回答有難うございます!さっそく直してみて、scanfが実行されるまではいったのですが、
そこからが進みません。
多分、N1hosei関数が悪いんだと思います。
入力したpが、12以上になってしまたらマイナスし、0以上になってしまったら
+する。
pが、jからj+2、またiからi+4の範囲にあったら、+を続け、また同時に、
p == k または p == h になってしまったら、更に+する、
つまるpが、jからj+2、iからi+4の範囲になく、かつkでもhでもない、数になるまで
演算をループさせたいのですが…
0323デフォルトの名無しさん
2012/03/13(火) 23:36:16.35エラー復帰とは具体的にどういうことをすればよいのでしょうか?
初心者で申し訳ありません
0324デフォルトの名無しさん
2012/03/13(火) 23:46:00.25> エラーを clear() してから a を読み捨てる
0325デフォルトの名無しさん
2012/03/14(水) 00:04:08.42>p == k または p == h になってしまったら
It means
if (p == k || p == h) {
}
not
if (p != k && p != h) {
}
0326デフォルトの名無しさん
2012/03/14(水) 00:21:23.51何をclearすればよいのでしょうか?
cin.clear();
をやってみたのですがダメでした・・
0327デフォルトの名無しさん
2012/03/14(水) 00:25:04.26>a を読み捨てる
0328デフォルトの名無しさん
2012/03/14(水) 00:28:09.600329326
2012/03/14(水) 15:19:23.31cin.ignore();
をしたら解決しました
>>321の言うとおりclearしてignoreしたら正常に動作しました
ありがとうごさいました
ただ何故こうしたらうまくいくのかよくわかりません
上の2つを逆にしてもダメでした
どなたか解説して頂けると助かります
0330322
2012/03/14(水) 22:08:26.53返信有難うございます。
int N1hosei(int i, int j, int k, int h,int &p){//iやjの範囲内だったら、
if(p > 12){
do{
p--;
}while((p == k) || (p == h)); //12以上になってしまったら、h,kでなくなるまで-する。h,kでなくなったら、再び一番最初の条件に戻る
return p;
}else if (p < 0){
do{
p++;
}while((p == k) || (p == h));//0以下になってしまっていたら、i,jの範囲外になるまで+して、//h,kでなくなるまで+。で最初の条件に戻る。
return p;
}else{//0≦p≦12、つまり普通の場合は、これ
if((p == k) || (p == h)){
p ++;}
return p;
}
}
このように書き換えて見たのですが、うまくいきません…何が悪いのでしょうか。。
指摘していただけると、大変助かります。
0331デフォルトの名無しさん
2012/03/14(水) 23:49:53.69j <= p <= j+2
は
(j <= p) <= j+2
であってpがある範囲内にあるかどうかの判定になっていないから
0332322
2012/03/14(水) 23:54:51.40なるほど!
ではpがある範囲内にあるかどうかの判定は、
j <= p && p <= j +2
とでもすればいいのでしょうか。
0333デフォルトの名無しさん
2012/03/15(木) 00:09:21.33ちったぁ考えれ
cin >> num; で a が見つかってエラーになって、cin.clear(); しても、
次の読み込みはまた a からなの
正しく読めるまで先には進まないの
だからまたエラーになるの
これがずっと続くってわけ
0334デフォルトの名無しさん
2012/03/15(木) 00:10:46.51つーか誰にも必要ないよね。
0335デフォルトの名無しさん
2012/03/15(木) 01:05:51.31それでいい
0336デフォルトの名無しさん
2012/03/15(木) 09:58:01.30CBaseAを継承し、CSpecとします。
CSpec CSpec::operator=(const CSpec &obj ){
CBaseA *p1 = dynamic_cast <CBaseA *> ( this );
CBaseA *p2 = dynamic_cast <const CBaseA *> ( &obj );
if( (p1 != nullptr) && (p2 != nullptr) ) *p1 = *p2;
}
今はこのようにしています。
0337デフォルトの名無しさん
2012/03/15(木) 10:04:21.020338デフォルトの名無しさん
2012/03/15(木) 10:05:43.28てかdynamic_castは間違い
0339デフォルトの名無しさん
2012/03/15(木) 10:14:28.60有難うございます!
こういう書き方も出来たんですね!
>>338
ダウンキャストは承知していましたが、継承元のoperator=を呼ぶ必要があったために
やむ終えず>>336の書き方をしていました。
知識不足で恥ずかしい限りです。
0340デフォルトの名無しさん
2012/03/15(木) 15:03:40.92static_cast<CBaseA &>(*this) = obj;
0341デフォルトの名無しさん
2012/03/15(木) 21:11:41.42Linux関連じゃ、istreamに突っ込んでんのをたまに見る
0342デフォルトの名無しさん
2012/03/15(木) 21:12:46.78thisもいらんだろ
0343デフォルトの名無しさん
2012/03/18(日) 16:43:24.83ppm形式のバイナリファイルの画像を読み込み,pgm形式に変換して配列に画素値を格納したいと考えています。
そこで画素読み込み部分を以下のように書いたのですが
for(int y = 0; y < m_height; y++){
for(int x = 0; x < m_width; x++){
double r,g,b;
ifs.read((char*) &r, sizeof(double));
ifs.read((char*) &g, sizeof(double));
ifs.read((char*) &b, sizeof(double));
pixels[x][y] = r * 0.299 + g * 0.587 + b * 0.114;
}
}
pixelsの配列内を確認してもどの位置の画素も同じ値になってしまいます
どこが間違ってるのでしょうか;;
0344デフォルトの名無しさん
2012/03/18(日) 16:46:01.810345デフォルトの名無しさん
2012/03/18(日) 17:08:10.03そりゃ、1画素がchar 1個分だもんな。
1画素をchar 6個分(double)で読み込みゃそりゃずれるで
0346デフォルトの名無しさん
2012/03/18(日) 17:15:48.220347デフォルトの名無しさん
2012/03/18(日) 17:21:19.83char r,g,b;
pixels[x][y] = (double)r * 0.299 + (double)g * 0.587 + (double)b * 0.114;
じゃないの?
0348デフォルトの名無しさん
2012/03/18(日) 19:14:02.740349デフォルトの名無しさん
2012/03/18(日) 19:51:44.93なんたって言語作者の9割以上が外国人だしな。
0350デフォルトの名無しさん
2012/03/18(日) 20:12:39.100351デフォルトの名無しさん
2012/03/18(日) 20:16:47.830352デフォルトの名無しさん
2012/03/18(日) 20:21:36.940353デフォルトの名無しさん
2012/03/18(日) 20:26:28.13Rubyに限らずコンテンツ量が一桁以上違うから
内容の濃淡は知らんけど日本は恵まれてると思うよ
0354デフォルトの名無しさん
2012/03/18(日) 21:44:20.01もう少しわかりやすく。
0355デフォルトの名無しさん
2012/03/18(日) 21:45:35.76多少ひねれば英語化できる言語圏じゃ、母国語資料の少なさなんて
大した問題じゃないんだろ。リーナスやハゲだってフィンランド人だし。
0356デフォルトの名無しさん
2012/03/18(日) 22:13:22.65SVOは全言語中でむしろマイナー
日本語と同じSOVが45%を占めている
0357デフォルトの名無しさん
2012/03/18(日) 23:04:35.700358デフォルトの名無しさん
2012/03/18(日) 23:42:15.55途上国言語で話題振っても誰も付いてこない来れない悲しみと対極にある
0359デフォルトの名無しさん
2012/03/19(月) 00:02:14.890360デフォルトの名無しさん
2012/03/19(月) 00:07:25.08真面目に話したら、俺らよりはるかに頭いいんだろうな
何せマルチリンガルらしいし
0361デフォルトの名無しさん
2012/03/19(月) 00:13:38.15perlやHaskellなんかだと日本語と比べるべくも無いが
0362デフォルトの名無しさん
2012/03/19(月) 02:23:37.24回答ありがとうございます。
やっぱり全然本質を理解できてないですね^^;参考になりました。
もうひとつ聞きたいことがあるのですが
バイナリで書かれたppm形式は画素値はバイナリで書かれていますが、ヘッダはテキストで書かれています。
このときifstreamを使ってファイルを読み込むときはオープンモードはbinaryを指定したほうがいいのですか?
またヘッダのテキスト部分がコメント等で長さが分からない場合に、ヘッダ部分を読み飛ばすにはどうしたらいいのでしょうか?
環境はVC++2010です。
0363デフォルトの名無しさん
2012/03/19(月) 02:35:39.30ppmを厳密に解釈するなら、libpnmのソースと同じようにやるしか。
簡易的には、バイナリで開いておいて行単位に読み出して、コメント行か有効行か判断する。
幅、高さ、濃度最大値を取得できたら、その後はバイト単位で読み出す。
0364デフォルトの名無しさん
2012/03/19(月) 02:36:02.85でも、テキストでオープンすると改行コードをイジっちゃうのでバイナリの意味が変わっちゃうことがあると思う。
0365デフォルトの名無しさん
2012/03/19(月) 02:56:31.390366デフォルトの名無しさん
2012/03/19(月) 13:31:21.65あるイベントは会話が何ページもあったりと可変長なデータがあるためインスタンスによってサイズはバラバラです
このような大きさがバラバラなデータが詰まったバイナリファイルからデータを読み込むには
普通どのような仕様にしているのでしょうか?全然想像がつきません 環境はVC++2010です
0367デフォルトの名無しさん
2012/03/19(月) 13:37:28.250368デフォルトの名無しさん
2012/03/19(月) 14:08:38.64vectorコンテナでデータを書きこむ時に
データの長さも同時に書きこんでおくといった方法でいけそうですね
0369デフォルトの名無しさん
2012/03/19(月) 14:11:58.880370366,368
2012/03/19(月) 14:27:55.83例えば2つの可変長データを含む構造体をバイナリで保存した場合、
それぞれの長さが分からないと、
読み込む時最初の可変長データの次のデータが可変長データの続きなのか、
それとも次の可変長データなのか判断する方法がないと思ったのですがおかしいでしょうか?
0371デフォルトの名無しさん
2012/03/19(月) 14:36:19.03なんでバイナリなの?
xmlは使えないの?
データ構造とファイル設計は混同しちゃダメだよ。
0372デフォルトの名無しさん
2012/03/19(月) 14:37:39.25で、必要な数だけpush_backする。
表示する場合は、msg.begin()�msg.end()を使えば良いのでは?
0373366
2012/03/19(月) 15:43:41.33xmlが使えるといいなと思うのですが、ファイルの中身が見えてしまうもので
ゲームというジャンルのために暗号をかけたバイナリデータに拘っていました。
本当はバイナリデータなんて使いたくないのですが…。
>>372
きちんとロードできるか試してみます。
表示はそれでいけると思います。
ありがとうございます。
0374デフォルトの名無しさん
2012/03/19(月) 17:33:23.80XMLだって暗号化できるでしょ?
データの記述方法とデータ構造とファイル構造をごっちゃにしちゃだめだよ。
0375デフォルトの名無しさん
2012/03/19(月) 17:52:10.63shared_ptr<A> a_;
public:
weak_ptr<A> getA() {return weak_ptr<A>(a_);}
【or】
A *getA() {return a_.get();}
};
リソース管理クラスを作りたいのですが外部からAを利用したい場合weak_ptr・生ポ(constでない)どちらで取得するのが良いのでしょうか?
※a_の寿命はR内で管理したいのでshared_ptrは公開したくありません
0377デフォルトの名無しさん
2012/03/19(月) 19:34:03.990378デフォルトの名無しさん
2012/03/19(月) 19:40:54.84weakをlockしたらshared_ptr取れちゃわない?
俺も似たような問題で悩んでweak_ptrのようにオブジェクトの生存確認が
できるけど所有権は主張しない生ポインタとスマートポインタの中間みたいなやつを
実装しようか迷った末やらなかった
0379デフォルトの名無しさん
2012/03/19(月) 19:45:52.94XMLというか、文字列orバイナリについて暗号化かけるだけだから、
別にXMLどうこうじゃないよね
例えば全部の文字についてXORかければ最低でも普通には読めないで高速な暗号化できるわけで。
0380デフォルトの名無しさん
2012/03/19(月) 20:15:38.57ありがとうございます。取れちゃいますね、、
weak_ptrのlock()が *get()になるようなバージョンがあるといいんですが。
素直にポインタで公開するのが妥当なのでしょうか?
0381デフォルトの名無しさん
2012/03/19(月) 20:20:29.26どうせ呼んでる間は死なないんだろ
0382デフォルトの名無しさん
2012/03/19(月) 22:06:28.71さすがに半年ROMったらかわるっしょ
0383デフォルトの名無しさん
2012/03/19(月) 22:07:30.27ハンドルを使う方法もあるけど、
実際ポインタで困ることはそんなに無い気がする
0384デフォルトの名無しさん
2012/03/19(月) 23:53:51.31とりあえず自分に必要なものを作ってみて、実用しないとニーズの比重がわからないよ。
0385デフォルトの名無しさん
2012/03/20(火) 13:37:16.64書けないとのことですが、引数が多い場合は、()の中に
改行して書けということでしょうか?
0386デフォルトの名無しさん
2012/03/20(火) 14:00:00.620387デフォルトの名無しさん
2012/03/20(火) 14:54:19.710388デフォルトの名無しさん
2012/03/20(火) 15:09:18.140389デフォルトの名無しさん
2012/03/20(火) 15:18:26.470390デフォルトの名無しさん
2012/03/20(火) 15:20:35.12まあ極めて問題のある構文だから使わない方がいいが
#include <stdio.h>
int foo(a, b)
int a, b;
{
return a + b;
}
int main()
{
printf("%d\n", foo(1.2, 2));
return 0;
}
実行結果: 1931896422
0391デフォルトの名無しさん
2012/03/20(火) 16:20:35.89まぁGCCの問題だけど
http://codepad.org/ceAMmTJC
いま動くコンパイラって何が有るの?
16bit時代のコンパイラ?
0392デフォルトの名無しさん
2012/03/20(火) 16:23:00.68int Function
(
int arg1,
int arg2,
int arg3,
)
{
return 0;
}
初めて見たときは寒気が走ったがこういう書き方するところも有る。
0393デフォルトの名無しさん
2012/03/20(火) 16:26:01.050394デフォルトの名無しさん
2012/03/20(火) 16:41:08.16あいたたたたた
0395デフォルトの名無しさん
2012/03/20(火) 16:46:28.00最後のコンマは書けないぞ
俺はこうか
int Function(
int arg1,
int arg2,
int arg3
) {
return 0;
}
こうだな
int Function(
int arg1,
int arg2,
int arg3)
{
return 0;
}
エディタとの相性に合わせて使う
0396デフォルトの名無しさん
2012/03/20(火) 16:47:47.41http://codepad.org/3TQKnfBZ
0397デフォルトの名無しさん
2012/03/20(火) 16:49:06.61カッコの揃える派とカッコどうでもいい派に好みは別れるよね
0398デフォルトの名無しさん
2012/03/20(火) 16:56:42.520399デフォルトの名無しさん
2012/03/20(火) 16:59:09.59この書き方だと型チェックが行われないので
1.2 が double 値のままスタックに積まれて、
それを int 値として取り出した結果、無茶苦茶なことになっている
簡単に未定義動作が起きる極めて危険なものなので
今時決して使ってはいけない
0400デフォルトの名無しさん
2012/03/20(火) 17:05:06.31C99でも廃止予定事項なだけで使えるぞ。
0401デフォルトの名無しさん
2012/03/20(火) 19:49:26.83括弧の中に書くのはやっぱり慣れてないというのもあって、
不細工な気がしますね。諦めてpascalに行こうかしら。
0402デフォルトの名無しさん
2012/03/20(火) 23:10:23.09そんな危ない書き方を慣れてないという理由だけで継続するとかとんでもない話だし。
0403デフォルトの名無しさん
2012/03/21(水) 08:42:18.70これでOK。
http://codepad.org/oyP2YgaY
型を省略したらint型ってことだけど、危なくてしゃぁないな。
0404デフォルトの名無しさん
2012/03/21(水) 11:07:25.08具体的にはどのようにやるのですか?
例:
ある型 f;
f=[ & f ](int a){if(a==0)return; else f(a-1 )};
ってかんじですか?
0405デフォルトの名無しさん
2012/03/21(水) 11:47:34.680406デフォルトの名無しさん
2012/03/21(水) 11:50:18.46ありがとうございます。
autoとfunctionの違いは教えてくれませんよね?
0407デフォルトの名無しさん
2012/03/21(水) 11:55:23.10ググれ
0408デフォルトの名無しさん
2012/03/21(水) 23:46:09.58STLや標準ライブラリなどはいちいち自前のアロケータを指定する方法しかないんでしょうか?
0409デフォルトの名無しさん
2012/03/21(水) 23:49:18.960410デフォルトの名無しさん
2012/03/21(水) 23:49:43.38プールの実装に確保サイズ以外の情報を使わないのであれば ::operator new () を
置き換えるという方法もあるよ。
0411デフォルトの名無しさん
2012/03/22(木) 00:01:40.50new/delete演算子をグローバルなオーバーロードをすれば
STLや標準ライブラリからも呼ばれるということでしょうか?
0412デフォルトの名無しさん
2012/03/22(木) 00:12:39.92そういうこと。少なくともアロケータ引数を取るテンプレートはデフォルトで std::allocator を
使うことになってて、デフォルトの std::allocator 実装は ::operator new を使うことになってる。
この場合の ::operator new/delete の定義はオーバーロードじゃないけどね。
あとSTLも標準ライブラリの一部な。
0413デフォルトの名無しさん
2012/03/22(木) 00:20:42.01ありがとうございます。
やってみます。
0414デフォルトの名無しさん
2012/03/23(金) 01:16:08.890415デフォルトの名無しさん
2012/03/23(金) 03:36:11.12それが >>410-413 じゃないのか?
0416デフォルトの名無しさん
2012/03/23(金) 08:52:23.54何言ってんだかわかんねーな
0417デフォルトの名無しさん
2012/03/24(土) 01:09:01.950418デフォルトの名無しさん
2012/03/24(土) 01:34:29.07グローバルに置き換えるんじゃ何か都合が悪いのか?
都合が悪い、指定した対象だけに絞りたいとすれば、それは
アロケータでの指定を行うのが妥当ということにはならないのか?
0419デフォルトの名無しさん
2012/03/24(土) 23:34:30.02できる処理系と出来ない処理系がある。
0420デフォルトの名無しさん
2012/03/24(土) 23:38:11.150421デフォルトの名無しさん
2012/03/25(日) 01:48:53.740422デフォルトの名無しさん
2012/03/27(火) 09:32:26.41virtualとはつまるところ、こいつを継承した何かがあるかもしれないから継承先があるかどうかチェックしてね、という目印のようなものでしょうか
0423デフォルトの名無しさん
2012/03/27(火) 10:18:58.88仮想関数、純仮想関数、ポリモーフィズムとかについて調べた?
0424デフォルトの名無しさん
2012/03/27(火) 16:00:04.900425デフォルトの名無しさん
2012/03/27(火) 16:06:27.510426デフォルトの名無しさん
2012/03/27(火) 16:08:31.140427デフォルトの名無しさん
2012/03/27(火) 17:45:48.25教えないつもりなら素直にスルーしとこうぜ
せっかくこういうスレがあってもわざわざ妨害してたら何にもならんし
0428デフォルトの名無しさん
2012/03/27(火) 18:56:37.910429デフォルトの名無しさん
2012/03/27(火) 19:12:33.48基底クラスのポインタや参照を使ってメンバ関数を呼んでも
本来のクラスのメンバ関数が呼ばれるというもの
0430デフォルトの名無しさん
2012/03/27(火) 21:51:38.93virtualの有無で、コンパイル結果をアセンブラレベルで比較したことがある。
明らかに違うんだよね。当たり前だが。
で、ポリモーフィズムの仕組みを妙に納得したり。
0431デフォルトの名無しさん
2012/03/28(水) 21:52:36.51別に、Smalltalkのワールドみたいなウィンドウ表示とかは要らないんで、
Smalltalkのイメージファイルを読み込んで、メソッドを記述した文字列を
送ってやると値を返したり、何らかの振る舞いをするってものでいいんですが。
0432デフォルトの名無しさん
2012/03/28(水) 22:33:58.48プリミティブから作るかBoostにもあったような気がする。
0433デフォルトの名無しさん
2012/03/28(水) 22:48:08.420434デフォルトの名無しさん
2012/03/28(水) 23:51:36.82でもね、関数型知らないんだ♪
プリミティブかBoostでいい感じ〜☆
わかんないけど、とりあえずオッケー☆ウフフ☆ タコヤキ!
0435デフォルトの名無しさん
2012/03/28(水) 23:59:41.95ここが何言いたいのかさっぱり解らん
前の文とつながってない
0436営利利用に関するLR審議中@詳細は自治スレへ
2012/03/29(木) 00:57:09.00・・・どこからタコヤキ出てきたんだろう。
さいきんのわかいもんは!・・・なんでもないよ。
0437営利利用に関するLR審議中@詳細は自治スレへ
2012/03/29(木) 07:20:55.860438営利利用に関するLR審議中@詳細は自治スレへ
2012/03/29(木) 09:39:55.77{
virtual Base* Duplicate() const { return new Base(*this); }
};
class Derived : public Base
{
virtual Derived* Duplicate() const { return new Derived(*this); }
};
という複製処理を仮想関数として作成する場合、
Derived::Duplicate()の戻り値がDerived*でよいのは仕様として決まっていますか?
Visual Studioではちゃんと仮想関数として動くのですが。
それとも、どちらもBase*としておくべきですか?
0439営利利用に関するLR審議中@詳細は自治スレへ
2012/03/29(木) 10:24:50.56共変の返却値。仕様で認められてるのでDerived*でいい。
0440営利利用に関するLR審議中@詳細は自治スレへ
2012/03/29(木) 10:43:26.27ありがとうございます。そういう専門用語があったのですね。
「共変の返却値」でググったら、全く同じような質問が出てきました。
失礼しました。
0441営利利用に関するLR審議中@詳細は自治スレへ
2012/03/29(木) 16:55:43.840442営利利用に関するLR審議中@詳細は自治スレへ
2012/03/29(木) 18:06:22.510443営利利用に関するLR審議中@詳細は自治スレへ
2012/03/29(木) 18:42:38.31ソース中の無駄に多いコメントみたいなモンだな
0444営利利用に関するLR審議中@詳細は自治スレへ
2012/03/29(木) 20:00:18.820445431
2012/03/29(木) 20:02:26.550446営利利用に関するLR審議中@詳細は自治スレへ
2012/03/30(金) 22:14:39.78VC2010 で、
struct Hoge {
Hoge(Hoge&& rhs) {
*this = rhs; // 1
}
Hoge& operator=(const Hoge& rhs); // 2
Hoge& operator=(Hoge&& rhs); //3
}
1 の箇所で、3 が呼ばれるかと思ったら、2 が呼ばれてしまいました。
これは、規格通りの動作なのでしょうか?
もしそうなら、右辺値参照の operator= にもっていくには、
コンストラクタの引数に対して std::move() すればいいのだと思うのですが、
どうして引数の型が && なのに、再度 std::move しなければいけないのか
理由を知っていれば教えて下さい。
0447営利利用に関するLR審議中@詳細は自治スレへ
2012/03/30(金) 22:27:00.73右辺値参照は普通の参照も受け取れちゃうから。
完全に転送したいならstd::forwardでも使いな。
0448営利利用に関するLR審議中@詳細は自治スレへ
2012/03/31(土) 00:06:50.58Hoge(Hoge&& rhs) { //ここでrhsという名前をつけているからこれは既に右辺値ではなく左辺値になる。
*this = rhs; // 1
//ここでrhsを使おうとする場合があるかもしれない
}
0449営利利用に関するLR審議中@詳細は自治スレへ
2012/03/31(土) 10:08:25.95このページの通りにやったのですがデバックして実行ボタンを押すとフリーズしてしまいます
まだ初めて日が浅いのでどうかおしえてください
0450営利利用に関するLR審議中@詳細は自治スレへ
2012/03/31(土) 10:12:23.55http://toro.2ch.net/test/read.cgi/tech/1268613679/
こっちで聞いてね
それにしても初心者がC++/CLIなんて自殺行為だぞ
0451営利利用に関するLR審議中@詳細は自治スレへ
2012/03/31(土) 10:31:16.28ありがとうござます
それなら別にフォームアプリケーションを作る方法があるのですか?
0452営利利用に関するLR審議中@詳細は自治スレへ
2012/03/31(土) 10:38:15.05C#を使うのが普通
今からでも遅くないからC#勉強しなさい
>>450のスレ流し読みしてそれでも使いたいっていうんなら止めないが…
0453営利利用に関するLR審議中@詳細は自治スレへ
2012/03/31(土) 10:42:10.29自分は工業高校生で一年間C++でコンソールを作ってきたのでフォームアプリに挑戦したいと思って最近やってみたのですが
C#のほうがいいとは知りませんでした
ありがとうございます
0454営利利用に関するLR審議中@詳細は自治スレへ
2012/03/31(土) 11:04:53.790455営利利用に関するLR審議中@詳細は自治スレへ
2012/03/31(土) 12:33:34.41C#を勉強した方が早い。
0456営利利用に関するLR審議中@詳細は自治スレへ
2012/03/31(土) 13:28:04.74C++でGUIやりたいならQt調べろ。C#より楽だぞ。
0457営利利用に関するLR審議中@詳細は自治スレへ
2012/04/02(月) 16:46:46.56class hoge{
private:
bool x;
public:
void set();
};
/*-----Class.cppの中身-----*/
#include"Class.h"
void hoge::set(){
turn=1;
}
とすると実行時にturn=1ができません。
理由が分からないので教えてください。
0458営利利用に関するLR審議中@詳細は自治スレへ
2012/04/02(月) 18:10:47.73turnはどこで宣言されてるの?
0459営利利用に関するLR審議中@詳細は自治スレへ
2012/04/02(月) 18:48:41.50すいません
bool x; が bool turn; です
間違えました
0460営利利用に関するLR審議中@詳細は自治スレへ
2012/04/02(月) 19:00:24.75何がどうなるのか具体的に書きましょう
bool型の値はtrueかfalseだけど、警告をエラーにするオプションつけてたりする?
0461営利利用に関するLR審議中@詳細は自治スレへ
2012/04/02(月) 19:13:03.86エラーも警告も出ないのですが、ここの動作にとりかかると実行が中断します。
なので、turnの宣言ができてない又はturnを参照できないのだと思うのですが…
0462営利利用に関するLR審議中@詳細は自治スレへ
2012/04/02(月) 20:01:12.030463営利利用に関するLR審議中@詳細は自治スレへ
2012/04/02(月) 20:06:28.41変数がbool型云々ではなく、intなどでも同じように問題が起こってるので
変数宣言自体に問題があるかと思います…
0464営利利用に関するLR審議中@詳細は自治スレへ
2012/04/02(月) 21:58:21.48h->set();
とかやってんじゃねーの
0465営利利用に関するLR審議中@詳細は自治スレへ
2012/04/02(月) 22:02:58.68問題はそれでした
普通にインスタンス化したら解決しましたありがとうございます
0466営利利用に関するLR審議中@詳細は自治スレへ
2012/04/02(月) 23:12:56.30テンプレートの実体化を指す。オブジェクトをインスタンスとは言わない。
0467営利利用に関するLR審議中@詳細は自治スレへ
2012/04/03(火) 12:13:20.480468営利利用に関するLR審議中@詳細は自治スレへ
2012/04/03(火) 12:19:06.840469営利利用に関するLR審議中@詳細は自治スレへ
2012/04/03(火) 16:16:40.29tolowerって大文字/小文字のサイズが同じ前提で設計されてるように見えるんだが、
そうでない場合を考慮しておきたいときってどう書くのが妥当なんだ?
例:locale=tr_TR.UTF-8の時、大文字'I'(0x49)→小文字(0xc4 0xb1)
0470営利利用に関するLR審議中@詳細は自治スレへ
2012/04/03(火) 16:53:26.18templateかCOMぐらいでしかいわんだろ
C++は実体が見えてる場合が多い上、
実体の共有もあんまりしないからな
0471営利利用に関するLR審議中@詳細は自治スレへ
2012/04/03(火) 17:06:38.85それを作ることをインスタンス化とは言わない
テンプレートに関してはインスタンス化と言うこともある
0472営利利用に関するLR審議中@詳細は自治スレへ
2012/04/03(火) 17:10:34.28むしろインスタンス化って用語テンプレート以前の時代からあったよね?
0473営利利用に関するLR審議中@詳細は自治スレへ
2012/04/03(火) 17:15:50.61HINSTANCEとかC++すら関係ない範囲だけど
0474営利利用に関するLR審議中@詳細は自治スレへ
2012/04/04(水) 00:49:13.79http://eow.alc.co.jp/instance
0475営利利用に関するLR審議中@詳細は自治スレへ
2012/04/04(水) 01:57:32.240476営利利用に関するLR審議中@詳細は自治スレへ
2012/04/04(水) 21:43:49.98プログラミング板に誘導されたんですけど
もしここもスレチだったら誘導お願いします
C++、Open GL
でユーザーが図形作成できるようなアプリを作りたいです
座標幾何学の勉強をするように言われたんですけど
ぶっちゃけ知識がないので
何か勉強するのにいい本を紹介してほしいです
0477営利利用に関するLR審議中@詳細は自治スレへ
2012/04/04(水) 22:07:22.330478営利利用に関するLR審議中@詳細は自治スレへ
2012/04/04(水) 23:50:42.74数学の話では線形代数になるけど、そこからだと結構回り道になるから、
3Dゲーム作成に必要な数学、みたいな本を読むのが手っ取り早いんじゃない?
タイトル忘れたけど、そんな感じの本を見かけたことあるから
しかしC++やOpenGLの使い方とかは大丈夫?全部初めてだと、なかなか敷居高いよ?
0479営利利用に関するLR審議中@詳細は自治スレへ
2012/04/05(木) 01:29:00.46>>478の言うように全部はじめてだと、それなりに時間かかると思うよ。
勉強の順番としては
まずは、C++の入門書かなんかやって
次にアプリを動かしたいプラットフォームでアプリを作る方法を学ぶ
次にOpenGLを学ぶ(べつにGLに拘らんでもいいと思うけど)。
それで、アプリの機能に必要な知識を勉強して
ようやくアプリが作れる感じ。
がんがれ。
0480営利利用に関するLR審議中@詳細は自治スレへ
2012/04/05(木) 21:26:00.23授業で簡単な画像を作ったりアニメーションの練習くらいは
やったんですけど、数学が苦手なもんで…
一応卒論に関係してくるので、何か参考書とかあればなと思って
書き込みしました。
3Dのゲーム用の数学本を探してみます。
レスありがとです。ももーい。
0481営利利用に関するLR審議中@詳細は自治スレへ
2012/04/05(木) 21:55:57.25変数も関数も定義できるクラスだけでOkだと思ったのですが
0482営利利用に関するLR審議中@詳細は自治スレへ
2012/04/05(木) 22:09:51.21C互換のAPIを使うときなどは使わざるを得ない。
そのほかにも私の場合、レガシーな構造体で充分なときはstructを使う。
要は、メンバ変数を公開するかどうかかな。
0483営利利用に関するLR審議中@詳細は自治スレへ
2012/04/05(木) 22:37:08.260484営利利用に関するLR審議中@詳細は自治スレへ
2012/04/05(木) 22:52:40.05勉強になりました。ありがとうございます。
0485営利利用に関するLR審議中@詳細は自治スレへ
2012/04/05(木) 23:47:09.72メンバー関数定義したらクラスじゃね?
構造体(POD または データブロック)として使用すると、
仮想関数テーブル破壊するから極めて危険。
ちなみに、俺インターフェース用のクラスとか
メンバーが全部publicならstructにしてる。
0486営利利用に関するLR審議中@詳細は自治スレへ
2012/04/06(金) 00:08:34.25テンプレートテンプレート引数くらいだね class なんか使うのは
private も下痢糞だがしぶしぶ使う
他言語との上っ面だけの横並びなんかウルトラどうでもいい
0487営利利用に関するLR審議中@詳細は自治スレへ
2012/04/06(金) 13:28:43.82使い捨てソースは全部structだけど
0488営利利用に関するLR審議中@詳細は自治スレへ
2012/04/06(金) 14:29:09.23共用体は,《クラスキー》unionを付けて定義するクラス。
0489営利利用に関するLR審議中@詳細は自治スレへ
2012/04/06(金) 15:53:22.18文脈から読み取らないと混乱するよ
0490営利利用に関するLR審議中@詳細は自治スレへ
2012/04/07(土) 18:29:03.06template<class II, class PD, class CT>
int sansuu(II pos, PD n, CT tr)
{
for (; 0 < n ; --n, ++pos)
{
---> ここの書き方 if( tr.eq(*pos, '0') )
{
}
}
return 0;
}
int main(int argc, char* argv[])
{
const char* p = "1+1";
ここの書き方 sansuu(p, strlen(p), char_traits<char>);
const wchar* wp = L"1+1";
sansuu(wp, strlen(wp), char_traits<wchar>);
インプットイテレータとサイズを引数にして、あとcharとwcharでも
使えるようにしたいんですがどうしたらいいのでしょうか
stringを見たらchar_traitsとかあったんですがよくわかりませんでした。
お願いします。
0491営利利用に関するLR審議中@詳細は自治スレへ
2012/04/07(土) 19:03:20.38いいたいことはわかるんだけどまずcharだけでいいから動くもの書ける?
forの中身を全部教えろはうんざりだな
0492営利利用に関するLR審議中@詳細は自治スレへ
2012/04/07(土) 19:12:10.50中身のアルゴリズムの質問ではないんです。書き方が悪くてすいません。
テンプレートの使い方がよくわからないので、そこのところをお願いします。
0493営利利用に関するLR審議中@詳細は自治スレへ
2012/04/07(土) 19:17:20.53どうでもいいが、IIとかPDとか大文字だけの名前使うと
プリプロセッサと衝突するぞ
0494営利利用に関するLR審議中@詳細は自治スレへ
2012/04/07(土) 19:20:44.170495営利利用に関するLR審議中@詳細は自治スレへ
2012/04/07(土) 19:21:54.66困ってるポイントがわからんから、まずテンプレートを使わず
char固定でコード書いてみてくれないか
0496営利利用に関するLR審議中@詳細は自治スレへ
2012/04/07(土) 19:34:06.850497営利利用に関するLR審議中@詳細は自治スレへ
2012/04/07(土) 19:34:16.31とりあえずテンプレートの使い方ってことで
http://codepad.org/L461ZCtg
0498営利利用に関するLR審議中@詳細は自治スレへ
2012/04/07(土) 19:42:13.30ありがとうございます。
でもこれだと
if(*it=='+')
のところでwchar_tとcharを比較してしまうとおもってどうにかしたほうが
いいと思ったんです。
0499営利利用に関するLR審議中@詳細は自治スレへ
2012/04/07(土) 19:55:13.05char*はascii互換文字コード(ASCII,SJIS(MS932),EUC-JP)で入ってる文字はASCIIコード内だけ
wchar_t*はUTF-16 or UTF-32で入ってる文字はASCIIコード内だけ
という前提なら一応大丈夫・・・のはず
ASCII範囲外の文字も使うならwchar_t*だけで実装して
使う側が文字コード変換する方が良いんじゃね?多分
0500営利利用に関するLR審議中@詳細は自治スレへ
2012/04/07(土) 19:58:19.950501営利利用に関するLR審議中@詳細は自治スレへ
2012/04/07(土) 20:13:07.49そういう中途半端なことするのやめろよ
0502営利利用に関するLR審議中@詳細は自治スレへ
2012/04/07(土) 20:32:22.44ありがとうございます。
まだ読みきれてないですが勉強します
0503営利利用に関するLR審議中@詳細は自治スレへ
2012/04/07(土) 20:46:08.500504営利利用に関するLR審議中@詳細は自治スレへ
2012/04/11(水) 18:55:48.670505営利利用に関するLR審議中@詳細は自治スレへ
2012/04/11(水) 19:20:38.670506デフォルトの名無しさん
2012/04/11(水) 23:20:34.470507デフォルトの名無しさん
2012/04/11(水) 23:21:52.18まずはお友達から。
0508デフォルトの名無しさん
2012/04/12(木) 00:55:07.85まずはCから
0509デフォルトの名無しさん
2012/04/12(木) 19:15:56.870510デフォルトの名無しさん
2012/04/12(木) 21:27:42.52pが0になる保証ってありますか?
0511デフォルトの名無しさん
2012/04/12(木) 22:00:03.12組み込み系とかで0番地にどうしても書き込みたい場合ならpはヌルポになるだろうけど、
普通はその前にアクセス違反で死ぬ
0512デフォルトの名無しさん
2012/04/12(木) 22:04:16.87int() じゃないからかと思ったけど、
int() でも死なないし、あまつさえ int(1) でも死なない
一体どう言う事だ
0513デフォルトの名無しさん
2012/04/12(木) 22:21:41.97なら、0 になる事は保証されてるっぽいな
0514デフォルトの名無しさん
2012/04/12(木) 23:09:03.72void* をひとつ取る配置用の operator new は引数をそのまま返す。 (18.6.1.3 p2)
そして noexcept で宣言されているので、ヌルを返すことはメモリ確保失敗の意味になる。
その場合、初期化は行われず new 式の結果がヌルになるとされている。 (5.3.4 p13)
というわけで、その p は必ず 0 と等しくなる。
・・・ void* より優先される operator new のオーバーロードが宣言されてなければね。
0515デフォルトの名無しさん
2012/04/12(木) 23:57:16.16どんな 性癖の人が使うの?
0516デフォルトの名無しさん
2012/04/13(金) 01:05:37.41うぉぉ、わかりやすい説明だぜぇぇぇぇぇ。
プレースメントnewは殆ど使わないから
すぐ挙動を忘れちゃう(´・ω・`)
0517デフォルトの名無しさん
2012/04/13(金) 02:48:18.140518デフォルトの名無しさん
2012/04/13(金) 12:09:56.25ガガガガガッ
0519デフォルトの名無しさん
2012/04/13(金) 15:38:19.28しかしリリースモードで実行すると1行ずつ読み込めません。デバッグモードでは問題なく読み込めました。
原因が分かる人がいたら教えてください。 ちなみにvs2008を使っています。
0520デフォルトの名無しさん
2012/04/13(金) 16:16:17.360521デフォルトの名無しさん
2012/04/13(金) 16:47:48.380522デフォルトの名無しさん
2012/04/13(金) 17:13:41.18DebugとReleaseでカレントが違うことを失念しているとか。
0523519
2012/04/13(金) 17:27:10.86>>521さんの想像通り未初期化の変数が誤動作の原因でした。
>>520-522
アドバイスありがとうございました。
0524デフォルトの名無しさん
2012/04/14(土) 01:20:20.192 0.2
3 0.3
...
みたいにintとdoubleが交互にならんだ入力を、
istream_iterator<int> a(cin);
istream_iterator<double> b(cin);
で交互に読み取りたいのだが、(テーブルの列読み込み)
while (a!=istream_iterator<int>()) {
int x = *a++;
double y = *b++;
}
てやっても評価順が制御できなくて困っています。
どうすればいいんでしょうか?
0525524
2012/04/14(土) 02:00:41.50問題が別のところにある可能性もあるから、ちょっと待ってくれ。
0526デフォルトの名無しさん
2012/04/14(土) 02:12:54.470527524
2012/04/14(土) 02:32:52.43C++0xがはいっちゃうけど、流れでここに出させてもらいます。
入力は
-1 0.3
-1 0.8
...
みたいな、doubleは適当な乱数。
1/1000くらいの割合で評価順が逆になる。
#include <iostream>
#include <algorithm>
#include <iterator>
using namespace std;
int main()
{
auto b = istream_iterator<double>(cin);
for_each(istream_iterator<int>(cin),istream_iterator<int>(),[&b](int n){ if (*b++<0) cout << "fail" << endl; });
}
}
0528デフォルトの名無しさん
2012/04/14(土) 03:15:36.16乱数やめて固定値でやtってみたら
0529524
2012/04/14(土) 03:44:48.16istream_iteratorがバッファリングでもしてるのかと思ってしまった。
0530デフォルトの名無しさん
2012/04/14(土) 09:56:55.43それじゃだめだろ。istream_iteratorの実装によってはインスタンス生成時に値を一回読む。
0531524
2012/04/14(土) 10:01:34.51まじかw
1/1000って書いたけど1/10000でもあったから、
調べてみたらたしかに1行目でドジってるw
この目的を達成するために仕様に沿った形で書けますか?
ちなみに使うときは527みたく
for_each(istream_iteratorA,...,istream_iteratorBを使った関数)
の格好(入力イテレータで読む)で。
0532524
2012/04/14(土) 10:09:20.74つ
a=...
b=...
for_each(...)
別の発想で交互に読み込むことを保証するイテレータの組をつくることはできないか?
0533デフォルトの名無しさん
2012/04/14(土) 10:46:08.64#include <iostream>
#include <algorithm>
#include <iterator>
using namespace std;
struct i_and_d { int i; double d; };
istream& operator>>( istream &is, i_and_d &id ) { return is >> id.i >> id.d; }
ostream& operator<<( ostream &os, i_and_d &id ) { return os << id.i << "," << id.d << endl; }
void testprint( i_and_d x ) { cout << x; }
int main() { for_each( istream_iterator<i_and_d>(cin), istream_iterator<i_and_d>(), testprint ); }
0534524
2012/04/14(土) 10:56:59.48ですが、API上、iとdは別のイテレータにしておかないといけないんです・・・
0535524
2012/04/14(土) 11:15:24.98bool operator==(const istream_iterator&, const istream_iterator&)
ってどう定義すればいいんだろ・・・
0536デフォルトの名無しさん
2012/04/14(土) 13:05:58.99あるタイミングで i を使って、別のタイミングで d を使うって事?
使ったかどうか覚えておけばいいだけのような
0537デフォルトの名無しさん
2012/04/14(土) 13:15:17.88APIって何?WinAPI? 自作エンジン操作するAPIとか?
0538デフォルトの名無しさん
2012/04/14(土) 13:26:28.24関数名が秘密ならそのあたりは変えていいから
0539デフォルトの名無しさん
2012/04/14(土) 13:35:58.11イテレータ内部でストリームを basic_istream<charT,traits>* in_stream; で保持しておいて
return lhs.in_stream == rhs.in_stream; するのがstdでのやりかた
0540デフォルトの名無しさん
2012/04/14(土) 13:45:03.82こんな感じ?
http://ideone.com/n5AKA
0541524
2012/04/14(土) 14:43:12.69>>540
が綺麗なんで、APIを変えることにしました。
単体の列をストリームで扱えるようにしたかったんだけど、
行ごとに読み込むストリームのほうがたしかに自然だな。
可変テンプレート引数をとるようにして(my_iter<int,double,double>)
tuple<int,double,double>が値になるようにすればテーブル読み込みできるね。
read()を書くのがちと面倒くさそうだが。
0542デフォルトの名無しさん
2012/04/14(土) 18:04:19.59void f(tuple<T,U>& t) {...}
template <typename T, typename U>
void f(pair<T,U>& t) { f(tuple<T,U>(t)); }
みたいな多重定義を避けられる方法ってないですか?
ただし、なんでも受け付けちゃう
template <class PairType>
void f(PairType& t) {...}
ってのは無しで。
(コンパイルでtuple<int,int,int>をつっこんでたらエラーが出るように)
0543541
2012/04/14(土) 18:15:50.84template <typename T, typename U, template <typename...> pair_type>
void f(pair_type<T,U>& t) {...}
かなぁ・・・他にいい案があったら教えて下さい。
0544デフォルトの名無しさん
2012/04/14(土) 18:35:55.990545541
2012/04/14(土) 18:42:36.840546デフォルトの名無しさん
2012/04/14(土) 18:52:58.80template<class T, class U> class tuple
{
・・省略・・
tuple( const std::pair< T, U > value ){省略}
・・省略・・
};
もしくは、
template<class T, class U> tuple<T, U> to_tuple( const std::pair &value )
{
return tuple< T, U >( value );
}
0547デフォルトの名無しさん
2012/04/14(土) 19:11:59.04スレ違いの話題で混乱させてしまってすみませんでした。
0548デフォルトの名無しさん
2012/04/14(土) 19:27:08.970549デフォルトの名無しさん
2012/04/14(土) 19:35:16.210550デフォルトの名無しさん
2012/04/14(土) 19:50:26.850551デフォルトの名無しさん
2012/04/14(土) 20:02:17.120552デフォルトの名無しさん
2012/04/14(土) 20:05:47.400553デフォルトの名無しさん
2012/04/14(土) 21:18:41.740554デフォルトの名無しさん
2012/04/14(土) 22:30:07.35std::messagesってどうやってつかうの?
0555デフォルトの名無しさん
2012/04/14(土) 23:16:35.57T型の要素はソートされて格納されるそうだから
インスタンスをa, bとして、a.begin()〜a.end()までとb.begin()〜b.end()をそれぞれ比較して
全部一致することと同値なのだろうか
それとも、STLの仕様的にはそこまでは保証されておらず、上の方法はたまたまうまくいっているか、処理系依存で、
やはり比較前に自前でaやbに格納されている要素をソート等せねばならないのだろうか
0556デフォルトの名無しさん
2012/04/15(日) 03:03:52.360557デフォルトの名無しさん
2012/04/15(日) 10:29:58.92> 全部一致することと同値なのだろうか
同値でしょ。
要素値を比較する前に双方の要素数を比較した方が良さそうな気がする。
// 要素数チェック
if(a.size()!=b.size()) return(1);
0558デフォルトの名無しさん
2012/04/15(日) 11:38:51.160559デフォルトの名無しさん
2012/04/15(日) 14:56:31.960560555
2012/04/15(日) 15:52:01.26とりあえず要素となる型に<演算子が定義されていれば
(ていうかstd::set<T>のTの用件なのでそもそも定義されている前提)
少なくともVS2010では>556の方法で逝けるみたいです!
STLのマニュアルとして↓ここ見ながらやってたんですが、
http://www.cplusplus.com/reference/stl/
グローバル関数でset<T>& operator==(set<T>&, set<T>&)が定義されるとか
どこにも書いてなかったから気づかなかったorz
0561555
2012/04/15(日) 15:54:45.55誤: set<T>& operator==(set<T>&, set<T>&)
正: bool operator==(const set<T>&, const set<T>&)
0562デフォルトの名無しさん
2012/04/15(日) 16:06:06.28赤黒木は同一要素からなる集合に対してはbegin() 〜 end()までの順序構造も同じ。
だから単にsizeを見た後iteratorを回してoperator ==での直接比較か
operator <(or operator >)x2で同値比較すればよい。
0563555
2012/04/15(日) 16:22:00.26要素型Tのless than演算子(operator<())だけでは
一致比較できるわけないじゃんorz(多分bool operator==(const T& a, const T& b)が必要)
set<int> a, b;についてはa==bで一致判定できましたが
Tが自作クラスの場合は要検証です検証中なう
0564デフォルトの名無しさん
2012/04/15(日) 16:35:32.67赤黒木でなければならないと規格で決められているわけでもない
0565デフォルトの名無しさん
2012/04/15(日) 16:42:12.290566デフォルトの名無しさん
2012/04/15(日) 16:46:30.43a,bの間に全順序の存在しか仮定しないときに、
果たしてそのコードでa==bと同値になるのか
冷静に考え直したほうがいいんジャマイカ、
0567デフォルトの名無しさん
2012/04/15(日) 16:59:04.51結局、Tについてoperator<()が定義されていれば、
set<T> a, b; についてa==bできるっぽい
(実際Tを自作クラスとしても、Tのoperator<()を定義したらVS2010で動いた)
0568デフォルトの名無しさん
2012/04/15(日) 19:59:18.77というようなことをごちゃごちゃ書きたくなかったから>>556みたいにレスしたけど
ちゃんと解説したほうがよかったな
http://www.cplusplus.com/reference/stl/set/operators/
ここにも書いてあるぞよく読め
0569デフォルトの名無しさん
2012/04/15(日) 20:21:33.47なるほど、、いつどのアルゴリズムを使うのかきちんと決まってるのか
std::equalの定義(というか規格上の等価テンプレート)みたら、
Tについてstd::equalが使われる場合、Tについてoperator==()は必須みたいですね
>567の最後の行は撤回(実はoperator==()が定義されてた)
0570デフォルトの名無しさん
2012/04/16(月) 00:14:55.06とりあえず学んだ範囲で簡単な電卓を作ってみたけど
なんか自信がないw動くけど 無駄な事してないかとか
ツッコミを入れて欲しい
http://codepad.org/uz46AcHY
0571デフォルトの名無しさん
2012/04/16(月) 02:15:07.23・グローバル変数の使用は避ける。
・calculatorの中で初期化とされてるのは初期化でなく代入。初期化と代入は別物。
・なぜcalcuratorの中でanswerに代入(初期化)?
・// a:Aの値。
ソースを先頭から読んだ場合この時点ではAの値といわれてもなんなのか不明。
・// Yと回答されたらループ、それ以外は終了。
実際の処理との不一致。
0572デフォルトの名無しさん
2012/04/16(月) 06:28:57.57せめて関数の中でusing namespaceするか、using std::cout;の様に
取り込んどいて欲しい。std系統じゃぶつかりづらいがVectorとか
Listとかありふれた名前は簡単にぶつかる。
0573570
2012/04/16(月) 16:33:06.78それをを受けて直してみました
http://codepad.org/T1qZFJTB
using namespace std;はまだ私にとって「おまじない」でしかないので
std:: を省略できるなら使うか みたいな感じなので・・・
0574デフォルトの名無しさん
2012/04/16(月) 20:12:09.410575デフォルトの名無しさん
2012/04/16(月) 20:32:28.10そんな男気あふれるあなたにC言語
0576デフォルトの名無しさん
2012/04/16(月) 22:05:18.63ダメ! ゼッタイ!!
0577デフォルトの名無しさん
2012/04/16(月) 23:39:54.67それはそうと、デカいオブジェクトの実体をSTLのコンテナに格納して
複数個所から参照しつつ必要に応じて追加するということをしたいんだけど
コンテナにinsert()する前後で参照が有効であり続けるようなうまいやり方ってないですかね…
コンテナの要素型を自作クラスでうまく作ればできなくは無いけど標準的なやり方は?
0578デフォルトの名無しさん
2012/04/16(月) 23:46:58.490579デフォルトの名無しさん
2012/04/17(火) 00:18:51.98windows.h が自動的にインクルードされていたり、まさに地獄だぜ。
>>577
listを使うか、間接参照するか
0580デフォルトの名無しさん
2012/04/17(火) 00:24:37.62ADL展開出力オプション欲しいよな
0581デフォルトの名無しさん
2012/04/17(火) 02:41:59.29なんでもかんでもshared_ptrでくるんじまいなよ! コンテナ用件は自動的に満たされるぜ!
0582デフォルトの名無しさん
2012/04/17(火) 05:47:00.52とりあえずusing std::stringとかにかえてみた
0583デフォルトの名無しさん
2012/04/17(火) 06:57:21.79ライブラリのヘッダでコンパイルエラーが出たわ
0584デフォルトの名無しさん
2012/04/17(火) 09:46:42.23http://codepad.org/wzgxNgw9
http://codepad.org/PSECxXqW
0585デフォルトの名無しさん
2012/04/17(火) 10:06:09.92http://ideone.com/uXfYk
http://ideone.com/IiwPB
0586デフォルトの名無しさん
2012/04/17(火) 12:38:41.41namespace fs = boost::filesystem;
とかはよくやるが。
0587デフォルトの名無しさん
2012/04/17(火) 13:24:50.23すっかり忘れてた
0588デフォルトの名無しさん
2012/04/17(火) 13:32:52.26手間の問題。
0589デフォルトの名無しさん
2012/04/17(火) 21:48:04.950590デフォルトの名無しさん
2012/04/17(火) 22:09:49.450591デフォルトの名無しさん
2012/04/17(火) 22:26:19.01{
const bool aaa(const a, const b) const
const int bbb(const c) const
const Sample(const d) const
}
最近constに触れる機会があったのですが
TYPEはintとかfloatとか
【const TYPE】 aaa(const x) const
質問なのですが、【const TYPE】の部分がconstだと
実際にはどういう利点があるのでしょうか
他の部分がconstになっていると
色々とパフォーマンスに影響がありそうだと直感的に理解できるのですが
(変数には値とかコピーが入るわけですよね?)
戻り値の型にconstがあったからといって特に意味無いような気がしてしまいまして
じゃあ、頭のconstにはどんな意味があるんじゃ!? ということで疑問が湧いてしまったのですが
どなたか意味というか意義というか、教えてくださいまし
0592デフォルトの名無しさん
2012/04/17(火) 22:29:04.870593デフォルトの名無しさん
2012/04/17(火) 22:29:55.14>なんでもかんでもshared_ptrでくるんじまいなよ!
何を言いたいのかわからんが、
確かに「型Tのset」のかわりに「型Tのshared_ptrのset」にでもして
shared_ptr<T>のoperator<()とoperator==()を(適当なスコープで)定義するとしたら逝けそうですな
※ とにかくデカいオブジェクトなので同じものを複数持ちたくない。
当然insert時は重複チェックをやる。これをも極力高速、極力コンテナに任せにしたいからlistというのもちょっと、、、
>577における「コンテナの要素型を自作クラスでうまく作」るのより良さげな回答だけど
しかしshared_ptrはSTL標準ではないのではないか
0594デフォルトの名無しさん
2012/04/17(火) 22:37:54.44const病の伝染をやり過ごせる利点がある
class Sample {
int* p;
// (適当な構築子)
const int* GetPtrA() { return p; }
const int* GetPtrB() const { return p; }
};
であるとして、
const Sample foo(...); // constオブジェクトとして構成
int* p1 = foo.GetPtrA(); // コンパイル時エラー
int* p2 = foo.GetPtrB(); // おk
0595594
2012/04/17(火) 22:41:43.73わからんメリットなど無いのではないか
(でもテンプレート絡みでちょっとあるのかも?テンプレートについて人類は何一つ断言できない)
0596デフォルトの名無しさん
2012/04/17(火) 22:57:13.88Effective C++に書いてあるけど、正直やりすぎだと思う
0597デフォルトの名無しさん
2012/04/17(火) 23:04:48.95…やっぱり、頭が const TYPE の場合はあまり意味なさそうな感じですか?
恐らくコスト面でも無視できるような違いしかないってことですよね。
実際にもあまり使わないという認識でいいのかな
そういえば、 const TYPE&の存在がありましたね…。
const TYPE& はパラメーター(参照)のstd::vectorのアイテム参照とかグローバル変数の配列の参照を返す時とかに有効な気がしますが
intとかfloatみたいな値を返す時とかに積極的に使う理由ってありますか?
0598デフォルトの名無しさん
2012/04/17(火) 23:44:43.08>・ 戻り値にconstを使うと、問題のある関数の安全性や効率を改善できる
>
>例2)
>const Rational operator* (const Ratioanl& lhs, const Rationa& rhs);
>
>(a * b) = c のようなコードは不正だが、const 指定すればコンパイル時エラーとなる。
>(a * b) = c; これを展開すると、const Rational (a * b) = Rational c となりエラー。
正直こんなのどうでもいいと思うが
0599デフォルトの名無しさん
2012/04/18(水) 00:02:43.130600デフォルトの名無しさん
2012/04/18(水) 00:18:49.010601デフォルトの名無しさん
2012/04/18(水) 00:21:29.89教義を貫けない的な話?
0602デフォルトの名無しさん
2012/04/18(水) 00:29:13.38無駄に複製が発生するようになるからじゃない
0603デフォルトの名無しさん
2012/04/18(水) 00:40:30.170604デフォルトの名無しさん
2012/04/18(水) 01:01:44.61>・ 戻り値にconstを使うと、問題のある関数の安全性や効率を改善できる
>・ 戻り値にconstを使うと、問題のある関数
>問題のある関数
メイヤーズ氏もついに演算子の多重定義をdisる境地に達したのか
0605デフォルトの名無しさん
2012/04/18(水) 01:23:01.73「sound_effect.h」に次のように書きました。簡略化しています。
#ifndef SOUND_EFFECT_H
#define SOUND_EFFECT_H
extern const int SOUND_EFFECT_MAX;
class CSoundEffect{
public:
CSoundEffect();
~CSoundEffect();
void RaiseFlag(int Num);
void LoadSet(int SoundSet_Num);
void Play();
private:
int File[SOUND_EFFECT_MAX];
int Flag[SOUND_EFFECT_MAX];
};
そして、「sound_effect.cpp」には次のように書きました。各関数の定義ははぶきます。
#include "sound_effect.h"
const int SOUND_EFFECT_MAX = 45;
CSoundEffect SE_Object;
すると、SOUND_EFFECT_MAXが代入済みの整数定数とみなされていないのか、
「構造体または共用体中にサイズが 0 の配列があります」ということになってしまいます。
なお、extern const intではなく#defineを用いるようにすれば、エラーは出なくなります。
ですが、整数定数の定義には#defineではなくconstを使うようにしろと言われてきたので……
0606デフォルトの名無しさん
2012/04/18(水) 01:25:49.79「sound_effect.h」の末尾に#endifがあるものとしてお答えください。
0607デフォルトの名無しさん
2012/04/18(水) 01:28:02.720608デフォルトの名無しさん
2012/04/18(水) 01:41:50.09externだとリンクの時に初めて値が入るとかでコンパイル時にそういう風に使っちゃいけないんだろう
0609デフォルトの名無しさん
2012/04/18(水) 01:57:38.08sound_effect.h
extern const int SOUND_EFFECT_MAX= 45;
sound_effect.cpp
const int SOUND_EFFECT_MAX;
だな
0610デフォルトの名無しさん
2012/04/18(水) 02:20:37.690611デフォルトの名無しさん
2012/04/18(水) 04:44:22.33そのルールって、C++は定数式で配列が初期化できるからあるってことかな?
0612デフォルトの名無しさん
2012/04/18(水) 05:03:50.990613デフォルトの名無しさん
2012/04/18(水) 07:34:46.83内部リンケージ(const が付く場合はデフォルト)であっても、
実体定義より前には配列の要素数などには使えない
宣言だけでは無理で、コンパイラは 0 であると仮定してエラー復帰してコンパイルを続けるので
連鎖的に配列が 0 要素だとか変なエラーが出る
class CSoundEffect{
public:
static const int Max = 45;
private:
int File[Max];
int Flag[Max];
};
これでFA
VC6のような化石コンパイラを使わない限りは大丈夫
VC6使うなら enum { MAX = 45 }; で
0614デフォルトの名無しさん
2012/04/18(水) 17:50:12.27おかげさまで解決いたしました。
0615デフォルトの名無しさん
2012/04/18(水) 18:50:22.14template aliasで下のコードがエラーになる(clangで)のは何故ですか?
barはfooの別名だと思うのですが。
--
template<typename T> struct foo{ /*empty */ };
template<typename T> using bar = foo<T>;
template<template<typename> class T> struct zot { /* empty */ };
void qux( zot<foo> ){ /*empty */ }
void quux( ){
qux( zot<bar>( )); // ココ
}
0616デフォルトの名無しさん
2012/04/18(水) 19:52:51.68俺も好き。Java使わさせられるとき
同等の機能が無いから不便で仕方ない。
0617デフォルトの名無しさん
2012/04/18(水) 19:54:39.53未対応だからじゃね
0618デフォルトの名無しさん
2012/04/18(水) 20:32:59.120619デフォルトの名無しさん
2012/04/18(水) 21:33:36.47alias使わずqux(zot<foo>());だけならideoneでも通るし
0620デフォルトの名無しさん
2012/04/18(水) 23:47:55.07template<typename T> using bar = foo<T>;
でbarを本当にfoo<T>の別名として使ってインスタンス化の片棒を担がせるには
Tの型を明示的に与えるか、型推論できるような書き方であらねばコンパイラ困っちゃう
、希ガス
0621デフォルトの名無しさん
2012/04/19(木) 00:15:19.40template<typename T> struct foo{ /*empty */ };
のTはfooの自由変数だが、
template<template<typename U> class T> struct zot { /* empty */ };
において、 U,Tは束縛変数の1, 2であって、テンプレートzotの自由変数は
実は( template<typename U> class T )という全体である
で、void qux( zot<foo> ){ /*empty */ } と書いたなら、この実体化では
zotの自由変数( typename<typename U> class T)のTがfooでUがfooの自由変数T、と解釈できる
(で、Uはzotの定義で使われないからUの定義が無くとも実体化できる。)
一方、qux( zot<bar>() )と書いたなら、barをfoo<T>の別名と解釈するときにTの定義が要るから、
上の話で言うUの定義が必要、という違いがある
、、多分、、
0622デフォルトの名無しさん
2012/04/19(木) 00:28:33.86template<template<typename U> class T> struct zot { U x; };
に変更したときに4行目の
void qux( zot<foo> ) { /*empty*/ }
がエラーになるか確かめればある意味一応検証になる
エラーにならなければ>621説は反証される
0623デフォルトの名無しさん
2012/04/19(木) 00:52:23.75return 3;
0624デフォルトの名無しさん
2012/04/19(木) 01:32:56.73template<class X, class Y> class hoge {};
template<class X> using fuga = hoge<X, X>;
みたいなときはhogeは引数2つのテンプレートでfugaは引数1つのテンプレートとしてふるまうから別物扱いするのが自然だし
0625デフォルトの名無しさん
2012/04/19(木) 18:36:57.09ある特定のウインドウの位置の変更や、サイズの変更があった場合に
通知を受け取るにはどうすればよいでしょうか?
いまは、ループでずっとGetWindowRect()を呼んでいます。
0626デフォルトの名無しさん
2012/04/19(木) 18:41:08.730627625
2012/04/19(木) 18:51:46.80監視対象が、自分の作ったウインドウ(アプリ)じゃないんですよね。
DLL作ってフックしないといけないんでしょうかね・・・。
0628デフォルトの名無しさん
2012/04/19(木) 19:23:52.04vista以降は上位権限のプロセスのメッセージは取れないらしいけど
あと使ったことないけどCreateRemoteThreadっていうので何か出来るかもしれない
0629625
2012/04/19(木) 22:53:19.86WM_SIZE,WM_MOVE,WM_MOVINGをフックできるようになりました。
それで、更新された新しいRECTをEXE側に渡したいのですが、
DLLからEXE側の関数を呼ぶにはどのようにすればよいでしょうか?
0630デフォルトの名無しさん
2012/04/19(木) 23:59:45.57exeの方のウィンドウハンドルとってきてメッセージでもいいけど
0631デフォルトの名無しさん
2012/04/20(金) 00:23:32.12違うプロセスのウィンドウハンドルを指定してゴニョゴニョは問題ないっけ?
0632デフォルトの名無しさん
2012/04/20(金) 01:16:30.450633デフォルトの名無しさん
2012/04/20(金) 01:22:36.10exeが多重起動してたらどれからとってくるかは知らね、目的は果たせたからあんま調べてない。
0634631
2012/04/20(金) 01:25:31.84でもWin32スレに書いてもまともな返答返ってこなさそうだし困ったもんだね。
0635631じゃなくて633でした
2012/04/20(金) 01:26:30.150636デフォルトの名無しさん
2012/04/20(金) 02:11:53.23仮想化でやってるのは内部的な整合性を保つ為だろうけど
どうせなら今までの粗雑なAPIはレガシー化させて
整合性のあるAPIとして生まれ変わったほうがいい
現状の#defineだらけのヘッダーやら互換性の為に残されたAPIやらは
一度分離してくれたほうがみんな幸せになれる
0637デフォルトの名無しさん
2012/04/20(金) 02:12:40.39Win64は随分まともになってるじゃないか
0638デフォルトの名無しさん
2012/04/20(金) 02:34:17.39DWORD→DWORD_PTRのことかね
0639デフォルトの名無しさん
2012/04/20(金) 02:35:23.12winapiは、なくなるのじゃないの?
0640デフォルトの名無しさん
2012/04/20(金) 02:42:01.500641デフォルトの名無しさん
2012/04/20(金) 03:04:20.320642デフォルトの名無しさん
2012/04/20(金) 03:53:34.34BOOLもbool型にしとくべきだろうね
0643デフォルトの名無しさん
2012/04/20(金) 07:01:04.44WinAPI使わなきゃいいじゃん
使わない自由はある
MSだって昔は.Net Frameworkで切り捨てるつもりだったんだし
0644デフォルトの名無しさん
2012/04/20(金) 08:40:17.720645デフォルトの名無しさん
2012/04/20(金) 10:42:47.330646デフォルトの名無しさん
2012/04/20(金) 11:38:25.040647デフォルトの名無しさん
2012/04/20(金) 12:15:25.67Win32APIとかのレガシーなのをやっととっかえる気になったと聞いたが
0648デフォルトの名無しさん
2012/04/20(金) 16:01:31.740649デフォルトの名無しさん
2012/04/20(金) 16:21:37.49ふたを開ければ機能限定版のWin32APIラッパだった
Windowsにフタをしてやりたくなった
0650デフォルトの名無しさん
2012/04/20(金) 16:59:12.08クラス内にメンバ変数しかなかったら
newする度に変数の分だけメモリを消費するだろうと推測できるのですが
例えば、メンバ変数は2〜3個でも、メンバ関数が100個くらいある場合には
newする度にメモリの消費量が半端ない感じになってしまったりしますか?
クラスのメモリを確保した時の挙動がちょっと気になってしまいまして
詳しい方いらっしゃったら教えてくださいまし
0651デフォルトの名無しさん
2012/04/20(金) 17:12:53.29こうかな??
ttp://ideone.com/8d2zK
クラスのメンバ関数は普通の関数にthisを食わせる暗黙のパラメータがあるもんだと思ってもらえればイイと思うお。
だから、関数のインスタンスは、一個でいいし、最適化すればクラスに内包してる必要はないと思う。
ちなみに、テンプレート関数にするとちょっと事情が変わってくる。
0652デフォルトの名無しさん
2012/04/20(金) 21:02:11.61{
friend class T;
};
こんな具合にテンプレート引数をフレンドクラスにしたいのですが方法教えて下さい。
0653デフォルトの名無しさん
2012/04/20(金) 21:39:22.82class A {
istream& is;
A(): is(???) {}
A(istream& is): is(is) {}
};
0654デフォルトの名無しさん
2012/04/20(金) 21:41:08.840655デフォルトの名無しさん
2012/04/20(金) 21:41:11.700656デフォルトの名無しさん
2012/04/20(金) 21:42:03.98参照だと色々不便な気がするけど大丈夫なの?
んで、デフォルトコンストラクタをProtectedにするとか・・・。
0657デフォルトの名無しさん
2012/04/20(金) 21:46:06.02ストリームの終端をA()で表現して、
iter!=A()
的な判定をするんだが、654の根拠は何?
iostreamってあぶなっかしい?
0658デフォルトの名無しさん
2012/04/20(金) 21:50:04.32いや、参照は初期化時以外に実態を束縛できないのでNULL参照になりやすいからアブネーという話だと思うよ。
0659デフォルトの名無しさん
2012/04/20(金) 21:53:19.880660デフォルトの名無しさん
2012/04/20(金) 21:54:35.39って規格的にはアリでしょうか?
struct sample_class
{
int value;
sample_class(int i): value(i) {}
sample_class() {
*this = sample_class(10);
}
};
0661デフォルトの名無しさん
2012/04/20(金) 21:57:04.040662デフォルトの名無しさん
2012/04/20(金) 21:59:04.72ふむふむ、あんまそういうのに遭遇したことがないからよくわからんが、
シングルスレッドでワンショットで終わっちゃう(走り続けない)ようなソフトでもヤバイのかね?
>>659
そういう人もったことないけど、やってみるわ。アイディアありがとう。
0663デフォルトの名無しさん
2012/04/20(金) 22:02:31.54実態が生きてるうちは大丈夫かな。デストラクタ走ったら死亡コース。
0664デフォルトの名無しさん
2012/04/20(金) 22:07:11.12なるほど。自分が書くような小さいプログラムだと、
mainの最後だけでデストラクタ呼ばれるパターンが多いから、
いつも気にしてないんだよね。
でもこれからは気をつけてみるわ。ありがとう。
0665デフォルトの名無しさん
2012/04/20(金) 22:21:45.5411ならこれで通る。(gccだと4.7以降)
template<typename T> class boo
{
friend T;
};
98だと直接は無理でメンバ関数をfriendにするしかないかな
http://codepad.org/Ako1qKqh
0666デフォルトの名無しさん
2012/04/20(金) 22:37:27.70メッセージが邪悪すぎるから、誰か助けてくれ〜
#include <iostream>
#include <utility>
#include <iterator>
using namespace std;
istream& operator>>(istream& is, pair<int,int>& p) {
is >> p.first >> p.second;
return is;
}
int main()
{
istream_iterator<pair<int,int> > is(cin);
}
0667デフォルトの名無しさん
2012/04/20(金) 23:16:13.35boost::functionをDLL側に渡して、DLLから呼び出したんですが
デスクトップ、スタートボタン、タスクバーが消えましたww
どうしたらよいでしょうか?
(コンソールアプリや他ライブラリでDLLを使いまわしたいので、
ウインドウメッセージでは受け取りたくないんです)
いまこんな感じです↓
>// EXE側
>boost::function<bool(STRUCT&)> func = &CallbackFunction;
>StartHook(func);
>//DLL側
>boost::function<bool(STRUCT&)> callbackFunc;
>EXPORT BOOL StartHook(boost::function<bool(STRUCT&)> &func)
>{
> callbackFunc=func;
> :
> callbackFunc(struct);
>}
0668デフォルトの名無しさん
2012/04/20(金) 23:23:33.48そんなことできるわけねーだろアホか
0669デフォルトの名無しさん
2012/04/20(金) 23:42:36.38あんまりいいサンプルじゃないけどこういうのも有るよ的な。
ttp://ideone.com/qaals
正直、std::cinは使ったこと無いからメチャクチャ大変だった。そして、勉強になった。
0670デフォルトの名無しさん
2012/04/20(金) 23:47:36.28う〜ん、求めているものではないなぁ。
とりあえず、コンパイルエラーの意味がわからんかったんだが、
それに関して何かコメントない?
0671デフォルトの名無しさん
2012/04/20(金) 23:51:02.72テンプレートを使った実装を使うときにエラー起こすと意味不明な文字の羅列が出て上級者でもイラッと来るらしい。
で、コンセプトっていう機能が入る予定だったけど、ウヤムヤになって空中分解した。
コンセプトがあればエラーメッセージはもっとシンプルになる予定だったそうな。
0672デフォルトの名無しさん
2012/04/20(金) 23:58:11.19コンセプトマップをユーザーが定義すべきか自動で定義されるべきかが決まらなかったのでC++11に入らなかっただけ
0673650
2012/04/20(金) 23:59:43.85virtutal属性とかテンプレート関数の有無が鍵になる感じなのですね!
便利なクラスにする為に大量にメンバ関数を作る分には問題ない事が分かったので
安心してクラスを作り込みたいと思います。
ちょっと返信遅れちゃいましてごめんなさい。
どうもありがとうございました!
0674デフォルトの名無しさん
2012/04/21(土) 00:00:12.190675デフォルトの名無しさん
2012/04/21(土) 00:01:13.040676デフォルトの名無しさん
2012/04/21(土) 00:03:44.630677デフォルトの名無しさん
2012/04/21(土) 00:03:57.15メタプログラミングとかでエラー出ても、メッセージの雰囲気でけっこうわかるんだが、
stringとiostream関連はいまだに読めないw
0678デフォルトの名無しさん
2012/04/21(土) 00:09:21.77は神待ちです。
0679デフォルトの名無しさん
2012/04/21(土) 00:12:42.020680677
2012/04/21(土) 01:11:26.04EXEからDLLにコールバック関数を登録して、DLL側から構造体を受け取るにはどうすればよいでしょうか?
EXE(またはコンパイラ)が変わってもDLLを修正せずにできる方法でお願いします。
0681デフォルトの名無しさん
2012/04/21(土) 01:38:32.640682デフォルトの名無しさん
2012/04/21(土) 01:48:01.02dllがFindWindowでexeが作ったウィンドウを見つけて
そのウィンドウハンドルにWM_COPYDATAで構造体を送り付けたらいい
0683677
2012/04/21(土) 01:54:10.77メッセージは使いたくないんです><
関数ポインタはDLLとEXEでアドレス空間が違うんですかね><
>// EXE側
>
>bool CALLBACK func(STRUCT struct){
> return true;
>}
>
>int main(){
> StartHook((LPVOID)&func);
> :
>// DLL側
>EXPORT BOOL StartHook(LPVOID func) {
> STRUCT data;
> data.dat = 0;
>
> bool (*callback)(STRUCT);
> callback = (bool (*) (STRUCT))func;
> callback(data); // ←この次の行の関数呼び出しでランタイムエラー
>
0684デフォルトの名無しさん
2012/04/21(土) 01:57:11.920685677
2012/04/21(土) 03:43:58.56それは無駄に重くなるのでやりたくないんですよね。。。
名前付きパイプ調べてみましたが、イベントってのが使えそうな気も・・・。
それと、DLLからEXEの関数呼び出しはなんとなくできました。
EXE側の関数をdllexportして、DLL側からEXE側にGetProcAddress()して関数アドレスを取得して
呼び出せました。これなら新しいEXEを作るときもDLLを変えずに済むかなと思ったのですが、
フックプロシージャからEXE側の関数を呼び出すと、なんかダイアログ出てきてシステムに無理やりDLLをとめられました・・・。
自分のミスなのか、フックプロシージャ内はなにか特別なのか??
0686デフォルトの名無しさん
2012/04/21(土) 03:48:34.25フックされたプロセスとフックを仕掛けたプロセスは違うんだから
呼び出せるわけがない
0687デフォルトの名無しさん
2012/04/21(土) 03:59:22.710688デフォルトの名無しさん
2012/04/21(土) 04:01:23.44http://toro.2ch.net/test/read.cgi/tech/1333095907/
こっちに移るべきだな
0689677
2012/04/21(土) 04:04:56.72そうなんですか・・・。
EXEと静的リンクしたDLLは同じプロセス空間、
DLLのフックプロシージャの中は別のプロセス空間ということでしょうか?
0690デフォルトの名無しさん
2012/04/21(土) 07:05:04.65コンストラクターの引数は参照で、
内部ではポインターで保持したら?
0691デフォルトの名無しさん
2012/04/21(土) 09:49:36.25newとdelete演算子ですか?
0692デフォルトの名無しさん
2012/04/21(土) 09:51:40.350693デフォルトの名無しさん
2012/04/21(土) 09:53:15.77横から便乗で質問だけど、コンストラクタ・デストラクタ呼び出したい時はnew deleteなのはわかったけど
その必要がない場合でもnew deleteすべき?
0694デフォルトの名無しさん
2012/04/21(土) 09:53:56.00混ぜるな危険!
0695デフォルトの名無しさん
2012/04/21(土) 10:17:08.330696デフォルトの名無しさん
2012/04/21(土) 10:22:17.05右辺値参照で改善に期待。
0697デフォルトの名無しさん
2012/04/21(土) 10:24:19.29placement newでおk
0698デフォルトの名無しさん
2012/04/21(土) 10:53:22.07他にはコンストラクタも動かすけど、それはplacement newでも同じ
0699デフォルトの名無しさん
2012/04/21(土) 11:41:10.25placement newを教えるからにはstd::aligned_storageもだな…。
0700デフォルトの名無しさん
2012/04/21(土) 11:42:27.960701デフォルトの名無しさん
2012/04/21(土) 13:38:50.23istream_iteratorの中からは自分でグローバルに定義したoperator >>が見えない(stdのoperator >>に隠蔽される)からエラーになる。
・解決法の一つ。stdじゃない場所に自分で定義したクラスを介する。
class mypair
{
pair<int, int> p;
public:
mypair() : p() {}
mypair(pair<int, int> const & p1) : p(p1) {}
operator pair<int, int>() const { return p; }
istream & readvalue(istream & is) { return is >> p.first >> p.second; }
};
istream & operator >>(istream & is, mypair & pr)
{
return pr.readvalue(is);
}
int main()
{
istream_iterator< mypair > is(cin);
pair<int, int> p = *is;
}
0702デフォルトの名無しさん
2012/04/21(土) 18:01:10.22malloc()は使用する必要性がほぼ0になるが
個人的にはrealloc()はしばしばまれに使うべ
std::vector()が使えるならそれに越したことは無いが
0703デフォルトの名無しさん
2012/04/21(土) 18:15:42.26> しばしばまれ
どっちなんだよ…
0704デフォルトの名無しさん
2012/04/21(土) 18:19:38.93まあ、環境依存でいいなら多少危険でも使えるケースはもうちょい多いと思うが
0705デフォルトの名無しさん
2012/04/21(土) 20:25:59.49諦めてたのですが、有り難い限りです!
0706デフォルトの名無しさん
2012/04/21(土) 23:52:24.21realloc()はヒープ管理のリンクリストに直に触るから、サイズsの既存分を動かさずに済むことがある
std::vector<T>が中で何やってるかは知らんが、案外realloc()を呼んでいるのではないか
0707デフォルトの名無しさん
2012/04/21(土) 23:55:39.79reserveで出来なかったっけ?
0708デフォルトの名無しさん
2012/04/22(日) 00:01:56.82reallocとかと混ぜる根性がよくあるな、おまえら。
0709デフォルトの名無しさん
2012/04/22(日) 00:02:23.30実装によるけど一般的には、vector<T>は要求よりも多めに確保して現在の利用状況をリポートする。
領域確保時は、何だったかな、現在の1.5倍だったかの領域をnewしてコピーするんだったかな。
まー、実装依存だわね。
0710デフォルトの名無しさん
2012/04/22(日) 00:09:22.80reallocなんで呼ぶわけないだろw
事前確保の容量超えたら新しくnewしてコピー/ムーブだよ
>>709
GCCとMSVCがそれぞれ1.5倍と2倍(どっちがどっちか忘れた)だったはず
0711デフォルトの名無しさん
2012/04/22(日) 01:08:33.21vectorもどきを作るのに使えるのにね・・・
伸ばせるなら伸ばす、伸ばせなければ失敗、
あるいは、新たな領域を確保して、それを返すだけ、という
0712デフォルトの名無しさん
2012/04/22(日) 01:14:34.54誰がコンストラクタ走らせるの?
そういう用途はプレイスメントnewという機構があるよ。
0713デフォルトの名無しさん
2012/04/22(日) 01:15:34.87vectorがどういう風に実装されてるか知ってる?
0714デフォルトの名無しさん
2012/04/22(日) 01:19:53.01オブジェクト指向と言うかC++の思想に反するよな。
0715デフォルトの名無しさん
2012/04/22(日) 01:23:08.37何を言ってるのか意味が分からない
0716デフォルトの名無しさん
2012/04/22(日) 01:23:30.27詳しくは知らない。
でも、アロケータにメモリ確保を任せて帰ってきたメモリをプレイスメントnewしてるのかねぇ。
オブジェクトをプッシュバックしたら、コピコンかムーブで移譲だよね。
その段階で破棄されるオブジェクトのデストラクタ走るし。
俺はユーザープログラマだからそんな詳しく知らなくても使える。と、言い訳。
0717716
2012/04/22(日) 01:25:35.850718デフォルトの名無しさん
2012/04/22(日) 01:29:43.11領域が移動する場合に、reallocが勝手に内容をmemcpyするから
ちゃんとしたコピーなりムーブなりが行われない
逆に言えば、この領域移動さえなければ使えると言う事
0719716
2012/04/22(日) 01:32:35.49アロケータのことはよく知らんのよ。実装する機会もないし。
0720デフォルトの名無しさん
2012/04/22(日) 01:36:35.68アロケータの知識は正直あまり関係ない
0721デフォルトの名無しさん
2012/04/22(日) 01:37:04.380723デフォルトの名無しさん
2012/04/22(日) 02:03:06.82PODだろうとmalloc、realloc、freeは使うなよ
おいおいnewで確保したか、mallocで確保したか
管理しきれなくなってバグの原因になりかねんから
PODとCの関数で思い出したが、POD型にmemsetでゼロ
初期化するヤツなんなんだろうな。
Type value = {0}; こういう形で十分だろうに。
0724デフォルトの名無しさん
2012/04/22(日) 02:04:10.52こうだろ
0725デフォルトの名無しさん
2012/04/22(日) 02:11:14.53それって、要素型Tにコピーコンストラクタが定義されていれば
どうとでもなるんじゃねwwwwwwwwwww
代入と異なりコンストラクタは構築先が何であるかを問わないから
(そうでない作りにすると普通の構築時に必ずバグって発覚する、)
生のメモリ領域を与えてから構築することができる
、、ハス
0726デフォルトの名無しさん
2012/04/22(日) 02:21:38.13それ警告出すコンパイラあるから俺は使わない
0727デフォルトの名無しさん
2012/04/22(日) 02:23:10.78reallocが内部でmemcpyするって言ってんじゃん
コピーコンストラクタもoperator==もガン無視でbitwiseコピーされる
0728デフォルトの名無しさん
2012/04/22(日) 02:24:33.50Cの仕様で定義されてるんじゃなかったっけ?
俺はそういうふうに習ったけど。
某らんどとかは、変数の初期化処理に警告だしたりするからな。あれは不味いだろうと思う。
0729デフォルトの名無しさん
2012/04/22(日) 03:00:04.36でも、初期化忘れか、意図的な0クリアかを
コンパイラが機械的に判断するのは難しかろう
0730デフォルトの名無しさん
2012/04/22(日) 03:01:59.22じゃあどうやって初期化してるの?
0731デフォルトの名無しさん
2012/04/22(日) 03:19:43.82だからプレースメントnewでrealloc()した後にコピーコンストラクタで構築すればいいでしょキイッ
http://www.geocities.jp/ky_webid/cpp/language/036.html
というわけで、realloc()とプレースメントnewの組み合わせで
領域が増えたときのコピーの回数をしばしばたまに減らせることがある
C++ばパフォーマンス命の言語
0732デフォルトの名無しさん
2012/04/22(日) 03:33:04.27使わないかもしれないオブジェクトについてデフォルトコンストラクタを呼んでしまう欠陥がある
コンストラクタというのは初期化しか仕事しないから高速を要する処理中に極力呼びたくないわけよ
この意味でも常にぎりぎりの領域サイズでrealloc()しつつプレースメントnewというのは
高速処理中にちまちまstd::vec<T>のインスタンスを生成するのに比べたらかなり手堅い
(本当に手堅いのは高速を要する処理開始前に必要なサイズを全部確保しておくことだが)
0733デフォルトの名無しさん
2012/04/22(日) 03:49:59.13なぜなら、命令型言語を選択したPGはその時点でチューリングマシン教の教徒であり、
チューリングマシンは状態の書き換えによって計算を進めるモデルだからだ
そのためのType a = { }だったり(new Typeではく) new Type() 構文だろうノシ
0734デフォルトの名無しさん
2012/04/22(日) 04:03:38.84とか意味が分からないけどとりあえず
>使わないかもしれないオブジェクトについてデフォルトコンストラクタを呼んでしまう
std::vectorもそんな挙動はしないよ?
0735デフォルトの名無しさん
2012/04/22(日) 04:39:50.99>std::vectorもそんな挙動はしないよ?
ちょっwwwwごめwwwwwwwwっうぇwwwwVS2010のstd::vector<T>で今調べたらそうだったわwwwwwww
(確保した要素数しかデフォルトコンストラクタが呼ばれた)
>意味が分からない
サソプル イズ ベスト:
struct TypeB {
int x;
TypeB() : x(-1) { }
TypeB(const TypeB& other) { x = other.x + 100; } }; // コピーされたら100足される
void test2() { const int n = 100;
TypeB* sizableArray = (TypeB*)realloc(0, sizeof(TypeB) * n);
for (int i = 0; i < n; ++i) {
TypeB a;
a.x = i;
new(sizableArray + i) TypeB(a); // It's new!
}
for (int i = 0; i < n; ++i) cout << "sizableArray[" << i << "]=" << sizableArray[i].x << endl;
}
実行結果は、sizeableArray[0] = 100\c\rsizableArray[1]= 101\c\r...
0736デフォルトの名無しさん
2012/04/22(日) 08:46:29.23終わったら呼んで。
0737デフォルトの名無しさん
2012/04/22(日) 13:56:10.85bitwiseコピーした後にどうコピコンすんだよ
既にアドレス変わってる上に、初期化元は自分自身だろ
0738デフォルトの名無しさん
2012/04/22(日) 14:11:44.62>new(sizableArray + i) TypeB(a); // It's new!
0739デフォルトの名無しさん
2012/04/22(日) 14:25:17.62a って何だ?
0740デフォルトの名無しさん
2012/04/22(日) 14:27:32.56アドレスsizableArray + i以外の場所にあるTypeB型のオブジェクト
0741デフォルトの名無しさん
2012/04/22(日) 14:29:39.39なんで別のものでコピコンすんの?
0742デフォルトの名無しさん
2012/04/22(日) 14:34:26.68コピコンで元データが論理的に保存されないとする根拠は?
>735のサンプルにおけるTypeBのコピコンにおいて、仮に100を足すのをやめたら
>738で(スタック上の)aと論理的に同じオブジェクトがアドレスsizableArray + iにできるわけだけど?
0743デフォルトの名無しさん
2012/04/22(日) 14:35:49.79そもそも、realloc したら元データが元の場所から無くなるんだよ
0744デフォルトの名無しさん
2012/04/22(日) 14:41:54.04vectorの伸張の話してんだぞ?
0745デフォルトの名無しさん
2012/04/22(日) 14:46:30.01ああスマン、それはそうね
p1がTypeBのコピー元配列srcArrayを指しているとして、
TypeB* p2 = realloc(p1, sizeof(TypeB) * n)
の実行後、p2 != p1でありなおかつsrcArrayの要素がsrcArray内の他要素のアドレスに依存するならそうね
しかし>702以降の流れはstd::vector<T>との比較という文脈なのを思い出してホスイ、
Tにそのような型が許されるだろうか?
0746デフォルトの名無しさん
2012/04/22(日) 14:56:54.970747デフォルトの名無しさん
2012/04/22(日) 18:51:11.01意味が解らん。reallocで1度コピーreplacement newでもう一度初期化。
処理が遅くなるだけだろ何のメリットが有るんだ?
0748デフォルトの名無しさん
2012/04/22(日) 18:53:19.14命令型ってbashとかzshだろ
メモリ確保は自動で行われるから
確保も開放も意識する必要は無い
0749デフォルトの名無しさん
2012/04/22(日) 18:54:29.330750デフォルトの名無しさん
2012/04/22(日) 19:00:12.55その内容ならmallocでいいだろ
0751デフォルトの名無しさん
2012/04/22(日) 19:04:47.26memset か std::fill に決まってるジャン(std::fill_n は警告出る事あるのでやはり使わない)
= { 0 } は可読性に劣るとも思うしね
初期化忘れか意図的な 0 クリアかが
コメント残さないと確実に伝えられないから
最初の 0 がある意味マジックナンバーじみているのも気持ち悪い
0752デフォルトの名無しさん
2012/04/22(日) 19:30:08.71あと組み込み向けのしょぼいコンパイラーだとこっちの方が早いことがある
逆にmemsetの方が早いってのは聞いたことないけどね
0753デフォルトの名無しさん
2012/04/22(日) 19:43:36.33それ初期化じゃないじゃん。
それに
={};
で初期化し忘れと読み取るアホはおらんよ。
0754デフォルトの名無しさん
2012/04/22(日) 20:04:39.000755デフォルトの名無しさん
2012/04/22(日) 20:09:06.330756デフォルトの名無しさん
2012/04/22(日) 20:13:57.520757デフォルトの名無しさん
2012/04/22(日) 20:24:10.37>reallocで1度コピー
領域拡大時であってもrealloc()だとコピーが起きないことがある
縮小時はもちろんほぼ常に起きないことが期待できる
>replacement newでもう一度初期化。
誰も2回も初期化しないわけだが
つかデフォルトのnewは使えば必ずメモリ確保してから初期化するのに対し、
プレースメントnewはそれ自体はメモリ確保しないから、
メモリがすでに確保されている場合はより早いの
ワカル?
0758デフォルトの名無しさん
2012/04/22(日) 20:38:05.66理解出来てないなら黙ってろ
0759デフォルトの名無しさん
2012/04/22(日) 20:38:21.85ソウジャナイ
破壊的代入が本質的(それ無しには何事も進まない)のが命令型言語、
非破壊的代入で全て済ますのが関数型言語
前者はチューリングマシン、後者はλ式をそれぞれ数学的基礎とする
一方で書けるアルゴリズムは他方でも書けるという意味で両者の計算能力は等価
ただし得手不得手はもちろん違う
0760デフォルトの名無しさん
2012/04/22(日) 20:41:11.32どこらへんがおかしいのかkwsk
つかrealloc()が勝手にコピーするとオブジェクト必ず壊れるとか思ってる?
std::vector<T>の要素型として使える型Tについてはそれは心配せんでええ
0761デフォルトの名無しさん
2012/04/22(日) 20:50:37.51>縮小時はもちろんほぼ常に起きないことが期待できる
どういう理屈なんだ?
0762デフォルトの名無しさん
2012/04/22(日) 20:51:25.25お前が言ってるのは手続き型だろ
0763デフォルトの名無しさん
2012/04/22(日) 20:54:06.90関数型は、演算式と制御文を全て関数で記述する事を目的とした言語
破壊的代入が無いというだけだと宣言型とダブるので、
破壊的代入が無い = 関数型というのはおかしい
0764デフォルトの名無しさん
2012/04/22(日) 21:03:04.70K&Rの終わりぐらいに書いてあるmalloc()の実装例でも読めばおk
サイズs1、s2の領域がこの順で隣接しており、s2が開放されたなら
サイズs1をサイズs1+s2までコピー無しで拡大することができる
(※簡単のため管理用のヘッダサイズは無視)
>>762
関数型言語であってもリストで手続き(順序的な処理)を表わせるから
手続き型/非手続き型の区分は命令型/関数型の切り口とは異なる別概念
Prologみたいに処理の順序が平に書かれない言語を非手続き型といい、
手続き型というのはそれの対義語
0765デフォルトの名無しさん
2012/04/22(日) 21:12:41.32宣言型というのは、ようわからんが非手続き型っていうのとほぼ同義ジャネ?
破壊的代入無しでチューリングマシンの計算能力と等価な言語、
といえば多分λ式ベースの言語(つまり関数型言語)しかないんじゃないかなあ、、
なお、関数型は、(関数で)新しい関数を作り出すことしかしない故に関数型
0766デフォルトの名無しさん
2012/04/22(日) 21:12:47.96mallocじゃなくreallocの内部の話なんだけど
実際コピーしない処理系が存在するのか?
gccのreallocはソース公開されてるがコピーしてる
実際どの処理系がしてるんだ?
普通に考えてもmalloc内部の実装に依存するreallocなんてクソだろ
0767デフォルトの名無しさん
2012/04/22(日) 21:15:18.80>関数型言語であってもリストで手続き(順序的な処理)を表わせるから
>手続き型/非手続き型の区分は命令型/関数型の切り口とは異なる別概念
>Prologみたいに処理の順序が平に書かれない言語を非手続き型といい、
>手続き型というのはそれの対義語
お前だけの常識で語られてもなぁ
0768デフォルトの名無しさん
2012/04/22(日) 21:32:45.54realloc()をmalloc()と別階層とすべきですかそうですか、、
コピーを生じない処理系の具体例については、
少なくとも下記コードをVS2010で走らせるとp1 == p2なんだけど?
void* p1 = malloc(1000);
void* p3 = malloc(1000);
free(p3);
void* p2 = realloc(p1, 2000);
cout << "p1=" << p1 << ", p2=" << p2 << endl;
glibcのソースをよく読みなおすことをお勧めする
>>767
漏れだけの常識がどうかはようわからんが、そうなの?
>764で妥当だと思うがなあ〜
0769デフォルトの名無しさん
2012/04/22(日) 21:35:05.310770デフォルトの名無しさん
2012/04/22(日) 21:36:14.02おいおい、オブジェクト領域でreallocなんか使ったら壊れるだろうがw
ポインタ関係が全部おかしくなるわ。
0771デフォルトの名無しさん
2012/04/22(日) 21:38:31.10サイズ変更が「可能な場合」はコピーされない。不可能な場合はコピーされる。
コピーされる場合はありえるんだが、たまたま特定環境化で動作するから使っていいとかアホの極み。ドシロウト。
仕事でそれ使ってたらリアルで背任でクビになるようにもっていく。
0772デフォルトの名無しさん
2012/04/22(日) 21:39:33.64そのコードじゃそりゃそうだろ。
つかそのコードはreallocの問題じゃねぇ。言い方悪かも試練が偶然だ。
解放された領域をもう一度使用してるのは意図して書けばできる事だが、
reallocが同じ領域であることを知っててコピー処理を省略してるかどうかは別問題。
0773デフォルトの名無しさん
2012/04/22(日) 21:40:57.09>ポインタ関係が全部おかしくなるわ。
ポインタを含まないか、ポインタを含んでも指す先が移動対象でないなら
そういうオブジェクトは勝手にコピーされても無問題でしょ?
で、std::vector<T>の要素型として使えるような型Tのオブジェクトなら、それは成立している、というしくみ
0774デフォルトの名無しさん
2012/04/22(日) 21:45:00.34まあ冷静に
コピーされる場合がありえるし、コピーされる/されないを
realloc()の呼び出し側で制御できないのは承知していますから
ただ、std::vector<T>の要素型として使えるような型Tのオブジェクトなら、
プレースメントnewをうまく使って安全にrealloc()で領域管理できるという話
0775デフォルトの名無しさん
2012/04/22(日) 21:54:51.43あまりにも不自然すぎる
0776デフォルトの名無しさん
2012/04/22(日) 21:56:42.25二重コピーされる分realloc使うのが無駄なのは事実だろ
まだmalloc, free, mallocしてreplacemente new呼んだ方がマシだ
0777デフォルトの名無しさん
2012/04/22(日) 22:06:36.44ちょっと前のレスから気になってたが、replacement newってなんぞね?
また、realloc()の呼び出し1回で同一オブジェクトのコピーが2回起きるみたいな書き方も気になるが、
それっていつどういうシチュで??
もし>738のようなコピーコンストラクタ呼び出しの回数のことを言ってるのなら、
それはrealloc()一回につき同一オブジェクト当たり1回以下にできる
(realloc()がコピーするかしないかや呼び出し下で制御できないが、
領域の移動があったかどうかは呼び出し元で判定でき、移動しなかったオブジェクトについて呼ぶ必要はないため。)
0778デフォルトの名無しさん
2012/04/22(日) 22:08:51.64まずはEffectiveC++でも嫁やザコ
0779777
2012/04/22(日) 22:10:35.64std::vector<T>の要素型として使えるような型Tのオブジェクトなら、
勝手にコピーされても何もする必要がないから、領域の移動は関係なかったな、、
0780デフォルトの名無しさん
2012/04/22(日) 22:14:06.10reallocで1回、new( buffer ) Type();で1回、合わせて2回だろ。
0781デフォルトの名無しさん
2012/04/22(日) 22:23:58.97自分自身をさすポインタをもつ場合、コピーコンストラクタ/operator=を正しく書けばvectorに入れられるが、メモリコピーでは正しく処理できない。
0782デフォルトの名無しさん
2012/04/22(日) 22:34:14.86普通そうはならないべ
サイズs1の領域が確保済みで、realloc()でそのサイズをs1+s2に拡大する場合、効率的な実装なら、まず>764(の前半)のようなケースでは実質コピー0回。(空き領域リンクリストの繋ぎ替えが起きるだけ。)
運が悪ければ、領域の移動を要し、サイズs1の部分のみコピーされる(コピー1回)。
ここには今の想定だと構築済みオブジェクトが入っているが、コピー安全なオブジェクトなのでそれ以外なにもしなくていい。つまり、コピーはオブジェクト毎に高々1回。
で、new(p) Type(); が必要なのは、新規に確保されたサイズs2の領域だけ。よって、2回コピーされるオブジェクトは生じない。
なお、細かいことを言えば、new(p) Type()はアドレスpについてType型のデフォルトコンストラクタを呼び出すだけなのでコピーではない。
また、Typeのデフォルトコンストラクタが全フィールドを確実に初期化する保証があるなら
new(p) Type(); と書くより new(p) Type; の方がよろしい。(0 fillが省略されるから早くなる。いつの規格からかは知らん。)
>>781
ああすまん、それはそうね。
0783デフォルトの名無しさん
2012/04/22(日) 22:41:23.02>サイズs1の領域が確保済みで、realloc()でそのサイズをs1+s2に拡大する場合、効率的な実装なら、まず>764(の前半)のようなケースでは実質コピー0回。(空き領域リンクリストの繋ぎ替えが起きるだけ。)
この前提が間違ってるって何度も指摘されてるだろ
0784デフォルトの名無しさん
2012/04/22(日) 22:45:14.75手間が増えるだけでreallocするメリットねぇじゃねぇか
0785デフォルトの名無しさん
2012/04/22(日) 22:45:21.40>何度も指摘
kwsk
すくなくとも、(たまたまかどうかはともかくとして)realloc()前後で領域が移動しなかった実例が>768にあるわけだが
これって呼び出し前後でアドレスが変わらない部分についてもrealloc()は律儀にコピーしてるってことなの??
>738おすすめのヒープメモリ管理方式を聞いてみたい気がするカモメ、
0786デフォルトの名無しさん
2012/04/22(日) 22:49:16.76ことなの?じゃなくコールスタック追いかけるか
逆アセしてみろよ。memcpy呼ばれてるだろ
0787デフォルトの名無しさん
2012/04/22(日) 23:06:31.08VS2010のデバッグモードでmemcpy()にブレークポイントしかけて見て見たが、
>768のコードにおける4行目
void* p2 = realloc(p1, 2000);
の呼び出し中のmemcpy(src, dst, count)の呼び出し回数は3回、ただしcountはどれも2だったべ
これはリンクリストか何かのコピーじゃねーの?
(>783の指摘どおりだとしたら1000バイト級のmemcpy()が起きないとおかしいが)
で、仮に万が一>783の指摘が正しかったとして、2回コピーされる件はどうなったのよさ?
主張を取り下げて>782で納得?
0788デフォルトの名無しさん
2012/04/22(日) 23:09:34.080789デフォルトの名無しさん
2012/04/22(日) 23:27:27.522回コピーは俺だが。新しい領域のみコンストラクターの結果を
コピーするんならたしかにコピーは1回だな。そこは納得するよ。
0790デフォルトの名無しさん
2012/04/22(日) 23:45:41.19http://codepad.org/tlYgmcrc
そもそも、同じアドレスだからと言って一旦解放された領域に
同じ値が入ってるとも限らんからな
このコードVSにコピペして実行してみ
0791デフォルトの名無しさん
2012/04/23(月) 01:13:06.56ちょっwwwwwwおまwwwwwwwwww
例示のコードはrealloc()とは話が違うわけだが
そりゃーfree()で本当に解放してしまった領域には誰に何書かれるかわからんでしょうよ
(別スレッドあり、デバッグビルドのfree()だと丁重に0xccccccccで埋めてくれたりすることあり。
セキュリティー目的で埋めるライブラリもあるかも試練、)
なんつーか>768のコードの意図が伝わってないようだけど、
K&R式なmalloc()およびrealloc()な実装の下で>768をシングルスレッド状況で走らせると
>782で言うコピー0回な挙動になるんすよ
>768は、その挙動を演出するために、使用中の領域(p1)とは関係ない領域(p3)を一旦malloc()後にfree()してるだけ
p1が指す領域は一貫してfree()されない。
0792デフォルトの名無しさん
2012/04/23(月) 01:26:27.20vector の要素型に realloc() で発生しうる memcpy() への耐性なんて要求されてないんだが
0793デフォルトの名無しさん
2012/04/23(月) 01:43:35.76realloc内部でfreeされるがな
0794デフォルトの名無しさん
2012/04/23(月) 02:08:56.95わざわざ危険を犯そうとする冒険者になることは、ない。
0795デフォルトの名無しさん
2012/04/23(月) 02:19:24.31newそのものの速度が問題になる状況って
どんな状況だ?
0796デフォルトの名無しさん
2012/04/23(月) 03:05:19.970797デフォルトの名無しさん
2012/04/23(月) 03:19:14.56public:
bool hoge();
}
MyClass instance;
があるとして、
「instance.hoge()」
が与えられたときに、
「MyClass::hoge(),&instance」
を返すようなマクロは作れませんでしょうか?
0798デフォルトの名無しさん
2012/04/23(月) 04:24:58.060799797
2012/04/23(月) 04:25:55.73「instance.hoge()」
という記述から、メンバ関数ポインタとthisポインタを取得したいんですよね。。。
0800デフォルトの名無しさん
2012/04/23(月) 06:50:18.400801797
2012/04/23(月) 12:43:53.90あとでそのメンバ関数を呼び出したいんです。
使う箇所が多いので、テンプレートとかでなんとかできないかと思いました。
0802デフォルトの名無しさん
2012/04/23(月) 12:53:08.140803797
2012/04/23(月) 14:26:18.17bind(&MyClass::hoge,&instance)って呼び出さないといけないじゃないですか。
これをbind(SUPER_MACRO(instance.hoge()))で記述できるようにしたいんです。
0804デフォルトの名無しさん
2012/04/23(月) 14:28:35.010805デフォルトの名無しさん
2012/04/23(月) 14:49:33.81&MyClass::hoge //現状
~~~~~~~~~~~
&instance.hoge //こう言いたいだけ
0806デフォルトの名無しさん
2012/04/23(月) 15:03:37.51std::function<T ()> hoge = std::bind(&MyClass::hoge,&instance);
hoge();
hoge();
で我慢しなさい
0807デフォルトの名無しさん
2012/04/23(月) 16:23:18.63[&]な。
0808デフォルトの名無しさん
2012/04/23(月) 17:35:05.27型情報の取得や比較などするクラスについてのみ型情報がバイナリに埋め込まれるのでしょうか?
それとも全てのクラスの型情報が埋め込まれるのでしょうか?
0809デフォルトの名無しさん
2012/04/23(月) 17:39:22.960810デフォルトの名無しさん
2012/04/23(月) 18:17:39.440811デフォルトの名無しさん
2012/04/23(月) 20:57:41.81自身内部へのポインタを持ってても
std::vector<T>のTとして使えるだろ常考
0812デフォルトの名無しさん
2012/04/23(月) 21:30:23.79>781
0813デフォルトの名無しさん
2012/04/23(月) 23:11:08.24vector<char [1000]>
みたいに配列を型として作ることできないんでしょうか?
0814デフォルトの名無しさん
2012/04/23(月) 23:18:38.75<可変長の配列>の配列ならvectorをvectorに突っ込む
0815デフォルトの名無しさん
2012/04/23(月) 23:20:00.370816デフォルトの名無しさん
2012/04/23(月) 23:27:38.75無理か
char *にして毎回メモリ確保してぶっこむわ
サンキュー
アディオス!
0817デフォルトの名無しさん
2012/04/24(火) 00:07:51.75おいアラインメント
0818デフォルトの名無しさん
2012/04/24(火) 00:08:13.27なんで既に vector を使ってる文脈で自分でメモリ確保・解放しようだなんて考えるの?
0819デフォルトの名無しさん
2012/04/24(火) 00:09:51.28アラインメントの問題もあるし、自分でnew/delete管理するのは不可能ではないながらも非常に苦労する部分であるし
毎回メモリ確保するならstd::vector<std::vector<element_type>>ってした方が良いと思う。
0820デフォルトの名無しさん
2012/04/24(火) 00:12:23.20boost 使うの嫌なら、構造体に配列だけぶっ込んだ奴を使え
0821デフォルトの名無しさん
2012/04/24(火) 00:17:35.80Tのサイズ示してナンセンスさを醸し出そうとしたけど大失敗!
あれ上手く行ってもポインタ投げてるだけだよな。
0822デフォルトの名無しさん
2012/04/24(火) 00:20:04.200823816
2012/04/24(火) 00:25:57.46boostは使ったことないっす
vector<element_type>ってのもよく知らないっす
自分でnew,deleteすんのもforループでぶん回して開放するだけなんで苦にならないっす
0824デフォルトの名無しさん
2012/04/24(火) 00:36:18.71Tはintとかcharとかの汎用表記だと思ってくれ。
0825デフォルトの名無しさん
2012/04/24(火) 00:58:17.08それで苦にならんということは、おおかたエラー処理まで考慮すると間違ったコードができあがってる。
0826デフォルトの名無しさん
2012/04/24(火) 01:00:10.80じゃあ>>824さんがおっしゃった方法ちょっとやってみます
ありがとうございました
0827デフォルトの名無しさん
2012/04/24(火) 01:00:19.84template<class Type, std::size_t N>
struct wrapped_array{
typedef Type type;
static const std::size_t size = N;
type elements[size];
};
ってして
std::vector<wrapped_array<char, 1000>>
とすればいいよ。
アラインメントは、単にこちらが「汎用ヒープ領域をchar単位で管理する」と思い違いしただけだから
ここではあまり関係ない。
new,deleteをforで回すのは行儀が良くない、というわけではないけど
デストラクタ以外でnew,deleteを回すという行為自体が、その前のプロセスで例外などが起こった場合の
リーク原因になるからスコープ防壁やshared_ptr等を実装する時以外は直接使わない方がいい。
0828デフォルトの名無しさん
2012/04/24(火) 01:00:33.67まぁとりあえず使ってみなよ
馴染みの方法を取るのはその後でも遅くは無いさ
0829デフォルトの名無しさん
2012/04/24(火) 01:02:05.24このコードの前に
void* px = malloc(1000);
void* py = malloc(1000);
free(px);
これをやるだけでデバッグビルドじゃとおってもリリースじゃとおらねぇダロアホ。しね。
0830デフォルトの名無しさん
2012/04/24(火) 01:04:33.72難しそうですね
まあなんとかやってみます。
>>828
気になってはいたんで一度挑戦してみましょうか
ありがとうございました!
0831デフォルトの名無しさん
2012/04/24(火) 23:27:02.66俺へタレでさっぱりなんだが
static const std::size_t size = N;
でstaticつけるのは何で? 付けないと何か問題生じる?
0832デフォルトの名無しさん
2012/04/24(火) 23:29:49.24直接初期化もできない
というか、実際にstatic消してコンパイルしてみろ
0833デフォルトの名無しさん
2012/04/24(火) 23:31:05.67ttp://ideone.com/HYKaN
0834デフォルトの名無しさん
2012/04/24(火) 23:38:55.40const InputIterator &begin = InputIteratorImplement< std::vector<int>::iterator >( vector.begin() );
こんな感じで。
なにがしたいかというと、仮想関数の引数にiteratorを使いたいのです。
0835デフォルトの名無しさん
2012/04/24(火) 23:43:59.560836デフォルトの名無しさん
2012/04/25(水) 00:10:25.60ありがと。でも何でstatic無だとコンパイルできないのか分らん,orz
wrapped_arrayに要素をどうやって入れるのか、どう要素を参照するのかも分らん
0837デフォルトの名無しさん
2012/04/25(水) 00:17:20.89static無だとタダの書き換えし辛い変数として扱われ
やろうと思えば実行時に書き換えられるから
実行時に書き換えられる値は定数として使えない
0838デフォルトの名無しさん
2012/04/25(水) 00:40:08.04ありがと。ある程度知識ある奴ならその説明で分るんだろうが
俺、C++がほとんど分ってないからな
要素へのアクセスってCのstructと同じように出来るんだな
0839デフォルトの名無しさん
2012/04/25(水) 06:36:23.18入門書を読み直せ、まずはそこからだ
0840デフォルトの名無しさん
2012/04/25(水) 18:59:13.19親父な俺が中級レベルになるのに役立った本を教えるよ。
エキスパートCプログラミング(訳:梅原系)
EffectiveC++(訳:吉川邦夫)
この2冊かな。More EffectiveC++もまぁよかったよ。
0841デフォルトの名無しさん
2012/04/25(水) 19:38:27.38仮想関数に不特定のiterator渡したいときどうしてます?
0842デフォルトの名無しさん
2012/04/25(水) 19:39:52.13テンプレート完全ガイドが「せいぜい中級」と言われる世界(すでに初級扱い)で
いまさらその2冊は厳しいっすよ。
0843デフォルトの名無しさん
2012/04/25(水) 19:45:59.690844デフォルトの名無しさん
2012/04/25(水) 19:47:40.310845デフォルトの名無しさん
2012/04/25(水) 20:03:41.89ないね。仮にあったとして(名前Itとして)、
typename std::iterator_traits<It>::difference_typeは何になるというんだい?
0846デフォルトの名無しさん
2012/04/25(水) 20:14:56.35値を書き込むだけでしたら、その手の定義は不要でしょうから。
0847デフォルトの名無しさん
2012/04/25(水) 20:16:11.62入門書読んでEffectiveC++読んでやっと初心者卒業くらいだろ…?
中級っていうと例外安全なテンプレートを自然に書けたり、
ちょっとしたメタプログラミング的な処理を書けたりするレベルじゃないの
0848デフォルトの名無しさん
2012/04/25(水) 20:25:02.43仮にあったとして、どう扱いたいの?
InputIteratorで何でも受け付けるなら*itはvoid*でも返すの?
自分で必要とするinterface決めて、使う型に応じてアダプタ書いた方がいいんじゃね?
0849デフォルトの名無しさん
2012/04/25(水) 20:26:05.05初級、中級、上級、神仙人級....
0850デフォルトの名無しさん
2012/04/25(水) 20:27:24.02やっぱ自作ですよね。
コンテナは未定ですが、入出力する型(wchar_t)は決まってます。
できれば、書き出しだけじゃなく読み込みもしたいんですけどね。
0851デフォルトの名無しさん
2012/04/25(水) 20:29:07.03ジーパンスニーカーハゲ級
0852デフォルトの名無しさん
2012/04/25(水) 20:41:03.870853デフォルトの名無しさん
2012/04/25(水) 20:41:43.16class base {
virtual void process_one( wchar_t c, context &ctx ) = 0;
public:
template<typename Iter>
/* non-virtual */ void process_iter( Iter from, Iter to ) {
context ctx;
for( ; from != to; ++from ) process_one( *from, ctx );
}
};
あたりでいいだろ。
0854840
2012/04/26(木) 00:16:49.07「初心者ゾーンを抜け出すきっかけになった2冊」であり、その後の別の経験やきっかけで
「中級になった」ということです。
0855デフォルトの名無しさん
2012/04/26(木) 00:17:55.74そんなもん初級も初級だろ
0856デフォルトの名無しさん
2012/04/26(木) 00:52:05.41ここは神仙人級の集まりだな
0857デフォルトの名無しさん
2012/04/26(木) 01:00:33.370858デフォルトの名無しさん
2012/04/26(木) 01:08:15.920859デフォルトの名無しさん
2012/04/26(木) 01:13:07.00ショッキュウやわ。
0860デフォルトの名無しさん
2012/04/26(木) 01:26:04.83初級じゃね?ラジオシティぐらいいかないとな。
0861デフォルトの名無しさん
2012/04/26(木) 01:35:52.97この流れだと、俺はまだまだ初級かな
0862デフォルトの名無しさん
2012/04/26(木) 01:39:21.66ラジオシティなんてリアルタイムで光源もりもり動かしたいとかでない限り楽勝じゃね?
数レスで人にやり方伝えるとこまでだったらちょっと難易度高いけど。
0863デフォルトの名無しさん
2012/04/26(木) 01:47:38.81スキャンラインにしても、ラジオシティにしても実装するだけなら
まともに学校行ってる人間ならできるじゃん
C++使ってんだからいかに実用的な速度と再利用性を維持できるかに
答えられなきゃおはなしにならなくね
0864デフォルトの名無しさん
2012/04/26(木) 01:59:19.69次は年収自慢でも始める?
0865デフォルトの名無しさん
2012/04/26(木) 02:01:02.820866デフォルトの名無しさん
2012/04/26(木) 02:08:05.95お前からコードうp汁
0867デフォルトの名無しさん
2012/04/26(木) 04:48:38.620868デフォルトの名無しさん
2012/04/26(木) 06:31:15.12面接受けただけで働く気がなくなるような企業ばかりだ
0869デフォルトの名無しさん
2012/04/28(土) 18:59:36.23一度はドロップアウトした清人だからこそおっさんの面白さを見落とさず拾い上げる事ができたし、それを伝える事もできた。
同じ伝えるプロでも、金持ちに生まれてリア充一直線を突っ走ってきたアナウンサーにこの面白さは伝えられないし、
受け手が勉強ばっかりやって来たオタクではやはり理解する事ができない。
必要なのは人生経験という共通の背景。
0870デフォルトの名無しさん
2012/04/29(日) 01:12:22.950871デフォルトの名無しさん
2012/04/29(日) 14:11:15.57int& a;
double b,c;
};
みたいなクラスあるいは構造体があったとき、
・メモリの連続性は保証されていますか?
・オフセットを指定する文法はありますか?
Cなら
unsigned offset: 16;
みたいなのがあった気がするんですが。
0872デフォルトの名無しさん
2012/04/29(日) 14:16:56.77a,b,cの順番で並んでる事は保証されるが、
a,b,cが隙間無く並んでることは保証されない。
オフセットは標準ではなかったんじゃ無かったっけ?
大体の処理系でoffsetofが使えただろうけど。
別の方法としてメンバー変数のポインタを使う方法もある。
int (X::*n); //こんなの
0873デフォルトの名無しさん
2012/04/29(日) 14:17:12.610874デフォルトの名無しさん
2012/04/29(日) 14:22:34.69バイナリ出力するときに、そのままの順序で吐き出せるかと思ってましたが、そうなんですか。ならメンバーで
double bc[2];
とかを持っておいて、個別にアクセスしたほうがいいですね。
ありがとうございます。
0875デフォルトの名無しさん
2012/04/29(日) 14:23:56.57a, b, c の順番は保証されてるけど、間は詰まっているとは限らない
各メンバのオフセットを直接指定する事はできないが、
間の詰まり方を調整する事はコンパイラによっては可能な場合もある(環境依存)
VC++ と g++ では #pragma pack で調整できるのでググれ
ここまでは、C でも同じ
最新規格の C++11 だと alignas を使って
C++11 対応コンパイラ間であれば環境非依存で調整可能
ただし、もちろん C++11 に対応していないコンパイラでは使えない
0876デフォルトの名無しさん
2012/04/29(日) 14:24:28.59本当は、aを飛ばしてbcだけをバイナリ出力したかったのです。
ビットフィールドが欲しいわけじゃないので、勘違いでした。
0877デフォルトの名無しさん
2012/04/29(日) 14:25:02.01アライメントというのがあって、それ意識してメンバーを並べてりゃ隙間は開かないよ。
0878デフォルトの名無しさん
2012/04/29(日) 14:25:56.92おぉ、有益な情報ありがとうございます。
じぶんでググってみますが、特に有用なページとかあれば教えてください。
0879デフォルトの名無しさん
2012/04/29(日) 14:27:16.52875と矛盾してますが、仕様ですか?
0880デフォルトの名無しさん
2012/04/29(日) 14:28:33.03横からだけど、template引数に型を突っ込んでアラインメントを得る事自体が
アラインメント適用した後のストレージの後ろに隙間が開く可能性を孕んでいる。
0881デフォルトの名無しさん
2012/04/29(日) 14:31:19.65#pragma packと似たような環境依存だよ。
基本的同じOSで動くコンパイラーが生成したコードだと
アライメント規則が同じになる。
こっちは、OSに依存するけどコンパイラーに依存しない。
0882デフォルトの名無しさん
2012/04/29(日) 14:31:27.35bとcだけなら型が同じなので
連続して記述してあれば配列と同じメモリ配置になるよ
offsetof で先頭からのオフセットが取得可能なので
そこから sizeof(double)*2 だけ出力すればいい
まああんまお勧めしないが
b, c を別構造体にして、それを出力した方が素直だと思う
0883デフォルトの名無しさん
2012/04/29(日) 14:44:06.16例えばshort a; int b; short c;だと、aが4の倍の倍数にならないので2バイト穴が開く。
int b; short a; short c; と並べてやれば穴は開かない。
0884デフォルトの名無しさん
2012/04/29(日) 14:54:58.15pragma pack なんかは char アラインしかされない int とか作れるけど、
alignas じゃそういうのはできないよ。 (7.6.2 p5)
0885デフォルトの名無しさん
2012/04/29(日) 15:03:17.87using namespace std;
struct X {
short x; int y; short z;
};
struct Y {
short x,y; int z;
};
int main()
{
cout << sizeof(X) << endl;
cout << sizeof(Y) << endl;
}
こわ〜い(笑
0886デフォルトの名無しさん
2012/04/29(日) 15:08:17.56> bとcだけなら型が同じなので
> 連続して記述してあれば配列と同じメモリ配置になるよ
そうなるコンパイラが多いのは事実だろうが、何の保証も無い。
0887デフォルトの名無しさん
2012/04/29(日) 15:10:48.030888デフォルトの名無しさん
2012/04/29(日) 15:13:49.74C++11でその辺も何とかなったりしないのだろうか。
それが幸せだと考えています。
0890デフォルトの名無しさん
2012/04/29(日) 16:22:48.870891デフォルトの名無しさん
2012/04/29(日) 20:55:22.470892デフォルトの名無しさん
2012/04/29(日) 21:06:36.09一応方法としてG内で構造体Sを作りその中でstaticメンバ関数Fを定義すれば良いみたいですが
このFからGの変数にアクセスする方法はありますか?
0893デフォルトの名無しさん
2012/04/29(日) 21:50:35.66関数のローカルstatic変数にアクセスできるから。
staticメンバー関数は、static変数を操作するための関数というより
どちらかというと、static関数が属してるクラスのオブジェクトを操作するための関数。
0894デフォルトの名無しさん
2012/04/29(日) 21:56:52.46じゃあと思ってstatic関数を関数内定義しようとしましたがこれは出来ませんね
うーん
0895デフォルトの名無しさん
2012/04/29(日) 22:00:55.300896デフォルトの名無しさん
2012/04/29(日) 22:16:23.00ttp://ideone.com/GSWFY
0897デフォルトの名無しさん
2012/04/29(日) 22:29:39.470898896
2012/04/29(日) 22:32:53.750899デフォルトの名無しさん
2012/04/29(日) 23:28:16.280900896
2012/04/29(日) 23:45:52.610901デフォルトの名無しさん
2012/04/30(月) 00:20:15.67C+11をサポしているコンパイラーってあんまりないんじゃない
VC2010サポートしているのか
0902デフォルトの名無しさん
2012/04/30(月) 00:32:42.56VC2010だって一部しかサポートしてない
ラムダ式は大丈夫だったけど
0903デフォルトの名無しさん
2012/04/30(月) 01:26:02.640904デフォルトの名無しさん
2012/04/30(月) 01:30:19.890905デフォルトの名無しさん
2012/04/30(月) 03:07:17.330906デフォルトの名無しさん
2012/04/30(月) 03:31:40.10C++の始まりはストラウストラップ先生の「高速で動くシミュレーション用言語が欲しい」という
個人的動機だったと理解しているが
0907デフォルトの名無しさん
2012/04/30(月) 03:40:09.30使って出てきた問題が修正されたり、あったらいいよねって機能が追加されたり、
多くの環境で必要とされる独自拡張が標準化されたり、広く使われるライブラリが標準化されたり。
0908デフォルトの名無しさん
2012/04/30(月) 03:42:54.34Boostはレビューしてもらって多数決で採用が決まる。
レビューで、色々文句も出るので改善しないと採用してくれない。
0909デフォルトの名無しさん
2012/04/30(月) 10:04:11.32ラムダは関数の引数に渡すとき以外は
普通はautoで受けるぜ
0910デフォルトの名無しさん
2012/04/30(月) 15:08:21.36結局C++で具体的に何が出来るのか教えてくれ。
他のところだと「何でも」しか来なくて具体的な例が知りたい。
0911デフォルトの名無しさん
2012/04/30(月) 15:10:30.20動作させる環境においてプログラムに許されていることなら何でも出来るよ
0912デフォルトの名無しさん
2012/04/30(月) 15:10:48.460913デフォルトの名無しさん
2012/04/30(月) 15:11:25.23C++だけではGUIアプリは作れん
CUIだけ
0915デフォルトの名無しさん
2012/04/30(月) 15:14:08.77お前Javaスレにも殆ど同じレスしてたろ
0916デフォルトの名無しさん
2012/04/30(月) 15:15:37.39よくわかったなw
今プログラミングの勉強してていろんなところで聞いてるw
0917デフォルトの名無しさん
2012/04/30(月) 15:17:38.13まあ比較的簡単な奴ならJavaやC#でもできるが
C++ほど融通が利かない上に実行速度が1/3ぐらいに低くなる
0918デフォルトの名無しさん
2012/04/30(月) 16:11:46.43PS3とかの3Dを駆使したゲームも作れるし、
OSも作れるし、
組み込み機器のソフトも作れるし、
ネットワーク関連のソフトも作れるし、
スマートフォンのアプリも作れる。
だから誰に聞いても何でも出来るとしか答えがこない。
当然他の言語の方が楽に作れる分野は一杯あるけどな。
C++で出来ないわけじゃない。
0919デフォルトの名無しさん
2012/04/30(月) 16:19:56.28おぉ!
ありがたい!
だから皆そう言うのかぁ〜
d(゚Д゚ )☆スペシャルサンクス☆( ゚Д゚)b
0920デフォルトの名無しさん
2012/04/30(月) 17:41:01.01おまえらは仕事でC++(Cじゃなく)をメインに使っているのか?
0921デフォルトの名無しさん
2012/04/30(月) 17:42:55.68でも同僚はみんなろくにC++を知らない
0922デフォルトの名無しさん
2012/04/30(月) 18:38:10.730923デフォルトの名無しさん
2012/04/30(月) 18:38:56.600924デフォルトの名無しさん
2012/04/30(月) 18:57:39.370925デフォルトの名無しさん
2012/05/01(火) 00:14:53.96でもあれがなければ<<とか>>のオーバーロードが自然に記述出来なかったわけだ
0926デフォルトの名無しさん
2012/05/01(火) 00:22:56.15演算子なんか全部グローバル名前空間に宣言することにすればよかったんじゃ?
0927デフォルトの名無しさん
2012/05/01(火) 00:30:34.150928デフォルトの名無しさん
2012/05/01(火) 01:22:20.160929デフォルトの名無しさん
2012/05/01(火) 01:34:59.500930デフォルトの名無しさん
2012/05/01(火) 01:55:40.45using namespace使いまくるとかバカな事してんのか?
using宣言かnamespaceの別名使うくせをつけろよ
0931デフォルトの名無しさん
2012/05/01(火) 01:56:30.05std:: とか boost:: と打つのが快感
0932デフォルトの名無しさん
2012/05/01(火) 06:06:38.50とかはよくやる
0933デフォルトの名無しさん
2012/05/01(火) 16:11:32.270934デフォルトの名無しさん
2012/05/01(火) 16:20:32.410935デフォルトの名無しさん
2012/05/01(火) 19:07:56.63出直してきました
thisに新しいのを代入してしまえばいいですかね?
0936デフォルトの名無しさん
2012/05/01(火) 19:12:00.430937デフォルトの名無しさん
2012/05/01(火) 19:16:09.82違います。
親クラスの中で、自分自身を派生クラスに置き換えたいんです。
0938デフォルトの名無しさん
2012/05/01(火) 19:17:41.27できるっていやーできるが、茨の道だしEffective C++にもいろいろ書いてあった気がするが良い?
a. クラスbaseからその派生クラスderivedへのキャスト
それを行うコピーコンストラクタをderivedに定義すればできる
ただし、explicitを忘れると、暗黙の型変換でbase→derivedが行われて死ぬ
b. クラスbaseのポインタ(or 参照)からその派生クラスderivedへのポインタ(or 参照)へのキャスト
キャストで一応はできる
(1) 速いが自己責任なやり方
base* p = new derived;
derived* q = reinterpret_cast<derived*>(&p);
これは、qを使ってbaseにないフィールドに「ついうっかり」アクセスすると死ぬ
(2) 遅いが多少安全なやり方 -- dynamic_castを使う。
baseに仮想関数が1つ以上無いとコンパイルエラー。
また、正確にderived*かderived&へのキャストでないと例外が発生する
0939デフォルトの名無しさん
2012/05/01(火) 19:19:29.73{
dynamic_cast<Delived>(this)->DelivedFunction(); // 派生class上の関数呼び出し
}
これがしたかった訳じゃないのか
0940デフォルトの名無しさん
2012/05/01(火) 19:20:59.96コンストラクタ以外ではthisへの代入はできない(コンパイルエラー)
コンストラクタでのthisへの代入は、昔の規格だとコンストラクタがメモリ確保する、の意味に取られるんだったと思う
(今の規格でどうなってるかは知らん)
>938のb.あたりでどう?
0941デフォルトの名無しさん
2012/05/01(火) 19:21:49.65(1) 速いが自己責任なやり方
多重継承してても死ぬぞ
0942デフォルトの名無しさん
2012/05/01(火) 19:25:52.12コンパイラーによっちゃインライン展開によって動的処理が消える
reinterpret_cast使っても多重継承でアウトになるし、こっちだけにしとけ
0943デフォルトの名無しさん
2012/05/01(火) 19:47:31.60ダイナミックジャスコしたところでそれは変換前と変換後のクラスが派生関係にあるかどうかを調べるだけで(なければヌル)。
0944デフォルトの名無しさん
2012/05/01(火) 19:49:58.240945デフォルトの名無しさん
2012/05/01(火) 20:25:25.260946デフォルトの名無しさん
2012/05/01(火) 20:26:23.39> base* p = new derived;
> derived* q = reinterpret_cast<derived*>(&p);
> これは、qを使ってbaseにないフィールドに「ついうっかり」アクセスすると死ぬ
static_cast にしとけば多重継承してても大丈夫だし生成してるのが
derived なら q を derived として扱って何の問題も無い。
0947デフォルトの名無しさん
2012/05/01(火) 20:44:08.30static_castの存在を忘れてたスマンス;
あと「qを使ってbaseにないフィールドに「ついうっかり」アクセスすると死ぬ」は確かに間違いで、
「pが指す先が本当はderivedでなかったら死ぬ」に訂正
0948デフォルトの名無しさん
2012/05/01(火) 21:43:06.200949デフォルトの名無しさん
2012/05/02(水) 17:11:52.95いまいち相違点というかメリット/デメリットが見えてこない。
互いに、アプリレベルでひとつしか実体を持たないし、
初期化するタイミングをユーザーが選択できる。
ポリモーフィズムできるか出来ないかぐらいか?
0950デフォルトの名無しさん
2012/05/02(水) 17:54:44.58シングルトンはインスタンスが1つだけ作れる
モノステートは1つしか実態を持たないわけじゃなくて、状態が1つしかないだけ
Construct(メモリ確保と初期化)、Destruct(後処理とメモリ開放)を考えるなら
staticなクラスフィールドに実体が存在し続けるモノステートよりシングルトンの方が優秀
だと個人的に思ってる
0951デフォルトの名無しさん
2012/05/02(水) 21:25:52.62デストラクターとテンプレートの親和性が有る。
まず、デストラクターだが、モノステートが抱きかかえてる
オブジェクトが死ぬタイミングではなく、モノステートのオブジェクトが
死んだ時点で呼ばせる事が出来る。例えば、関数の呼び出しと
脱出のログをとる場合、関数に1個モノステートのオブジェクトを置いて
おけばいい。他にもデストラクターを使った排他制御にも使える。
次にテンプレートだが、もともとシングルトンを想定してないテンプレートで
コンストラクターを呼び出す仕様になってる場合、シングルトンは使えない。
見た目が他のクラスと変わらないモノステートであれば、問題なく使用できる。
基本的に、アドレスが同一である事を求める場合ぐらいしかシングルトンのメリットはない。
FlyWeightでもモノステートで実装できるし、static変数の初期化を利用した
根底クラスの拡張もモノステートでできる。
よほどの事情がなけりゃモノステートにしとけばいいだろ。
0952デフォルトの名無しさん
2012/05/03(木) 00:05:39.10>モノステートのオブジェクトが
>死んだ時点
モノステートなクラスって、
・それ自体のオブジェクト(インスタンス)は生成されない(コンストラクタ系が全部privateなのでできない)
・抱えてるオブジェクトは(あるとしても)全部static
だから、
死んだ時点=抱えてるオブジェクトのデストラクタが呼ばれた時点=プログラム終了後の後処理タイミング、
なんじゃ…?
0953デフォルトの名無しさん
2012/05/03(木) 00:19:22.33http://www.geocities.co.jp/bleis_tift/cpp/singleton.html
シングルトンにできてモノステートにできないこととして、抱えているオブジェクトの遅延生成が挙げられる
抱えているオブジェクトが複数あって、相互に依存性があり、
かつ本体のリンケージ単位が分かれていて初期化順序不定、と言う場合
シングルトン1択(コンストラクタできちんと生成順序を指定して遅延生成する)になる
ただ、個人的にはシングルトンオブジェクトの汎用性(第三者が後にいつ生成する使い方をするかわからない)
を考えると、マルチスレッド状況下での生成も考慮せねばならず、するとメモリバリア関連の検証が必要になり、面倒なのでシングルトン嫌いだが
(そう言った事柄をプログラマが完璧に管理できる状況下なら生成タイミングと回数が管理できるということで、シングルトンでなくても良い。)
0954デフォルトの名無しさん
2012/05/03(木) 00:31:20.29それは間違い。
というか、一般的に言われるモノステートじゃない。
一般的なのは
名前通り単純に、状態が1つだけって事だけで
http://c2.com/cgi/wiki?MonostatePattern
こういうやつね。
コンストラクタのアクセス修飾子はどーでもいいし
メンバ関数がstaticだろうが非staticだろうが関係ない。
0955953
2012/05/03(木) 00:37:43.14了解;
そして>953の前段は撤回スマンス;
>953式の(誤った)モノステートが抱えているオブジェクトの初期化順序は、多分宣言した順に行われると思うし
そんな規格の微妙な条項に頼らずに初期化順序を保証したければ、
遅延生成専門のクラスFooを設けてFooのコンストラクタ中で遅延生成することにして、
Fooのオブジェクトをstaticにすれば全く安全に解決できるorz
(むしろ>953式の(誤った)モノステートが抱えるオブジェクトと外のオブジェクトとの初期化順序を気にしたが、
それも上のようにFooを噛ます方法方法で解決できる。)
0956デフォルトの名無しさん
2012/05/03(木) 02:25:12.35そのサイトいつまで嘘を吹聴し続ける気なんだろうな
0957デフォルトの名無しさん
2012/05/03(木) 04:41:36.28モノステートとシングルトンのくっきりした違いが分ったよ。
(というか>>953のサイトを質問前に読んでいて、混乱したクチだった)
ありがとう。もう陽も昇る頃だが、よく眠れそうだ。
0958デフォルトの名無しさん
2012/05/03(木) 17:23:04.08を使ってきましたがEffectiveC++曰くconst type HOGE = nantoka;を使えトのことだったので
使ってみましたが、これがヘッダファイル内だと複数のcppにincludeされて多重定義エラー
externで回避できますがconst外さないと駄目ですが、そういうものですか?const外れるのが気持ち悪いのですが
0959デフォルトの名無しさん
2012/05/03(木) 17:27:12.440960デフォルトの名無しさん
2012/05/03(木) 17:30:18.00インクルードガード使えや……
0961デフォルトの名無しさん
2012/05/03(木) 17:32:54.690962デフォルトの名無しさん
2012/05/03(木) 19:37:00.53typeが整数型なら、多重定義のエラーにならない。constの特例。
それでエラーになるなら、実はCとしてコンパイルしているのでは?
0963デフォルトの名無しさん
2012/05/03(木) 20:43:51.71>多重定義のエラーにならない。
えっにわかには信じ難い
VS2008で「const int x = 10;」を同じcppファイル内で2回以上書くと
「error C2370: 'x' : 再定義 ; 異なるストレージ クラスです。」と言われる
>960ではないが、とりあえずは重複インクルードをガードすれば解決するんでないの
0964デフォルトの名無しさん
2012/05/03(木) 20:58:55.060965958
2012/05/03(木) 21:00:16.38問題は文字列char*でした
const intは通りました。不思議
0966デフォルトの名無しさん
2012/05/03(木) 21:09:16.83ってやらないと
0967デフォルトの名無しさん
2012/05/03(木) 21:10:04.99クラス内で
class Hoge{
statyic const char* hoge = "hogehoge";
};
ってやってるんじゃないの? もっと詳細に情報書け
0968デフォルトの名無しさん
2012/05/03(木) 21:11:14.020969デフォルトの名無しさん
2012/05/03(木) 21:14:04.82おうふ、それで通りました
いろいろ納得
0970デフォルトの名無しさん
2012/05/03(木) 21:15:36.03いや>965で意味が通ってるし、>966は正しい
>962の「typeが整数型なら」というのは意味不明
(クラス内のstatic const int x = 10;は確かにintでだけ可能という特例があるが)
0971デフォルトの名無しさん
2012/05/04(金) 11:08:00.260972962
2012/05/04(金) 23:18:35.03整数型に限らず、constなやつはextern付けない限りみな内部リンケージだったな。
0973デフォルトの名無しさん
2012/05/05(土) 17:06:39.12毎度だがマクロでないものを全て大文字で書くな
0974デフォルトの名無しさん
2012/05/05(土) 17:54:59.48http://2chnull.info/r/tech/1315922506/701-800#res707
0975デフォルトの名無しさん
2012/05/05(土) 17:58:41.560976デフォルトの名無しさん
2012/05/07(月) 17:47:20.54メインプログラムを自分、サブプログラム(.libや.dll)を他の人が作る場合、
相互での関数呼び出しの引数にstringやvector<>を使いたい場合は、ライブラリのバージョン合わせればOKですか?
コンパイラのバージョンはもちろん固定で。
(受け渡しはTCHAR使えば安全、というのは分かりますが、毎度変換しててはstring使う意味が薄れてしまう)
0977デフォルトの名無しさん
2012/05/07(月) 18:49:02.07>TCHAR使えば安全
えっ!?
0979デフォルトの名無しさん
2012/05/07(月) 19:06:36.48えっ?
0980デフォルトの名無しさん
2012/05/07(月) 19:16:45.770981デフォルトの名無しさん
2012/05/07(月) 20:06:03.81> SLTや
えっ?
0982デフォルトの名無しさん
2012/05/07(月) 20:08:59.800983デフォルトの名無しさん
2012/05/07(月) 20:15:45.37が多い。それで回答者が逆質問をしたり
悪口を言ったりする。それを前もって思
い描く力が絶望的に欠如してるに違いない。
スーパーハッカーだけが意図を理解できる。
レアなそういう神が颯爽と登場する予感。
0984デフォルトの名無しさん
2012/05/07(月) 20:36:57.190985デフォルトの名無しさん
2012/05/07(月) 20:40:37.89以降スルーで
0986デフォルトの名無しさん
2012/05/07(月) 21:17:16.900987デフォルトの名無しさん
2012/05/07(月) 21:17:30.04>>976
LIBは問題ないだろうが、DLLは地雷を踏んでも泣かない覚悟があるならどうぞ
0988デフォルトの名無しさん
2012/05/07(月) 21:20:03.000989デフォルトの名無しさん
2012/05/07(月) 21:22:34.710990デフォルトの名無しさん
2012/05/07(月) 21:24:21.260991デフォルトの名無しさん
2012/05/07(月) 21:35:56.18いやそんなことより次スレ誰か
0992デフォルトの名無しさん
2012/05/07(月) 22:51:29.640993デフォルトの名無しさん
2012/05/08(火) 04:14:19.620994デフォルトの名無しさん
2012/05/08(火) 04:50:38.690995デフォルトの名無しさん
2012/05/08(火) 05:42:48.920996デフォルトの名無しさん
2012/05/08(火) 08:29:59.46C++相談室 part95
http://toro.2ch.net/test/read.cgi/tech/1336420524/
0997デフォルトの名無しさん
2012/05/08(火) 08:34:23.850998デフォルトの名無しさん
2012/05/08(火) 08:58:40.370999デフォルトの名無しさん
2012/05/08(火) 17:11:33.591000デフォルトの名無しさん
2012/05/08(火) 17:36:56.11\ヽ, ,、
`''|/ノ
.|
_ |
\`ヽ、|
\, V
`L,,_
|ヽ、)
.|
/ ,、
/ ヽYノ
.| r''ヽ、.|
| `ー-ヽ|ヮ
| `|
ヽ, ,r .|
ヽ,r'''ヽ!'-‐'''''ヽ、ノ
,,,..---r'",r, , 、`ヽ、 ヾ
ヽ、__/ ./ハレハ i`ヽ、 `''r`ミ_
.レ//r,,,、 レ'レハヾ, L,,_ `ヽ、
"レ, l;;;l l;;;l`i.リレ' リ ̄~~
ヽ、 ワ `"/-'`'`'
`''''''''"
┼ヽ -|r‐、. レ |
d⌒) ./| _ノ __ノ
10011001
Over 1000Threadもう書けないので、新しいスレッドを立ててくださいです。。。
レス数が1000を超えています。これ以上書き込みはできません。