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

C++相談室 part34

■ このスレッドは過去ログ倉庫に格納されています
0001v(^・^)vNGNG
C++に関する質問やら話題やらはこちらへどうぞ。
ただし質問の前にはFAQに一通り目を通してください。
テンプレートライブラリ(STL含む)に関する質問は
専用の別スレにお願いッス。

過去スレ、関連スレ、関連リンクなどは >>2-20 あたり
0429デフォルトの名無しさんNGNG
>>428 いいえ
0430デフォルトの名無しさんNGNG
>>429
マジデスカ…

おのれ VC7.1 …
0431デフォルトの名無しさんNGNG
>>430 http://www.microsoft.com/japan/msdn/library/ja/vccore/html/vcrefZcforScope.asp
0432デフォルトの名無しさんNGNG
>>431
おぉ、THX!
これやってみます
0433デフォルトの名無しさんNGNG
他にもこんな方法もある。
#define for if (0) ; else ; for
0434デフォルトの名無しさんNGNG
forループのスコープ云々って
イテレータが2種以上あるとき無力だにょなあ

map::iterator im = m.begin();
for( int i = 0; i < 10; ++i, ++im)...

結局こうなっちゃうし。
俺は古い仕様のままでいいと思うけど。
0435デフォルトの名無しさんNGNG
どっちでもいいけどどっちでもありうるのはいやだ
0436デフォルトの名無しさんNGNG
for ( int i = 0, map::iterator im = m.begin;
    i<10;
    ++i, ++im) {}
でいいじゃん
0437デフォルトの名無しさんNGNG
>>436
それ、コンパイル通る?
0438デフォルトの名無しさんNGNG
for (xxx::iterator it = m.begin(), end = m.end(); it != end; ++it)
なら通るんだけどねぇ
0439デフォルトの名無しさんNGNG
vc++.net2003で新しいプロジェクトを作ろうとすると
テンプレートが16種類もあるんだけど
どれが何用とか決まってんの?
0440デフォルトの名無しさんNGNG
一つは昼用、他は夜用。どれが昼用かは使ってわかってね。
0441デフォルトの名無しさんNGNG
>>436
int i = 0, map::iterator im = m.begin();
が、
int i = 0; int map::iterator im = m.begin();
と解釈されちゃうんだね。

forの初期化部には一つの型しか書けないわけか。
0442デフォルトの名無しさんNGNG
{ //こうでいいじゃん
 map::iterator im = m.begin;
 for (int i = 0; i < 10; ++i, ++im)
 {
 }
}
0443デフォルトの名無しさんNGNG
結論: C++ は糞
0444デフォルトの名無しさんNGNG
>>442
禿げしく却下
0445デフォルトの名無しさんNGNG
Cとかだと普通にやるけどな>ブロックスコープのでっち上げ
0446デフォルトの名無しさんNGNG
スコープ便利やん
人にとって
0447デフォルトの名無しさんNGNG
>434
んなアンコモンケースに対応することの方がどうでもいい。
0448デフォルトの名無しさんNGNG
>>447
そうか?
つーか現状のfor構文の方に
不備があるだろ、どっちかって言うと。
for()内のカンマをセミコロンに、
セミコロンを別の適当な記号に置き換えれば
無問題になるし意味的にも自然だ。
0449デフォルトの名無しさんNGNG
僕のキーボードには適当な記号がありません。
0450デフォルトの名無しさんNGNG
そこでトライグラフですよ。
0451デフォルトの名無しさんNGNG
??=include <stdio.h>
int main(int argc, char **argv)
??<
    printf("%d??/n", argc);
??>
0452デフォルトの名無しさんNGNG
たとえば:とか。
0453デフォルトの名無しさんNGNG
for(map::iterator im = m.begin; int i = 0;)(i < 10)(++i; ++im;) ...
0454デフォルトの名無しさんNGNG
do{
map::iterator im = m.begin;
int i = 0;}
whlie( i < 10){
...
++i; ++im;);
0455デフォルトの名無しさんNGNG
int* p = static_cast< int* >( operator new( 10 * sizeof( int ) ) );
operator delete( p );
と、
int* p = static_cast< int* >( operator new[]( 10 * sizeof( int ) ) );
operator delete[]( p );
は何か違いがあるのでしょうか?
あるのなら何を基準に使い分ければいいのでしょうか?
0456デフォルトの名無しさんNGNG
>>455
reinterpret_cast ちゃうか?
0457デフォルトの名無しさんNGNG
>>455
ここ読め。
http://www.fides.dti.ne.jp/~oka-t/cpplab-placement-new-3.html
new int[10]だと10 * sizeof(int)以上の領域を確保しなければならない可能性がある。
0458デフォルトの名無しさんNGNG
char EndChr[10] = "n";
int flag = 1;
if (EndChr == "n"){
flag = 0;
}

