C++相談室 part34
■ このスレッドは過去ログ倉庫に格納されています
0001v(^・^)v
NGNGただし質問の前にはFAQに一通り目を通してください。
テンプレートライブラリ(STL含む)に関する質問は
専用の別スレにお願いッス。
過去スレ、関連スレ、関連リンクなどは >>2-20 あたり
0429デフォルトの名無しさん
NGNG0430デフォルトの名無しさん
NGNGマジデスカ…
おのれ VC7.1 …
0431デフォルトの名無しさん
NGNG0432デフォルトの名無しさん
NGNGおぉ、THX!
これやってみます
0433デフォルトの名無しさん
NGNG#define for if (0) ; else ; for
0434デフォルトの名無しさん
NGNGイテレータが2種以上あるとき無力だにょなあ
map::iterator im = m.begin();
for( int i = 0; i < 10; ++i, ++im)...
結局こうなっちゃうし。
俺は古い仕様のままでいいと思うけど。
0435デフォルトの名無しさん
NGNG0436デフォルトの名無しさん
NGNGi<10;
++i, ++im) {}
でいいじゃん
0437デフォルトの名無しさん
NGNGそれ、コンパイル通る?
0438デフォルトの名無しさん
NGNGなら通るんだけどねぇ
0439デフォルトの名無しさん
NGNGテンプレートが16種類もあるんだけど
どれが何用とか決まってんの?
0440デフォルトの名無しさん
NGNG0441デフォルトの名無しさん
NGNGint i = 0, map::iterator im = m.begin();
が、
int i = 0; int map::iterator im = m.begin();
と解釈されちゃうんだね。
forの初期化部には一つの型しか書けないわけか。
0442デフォルトの名無しさん
NGNGmap::iterator im = m.begin;
for (int i = 0; i < 10; ++i, ++im)
{
}
}
0443デフォルトの名無しさん
NGNG0444デフォルトの名無しさん
NGNG禿げしく却下
0445デフォルトの名無しさん
NGNG0446デフォルトの名無しさん
NGNG人にとって
0447デフォルトの名無しさん
NGNGんなアンコモンケースに対応することの方がどうでもいい。
0448デフォルトの名無しさん
NGNGそうか?
つーか現状のfor構文の方に
不備があるだろ、どっちかって言うと。
for()内のカンマをセミコロンに、
セミコロンを別の適当な記号に置き換えれば
無問題になるし意味的にも自然だ。
0449デフォルトの名無しさん
NGNG0450デフォルトの名無しさん
NGNG0451デフォルトの名無しさん
NGNGint main(int argc, char **argv)
??<
printf("%d??/n", argc);
??>
0452デフォルトの名無しさん
NGNG0453デフォルトの名無しさん
NGNG0454デフォルトの名無しさん
NGNGmap::iterator im = m.begin;
int i = 0;}
whlie( i < 10){
...
++i; ++im;);
0455デフォルトの名無しさん
NGNGoperator delete( p );
と、
int* p = static_cast< int* >( operator new[]( 10 * sizeof( int ) ) );
operator delete[]( p );
は何か違いがあるのでしょうか?
あるのなら何を基準に使い分ければいいのでしょうか?
0456デフォルトの名無しさん
NGNGreinterpret_cast ちゃうか?
0457デフォルトの名無しさん
NGNGここ読め。
http://www.fides.dti.ne.jp/~oka-t/cpplab-placement-new-3.html
new int[10]だと10 * sizeof(int)以上の領域を確保しなければならない可能性がある。
0458デフォルトの名無しさん
NGNGint flag = 1;
if (EndChr == "n"){
flag = 0;
}
このような式においてEndChr == "n"がfalseになります。
なぜなのでしょうか?
0459デフォルトの名無しさん
NGNG>>455のような例では両者に領域の違いも何もないということですよね?
new 演算子で配列を確保場合、必要以上の領域を確保する可能性があると。
0460デフォルトの名無しさん
NGNGそもそもoperator newはnewから呼び出される為の物だということを忘れるな。
0461デフォルトの名無しさん
NGNGは?
0462デフォルトの名無しさん
NGNGアドレス比較してるから。char[10] の代わりに std::string 使うか strcmp() で比較。
0463デフォルトの名無しさん
NGNGclass C{ ... };
C* p = static_cast< C* >( operator new( 10 * sizeof( C ) ) );
for( int i = 0; i < 10; ++ i )
new( p[ i ] ) C( ... );
...
for( int i = 0; i < 10; ++ i )
p[ i ].~C();
operator delete( p );
と、
C* p = static_cast< C* >( operator new[]( 10 * sizeof( C ) ) );
for( int i = 0; i < 10; ++ i )
new( p[ i ] ) C( ... );
...
for( int i = 0; i < 10; ++ i )
p[ i ].~C();
operator delete[]( p );
はどっちも正しい?
0464デフォルトの名無しさん
NGNG0465デフォルトの名無しさん
NGNGどちらも正しくないんじゃない?動くとは思うけど。
malloc でも動くけどね。
0466デフォルトの名無しさん
NGNGあ、スイマセン…
new( &p[ i ] ) C( ... );
です
0467デフォルトの名無しさん
NGNGまー確かに、全く平等な条件で選んでた言語かって聞かれると・・・・だな。
市場のデカさは間違いなく判断基準に入ってる。
0468デフォルトの名無しさん
NGNGそれで、オブジェクトの事を詳しく説明しているサイトがあれば、教えて頂けないでしょうか?
よろしくお願いします。
0469デフォルトの名無しさん
NGNGは、人文で言うと、
「文化について詳しく説明しているサイトを教えてください」
くらい、条件が広くて絞り込めない。
0470デフォルトの名無しさん
NGNGC++関連の書籍を扱っている書店に行ける環境ですか?
Amazonなどの通信販売でも構いませんので、
まずは1冊、自分で良さそうと思った本を読破することをお勧めします。
高くて買えないという場合は、立ち読みしちゃうとか図書館を覗いてみるとか。
時にはネット以外の情報源に当たるのもいいですよ。
0471デフォルトの名無しさん
NGNGえっと、オブジェクトの事で知りたいのは、オブジェクト=オブジェクトとか、
クラスで、メンバ関数の引数でオブジェクトでの参照渡し、値渡しです。
0472デフォルトの名無しさん
NGNG0473471
NGNG0474デフォルトの名無しさん
NGNGchar hoge[256] = {0}; // hoge文字列の初期化
この書き方って一般的でない?
レビューで「わかりにくい」と言われてしまったんだけど。
#memsetやるより良いと思うんだけどなぁ・・・
0475デフォルトの名無しさん
NGNG0476デフォルトの名無しさん
NGNGhoge[0]='\0';
特に意味が無いのならこうすべきだ。
初期化指定子は無駄な領域も初期化するからな。
0477デフォルトの名無しさん
NGNGこれで
0478デフォルトの名無しさん
NGNGでも構造体配列だと・・・
0479478
NGNG0480474
NGNGchar hoge[256];
hoge[0]='\0';
これってVC6のDebug(Releaseでは大丈夫だった)で起動するとこうならない?↓
hoge[0] : 0x00
hoge[1] : 0xcc
hoge[2] : 0xcc
・・・
hoge[255] : 0xcc
まあ、問題はないんだけど・・・。
0481デフォルトの名無しさん
NGNG0で埋めたいわけじゃないんだろ?
0483デフォルトの名無しさん
NGNGせめて
for (int i = 0; i < 256; i++) hoge[i] = '\0';
だろ。
0484デフォルトの名無しさん
NGNGじゃぁコードが合っててコメントが糞ってことだな。
0で埋めるコードとしては、>>474のものが最も効率が良くなる可能性が高い。
0485デフォルトの名無しさん
NGNGおまえはたぶん回答者に向いてない。もうちっとROMで雰囲気つかめ。
0486デフォルトの名無しさん
NGNGC++ならせめて std::fill 使うだろ。
0487484
NGNG>485
テメーで解答してから言え ぼけ
0488デフォルトの名無しさん
NGNG0489デフォルトの名無しさん
NGNG0490デフォルトの名無しさん
NGNG0491484
NGNG関数を想定してるなら全部埋める必要があるだろ。0で埋めるってのはそういう話だと
思ったが。
0492デフォルトの名無しさん
NGNG1byteずつ初期化すると遅いから4byteか8byteずつ初期化しなさい。
0493デフォルトの名無しさん
NGNGあー、すまん。>>483=487=491だ
0494デフォルトの名無しさん
NGNG0495デフォルトの名無しさん
NGNGCしか知らんて、Cでも配列の初期化は={0}で同じことできる。
これが通らないとか言ってるからROMっとけと言ってるんだ。
0497デフォルトの名無しさん
NGNG0498デフォルトの名無しさん
NGNGいや、意図は、hoge[0] だけ0で埋めるという意味だよ。
全部埋まったのは、そのコンパイラがたまたまそうだっただけ。
0499デフォルトの名無しさん
NGNGレビューで文句言われたならとりあえず従っておいたら。
コメントが微妙にずれてるのがわかりにくいと言われたのなら直せばいいだけだ。
0500デフォルトの名無しさん
NGNG知らなかった、正直すまんかった。
で、スレ違いではあるがよければK&Rのどのへんにそういうのが載ってるのか教えてくれないか。
索引で配列関連を引いてみたが見つからなかった。
0501デフォルトの名無しさん
NGNG「4.9 初期化」
0502474
NGNG了解。コンパイラ依存という事で。
>>497,499
実際のコメントは○○文字の初期化、という感じで書いていました。(○○がわかると会社がばれる)
レビュアーの言う通りにmemsetで統一、という事になりそうなので訊いてみた次第です。
たくさんの意見蟻が�d。
0503デフォルトの名無しさん
NGNGP.104〜P.105の
『指定した個数より配列に対する初期値が少なければ、残り要素は外部変数、静的変数および
自動変数については0になる。』
ここかー!ありがとう。ほんとK&Rは隅々まで読んどかないと変なとこで足下掬われるな
0504デフォルトの名無しさん
NGNG0505504
NGNG0506デフォルトの名無しさん
NGNG0507デフォルトの名無しさん
NGNG所詮STLの知名度なんてそんなもんなんですな
0508498=504=505
NGNGちょっと混乱中。
0509474
NGNGデータ構造関係は、ほぼ使ってますよ。
Boostも使いたかったけど「実績」を証明するのがめんどくさかったので諦めましたが。
>>508
VC6 VC7 mingw gcc にて確認、全部0で埋まりました・・・。
0510デフォルトの名無しさん
NGNG={0}と=""は同じです。
どっちも={'\0'}です。
0511デフォルトの名無しさん
NGNG0512デフォルトの名無しさん
NGNGなんで既出の意見を何度も繰り返す必要があるよ?
つうかこの場合={0}がstd::fillよかいいだしょ。
0513デフォルトの名無しさん
NGNG激しく同意。とでも言って欲しかったんじゃないか。
寂しい奴なんだよ。
0514デフォルトの名無しさん
NGNGコンパイラ依存じゃねーよ
{0}は残りの配列の要素(クラス、構造体のメンバ)も0で埋める。
0515デフォルトの名無しさん
NGNGhttp://www.kuzbass.ru/docs/isocpp/decl.html#dcl.init.aggr
の8.5.1-7-がそれ.
>512,513
すいません.愚痴垂れ流しただけになってました.
0516デフォルトの名無しさん
NGNGPoint* pt = (Point*)new char[sizeof(Point)];
*pt = Point(10, 10);
delete [] pt;
1). 2行目のコードででptのコンストラクタが呼ばれますが、
ptはビット的な変化はあるんでしょうか?
2). ptのアドレスは変わらない様ですがこの行為は正当でしょうか?
0517デフォルトの名無しさん
NGNG釣れますか?
0518デフォルトの名無しさん
NGNGPoint* pt=new(buffer) Point(10, 10);
pt.~Point();
delete[]buffer;
こういうことがやりたかったんじゃないのかい?
0519デフォルトの名無しさん
NGNGあまりエレガントな記述を追求しても、
同じデータを再初期化する時に破綻するのがわかってんだから、
大人しく一般的な初期化をしとけ。
memset、ZeroMemory、std::fillで決着。
反論は受け付けない。以上。
0520デフォルトの名無しさん
NGNG知名度はそんなに高くないから「わかりにくい」という意見には
一理あるかもしれんけど、だからと言ってそこで memset を使う理由にはならない。
オーバーロードは分かりにくいから使用禁止って言うのと同レベルだよ。
0521デフォルトの名無しさん
NGNG最初期化、それは名高い変数の使いまわしと言うものですか!?
0522デフォルトの名無しさん
NGNG変数使いまわしも何も、クラスのメンバ変数が思い切り該当するっしょ。
0523デフォルトの名無しさん
NGNG0524デフォルトの名無しさん
NGNGまったく同意見
519は論点ずれてるうえ
反論は(ry とわざわざ自爆する奇特なピエロ
0525デフォルトの名無しさん
NGNGそれはやってみるしかない
同じ処理系でも条件次第で違ったりもする
アセンブラ読めない人と、実測できない人は、蚊帳の外
0526デフォルトの名無しさん
NGNG> memset、ZeroMemory、std::fillで決着。
これらは一般的な「初期化」ではない。
未初期化のPODに対して行う場合に限定して
「初期化」と呼べるかもしれない、くらいのものだ。
0527デフォルトの名無しさん
NGNG何に該当するって?
0528デフォルトの名無しさん
NGNG■ このスレッドは過去ログ倉庫に格納されています