C++相談室 part85
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん
2010/10/09(土) 20:22:35ただし質問の前にはFAQに一通り目を通してください。
IDE (VC++など)などの使い方の質問はその開発環境のスレに
お願いします。
前スレ
C++相談室 part84
http://hibari.2ch.net/test/read.cgi/tech/1284736187/
0075デフォルトの名無しさん
2010/10/11(月) 22:24:40ぷっ
0076デフォルトの名無しさん
2010/10/11(月) 22:29:27void hogehoge(const BYTE *values)
{
なんです。
void hogehoge(const BYTE values[])
{
にしても、C2784エラーがでてしまいます。
0077デフォルトの名無しさん
2010/10/11(月) 22:31:14そのhogehogeもテンプレートにしちゃいないよ。
0078デフォルトの名無しさん
2010/10/11(月) 22:31:170079デフォルトの名無しさん
2010/10/11(月) 22:33:22だめだこりゃ!
0080デフォルトの名無しさん
2010/10/11(月) 22:46:43{
こうですか?
0081デフォルトの名無しさん
2010/10/11(月) 22:47:49もう大分前から STL は C++ 標準
0082デフォルトの名無しさん
2010/10/11(月) 23:04:56void print1();
void print2();
void print3();
の方が
void print3();
void print1();
void print2();
より見やすい気がする
お前らはどんなルールで関数を宣言していますか?
0083デフォルトの名無しさん
2010/10/11(月) 23:07:59書けるとこに書けばいい。
スレ違いだから。
0084デフォルトの名無しさん
2010/10/11(月) 23:08:06両方とも醜いです
0085デフォルトの名無しさん
2010/10/11(月) 23:45:08printを使うのは良いとして 1,2,3 なんてイミフなラベル付けないなぁ
0086デフォルトの名無しさん
2010/10/11(月) 23:45:56init → begin → end → free か
init → free → begin → end
0088デフォルトの名無しさん
2010/10/11(月) 23:48:070089デフォルトの名無しさん
2010/10/11(月) 23:48:130090デフォルトの名無しさん
2010/10/12(火) 00:53:21結局はこれが一番一覧性高い
0091デフォルトの名無しさん
2010/10/12(火) 00:59:38それぞれどんな機能差があるか分からないけど、番号だけで分けるなんて安易で酷いと思うよ
0092デフォルトの名無しさん
2010/10/12(火) 01:02:47説明のためだけなら、実用における
void print1();
void print2();
void print3();
と
void print3();
void print1();
void print2();
の違いがさっぱり分からないわけだが。
0093デフォルトの名無しさん
2010/10/12(火) 01:05:00宣言とか定義場所の並び順なら、グループ別に分けてコメントで見出しと説明文とgrep用の印付ける。
その上で呼び出し順序のある物ならその順番で書いて、そうじゃない単位での並び順はそんなわらわら増えた事も無いし適当。
0094デフォルトの名無しさん
2010/10/12(火) 01:14:12辞書順の例を出しただけ。
他にどんなルールで並べてるのかを聞いてるんだよ
0095デフォルトの名無しさん
2010/10/12(火) 01:16:170096デフォルトの名無しさん
2010/10/12(火) 01:53:40というか辞書順という言葉が分からなかったんだろ?
009729
2010/10/12(火) 06:16:30>valarrayの - 演算子って定義されてるの?
演算子いっぱい定義されてます.
http://www.cplusplus.com/reference/std/valarray/valarray/operators/
>>31
遅延評価をやってるってことですよね?
doSomething(std::valarray<float>(A - x));
でも
doSomething(A -= x);
でもコンパイル通りました.ありがとうございます!
(言い忘れましたが私はgcc 4.5を使っています)
ただ,なぜ自動的に型変換されないのでしょう.
std::valarrayのコンストラクタにA-xは渡せるのだから引数に渡るとき暗黙に型変換されるものだと思っていましたが・・
0098デフォルトの名無しさん
2010/10/12(火) 06:55:390099デフォルトの名無しさん
2010/10/12(火) 08:24:34テンプレート配列
#include <iostream>
template<class T,int N>
inline int length(T (&a)[N])
{
return N;
}
int _tmain(int argc, _TCHAR* argv[])
{
int s[70];
std::cout<<length<>(s);
return 0;
}
0100デフォルトの名無しさん
2010/10/12(火) 08:42:14お願いします。
0101デフォルトの名無しさん
2010/10/12(火) 09:14:180102デフォルトの名無しさん
2010/10/12(火) 09:34:560103デフォルトの名無しさん
2010/10/12(火) 09:53:500104デフォルトの名無しさん
2010/10/12(火) 18:29:31これは私ではありません
0105デフォルトの名無しさん
2010/10/12(火) 19:41:08私も気になって調べてみましたがよくわかりませんでした。
valarrayの_Exprを受け取るコンストラクタがメンバテンプレートなのが関係あるかも?
0106デフォルトの名無しさん
2010/10/12(火) 19:47:56class Test {
public:
Test() { c = 'T'; i = 10; };
char getChar() { return c; };
int getInt() { return i; };
private:
int i;
char c;
};
int main()
{
Test t;
printf("t.i = %d, t.c = %c\n", t.getInt(), t.getChar());
printf("t = %d\n", t);
return 0;
}
としたとき、1つ目のprintf()関数で値を取得出来るのは分かるのですが、
2つ目のprintf()関数でも、最初に定義されたメンバ変数の値(つまりt.getInt()と同じ値)が
取得出来るようです。
値を書き換えることは出来ないとは言え、実質privateメンバ変数の値に
publicメンバ関数を通さずにアクセスできていることになりますが、
これは言語仕様でしょうか?
0107デフォルトの名無しさん
2010/10/12(火) 19:56:57printfの正しくない使い方をして先頭のメンバーがたまたま見えてるだけ。
仕様としては未定義な動作。
0108デフォルトの名無しさん
2010/10/12(火) 19:58:59具体的な仕様は知らんのだけど、それってprintfの中で (int)t されてるんじゃないかな。
0109デフォルトの名無しさん
2010/10/12(火) 20:00:18言語仕様うんぬんではなく、printf()の正しくない使い方だったのですね。
迅速なご回答ありがとうございました。
0110デフォルトの名無しさん
2010/10/12(火) 20:07:42ありがとうございます。
インスタンスtの先頭にメンバ変数iが割り当てられて、
printf()内で(int)tされた結果、tのアドレスをint型として扱い
iの値が出力されたということでしょうか?
0111デフォルトの名無しさん
2010/10/12(火) 20:13:36そんな所だと思う。
int a = *(int*)&t;
printf("%d\n", a);
でも同じ処理系なら同じ結果が得られるよ。
tの中の状態に依存してるから、他で必ず同じ結果になるとは限らないと思うけど。
0112デフォルトの名無しさん
2010/10/12(火) 20:15:220113デフォルトの名無しさん
2010/10/12(火) 20:22:19ありがとうございます。
ご提示のコードでも確かに同様の結果が得られました。
>>112
ありがとうございます。
ということは、違う環境で例えばメンバ変数のスタックへの積まれ方が異なる場合には
違う値になってしまいますね。
仕事で携わってるものにこのようなコードがあり、
初めて見る書き方でしたので最初は意味が分からず
>>106のような検証コードを書いて、ようやく理解出来ました・・・。
正しくない使い方のようですのでgetInt()のようなゲッターを作って
取得するようにしようと思います。
ありがとうございました。
0114デフォルトの名無しさん
2010/10/12(火) 20:25:410115デフォルトの名無しさん
2010/10/12(火) 20:26:010116デフォルトの名無しさん
2010/10/12(火) 20:29:08private:
int i;
char c;
から
private:
char c;
int i;
と入れ替えて、
printf("t = %c\n", t);
とすると、「T」が表示されましたので、
クラスTestのインスタンスとして確保されたメモリ領域に
メンバ変数の定義順に配置されたって感じなんでしょうかねぇ。。。
0117デフォルトの名無しさん
2010/10/12(火) 21:05:13クラスも構造体も基本は一緒だから
でも>>106は未定義
0118デフォルトの名無しさん
2010/10/13(水) 00:56:49参照型変数の寿命に関連してお伺いします。
紙面の都合上かなり省いていますが、下記コードでのretの使い方は正しいでしょうか?
(分かりづらいようでしたら、どこかに張ります)
まず、foo()は変更できない関数です。
処理としては、クラスXXXのメンバ変数のconst参照を返しています。
この参照をそのまま取得したいのですが、cがNULLの時はfoo()を呼べないので、
ifブロック外のポインタretに代入するようにしました。
動くことは動くのですが、ifブロックを抜ける時にRetが消えるような
気がしてなりません。よろしくお願いします。
XXX *c = yyy.GetPointer();
const vector<int> *ret = NULL;
if (c != NULL) {
const vector<int>& Ret = c->foo();
ret = &Ret;
}
:
if (c != NULL) {
std::for_each(ret->begin(), ret->end(), print);
}
0119デフォルトの名無しさん
2010/10/13(水) 01:06:22この(元のコードの)目的は、
(fooが取得できれば、)fooの返り値に対して最後のfor_eachを行うことです。
制限ばかりで申し訳ないですが、他の関係の無い処理が入る都合上、
for_eachの部分を上のfooの部分と同じブロックに入れることができません。
0120デフォルトの名無しさん
2010/10/13(水) 01:10:09>ifブロックを抜ける時にRetが消えるような
>気がしてなりません。よろしくお願いします。
消えるよ
当たり前だろ
ブロック内しか寿命がない
>動くことは動くのですが、
たまたま動いているだけ
Retはブロックの外で定義しないと
その場合参照型にはできないね
0121デフォルトの名無しさん
2010/10/13(水) 01:11:59× 他の関係の無い処理が入る都合上、
○ 既存のコードの制御フローを変更できない都合上、
0122デフォルトの名無しさん
2010/10/13(水) 01:15:39バグってはっきりわかったんだから修正するのが当たり前だろ
0123デフォルトの名無しさん
2010/10/13(水) 01:22:58Retを介す必要なくね?
ret = c->foo();
0124デフォルトの名無しさん
2010/10/13(水) 01:40:25なるほど。>>118を再掲しますと
> 処理としては、クラスXXXのメンバ変数のconst参照を返しています。
なので
ret = &(c->foo())
となるかと思いますがretの指すアドレスは、
「ifブロック内の一時的な変数」ではなくて「cのメンバ変数」のアドレスである。
という理解でよいのでしょうか?
加えて、retの有効範囲はcが有効である間という認識でよいのでしょうか?
0125デフォルトの名無しさん
2010/10/13(水) 01:42:53class C {
int i;
public:
C(int j) : i(j) {}
void foo() const {
std::cout << i << ' ';
}
};
int main()
{
const std::vector<C> *ret = 0;
std::vector<C> vi;
for (int i = 0; i < 10; i++)
vi.push_back(C(i));
ret = &vi;
std::for_each(ret->begin(), ret->end(), std::mem_fun_ref(&C::foo));
}
0126デフォルトの名無しさん
2010/10/13(水) 02:11:29それで動くはず。
foo() が const 参照を返すのなら、参照先は c のメンバ変数そのものだから、
&演算子でメンバ変数そのもののアドレスがとれる。
もっとも、その程度の処理なら、これで十分だけどね。
std::for_each(c->foo()->begin(), c->foo()->end(), print);
0127デフォルトの名無しさん
2010/10/13(水) 02:41:58class C : public std::unary_function<int, void> {
int i;
public:
void operator()(int i) const {
std::cout << i << ' ';
}
};
int main()
{
const std::vector<int> *ret;
std::vector<int> vi;
for (int i = 0; i < 10; i++)
vi.push_back(i);
ret = &vi;
std::for_each(ret->begin(), ret->end(), C());
}
0128デフォルトの名無しさん
2010/10/13(水) 13:46:420129デフォルトの名無しさん
2010/10/13(水) 14:01:12コンパイラのマニュアルを見ろ。
いちおう、同じコンパイラ+同じ設定でコンパイルしてるなら問題ない可能性が高いとは言える。
0130デフォルトの名無しさん
2010/10/13(水) 14:03:320131デフォルトの名無しさん
2010/10/13(水) 14:14:300132デフォルトの名無しさん
2010/10/13(水) 18:49:54お返事が遅れました。
確かに、c->foo()->begin()で十分ですね。コレがよさそうです。
あと知らなかったのでmem_fun_ref調べてみましたが、
オブジェクトを作らなくても関数を呼べるのは面白いですね。
ありがとうございました。
0133デフォルトの名無しさん
2010/10/13(水) 23:08:360134デフォルトの名無しさん
2010/10/13(水) 23:24:430135デフォルトの名無しさん
2010/10/14(木) 00:44:43namespace std{ void bar(); }
void baz() { std::bar(); }
}
まあこんなことするやつはいないと思いたい
0136デフォルトの名無しさん
2010/10/14(木) 00:46:330137デフォルトの名無しさん
2010/10/14(木) 01:37:540138デフォルトの名無しさん
2010/10/14(木) 01:41:55それは黒歴史。後方互換性とも言う。
0139デフォルトの名無しさん
2010/10/14(木) 01:50:340140デフォルトの名無しさん
2010/10/14(木) 02:10:290141デフォルトの名無しさん
2010/10/14(木) 07:42:09http://togetter.com/li/59043
綾瀬はるかのおっぱいはどの型で宣言すればいいですか?
0142デフォルトの名無しさん
2010/10/14(木) 08:16:24int
0143デフォルトの名無しさん
2010/10/14(木) 13:00:470144デフォルトの名無しさん
2010/10/14(木) 13:38:430145デフォルトの名無しさん
2010/10/14(木) 13:47:40関数Bでは関数Cを呼び、関数Cは関数Dを呼び・・・と何層にもなっているとします。
ここで、関数Cや関数Dから、goto文のように直接関数Aにreturnすることはできるでしょうか?
0146デフォルトの名無しさん
2010/10/14(木) 13:49:050147デフォルトの名無しさん
2010/10/14(木) 13:57:36エラー処理なら throw 〜 catch で。
それ以外ならもう少し詳しく状況を。できればコードで。
0148デフォルトの名無しさん
2010/10/14(木) 13:58:550149デフォルトの名無しさん
2010/10/14(木) 14:10:160150デフォルトの名無しさん
2010/10/14(木) 14:16:30try〜catchは少し調べてみましたが、例外がおきたときに特定の処理をするようなので、処理を関数Aに戻すのは難しいのでは・・・と思います。
setjmp/longjmpはぴったりあってるような気がします。
ただ、goto文と同じくあまり推奨されてないのが不安ですが・・・
0151デフォルトの名無しさん
2010/10/14(木) 14:40:55使用してはいけない。throwが正解。
0152デフォルトの名無しさん
2010/10/14(木) 15:22:17それはまさしく例外だ。
try 〜 catchを関数Aに記述すれば、関数Dで例外がthrowされたときに関数Aまで戻るよ。
このとき、途中の関数の自動変数(ローカル変数)のデストラクタがちゃんと呼ばれる。
0153デフォルトの名無しさん
2010/10/14(木) 15:27:22○ デストラクタ
0154デフォルトの名無しさん
2010/10/14(木) 15:56:05簡単な例を作って試してみたところ、関数Aに処理が戻ったことが確認できました。
これで綺麗にコーディングできそうです。
助かりましたm(_ _)m
0155デフォルトの名無しさん
2010/10/14(木) 20:42:52void main(){
vector<int> p;
vector<int> q;
for(int i=0; i<10; i++){
p[i]=i;
q[i]=i*2;
}
up(p,q);
cou << p[0] <<endl;
cou << q[0] <<endl;
}
void up(vector<int> p, vector<int> q){
for(int i=0; i<10; i++){
p[i]+=1;
q[i]+=1;
}
}
かなり適当になってしまったのですが上のようにvectorを複数個メソッドに渡して中身を処理変化させても
呼び出し元では変化しません。配列を渡した場合ポインタを利用して中身を替えることができますがvectorでも可能なのでしょうか?
vectorでのポインタの扱いがいまいちわかっておりません。どうか教えてください。
0156デフォルトの名無しさん
2010/10/14(木) 20:51:05void up(vector<int> &p, vector<int> &q)
0157デフォルトの名無しさん
2010/10/14(木) 20:59:020158デフォルトの名無しさん
2010/10/14(木) 21:01:380159デフォルトの名無しさん
2010/10/14(木) 21:46:15あくまでもvector「クラス」
だから普通のクラスと同様にポインタや参照で渡せばいい
コピーはまずいな 時間計測してみればわかるが
0160デフォルトの名無しさん
2010/10/14(木) 22:05:010161デフォルトの名無しさん
2010/10/14(木) 22:32:16それだったら言語によって普通とかないと思うよ。
見易さのために組織で決めることはあるかもしれないけどね。
ちなみにgoogleは4文字。アクセス指定子は2文字とどこかで見た。
0162デフォルトの名無しさん
2010/10/14(木) 22:32:42その話題はこっちで
http://hibari.2ch.net/test/read.cgi/tech/1193554741/
0163デフォルトの名無しさん
2010/10/14(木) 23:18:27Boost.Serialization
0164デフォルトの名無しさん
2010/10/15(金) 07:49:55最近はそうでもないです
0165デフォルトの名無しさん
2010/10/15(金) 12:45:44assertみたいに正式版では簡単に消せるような
文字を表示するにはどうやりますか?
0166デフォルトの名無しさん
2010/10/15(金) 13:09:00printf ( "message" ) ;
#endif
0167デフォルトの名無しさん
2010/10/15(金) 13:34:49もしそうならマクロ名を
assertを解除するマクロと同じ名前にした方が良いような気がするのですが?
あるいはその3行のコードをマクロにしたようなものはよういされてませんか?
0168デフォルトの名無しさん
2010/10/15(金) 13:38:34#define PRINT( ... ) printf( __VA_ARGS__ )
#else
#define PRINT( ... ) ((void)0)
#endif
0169デフォルトの名無しさん
2010/10/15(金) 13:40:00_RPTFとかな
「正式版」なんてものは規格の外の話だ
0170デフォルトの名無しさん
2010/10/15(金) 14:21:02日本語でおk
0171デフォルトの名無しさん
2010/10/15(金) 14:27:11Releaseバージョンでリンクすれば自動でスキップされる
0172デフォルトの名無しさん
2010/10/15(金) 14:37:470173デフォルトの名無しさん
2010/10/15(金) 14:41:170174デフォルトの名無しさん
2010/10/15(金) 14:51:19■ このスレッドは過去ログ倉庫に格納されています