このような式においてEndChr == "n"がfalseになります。
なぜなのでしょうか?
0459デフォルトの名無しさんNGNG
>>457
>>455のような例では両者に領域の違いも何もないということですよね?
new 演算子で配列を確保場合、必要以上の領域を確保する可能性があると。
0460デフォルトの名無しさんNGNG
>455
そもそもoperator newはnewから呼び出される為の物だということを忘れるな。
0461デフォルトの名無しさんNGNG
>>460
は?
0462デフォルトの名無しさんNGNG
>>458
アドレス比較してるから。char[10] の代わりに std::string 使うか strcmp() で比較。
0463デフォルトの名無しさんNGNG
あれ、分からなくなってきた…
class 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デフォルトの名無しさんNGNG
アドレスが別だからじゃないの?
0465デフォルトの名無しさんNGNG
>>463
どちらも正しくないんじゃない?動くとは思うけど。
malloc でも動くけどね。
0466デフォルトの名無しさんNGNG
>>465
あ、スイマセン…
new( &p[ i ] ) C( ... );
です
0467デフォルトの名無しさんNGNG
>>443
まー確かに、全く平等な条件で選んでた言語かって聞かれると・・・・だな。
市場のデカさは間違いなく判断基準に入ってる。
0468デフォルトの名無しさんNGNG
今、C++を勉強しているのですが、オブジェクトが難しくて理解があまりできていません。
それで、オブジェクトの事を詳しく説明しているサイトがあれば、教えて頂けないでしょうか?
よろしくお願いします。
0469デフォルトの名無しさんNGNG
「オブジェクトのことを詳しく説明しているサイトを教えてください」

は、人文で言うと、

「文化について詳しく説明しているサイトを教えてください」

くらい、条件が広くて絞り込めない。
0470デフォルトの名無しさんNGNG
>>468
C++関連の書籍を扱っている書店に行ける環境ですか?
Amazonなどの通信販売でも構いませんので、
まずは1冊、自分で良さそうと思った本を読破することをお勧めします。
高くて買えないという場合は、立ち読みしちゃうとか図書館を覗いてみるとか。
時にはネット以外の情報源に当たるのもいいですよ。
0471デフォルトの名無しさんNGNG
C++関連の本って大きい本屋じゃないと扱っていないんですよね。でも、探してみます☆
えっと、オブジェクトの事で知りたいのは、オブジェクト=オブジェクトとか、
クラスで、メンバ関数の引数でオブジェクトでの参照渡し、値渡しです。
0472デフォルトの名無しさんNGNG
http://www.1point.jp/~book_2ch/program/cpp.html
0473471NGNG
ありがとうございます!!
0474デフォルトの名無しさんNGNG
今まであたりまえだと思っていたんだけど

char hoge[256] = {0};  // hoge文字列の初期化

この書き方って一般的でない?
レビューで「わかりにくい」と言われてしまったんだけど。
#memsetやるより良いと思うんだけどなぁ・・・
0475デフォルトの名無しさんNGNG
0限定なら別にどっちゃでも。
0476デフォルトの名無しさんNGNG
char hoge[256];
hoge[0]='\0';

特に意味が無いのならこうすべきだ。
初期化指定子は無駄な領域も初期化するからな。
0477デフォルトの名無しさんNGNG
char hoge[256] = "";
これで
0478デフォルトの名無しさんNGNG
文字配列ならどうとでもなるな。
でも構造体配列だと・・・
0479478NGNG
あ、ごめん、ここC++だった。
0480474NGNG
>>476
char hoge[256];
hoge[0]='\0';

