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

C++相談室 part34

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

過去スレ、関連スレ、関連リンクなどは >>2-20 あたり
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
0529デフォルトの名無しさんNGNG
std::stringからchar配列に変換しようとすると、変換できませんとコンパイラが言います。


具体的には、

char hairetu[256];
std::string str = "ぬるぽ";

hairetu = str.c_str();

これでいけると思うのですが・・だめなのでしょうか・・・
0530デフォルトの名無しさんNGNG
strcpy(hairetu, str.c_str());
0531デフォルトの名無しさんNGNG
>>529
ネタ?
配列名には代入できない。strcpyを使え。
0532デフォルトの名無しさんNGNG
>>529
だめです。
char配列を文字列として使うなら、C言語の文字列処理を知るべきです。
0533マイク ◆yrBrqfF1Ew NGNG
>std::string str = "ぬるぽ";
 ↓
>std::string str("ぬるぽ");
0534デフォルトの名無しさんNGNG
いつも思うんだけど、>>529の類ってどう考えてもネタだと思う。
文字列処理なんてどんな入門書にも書いてるし、これ間違えるなんてあり得ない
0535デフォルトの名無しさんNGNG
std::copy(str.c_str(), str.c_str() + str.length() + 1, buf);
0536デフォルトの名無しさんNGNG
std::copy(str.begin(), str.end() + 1, hairetu);
0537デフォルトの名無しさんNGNG
>535, 536

buffer overrun が気になる
0538デフォルトの名無しさんNGNG
>>536 ×
0539>>529NGNG
どうも、ありがと。

自分C++ラーなので、知りませんでした。
まじで、ネタじゃありませんが(あせ
0540デフォルトの名無しさんNGNG
std::copy(str.begin(), str.end(), hairetu);
henkaku[str.length()] = '\0';
0541540NGNG
henkaku じゃなくて hairetuだた。
0542デフォルトの名無しさんNGNG
>>540
>>537
0543デフォルトの名無しさんNGNG
C++ならこうだろ。
std::vector<char> hairetu(str.begin(), str.end());
hairetu.push_back('\0');
0544デフォルトの名無しさんNGNG
こっちのが効率がいいかもね。
char const* const c_str = str.c_str();
std::vector<char> hairetu(c_str, c_str + str.length() + 1);
0545デフォルトの名無しさんNGNG
そういうのを見ると、Cを暗号化したものがC++と思えてくるな。
0546mike ◆yrBrqfF1Ew NGNG
>>529
char carray[256];
std::string nullpo("ぬるぽ");
std::istringstream strstrm(nullpo);
strstrm>>setw(sizeof(carray))>>carray;
0547デフォルトの名無しさんNGNG
char *bgn = str.begin();
int len = std::max(str.length(), sizeof(hairetu) - 1);
std::copy(bgn, bgn + len, hairetu);
hairetu[len] = '\0';
0548デフォルトの名無しさんNGNG
minじゃね?
0549デフォルトの名無しさんNGNG
>>533,>>546 頭悪そう。
0550デフォルトの名無しさんNGNG
>>547
勝手に後ろを切り捨てちゃまずいだろ。

char hairetu[256];
if(str.length() >= sizeof(hairetu)) throw std::range_error("長すぎ");
strcpy(hairetu, str.c_str());
0551マイク ◆yrBrqfF1Ew NGNG
2chネラほどじゃないさ。
0552デフォルトの名無しさんNGNG
インクルードの次の行に
gap::sweet texture;
という記述があるのですが、
これはどういう構文なのでしょうか?
初心者で申し訳ない。
0553デフォルトの名無しさんNGNG
>>552
名前空間(またはクラス型) gap のメンバである sweet 型の変数 texture の定義。
インクルードの次の行であることには意味が無い。
0554デフォルトの名無しさんNGNG
グローバル変数ですよ
0555マイク ◆yrBrqfF1Ew NGNG
//header
namespace gap {
typedef void sweet();
}


//sourcefile
gap::sweet texture; //declare

//omit

gap::sweet texture //def
{
std::cerr<<"\0m0th3rfuck3r"<<std::flush;
std::teminate();
}
0556522NGNG
つまり、
名前空間 gap のメンバである sweet 型の変数 texture を
グローバル変数に定義しているということで間違いないでしょうか?
0557マイク ◆yrBrqfF1Ew NGNG
失礼。間違い。
0558デフォルトの名無しさんNGNG
>>555,>>557 頭悪・・・そう。
0559522NGNG
ヘッダファイルの中で
namespace gap{
void sweet::print()
}

としておいて、ソースの中で
gap::sweet texure
texture.print()

となっているのですが、これは
sweet型の変数textureがprint()という関数を
呼び出しているということであってますでしょうか?
0560デフォルトの名無しさんNGNG
>>559
いや、それだとコンパイル通らないはず。

ところで、そのプログラム全部ここで解説させるつもりなのか?
0561デフォルトの名無しさんNGNG
>>560
セミコロンくらい見逃してやれよ。
0562マイク ◆yrBrqfF1Ew NGNG
>>558
ん?ならお前は何大卒だ?
0563デフォルトの名無しさんNGNG
>>523
char*に対するfillはmemsetで特殊化している実装が多いです
0564522NGNG
>>560
初心者なんだ。イジめるなよ。
コンパイルは通るとおもう。
>>559に書いた通り。
0565デフォルトの名無しさんNGNG
>>562 大学卒業してないよ。
頭悪そうだと思っていたが、もういいかげん頭悪いんだとわかった。
もう触りません。スレ汚して悪かった。
0566デフォルトの名無しさんNGNG
>>564
名前おかしいよ藁
0567デフォルトの名無しさんNGNG
えっと、C言語を使って現在ゲームをコツコツと作ってるのですが
複雑になるにつれ、クラスに纏めたいと思い、C++に手をだしました。
ただ、CもC++もまだ初心者で、中々苦労しています。
特に困っているのが、何をクラスにして派生クラスは何になるのか、メンバは何を持たせるか
みたいな部分が中々把握できません。
基礎的な書き方のようなものは、本を買ってプログラム組んでみました。
こういったことに慣れるための良い練習法のようなものがあれば教えてください。
0568マイク ◆yrBrqfF1Ew NGNG
>>565
わかればいいさ。
0569アイク ◆uCUYQ8/A2w NGNG
俺もコテハンデビューする
0570デフォルトの名無しさんNGNG
>>568
ワラタ
0571デフォルトの名無しさんNGNG
>>567
包含関係に気を配るとよろしいかも。
あと、Effective C++あたりが定番かな。
0572デフォルトの名無しさんNGNG
>>567
http://www.amazon.co.jp/exec/obidos/ASIN/4881356194/250-1099330-3815450
0573デフォルトの名無しさんNGNG
>>571-572
アドバイスありがとうございます。
本も探してみます
0574アイク ◆uCUYQ8/A2w NGNG
>>573
探してる暇があんなら、さっさとamazonで注文しろや
0575アイク ◆uCUYQ8/A2w NGNG
>>574
お前が買ってこいやヴォケ
0576マイク ◆yrBrqfF1Ew NGNG
ただでさえ馬鹿が多いのにうんざりするのが一人増えたな。
0577アイク ◆uCUYQ8/A2w NGNG
>>575
トリップパクんなタコ

>>576
ほんたまとマイクは死んだほうがいいよな
0578デフォルトの名無しさんNGNG
以下の関数を修正して、標準出力ではなくて、st::stringに出したいのですが、
どのようにすればいいんでしょうか・・・

void Hage::OutLog(const char* fmt, ...)
{

va_list argp;
va_start(argp, fmt);
vfprintf(stdout, fmt, argp);
va_end(argp);
fprintf(stdout, "\n");
}
0579デフォルトの名無しさんNGNG
std::stringにタブがあるかどうかを調べるにはどうすればいいですか?

std::string sss;

sss = "abc<TAB>bbb";

※<TAB>は制御コードのTABだと思ってください。

で、このストリングを、

sss.find();で見つけたいのですが、どうすればできますか?
そもそも、find()で制御コードを検索することってできるのでyそうか?
0580デフォルトの名無しさんNGNG
cppllでつまんねえ喧嘩してるぞ。どっちもどっちだな。傍から見ていると。
0581アイク ◆uCUYQ8/A2w NGNG
>>578
vsprintfでも使え

>>579
if(sss.find('\t')!=std::string::npos)//見つかった
0582デフォルトの名無しさんNGNG
>>579
\
0583デフォルトの名無しさんNGNG
>>578 vsnprintf
0584デフォルトの名無しさんNGNG
>>579
>※<TAB>は制御コードのTABだと思ってください。

嫌です。
0585デフォルトの名無しさんNGNG
>>580
典型的な宗教論争だね。2ch なら煽り入れて楽しむところだが。
058611063NGNG
11056 にはビックリしますた。

>>580,>>585
そんなこと言ってないでお前らも参加しろよー
ほれ、よく言うじゃん、「踊る阿呆に、見る阿呆。同じ阿呆なら踊らにゃそんそん。」って。
0587デフォルトの名無しさんNGNG
その阿呆と違って本物の阿呆だから
触りたくないです
■ このスレッドは過去ログ倉庫に格納されています