これってVC6のDebug(Releaseでは大丈夫だった)で起動するとこうならない?↓
hoge[0] : 0x00
hoge[1] : 0xcc
hoge[2] : 0xcc
・・・
hoge[255] : 0xcc

まあ、問題はないんだけど・・・。
0481デフォルトの名無しさんNGNG
>>480
0で埋めたいわけじゃないんだろ?
0482474NGNG
>>481
0で埋めたいんです・・・
0483デフォルトの名無しさんNGNG
え、C++でそんなお馬鹿コードが通るなんて聞いたことないぞ。
せめて
for (int i = 0; i < 256; i++) hoge[i] = '\0';
だろ。
0484デフォルトの名無しさんNGNG
>>482
じゃぁコードが合っててコメントが糞ってことだな。
0で埋めるコードとしては、>>474のものが最も効率が良くなる可能性が高い。
0485デフォルトの名無しさんNGNG
>>483
おまえはたぶん回答者に向いてない。もうちっとROMで雰囲気つかめ。
0486デフォルトの名無しさんNGNG
>>483
C++ならせめて std::fill 使うだろ。
0487484NGNG
実はCしか知らん

>485
テメーで解答してから言え ぼけ
0488デフォルトの名無しさんNGNG
>>483がレビューで「わかりにくい」と言った人。
0489デフォルトの名無しさんNGNG
文字列操作しかしないバッファなら char hoge[128] = ""; で十分。
0490デフォルトの名無しさんNGNG
>>487=>>483?
0491484NGNG
comdlgのopenフィルタ(W32API)のように、\0を区切りとして\0\0まで処理するような
関数を想定してるなら全部埋める必要があるだろ。0で埋めるってのはそういう話だと
思ったが。
0492デフォルトの名無しさんNGNG
>>483
1byteずつ初期化すると遅いから4byteか8byteずつ初期化しなさい。
0493デフォルトの名無しさんNGNG
>>490
あー、すまん。>>483=487=491だ
0494デフォルトの名無しさんNGNG
この質問者のレベルだと、多分そこまで求められていない。
0495デフォルトの名無しさんNGNG
>>493
Cしか知らんて、Cでも配列の初期化は={0}で同じことできる。
これが通らないとか言ってるからROMっとけと言ってるんだ。
0496474NGNG
特殊な文字コードとかも使っていて、ダンプ出力するのに「フ」の字が入るのはちと困ってしまうのですがw

>>489
全部0で埋まりました・・・。こっちの方がわかりやすいかしら?
0497デフォルトの名無しさんNGNG
いや、やりたい事とコメントが微妙にずれてるから「わかりにくい」と言われたんだろ
0498デフォルトの名無しさんNGNG
>>496
いや、意図は、hoge[0] だけ0で埋めるという意味だよ。
全部埋まったのは、そのコンパイラがたまたまそうだっただけ。
0499デフォルトの名無しさんNGNG
俺も{0}で初期化は一般的だと思うけど、
レビューで文句言われたならとりあえず従っておいたら。
コメントが微妙にずれてるのがわかりにくいと言われたのなら直せばいいだけだ。
0500デフォルトの名無しさんNGNG
>>495
知らなかった、正直すまんかった。
で、スレ違いではあるがよければK&Rのどのへんにそういうのが載ってるのか教えてくれないか。
索引で配列関連を引いてみたが見つからなかった。
0501デフォルトの名無しさんNGNG
>>500
「4.9 初期化」
0502474NGNG
>>498
了解。コンパイラ依存という事で。

>>497,499
実際のコメントは○○文字の初期化、という感じで書いていました。(○○がわかると会社がばれる)
レビュアーの言う通りにmemsetで統一、という事になりそうなので訊いてみた次第です。
たくさんの意見蟻が�d。
0503デフォルトの名無しさんNGNG
>>501
P.104〜P.105の
『指定した個数より配列に対する初期値が少なければ、残り要素は外部変数、静的変数および
自動変数については0になる。』
ここかー!ありがとう。ほんとK&Rは隅々まで読んどかないと変なとこで足下掬われるな
0504デフォルトの名無しさんNGNG
あれ、じゃあ = ""; も  = {0}; と同じ扱い?
0505504NGNG
ちがうか。 "" の先頭アドレスから連続したメモリ領域がコピーされるんかな?
0506デフォルトの名無しさんNGNG
>>498読め。だからおまえはちゃんとROMれよ!
0507デフォルトの名無しさんNGNG
std::fill使えって言う意見が1つだけってのも悲しいなぁ
所詮STLの知名度なんてそんなもんなんですな
0508498=504=505NGNG
なんです。マジでw。
ちょっと混乱中。
0509474NGNG
>>507
データ構造関係は、ほぼ使ってますよ。
Boostも使いたかったけど「実績」を証明するのがめんどくさかったので諦めましたが。

>>508
VC6 VC7 mingw gcc にて確認、全部0で埋まりました・・・。
0510デフォルトの名無しさんNGNG
すいません勘違いしました。
={0}と=""は同じです。
どっちも={'\0'}です。
0511デフォルトの名無しさんNGNG
むしろhoge[128]={}で
0512デフォルトの名無しさんNGNG
>>507
なんで既出の意見を何度も繰り返す必要があるよ?


つうかこの場合={0}がstd::fillよかいいだしょ。
0513デフォルトの名無しさんNGNG
>>512
激しく同意。とでも言って欲しかったんじゃないか。
寂しい奴なんだよ。
0514デフォルトの名無しさんNGNG
>>498
コンパイラ依存じゃねーよ
{0}は残りの配列の要素(クラス、構造体のメンバ)も0で埋める。
0515デフォルトの名無しさんNGNG
C++の規格書にもほとんど同じ記述が明記されてますね.
http://www.kuzbass.ru/docs/isocpp/decl.html#dcl.init.aggr
の8.5.1-7-がそれ.

>512,513
すいません.愚痴垂れ流しただけになってました.
0516デフォルトの名無しさんNGNG
メモリプールを作っていて疑問に思ったのですが、

Point* pt = (Point*)new char[sizeof(Point)];
*pt = Point(10, 10);
delete [] pt;

1). 2行目のコードででptのコンストラクタが呼ばれますが、
ptはビット的な変化はあるんでしょうか?

2). ptのアドレスは変わらない様ですがこの行為は正当でしょうか?
0517デフォルトの名無しさんNGNG
>>516
釣れますか?
0518デフォルトの名無しさんNGNG
char* buffer=new char[sizeof(Point)];
Point* pt=new(buffer) Point(10, 10);
pt.~Point();
delete[]buffer;

こういうことがやりたかったんじゃないのかい?
0519デフォルトの名無しさんNGNG
藻前ら、初期化の方法にこだわるのも結構だが、
あまりエレガントな記述を追求しても、
同じデータを再初期化する時に破綻するのがわかってんだから、
大人しく一般的な初期化をしとけ。

memset、ZeroMemory、std::fillで決着。
反論は受け付けない。以上。
0520デフォルトの名無しさんNGNG
>>474
知名度はそんなに高くないから「わかりにくい」という意見には
一理あるかもしれんけど、だからと言ってそこで memset を使う理由にはならない。
オーバーロードは分かりにくいから使用禁止って言うのと同レベルだよ。
0521デフォルトの名無しさんNGNG
>>519
最初期化、それは名高い変数の使いまわしと言うものですか!?
0522デフォルトの名無しさんNGNG
>>521
変数使いまわしも何も、クラスのメンバ変数が思い切り該当するっしょ。
0523デフォルトの名無しさんNGNG
std::fillってコンパイラちゃんと最適化してくれんの?
0524デフォルトの名無しさんNGNG
>>520
まったく同意見
519は論点ずれてるうえ
反論は(ry とわざわざ自爆する奇特なピエロ
0525デフォルトの名無しさんNGNG
>>523
それはやってみるしかない
同じ処理系でも条件次第で違ったりもする
アセンブラ読めない人と、実測できない人は、蚊帳の外
0526デフォルトの名無しさんNGNG
> 大人しく一般的な初期化をしとけ。
> memset、ZeroMemory、std::fillで決着。

これらは一般的な「初期化」ではない。
未初期化のPODに対して行う場合に限定して
「初期化」と呼べるかもしれない、くらいのものだ。
0527デフォルトの名無しさんNGNG
>>522
何に該当するって?
0528デフォルトの名無しさんNGNG
vector::clear
■ このスレッドは過去ログ倉庫に格納されています